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 코드
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 |















