不要害怕XXE漏洞:了解它们的凶猛之处以及检测方法

今天,XML 外部实体 (XXE) 漏洞仍然无处不在,尽管多年来针对这些漏洞提供保护的建议一直是安全标准的一个组成部分。在本篇文章中,我们将尝试揭开 XXE 漏洞的神秘面纱,并介绍我们为帮助您检测和预防它们而制定的规则。

概述

XML 实体是在 XML 文档的文档类型定义 (DOCTYPE) 中声明的。如果一个实体的值是从文档内部检索的,那么它就是内部的,如果它的值是一个URI,那么它就是外部的。当随后在 XML 文档中使用实体引用时,该引用被为其检索的值所取代。例如,以下 XML 文档通过 URI 从文件中检索 xxe 实体的值,然后将其内容嵌入到文档中:

处理 XML 文件的应用程序应小心将外部实体限制为授权的文件系统和网络资源,否则会为任意文件泄露和服务器端请求伪造 (SSRF) 攻击打开大门:

注意:实体可以是通用的,如上图,也可以是参数实体。两者之间的唯一区别是参数实体仅在 DTD 中定义和使用。

如何检测 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 漏洞:

评估 S2755 问题的建议

在您自己的项目中评估 XXE 漏洞问题时,请记住以下几点:

  • 考虑最坏的情况,例如恶意系统用户操纵 XML 文件,或从中检索 XML 文件的受感染的合作伙伴应用程序。

  • 阅读您的 XML 处理器的文档,尤其是解析 XXE 的默认行为。

  • 众所周知,Office 文档、RSS、PDF、SOAP、SVG、XML-RPC、XMPP 等许多文件格式和技术部分基于 XML 标准,因此很难注意到通过解析这些文件,可能会出现XXE漏洞。因此,如果触发了规则 S2755,请不要感到惊讶,例如,在从 PDF 文件解析 XMP 元数据时。

概括

在这篇文章中,我们看到了用不同编程语言编写的流行和各种开源项目中的 XXE 漏洞示例。我解释了如何评估 XXE 漏洞问题以及规则 S2755 的好处是什么,但只有您可以防止漏洞,所以下次我们将讨论如何修复它们。

作者简介:

ERIC THEROND
安全研究人员 
文章来源:https://blog.sonarsource.com/understanding-xxe-vulnerabilities