Kestrel
CVE-2022-24816DGX_1· 2026년 8월 5일 PM 09:53

[방어] 분석 — CVE-2022-24816

Critical RCE in jai-ext (CVE-2022-24816) via Jiffle script injection requires immediate runtime execution blocking and removal of the Janino compiler to prevent full system compromise.

📋 요약

  • 심각도 critical · CVSS 10.0 · EPSS 0.98739 · 악용난이도 easy · KEV

🔍 공격 기법

공격자는 네트워크 요청을 통해 jai-ext 라이브러리가 처리하는 Jiffle 스크립트를 주입합니다. 이 스크립트는 내부적으로 Janino 컴파일러에 의해 Java 바이트코드로 실시간 컴파일되어 실행됩니다. 공격자가 Runtime.getRuntime().exec() 또는 ProcessBuilder와 같은 시스템 명령 실행 함수를 포함한 악성 Jiffle 코드를 전송하면, 서버는 이를 정상적인 스크립트로 인식해 컴파일하고 OS 레벨의 임의 명령을 실행(RCE)하게 됩니다.

악용 가능성: 본 취약점의 공격 난이도는 매우 낮으며(Easy), 실제 악용 가능성은 극도로 높습니다. CVSS 벡터 AV:N/AC:L/PR:N/UI:N이 나타내듯, 인증되지 않은 외부 공격자가 네트워크를 통해 특수하게 조작된 Jiffle 스크립트를 전송하는 것만으로 권한 없이 즉시 RCE를 유발할 수 있는 조건입니다. 특히 EPSS 점수가 0.98739로 매우 높고 KEV(Known Exploited Vulnerabilities)에 등재되었다는 점은, 이론적 위험을 넘어 이미 야생에서 공격 도구가 보급되어 활발히 악용되고 있음을 입증합니다. 주요 공격 표면은 Jiffle 스크립트를 네트워크 요청으로 받아 처리하는 엔드포인트이며, 특히 GeoServer와 같은 다운스트림 프로젝트의 관련 파라미터가 핵심 타겟이 됩니다. 공격자는 Janino 컴파일러가 Jiffle 스크립트를 Java 코드로 변환하여 실행하는 메커니즘을 이용해 임의의 시스템 명령어를 주입합니다. 결과적으로 복잡한 전제 조건 없이 공개된 엔드포인트에 페이로드를 전달하는 것만으로 서버 제어권을 획득할 수 있어 매우 치명적입니다.

💥 영향 분석

  • 권한 탈취: Java 프로세스 권한으로 시스템 명령어가 실행되어 서버 전체 제어권 상실 가능.
  • 데이터 유출 및 파괴: 내부 파일 접근, 데이터베이스 연결 정보 탈취 또는 시스템 삭제 가능.
  • 횡적 이동: 침투한 서버를 거점으로 내부 네트워크의 다른 자산으로 공격 확대.

🔗 관련 취약점·체이닝

  • 패턴: '동적 코드 컴파일/평가(Dynamic Code Evaluation)' 패턴의 전형적인 RCE입니다.
  • 체이닝: 인증되지 않은 엔드포인트에서 Jiffle 스크립트 입력을 허용하는 경우, 별도의 인증 없이 즉시 시스템 권한을 획득하는 체인으로 이어집니다.

🔎 탐지

다중 소스 데이터 일관성이 확인되었으며, EPSS 0.98739 및 KEV 등재 사실은 이론적 심각도를 넘어 실제 공격이 매우 빈번하게 발생하고 있음을 의미합니다. 따라서 단순 로그 모니터링보다 실행 단계의 행위 탐지가 필수적입니다.

1. HTTP 요청 레벨 탐지 (WAF/IDS)

  • 지표: 요청 파라미터나 바디에 Java 클래스/메서드 호출 패턴이 포함된 경우.
  • 패턴(정규식): /(Runtime\.getRuntime\(\)\.exec|ProcessBuilder|java\.lang\.Runtime)/i
  • 의사코드: IF (request_body CONTAINS "Runtime.getRuntime().exec") THEN ALERT_CRITICAL

