
교육 목적으로만 사용되는 CVE-2025-66516 Apache Tika 취약점에 대한 PoC
이 저장소는 Apache Tika 3.2.2 미만 버전의 XML External Entity (XXE) 주입 취약점인 CVE-2025-66516에 대한 개념 증명 (POC) 익스플로잇을 포함합니다. 이 취약점은 tika-parser-pdf-module 컴포넌트의 XFA (XML Forms Architecture) 파서에 영향을 미치며, 공격자가 악의적으로 조작된 PDF 문서를 통해 로컬 파일을 읽고 민감한 데이터를 유출할 수 있게 합니다.
CVE-2025-66516은 Apache Tika의 PDF 파싱 기능에 존재하는 심각한 보안 취약점입니다. Tika 3.2.2 이전 버전은 내장된 XFA 양식이 있는 PDF 파일을 처리할 때 XML 파서의 외부 엔터티 처리를 적절히 제한하지 못합니다. 이를 통해 공격자는 다음과 같은 작업을 수행할 수 있습니다:
이 저장소에는 다음이 포함됩니다:
Apache Tika XXE, CVE-2025-66516 exploit, Tika security vulnerability, XML External Entity attack, PDF XXE injection, Tika 3.2.1 vulnerability, out-of-band XXE, OOB XXE, security research, penetration testing, POC exploit, vulnerability disclosure, XFA parser vulnerability, tika-parser-pdf-module, file disclosure vulnerability, data exfiltration, SSRF attack, secure coding, vulnerability analysis, security testing, ethical hacking, infosec, cybersecurity research, Apache Tika exploit code, XXE payload, PDF security, document parser vulnerability
참고: 이 POC는 다음 환경에서 테스트 및 검증되었습니다:
먼저 POC 전용 디렉토리를 생성하여 모든 파일을 정리합니다.
mkdir apache_tika_poc
cd apache_tika_poc
POC를 진행하기 전에 환경에 필요한 종속성이 있는지 확인합니다. 다음 명령은 Java 컴파일러/런타임 버전과 OS 세부 정보를 표시하며, 이는 취약점 재현에 중요합니다.
# Java 버전 확인
java -version
javac -version
# OS 버전 확인
lsb_release -a
예상 출력: Java 버전 정보 (예: OpenJDK 17.x.x) 및 Ubuntu 버전 세부 정보 (24.04.3 LTS)가 표시되어야 합니다.
취약 버전 (3.2.1)과 패치 버전 (3.2.2)을 각각 다운로드합니다. 두 버전이 모두 필요하며, XXE 취약점이 3.2.1에 존재하고 3.2.2에서 수정되었음을 입증해야 합니다. tika-app JAR은 모든 Tika 파서와 종속성을 포함하는 올인원 실행 파일입니다.
# 취약한 Tika 버전 다운로드
wget https://repo1.maven.org/maven2/org/apache/tika/tika-app/3.2.1/tika-app-3.2.1.jar
# 패치된 Tika 버전 다운로드
wget https://repo1.maven.org/maven2/org/apache/tika/tika-app/3.2.2/tika-app-3.2.2.jar
예상 출력: 두 개의 JAR 파일 (tika-app-3.2.1.jar ~75MB, tika-app-3.2.2.jar ~75MB)이 다운로드됩니다.
JAR 매니페스트 파일을 검사하여 정확한 버전을 확인합니다. 이는 테스트 전 올바른 취약/패치 버전을 확인하는 절차입니다.
# 취약 버전 매니페스트 확인
unzip -p tika-app-3.2.1.jar META-INF/MANIFEST.MF
# 패치 버전 매니페스트 확인
unzip -p tika-app-3.2.2.jar META-INF/MANIFEST.MF
예상 출력: 각각 Implementation-Version: 3.2.1 및 3.2.2를 보여주는 매니페스트 파일과 빌드 타임스탬프 등 기타 메타데이터가 표시됩니다.
프로젝트 오브젝트 모델 (Maven의 POM 속성은 프로젝트의 종속성, 빌드 구성 및 메타데이터를 정의)을 살펴보면 보안 권고에서 언급된 별도의 tika-parsers가 없음을 알 수 있습니다. 이는 버전 관련 사항일 수 있으며, POC의 대상인 3.2.1 및 3.2.2 버전에서는 tika-parsers 모듈이 개별 파서 모듈로 대체된 것으로 추정됩니다.
# 두 버전의 모든 pom.properties 파일 나열
unzip -l tika-app-3.2.1.jar | grep pom.properties | grep tika
unzip -l tika-app-3.2.2.jar | grep pom.properties | grep tika
예상 출력: tika-core, tika-parser-pdf-module, tika-xmp 등 모든 Tika 컴포넌트 모듈 목록이 표시됩니다. 단일 tika-parsers 모듈 대신 개별 파서 모듈이 있음을 확인할 수 있습니다.
핵심 Tika 컴포넌트의 버전 정보를 추출하여 표시합니다. 이는 내부 모듈 구조를 이해하고 핵심 라이브러리와 PDF 파서 모듈이 모두 예상 버전인지 확인하는 데 도움이 됩니다.
# 3.2.1의 tika-core, tika-parser-pdf-module, tika-app 버전 확인
unzip -p tika-app-3.2.1.jar META-INF/maven/org.apache.tika/tika-core/pom.properties && echo "---" && unzip -p tika-app-3.2.1.jar META-INF/maven/org.apache.tika/tika-parser-pdf-module/pom.properties && echo "---" && unzip -p tika-app-3.2.1.jar META-INF/maven/org.apache.tika/tika-app/pom.properties
# 3.2.2의 tika-core, tika-parser-pdf-module, tika-app 버전 확인
unzip -p tika-app-3.2.2.jar META-INF/maven/org.apache.tika/tika-core/pom.properties && echo "---" && unzip -p tika-app-3.2.2.jar META-INF/maven/org.apache.tika/tika-parser-pdf-module/pom.properties && echo "---" && unzip -p tika-app-3.2.2.jar META-INF/maven/org.apache.tika/tika-app/pom.properties
예상 출력: 각 컴포넌트에 대해 version=3.2.1 또는 version=3.2.2를 보여주는 POM 속성이 ---로 구분되어 표시됩니다. 세 컴포넌트(tika-core, tika-parser-pdf-module, tika-app) 모두 전체 버전과 일치해야 합니다.
XXE 공격의 대상이 될 가상의 시크릿 파일을 생성합니다. 이 파일은 공격자가 XXE 취약점을 통해 유출하려고 시도할 수 있는 민감한 데이터 (예: API 키 또는 자격 증명)를 시뮬레이션합니다.
# 대상 시크릿 파일 생성
echo "INTERNAL_SERVER_KEY=EXPOSED" > fake-secrets.txt
예상 출력: INTERNAL_SERVER_KEY=EXPOSED 문자열이 포함된 fake-secrets.txt 파일이 생성됩니다. 이 파일은 XXE 익스플로잇에 의해 읽힙니다.
수정 사항을 이해하려면 두 버전의 XMLReaderUtils 클래스를 디컴파일하여 비교해야 합니다. 이 클래스는 XML 파서를 생성하는 역할을 하며, 취약점은 XML 엔터티 처리 구성 방식에서 비롯됩니다.
# 분석을 위해 취약 JAR 추출
mkdir tika-3.2.1-extract && cd tika-3.2.1-extract && unzip -q ../tika-app-3.2.1.jar && cd ..
# 분석을 위해 패치 JAR 추출
mkdir tika-3.2.2-extract && cd tika-3.2.2-extract && unzip -q ../tika-app-3.2.2.jar && cd ..
# 취약 클래스 디컴파일
cd tika-3.2.1-extract && javap -c org/apache/tika/utils/XMLReaderUtils.class > ../XMLReaderUtils-3.2.1.txt && cd ..
# 패치 클래스 디컴파일
cd tika-3.2.2-extract && javap -c org/apache/tika/utils/XMLReaderUtils.class > ../XMLReaderUtils-3.2.2.txt && cd ..
# 버전 비교
diff -u XMLReaderUtils-3.2.1.txt XMLReaderUtils-3.2.2.txt
예상 출력: 추출 시 디컴파일된 클래스 파일이 포함된 두 개의 디렉토리가 생성됩니다. javap 명령은 XMLReaderUtils 클래스의 바이트코드 디스어셈블리를 생성합니다. diff 명령은 버전 간 XML 파서 구성의 차이점을 보여줍니다.
신중하게 비교하면 3.2.2에서 Doctype 정의(DTD) 및 외부 엔터티 지원이 비활성화되었음을 알 수 있습니다. 이것이 수정의 핵심입니다:
diff -u XMLReaderUtils-3.2.1.txt XMLReaderUtils-3.2.2.txt | grep -A2 -B2 "accessExternalDTD\|supportDTD\|isSupportingExternalEntities"
예상 출력: 3.2.2에서 DTD 처리 및 외부 엔터티 해석을 비활성화하는 호출이 추가되었음을 보여주는 diff 출력이 표시됩니다. accessExternalDTD를 빈 문자열로 설정하고 supportDTD를 false로 설정하는 줄을 찾으십시오.
이는 악성 PDF가 서버 파일 시스템의 로컬 파일을 읽는 고전적인 XXE 공격을 보여줍니다. Python 스크립트는 XXE 페이로드 ( file:///fake-secrets.txt 참조)가 포함된 XML이 포함된 XFA 양식이 포함된 PDF를 생성합니다.
# 악성 PDF 생성
python3 ./gen_poc.py
# 취약한 Tika 3.2.1로 테스트
java -jar tika-app-3.2.1.jar -t cve_2025_66516_poc.pdf
# 패치된 Tika 3.2.2로 테스트
java -jar tika-app-3.2.2.jar -t cve_2025_66516_poc.pdf
예상 출력:
gen_poc.py가 XXE 페이로드가 포함된 cve_2025_66516_poc.pdf를 생성합니다.INTERNAL_SERVER_KEY=EXPOSED (시크릿 파일의 내용!)가 포함됩니다.이는 대역 외 (OOB) 데이터 유출을 사용하는 보다 정교한 XXE 공격을 보여줍니다. 악성 PDF는 응답에 파일 내용을 반영하는 대신 Tika가 데이터를 공격자가 제어하는 외부 서버로 보내도록 강제합니다. 이 기술은 애플리케이션이 파싱된 콘텐츠를 반환하지 않는 경우에도 작동합니다.
# 대역 외 XXE PDF 생성
python3 ./gen_oob_poc.py