如何禁用XXE处理?

2022-12-19 0 225

如何禁用XXE处理?
如何禁用XXE处理?

在我的上一则该文中,我谈及了在现阶段盛行的开放源码工程项目中辨认出的XXE安全可靠漏洞,和怎样更全面性地评估结果此类难题。那时我将探讨停止采用XXE处置的三种思路。

外部虚拟(XXE)和外部虚拟对构筑简约的XML文件格式十分关键。防止出现XXE安全可靠漏洞的适度配套措施依赖于您的工程项目须要。它能像全然停止采用外部虚拟那样单纯,也能只对您须要的虚拟和信赖的虚拟展开稍稍繁杂一点儿的处置就能有效率化解。

与任何人其它被科学研究的词汇较之,Java词汇,特别是JAXP API,为他们提供更多了更多的快捷键,因此他们的标识符实例和软件系统将主要就采用Java词汇来展开,但他们也展现了其它词汇与Java词汇具备等同效用的软件系统。

停止采用DOCTYPE

前文文所说,虚拟是在XML文件格式的DOCTYPE中新闻稿的,因而当工程项目中不须要DOCTYPE新闻稿时,单纯而安全可靠的软件系统是全然停止采用此类虚拟。

当增设为true时,disallow doctype decl机能命令XML处置器在遇到doctype新闻稿时引起极度:

factory.setFeature(“http://apache.org/xml/features/disallow-doctype-decl”, true);

停止采用外部虚拟新闻稿

一类不太程序化的软件系统是容许DOCTYPE新闻稿,而只明令禁止外部虚拟新闻稿。因而,假如找出外部虚拟,XML处置器会引起极度,但会恒定处置其它DTD新闻稿。透过将下列三个机能都增设为false,能停止采用模块和常规性外部虚拟:

factory.setFeature(“http://xml.org/sax/features/external-general-entities”, false);factory.setFeature(“http://xml.org/sax/features/external-parameter-entities”, false);

PHP的libxml库在默认情况下是安全可靠的,因为外部虚拟被停止采用,除非LIBXMLNOENT模块显式增设为容许状态:

$doc = simplexmlloadstring($xml,”SimpleXMLElement”, LIBXMLNOENT);//!XXE enabled!$doc = simplexmlloadstring($xml,”SimpleXMLElement”);// XXE disabled

注:LIBXMLNOENT模块名称具备误导性,因为它不会在DOM树中创建虚拟引用节点来解释“NOENT”后缀,而是用该模块的内容对虚拟展开替换。

启用安全可靠处置

能按如下方式显示启用 Java JAXP 安全可靠处置机能(FSP):

factory.setFeature(XMLConstants.FEATURESECUREPROCESSING, true);

该机能透过应用限制来安全可靠配置XML处置器的中央Java机制,以防止存在XML拒绝服务攻击和XXE安全可靠漏洞等潜在风险。

在默认情况下,FSP部分启用,可防止XML拒绝服务攻击。然而,只有当透过调用setFeature方法将FSP属性增设为true并显示全然启用FSP时,外部连接才会被明令禁止。但实际情况下,并非所有的XML处置器均如此操作,例如在Apache Xerces上,FSP不限制外部连接,因而无法防止XXE安全可靠漏洞。

因而,请务必测试有关XXE安全可靠漏洞的FSP行为,并采用其它属性(例如他们在本文中介绍的其它属性)来明确停止采用或限制XXE。

停止采用虚拟引用扩展

对每个虚拟引用(&entityname;)能在XML文件格式中找出,DOM XML解析器能用其值替换引用,也能在DOM树中创建一个“empty”虚拟引用节点,具体选择依赖于配置情况。利用虚拟引用的值替换虚拟引用的机制,也被称之为“扩展虚拟引用”,在解析恶意构筑的XML文件时,可能会泄露敏感信息,这点与他们在本系列的第一则该文中探讨的内容一致。

在 Java 中,DocumentBuilder 工厂的 setExpandEntityReferences 方法用于配置虚拟引用方式:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();factory.setExpandEntityReferences(false);

当采用false调用时,不会扩展虚拟引用,从而能够有效率防止XXE安全可靠漏洞。

须要重点强调的一点儿是,OpenJDK13之前版本提供更多的Xerces处置器不支持将expandEntityReferences属性增设为false;因此须要扩展虚拟引用。实际上最好的配套措施是对OpenJDK展开升级,但假如未对其展开升级,规则S2755能够检测到它们。

C/C++ Xerces库的等效机能是:

xercesc::XercesDOMParser *DOMparser = new xercesc::XercesDOMParser();DOMparser->setCreateEntityReferenceNodes(true);

创建虚拟引用节点意味着虚拟引用不会被扩展,因而不会导致外部内容泄露。但要实现正确增设可能存在很多困难,因为这些方法名称不属于那种清晰易懂的类型,因而很容易发生概念混淆。例如,他们最近为改进OWASP C++指南做出了很多努力。之前的情况曾错误地建议将此模块增设为“false”而非“true”。

因而,假如您仍然依赖之前的OWASP建议,将激活C++规则S2755。例如,msix-packaging微软开放源码工程项目就是一个用于打包和解压MSIX包的C++工具:

如何禁用XXE处理?

险可被视为很低,因为攻击者只能展开“盲目的SSRF”攻击。假如您认为此观点不可接受,那么您须要对上文探讨的任一软件系统展开考虑。

注:在假设XML处置器能访问此API(https://internal.network/private/username/admin)的情况下,当攻击者欺骗服务器(在本例中为XML处置器)执行任意请求而无法检索响应内容时,就会发生盲目的SSRF。

继而攻击者能对该API端点执行请求。在该案例的最差情况下,攻击者可能够窃取用户名信息,具体情况依赖于XML处置器的错误处置程度。

结语

在本篇该文中,他们知道了怎样配置您的XML解析器从而有效率防止XXE安全可靠漏洞,从停止采用XXE新闻稿(假如您根本不须要这类新闻稿)到停止采用引用扩展(假如您须要并希望取得XXE新闻稿但不容许用其替换时),有时您的工程项目可能须要更灵活和更精确的修复来对特定XXE解析展开控制和设定限制,这些XXE分析是您所期望的并且是安全可靠的。这是他们将在第三篇也是最后一则该文中见到的内容。

作者简介:

如何禁用XXE处理?

ERIC THEROND

安全可靠科学研究人员

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务