Apache Tika XML外部实体注入漏洞(CVE-2025-66516)

环境搭建:

下载 3.2.1 漏洞版本

https://archive.apache.org/dist/tika/3.2.1/tika-app-3.2.1.jar

创建本地项目如下:

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.2.1</version>
</dependency>

<!-- Tika PDF Parser -->
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parser-pdf-module</artifactId>
<version>3.2。1</version>
</dependency>

Main.java

1
2
3
4
5
6
7
8
9
10
11
12
13
package org.example;

import org.apache.tika.Tika;
import java.io.File;

public class Main {
public static void main(String[] args) throws Exception {
// 请将文件路径替换为实际的PDF文件路径
Tika tika = new Tika();
String txt = tika.parseToString(new File("C:\\your\\xfa_passwd.pdf"));
System.out.println(txt);
}
}
漏洞分析:

查看漏洞补丁:在 XMLReaderUtils.getXMLInputFactory() 方法中,只设置了基本属性,但没有禁用DTD和外部实体

https://github.com/apache/tika/commit/bfee6d5569fe9197c4ea947a96e212825184ca33

跟踪漏洞流程:parseToString() 方法作用就是将一个文件解析为字符串

初始化阶段:创建WriteOutContentHandler(限制输出)和ParseContext(配置容器)

解析阶段:通过this.parser.parse()方法,将内容处理器和上下文传递给解析器

内容处理:解析器将提取的文本内容写入WriteOutContentHandler

结果返回:最终通过handler.toString()获取限制长度的解析结果

org.apache.tika.Tika#parseToString(java.io.InputStream, org.apache.tika.metadata.Metadata, int)

跟进 this.parser.parse 方法(org.apache.tika.parser.AutoDetectParser#parse) -> org.apache.tika.parser.CompositeParser#parse,此处会根据上传文件类型选择对应的 Parser

继续跟进到 PDFParser,负责PDF文件的一系列配置、文档加载、元数据提取、内容解析等处理,然后进入到PDF2XHTML.process 分支

org.apache.tika.parser.pdf.PDFParser#parse

org.apache.tika.parser.pdf.PDF2XHTML#process

org.apache.pdfbox.text.PDFTextStripper#writeText

最终跟进到 this.endDocument,此处会调用 this.extractAcroForm(pdf)

org.apache.tika.parser.pdf.AbstractPDF2XHTML#endDocument

extractAcroForm 负责从PDF文档中提取并处理 XFA(XML Forms Architecture)表单:

  1. 获取文档目录和表单

  2. XFA表单处理

  3. 创建XFA数据流

  4. 解析XFA数据:xfaExtractor.extract()

org.apache.tika.parser.pdf.AbstractPDF2XHTML#extractAcroForm

跟进可以看到调用 XMLReaderUtils.getXMLInputFactory 来处理表单,而该方法在补丁前是没有禁止外部实体。

org.apache.tika.parser.pdf.XFAExtractor#extract

漏洞复现: