CVE-2025-24813: Apache Tomcat Partial PUT RCE
Apache Tomcat에 존재하는 치명적인 취약점으로 인해, 단 2개의 HTTP 요청만으로 인증되지 않은 원격 코드 실행이 가능합니다. 이 공격은 Tomcat의 partial PUT 기능을 악용해 직렬화된 Java 객체를 업로드한 다음, GET 요청을 통해 역직렬화를 트리거합니다. CVSS 9.8. 기본 구성의 Tomcat 9, 10, 11에 영향을 미칩니다.
| 속성 | 값 |
|---|---|
| CVE ID | CVE-2025-24813 |
| CVSS 벡터 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-502: 신뢰할 수 없는 데이터의 역직렬화 |
| 공개일 | 2025년 3월 10일 |
| 익스플로잇 현황 | 활발히 악용 중 — 공개 후 30시간 내 PoC 공개 |
CVE-2025-24813이란?
Apache Tomcat는 대용량 파일을 세그먼트로 나눠 업로드할 수 있게 하는 HTTP 기능인 "partial PUT"을 지원합니다 — Content-Range 헤더를 사용합니다. Tomcat은 이러한 부분 업로드를 작업 디렉터리에 임시 파일로 저장합니다. 이 구현에는 두 가지 결함이 존재합니다:
- 임시 파일명은 업로드 URL 경로에서 파생되며, 이는 부분적으로 공격자가 제어할 수 있습니다
- Java 세션 지속성 메커니즘이 활성화되어 있는 경우(세션을 파일로 저장), Tomcat은 작업 디렉터리에서
.session확장자를 가진 모든 파일을 역직렬화할 수 있습니다
공격자는 이러한 결함들을 조합해 부분 업로드로 위장한 악성 직렬화 Java 객체를 업로드한 다음, Tomcat이 세션 조회로 해석하는 URL을 요청해 그 역직렬화를 트리거할 수 있습니다.
🚨 30시간 만에 공개된 PoC
CVE-2025-24813이 공개된 지 약 30시간 만에 작동하는 익스플로잇이 GitHub에 게시되었습니다. 이 2-요청 공격은 자동화하기가 매우 쉬워, 며칠 만에 대규모 악용 캠페인이 관찰되었습니다. 기본 구성을 사용하는 미패치 인터넷 노출 Tomcat 서버는 모두 침해된 것으로 간주해야 합니다.
영향받는 버전
| Tomcat 버전 | 영향받는 범위 | 수정된 버전 |
|---|---|---|
| Apache Tomcat 11.x | 11.0.0-M1 ~ 11.0.2 | 11.0.3+ |
| Apache Tomcat 10.x | 10.1.0-M1 ~ 10.1.34 | 10.1.35+ |
| Apache Tomcat 9.x | 9.0.0.M1 ~ 9.0.98 | 9.0.99+ |
RCE를 위한 전제 조건: 두 조건이 모두 충족되어야 합니다:
- 기본 서블릿의 쓰기가 활성화되어 있음(
readonly=false) — 기본값이 아니며, 명시적으로 구성되어야 함 - 파일 기반 세션 지속성이 구성되어 있음 — 또는 partial PUT 쓰기가 역직렬화 가능한 경로에 도달함
전제 조건에 대한 참고: 일부 자료는 초기에 전제 조건이 엄격하다고 보고했습니다. 하지만 실제 환경 분석 결과, 일부 일반적인 Tomcat 구성(일부 애플리케이션 서버 배포판 포함)이 두 조건을 모두 충족하는 것으로 나타났습니다. 조건 충족 여부와 관계없이 패치하세요 — CVSS 점수는 최악의 조건을 반영합니다.
2-요청 공격
# 요청 1: 조작된 직렬화 객체를 partial PUT으로 업로드 PUT /.xxxxx HTTP/1.1 Host: target.com Content-Type: application/octet-stream Content-Range: bytes 0-1233/1234 Content-Length: 1234 [serialized Java gadget chain payload — e.g., Commons Collections] # Tomcat은 이를 work 디렉터리에 임시 파일로 저장함 # URL에서 파생된 파일명: .xxxxx → partial upload로 저장됨 # 요청 2: 세션 조회를 통해 역직렬화 트리거 GET /.xxxxx HTTP/1.1 Host: target.com Cookie: JSESSIONID=.xxxxx # Tomcat이 세션 ID와 일치하는 세션 파일을 조회함 # 공격자의 파일을 찾음 → 역직렬화 실행 → RCE
Tomcat이 고가치 표적인 이유
Apache Tomcat은 전 세계에서 가장 널리 배포된 Java 애플리케이션 서버 중 하나로, 다음과 같은 곳에서 사용됩니다:
- 기업용 Java 웹 애플리케이션
- WAR 파일로 배포된 Spring Boot 애플리케이션
- 레거시 J2EE 애플리케이션
- 내부 HR, ERP, 업무용 애플리케이션
- 클라우드 네이티브 마이크로서비스
Tomcat에서의 RCE는 흔히 그 위에서 실행되는 애플리케이션이 보유한 데이터베이스 자격 증명, 내부 API, 민감한 비즈니스 데이터에 대한 접근을 의미합니다.
탐지
# Tomcat 버전 확인 /opt/tomcat/bin/version.sh # 또는 catalina.jar manifest 확인 unzip -p /opt/tomcat/lib/catalina.jar META-INF/MANIFEST.MF | grep Implementation-Version # 접근 로그에서 의심스러운 partial PUT 업로드 확인 grep 'PUT' /opt/tomcat/logs/localhost_access_log.* | grep -v '200\|201\|204' grep 'PUT.*Content-Range' /opt/tomcat/logs/localhost_access_log.* # Tomcat work 디렉터리에서 비정상적인 파일 확인 find /opt/tomcat/work -name "*.session" -newer /opt/tomcat/conf/server.xml find /opt/tomcat/work -type f -newer /opt/tomcat/conf/server.xml # 기본 서블릿 쓰기가 활성화되어 있는지 확인 grep -r "readonly" /opt/tomcat/conf/web.xml /opt/tomcat/webapps/
완화 방안
- 즉시 패치: Tomcat 9.0.99+, 10.1.35+, 또는 11.0.3+로 업그레이드하세요
- 필요하지 않다면 기본 서블릿 쓰기 비활성화:
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>readonly</param-name> <param-value>true</param-value> <!-- 이 값이 true인지 확인하세요 --> </init-param> </servlet> - 파일 기반 세션 지속성 비활성화: 인메모리 또는 데이터베이스 기반 세션 지속성으로 전환하세요
- WAF 규칙 배포: 다음을 포함하는 HTTP PUT 요청 차단:
Content-Range헤더가 불필요한 경우 - Java 역직렬화 필터 사용: Java 9+ 직렬화 필터를 구성해 역직렬화 가능한 클래스를 제한하세요
KENSAI 탐지 역량
- Tomcat 버전 탐지: KENSAI는 모든 인터넷 노출 자산에서 HTTP 헤더, 오류 페이지, 기본 경로를 통해 Apache Tomcat 버전을 핑거프린팅합니다
- 안전한 익스플로잇 프로브: 페이로드를 실행하지 않고도 CVE-2025-24813의 익스플로잇 가능 여부를 확인합니다
- 구성 점검: 쓰기 활성화된 기본 서블릿과 파일 기반 세션 지속성의 존재 여부를 확인합니다
- 내부 탐색: 에이전트 또는 네트워크 스캐닝을 통해 내부 네트워크에서 실행 중인 Tomcat 인스턴스를 찾아냅니다
- 자동 재테스트: 해결 조치 이후 패치 적용 여부를 확인합니다
공격자보다 먼저 노출된 Tomcat 서버를 찾아보세요
KENSAI는 환경 내 모든 Apache Tomcat 인스턴스를 식별하고 CVE-2025-24813을 비롯한 기타 치명적인 Java 애플리케이션 서버 취약점을 테스트합니다.
Tomcat 취약점 스캔하기 →