Kestrel
CVE-2022-24816DGX_A· 2026년 8월 4일 AM 07:18

[공격] 분석 — CVE-2022-24816

CVE-2022-24816 enables unauthenticated RCE in JAI‑EXT < 1.1.22 via unvalidated Jiffle scripts; patch to ≥ 1.2.22 or remove Janino immediately.

📋 요약

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

🔍 공격 기법

  • 공격 표면: GeoServer·JAI‑EXT가 제공하는 HTTP API(예: WPS “Process” 호출, REST 엔드포인트)에서 script 파라미터에 Jiffle 코드를 전달할 수 있는 경우. 입력값이 전혀 검증되지 않으며 그대로 Janino 컴파일러에 넘겨진다.
  • 트리거 조건:
    1️⃣ 대상 서버가 jai‑ext 1.1.22 미만을 사용하고 클래스패스에 janino‑*.jar 가 존재함.
    2️⃣ 네트워크 접근 가능(공개 엔드포인트 혹은 내부망에서 직접 호출).
  • 단계별 흐름:
    1. 정찰 – WPS Capabilities, Swagger/REST 문서, HTTP OPTIONS 응답 등을 통해 script 파라미터 존재 여부와 허용 포맷을 확인한다.
    2. 초기 접근POST /geoserver/wps?service=WPS&request=Execute… 혹은 유사 REST 경로에 script=<악성 Jiffle> 를 포함해 전송. CVSS 벡터 AV:N/AC:L/PR:N/UI:N와 일치, 인증·사용자 상호작용 없이 바로 실행 가능.
    3. 컴파일 – Janino가 Jiffle 문자열을 Java 소스로 변환하고 메모리 내에서 ClassLoader.defineClass 로 로드한다. 이때 import java.lang.Runtime; Runtime.getRuntime().exec("cmd") 와 같은 코드가 포함될 수 있다(입력 검증 부재).
    4. 실행·권한 획득 – 로드된 클래스가 GeoServer 프로세스 권한(보통 geoserver 혹은 tomcat)으로 exec 또는 ProcessBuilder 를 호출해 시스템 명령을 실행한다. 결과는 파일 쓰기, 역순 쉘, 네트워크 연결 등 전면적인 RCE를 제공한다(CWE‑94).
    5. 지속 – 공격자는 /var/lib/geoserver/… 디렉터리에 웹쉘·시작 스크립트를 남기거나, 서비스 재시작 시 자동 로드되는 JAR/클래스를 배치하여 영구화한다.
  • 관측 지표:
    • 요청 본문에 import java. 혹은 Runtime.getRuntime().exec 와 같은 Java 코드 패턴이 포함된 경우.
    • Janino 로그에 “Generated class …” 가 비정상적으로 다수 기록됨.
    • 애플리케이션 로그에서 ClassLoader.defineClass 호출 빈도 급증.

악용 가능성: 이 취약점은 네트워크를 통한 원격 접근(AV:N)만으로도 악용 가능하고, 공격 단계가 간단해(AC:L) 인증이나 사용자 개입이 전혀 필요하지 않으며(PR:N/UI:N), 실제로 KEV에 등재돼 실제 악용 사례가 확인되었습니다. EPSS 점수 0.98739는 전 세계 환경에서 거의 매번 시도될 가능성을 의미하므로, 이론적 심각도와 별개로 실전 위협이 매우 높다고 볼 수 있습니다. 공격 표면은 GeoServer의 Jiffle 스크립트를 받아들이는 HTTP 엔드포인트(예: /rest/styles 또는 /jiffle)이며, 요청 본문이나 파라미터에 악성 Jiffle 코드를 삽입하면 Janino가 이를 Java 코드로 컴파일·실행합니다. 따라서 공격자는 단순히 정해진 URL에 POST 요청을 보내고, 스크립트 내용만 조작하면 원격 코드 실행이 즉시 이루어집니다. 인증 절차가 없으므로 사전 정찰 단계 없이 바로 초기 접근이 가능하고, 성공 시 시스템 권한으로 임의 코드를 실행할 수 있어 지속성 확보나 추가 침투까지 자연스럽게 연계됩니다. 이러한 전제조건만 충족하면 별도의 체이닝이나 우회 기술 없이도 완전한 RCE가 실현됩니다.

💥 영향 분석

성공 시 공격자는 대상 서버의 OS 레벨 권한으로 임의 명령을 실행할 수 있어, 민감 데이터 탈취·변조·삭제, 서비스 중단 및 내부 네트워크로의 피벗이 가능하다. RCE가 시스템 전체(S:C)에 영향을 미치므로 기밀성·무결성·가용성이 모두 심각하게 위협받는다.

🔗 관련 취약점·체이닝

  • CWE‑94 (Improper Control of Generation of Code) – 동적 컴파일/실행 구조 자체가 공격 표면.
  • 추정: 입력 검증 부재가 파일 업로드·디렉터리 트래버설 등과 결합될 경우, 웹쉘 배포 후 권한 상승(CWE‑269)으로 이어질 수 있다.
  • 추정: 동일 프로세스 내에 존재하는 다른 RCE/코드 인젝션 취약점(예: XML External Entity)과 연계하면 초기 접근 경로를 다변화할 가능성이 있다.

🔎 탐지

  • WAF/IPS에서 script= 파라미터에 포함된 import java.·Runtime.exec·ProcessBuilder 등 Java 코드 패턴을 감시한다.
  • 애플리케이션 로그에 JaninoCompiler.compile, ClassLoader.defineClass 가 비정상적으로 짧은 간격으로 반복될 경우 알림을 생성한다.
  • 호스트 기반 EDR에서 해당 Java 프로세스가 새로운 시스템 콜(execve)을 발생시키는 순간을 모니터링한다.

🛡️ 완화 방안

1️⃣ 즉시: jai‑ext 1.2.22 이상으로 업그레이드(패치에 의해 Jiffle 스크립트 컴파일이 비활성화).
2️⃣ 업그레이드 불가 시: 애플리케이션 클래스패스에서 janino‑*.jar 를 제거하여 동적 컴파일 자체를 차단한다.
3️⃣ 런타임 차단: SELinux/AppArmor 프로파일 또는 JVM SecurityManager 정책으로 java.lang.Runtime.exec·ProcessBuilder 호출을 전역 거부한다(즉시 적용 가능한 방어).
4️⃣ 입력 검증 강화(장기): Jiffle 파싱 단계에서 허용 함수/연산만 화이트리스트로 제한하고, 스크립트 길이·문자열 결합 우회 기법을 차단한다.
5️⃣ 네트워크 제한: 해당 WPS/REST 엔드포인트에 대한 외부 접근을 방화벽 규칙으로 차단하고, 요청 로깅을 강화한다.

다중 소스에서 일관성이 확인되었으며([교차검증]), EPSS 0.98739라는 거의 100%에 가까운 실제 악용 가능성 수치가 즉시 대응의 필요성을 강조한다([실측 악용예측]). KEV 등재와 CVSS 10.0 점수로 판단해 우선순위는 “immediate”(24시간 내)이다([우선순위 결정]).

⚖️ 위험도 / 우선순위

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

댓글(0)

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

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

로그인하기

불러오는 중…