[방어] 분석 — CVE-2022-24816
Critical remote code execution in JAI‑EXT before 1.1.22 can be blocked immediately by removing the Janino library from the classpath, while long‑term protection requires upgrading and input validation of Jiffle scripts.
📋 요약
- 심각도 critical · CVSS 10.0 · EPSS 0.98739 · 악용난이도 easy · KEV
🔍 공격 기법
네트워크 요청의 script 파라미터에 악의적인 Jiffle 코드를 삽입하면, JAI‑EXT는 내부적으로 Janino 컴파일러를 호출해 해당 스크립트를 Java 바이트코드로 변환한다. 변환된 클래스 안에 Runtime.getRuntime().exec() 혹은 new ProcessBuilder()와 같은 시스템 명령 실행 API가 포함되면, 컴파일 직후 즉시 실행되어 원격 코드 실행(RCE)이 이루어진다. 공격자는 인증·사용자 상호작용 없이 네트워크만 접근하면 된다.
악용 가능성: 이 취약점은 네트워크를 통한 원격 공격(AV:N)이 가능하고, 공격자는 별도의 권한 상승 없이 바로 실행할 수 있으므로(PR:N) 난이도가 낮습니다(AC:L). 사용자 인터페이스가 자동으로 스크립트를 처리하도록 설계돼 있어 UI 상호작용이 필요하지 않으며(UI:N), 이는 완전 원격 코드 실행을 즉시 가능하게 합니다. EPSS 점수가 0.98739로 매우 높고, KEV에 등재된 실증적 악용 사례가 존재하므로 이론적인 CVSS 점수와 별개로 실제 위협이 크게 현실화되고 있습니다. 공격자는 HTTP(S) 요청의 파라미터(예: jiffleScript 혹은 유사한 필드)에 임의의 Jiffle 스크립트를 삽입하면, Janino 컴파일러가 이를 Java 코드로 변환해 바로 실행하게 됩니다. 따라서 노출되는 공격 표면은 GeoServer 또는 해당 라이브러리를 사용하는 웹 서비스의 REST 엔드포인트이며, 요청 본문 혹은 쿼리 문자열에 스크립트를 전달할 수 있는 모든 경로가 대상이 됩니다. 이러한 조건만 충족하면 별도의 인증 절차 없이 원격 코드 실행이 가능하므로 공격 난이도는 “easy” 수준으로 평가됩니다.
💥 영향 분석
- 성공 시 Java 프로세스가 임의의 OS 명령을 실행해 시스템 전체 권한을 획득한다.
- 민감 데이터 탈취, 서비스 중단, 추가 악성 코드 배포 등 전방위적인 비즈니스 리스크가 발생한다.
- GeoServer와 연동된 GIS 파이프라인 전반에 영향을 미칠 수 있다.
🔗 관련 취약점·체이닝
- Janino 기반 동적 컴파일을 사용하는 다른 Java 라이브러리에서도 동일한
Runtime.exec경로가 존재하면 연쇄 공격에 이용될 가능성이 있다. - OS‑level EDR/AV와 결합해 악성 바이트코드 실행 전후의 행위를 감시·차단할 수 있다.
🔎 탐지
로그 지표
- Web Access Log:
script파라미터에runtime\.getruntime\(\)\.exec혹은processbuilder문자열이 포함된 요청. 필드 예)request.body,query_string. - Janino 컴파일 로그(애플리케이션 로깅 활성화 시): “Compiling Jiffle script” 뒤에
Runtime.getRuntime또는ProcessBuilder단어가 나타나는 행. 정규식:(?i)Compiling\s+Jiffle.*\b(Runtime\.getRuntime|ProcessBuilder)\b. - Linux audit / SELinux AVC: Java 프로세스(
exe="/usr/bin/java")가execve시스템 콜을 시도한 이벤트.
SIEM 쿼리 예시
- Elastic/Kibana (Lucene)
text1request.path:/jiffle/ AND (request.body:*runtime\.getruntime\(\)\.exec* OR request.body:*processbuilder*)
- Splunk (Linux audit)
text1index=linux_audit sourcetype=auditd exe="/usr/bin/java" evt.type="EXECVE"
오탐 시나리오 및 튜닝
- 개발·테스트 환경에서 정상적인 Jiffle 스크립트가
Runtime.exec를 활용하는 경우 false positive가 발생한다. → 호스트 태그(env=dev)와 매칭해 해당 인덱스를 제외하거나, “허용 목록”에 내부 GIS 클라이언트 IP를 추가한다. - 일반 이미지 처리 파이프라인은
Runtime.exec를 사용하지 않으므로 위 패턴의 신뢰도는 높다; 오탐률을 낮추기 위해 최소 문자열 길이(예: ≥20자)와 함께script=파라미터 존재 여부를 조건에 추가한다.
🛡️ 완화 방안
즉시(긴급 차단)
- Janino 라이브러리 제거:
janino‑*.jar파일을 애플리케이션 배포 디렉터리·클래스패스에서 삭제하고 서비스 재시작.- 난이도 ★★ (배포 패키지 수정·재시작)
- 운영 영향: Jiffle 스크립트 컴파일 기능 전면 비활성화 → 이미지/레스터 처리 일부 제한.
- 검증 방법: 애플리케이션 시작 로그에 “Janino not found” 메시지가 출력되는지 확인.
단기(완화)
-
SecurityManager / JVM 정책 적용:
java.security.policy에permission java.lang.RuntimePermission "exec";를 부여하지 않아Runtime.exec와ProcessBuilder호출을 차단한다.- 난이도 ★★★ (JVM 옵션 및 재배포)
- 운영 영향: 기존 코드가
Runtime.exec를 사용하면AccessControlException발생, 기능 점검 필요. - 검증 방법: 의도적인 명령 실행 테스트 시 예외 발생 확인.
-
WAF 규칙 추가: HTTP 요청 본문·쿼리스트링에
runtime\.getruntime\(\)\.exec또는processbuilder문자열이 포함될 경우 차단 응답(403) 반환.- 난이도 ★ (규칙 한 줄 추가)
- 운영 영향: 정상적인 Jiffle 스크립트 전송도 차단될 수 있음 → 허용 목록 및 패턴 조합으로 튜닝 필요.
근본(해결)
- 패치 적용 / 업그레이드:
geosolutionsgroup jai-ext를 1.1.22 이상 버전으로 업데이트한다. 해당 버전은 Janino 기반 코드 인젝션을 비활성화한다.- 난이도 ★★ (버전 교체·테스트)
- 운영 영향: 기존 Jiffle 스크립트 기능 복구, 서비스 재시작 필요.
- 검증 방법: 취약점 확인용 테스트 스크립트를 전송했을 때 컴파일 오류가 발생하고 실행되지 않음 확인.
우선순위 및 적용 로드맵
- 즉시 조치 – Janino 제거 (24시간 내).
- 단기 – SecurityManager 정책 및 WAF 규칙 적용 (패치 전까지 48‑72시간 내).
- 근본 – 정식 패치/업그레이드 수행 (가능한 가장 빠른 릴리즈 사이클에 맞춰).
잔여 리스크
- Janino 제거 시 Jiffle 스크립트 기능이 완전히 차단되므로, 해당 기능을 필요로 하는 서비스는 대체 로직을 마련해야 한다.
- SecurityManager 정책은 JVM 전체에 영향을 미치므로, 다른 애플리케이션에서
Runtime.exec가 정상적으로 사용되는 경우 추가 예외 규칙이 필요할 수 있다.
인시던트 대응 플레이북 (초기 확인 단계)
- SIEM 알람 발생 시 해당 요청의
script파라미터와 IP를 추출한다. - 해당 호스트의 audit 로그에서
execve시도 여부를 확인한다. - 즉시 Janino 라이브러리가 존재하면 삭제하고 서비스 재시작한다.
- 공격자 IP 차단 및 WAF 규칙 적용 후, 추가 침해 흔적(파일 생성·네트워크 연결 등)을 조사한다.
우선순위 결정 근거
- CVSS 10.0·KEV 등재·EPSS 0.98739·공격 난이도 easy 로 판단되어 “immediate (24h 내)” 대응이 규칙 기반으로 상향되었다(다중 소스 교차검증 결과 일관).
⚖️ 위험도 / 우선순위
- 조치: immediate (지금 즉시(24h 내))
- 근거: CVSS=10.0 · KEV · EPSS=0.98739 · exploit=easy · in_scope=None