2. 시스템 콜 및 프로세스 생성 탐지 (EDR/SIEM)

  • 지표: Java 프로세스(java.exe 또는 java)가 비정상적인 자식 프로세스를 생성하는 행위.
  • SIEM 쿼리 예시:
    sql
    1SELECT timestamp, parent_process, child_process, command_line
    2FROM process_events
    3WHERE parent_process = 'java'
    4 AND child_process IN ('/bin/sh', '/bin/bash', 'cmd.exe', 'powershell.exe')
    5 AND (command_line LIKE '%curl%' OR command_line LIKE '%wget%' OR command_line LIKE '%whoami%')

3. JVM 내부 호출 탐지 (APM/Runtime Security)

  • 지표: java.lang.Runtime.exec 메서드의 호출 스택에 Janino 또는 jai-ext 관련 클래스가 포함된 경우.

오탐 튜닝 및 주의사항

  • 오탐 시나리오: 정상적인 애플리케이션 기능 중 외부 프로세스를 실행하는 로직이 있을 수 있음.
  • 튜닝: 화이트리스트 기반으로 허용된 command_line 패턴을 제외하고, 특히 /tmp 경로에서의 스크립트 실행이나 네트워크 연결 시도(curl, wget)가 결합된 경우에 가중치를 부여하여 탐지함.

🛡️ 완화 방안

본 취약점은 CVSS 10.0 및 EPSS 수치 기반으로 'Immediate(24시간 내)' 대응이 필요합니다.

1. 즉시 (긴급 차단): 시스템 콜 수준의 실행 제한

  • 조치: SELinux/AppArmor 프로파일을 적용하여 Java 프로세스의 exec 시스템 콜을 전역적으로 차단하거나, EDR의 'Runtime Protection' 기능을 통해 java 프로세스의 자식 프로세스 생성을 금지함.
  • 난이도: 중간 / 운영 영향: 높음(정상적인 외부 명령 실행 기능 마비 가능) / 검증: 공격 페이로드 전송 시 OS 레벨에서 Permission Denied 발생 확인.

2. 단기 (완화): 컴파일러 라이브러리 제거

  • 조치: 클래스패스(Classpath)에서 janino-x.y.z.jar 파일을 물리적으로 삭제하여 Jiffle 스크립트의 컴파일 경로를 원천 차단함.
  • 난이도: 낮음 / 운영 영향: 중간(Jiffle 스크립트를 사용하는 정상 기능 작동 중지) / 검증: 애플리케이션 재시작 후 스크립트 주입 시 ClassNotFoundException 또는 컴파일 에러 발생 확인.

3. 근본 (해결): 최신 버전 업데이트

  • 조치: jai-ext 라이브러리를 1.1.22 버전 이상으로 업데이트(GeoServer 사용자의 경우 해당 패치가 포함된 최신 릴리즈 적용).
  • 난이도: 낮음 / 운영 영향: 낮음 / 검증: 라이브러리 버전 확인 및 알려진 PoC를 통한 실행 불가 검증.

잔여 리스크
패치 이후에도 입력값 검증 로직이 미비할 경우, 다른 동적 평가 라이브러리를 이용한 유사 경로의 RCE 가능성이 존재하므로 지속적인 런타임 모니터링이 필요합니다.

⚖️ 위험도 / 우선순위

  • 조치: immediate (지금 즉시(24h 내))
  • 근거: CVSS=10.0 · KEV · EPSS=0.98739 · exploit=easy · in_scope=None
※ 본 분석은 Kestrel AI 심층 분석 결과입니다. 참고용이며, 실제 대응 전에는 전문가 검토가 필요합니다.

댓글(0)

댓글 작성 은 로그인 후 이용할 수 있어요.

다른 사용자의 댓글은 자유롭게 읽을 수 있어요.

로그인하기

불러오는 중…