本日,XML 外部实体 (XXE) 漏洞仍旧无处不在,只管多年来针对这些漏洞供应保护的建议一贯是安全标准的一个组成部分。在本篇文章中,我们将考试测验揭开 XXE 漏洞的神秘面纱,并先容我们为帮助您检测和预防它们而制订的规则。
01
概述

XML 实体是在 XML 文档的文档类型定义 (DOCTYPE) 中声明的。如果一个实体的值是从文档内部检索的,那么它便是内部的,如果它的值是一个URI,那么它便是外部的。当随后在 XML 文档中利用实体引用时,该引用被为其检索的值所取代。例如,以下 XML 文档通过 URI 从文件中检索 xxe 实体的值,然后将其内容嵌入到文档中:
处理 XML 文件的运用程序该当心将外部实体限定为授权的文件系统和网络资源,否则会为任意文件透露和做事器端要求假造 (SSRF) 攻击打开大门:
把稳:实体可以是通用的,如上图,也可以是参数实体。两者之间的唯一差异是参数实体仅在 DTD 中定义和利用。
02
如何检测 XXE 漏洞?
用规则 S2755 来补救
为了帮助开拓职员理解该主题,规则S2755中的 “XML 解析器不应随意马虎受到 XXE 攻击”适用于 SonarLint、SonarCloud 和所有版本的 SonarQube 中的 C#、Java、JS/TS、Python、PHP 和 C/C++。
每当 XML 处理器配置缺点时,纵然它只解析受信赖的 XML 文件,此规则也会引发问题。我们认为,掌握和限定利用外部实体只有以下上风:
出于性能缘故原由:减少对外部资源的依赖是一种很好的做法。出于安全缘故原由:很难担保受信赖的 XML 文件没有被恶意第三方在某些地方或传输中修改(如下所示)。一样平常来说:一旦您开始解析 XML 文件,就在项目中安全地配置 XML 解析器是故意义的,纵然您认为它们是可信的。这样,如果 XML 解析器处理您无法掌握的其他 XML 文件,您就不必再担心将来涌现 XXE 漏洞的风险。不相信吗?看看 S2755 在用不同编程措辞编写的各种有名开源项目中,创造的一些实际且严重的漏洞:
在之前的文章https://blog.sonarsource.com/wordpress-xxe-security-vulnerability中,我们谈到了最盛行的 PHP CMS WordPress 5.7 (CVE-2021-29447) 中的 XXE 漏洞,当经由身份验证的用户上传媒体文件时:pikepdf 2.9.2 (CVE-2021-29421) 中的 XXE 漏洞,这是一个用于操作 PDF 文件的 Python 库,当解析 PDF XMP 元数据(基于 XML)时:WxJava 3.7.4.A 中的 XXE 漏洞,这是一个用于开拓微信移动支付运用程序的 Java SDK:在解析来自互助伙伴漏洞扫描工具的 XML 文件时,盛行的 Python 漏洞管理工具 DefectDojo 1.6.4 中的 XXE 漏洞:Java XMPP 做事器 Openfire 中的 XXE 漏洞:03
评估 S2755 问题的建议
在您自己的项目中评估 XXE 漏洞问题时,请记住以下几点:
考虑最坏的情形,例如恶意系统用户操纵 XML 文件,或从中检索 XML 文件的受传染的互助伙伴运用程序。阅读您的 XML 处理器的文档,尤其是解析 XXE 的默认行为。众所周知,Office 文档、RSS、PDF、SOAP、SVG、XML-RPC、XMPP 等许多文件格式和技能部分基于 XML 标准,因此很难把稳到通过解析这些文件,可能会涌现XXE漏洞。因此,如果触发了规则 S2755,请不要感到惊异,例如,在从 PDF 文件解析 XMP 元数据时。04
概括
在这篇文章中,我们看到了用不同编程措辞编写的盛行和各种开源项目中的 XXE 漏洞示例。我阐明了如何评估 XXE 漏洞问题以及规则 S2755 的好处是什么,但只有您可以防止漏洞,以是下次我们将谈论如何修复它们。
作者先容:
ERIC THEROND
安全研究职员
文章来源:https://blog.sonarsource.com/understanding-xxe-vulnerabilities