XML 处理模块

源代码: Lib/xml/


Python 处理 XML 的接口分组在 xml 包中。

警告

XML 模块对于错误或恶意构造的数据不安全。如果需要解析不受信任或未经身份验证的数据,请参阅 XML 漏洞defusedxml 包 部分。

需要注意的是,xml 包中的模块要求至少有一个符合 SAX 的 XML 解析器可用。Expat 解析器包含在 Python 中,因此 xml.parsers.expat 模块始终可用。

xml.domxml.sax 包的文档是 DOM 和 SAX 接口的 Python 绑定的定义。

XML 处理子模块包括:

XML 漏洞

XML 处理模块对于恶意构造的数据不安全。攻击者可以滥用 XML 功能来执行拒绝服务攻击,访问本地文件,生成与其他机器的网络连接,或绕过防火墙。

下表概述了已知的攻击以及各个模块是否容易受到这些攻击。

类型

sax

etree

minidom

pulldom

xmlrpc

十亿笑

易受攻击 (1)

易受攻击 (1)

易受攻击 (1)

易受攻击 (1)

易受攻击 (1)

二次爆炸

易受攻击 (1)

易受攻击 (1)

易受攻击 (1)

易受攻击 (1)

易受攻击 (1)

外部实体扩展

安全 (5)

安全 (2)

安全 (3)

安全 (5)

安全 (4)

DTD 检索

安全 (5)

安全

安全

安全 (5)

安全

解压缩炸弹

安全

安全

安全

安全

易受攻击

大型令牌

易受攻击 (6)

易受攻击 (6)

易受攻击 (6)

易受攻击 (6)

易受攻击 (6)

  1. Expat 2.4.1 及更新版本不受 “十亿笑” 和 “二次爆炸” 漏洞的影响。由于可能依赖于系统提供的库,因此仍被列为易受攻击项。检查 pyexpat.EXPAT_VERSION

  2. xml.etree.ElementTree 不会扩展外部实体,当出现实体时会引发 ParseError

  3. xml.dom.minidom 不会扩展外部实体,而是直接返回未扩展的实体。

  4. xmlrpc.client 不会扩展外部实体,而是省略它们。

  5. 自 Python 3.7.1 起,默认情况下不再处理外部通用实体。

  6. Expat 2.6.0 及更高版本不受因解析大型令牌而导致的二次运行时拒绝服务攻击的影响。由于可能依赖于系统提供的库,因此仍被列为易受攻击项。检查 pyexpat.EXPAT_VERSION

十亿笑/指数实体扩展

十亿笑 攻击,也称为指数实体扩展,使用多层嵌套实体。每个实体多次引用另一个实体,最终的实体定义包含一个短字符串。指数扩展会导致生成数 GB 的文本,并消耗大量内存和 CPU 时间。

二次爆炸实体扩展

二次爆炸攻击类似于 十亿笑 攻击;它也滥用实体扩展。它不是嵌套实体,而是重复包含几千个字符的大型实体。此攻击不如指数攻击高效,但它避免触发禁止深度嵌套实体的解析器对策。

外部实体扩展

实体声明可以包含的不仅仅是用于替换的文本。它们还可以指向外部资源或本地文件。XML 解析器访问该资源并将内容嵌入到 XML 文档中。

DTD 检索

某些 XML 库(如 Python 的 xml.dom.pulldom)从远程或本地位置检索文档类型定义。此功能与外部实体扩展问题具有相似的含义。

解压缩炸弹

解压缩炸弹(又名 ZIP 炸弹)适用于所有可以解析压缩 XML 流(如 gzip 压缩的 HTTP 流或 LZMA 压缩的文件)的 XML 库。对于攻击者而言,它可以将传输的数据量减少三个数量级或更多。

大型令牌

Expat 需要重新解析未完成的令牌;如果没有 Expat 2.6.0 中引入的保护,这可能会导致二次运行时,从而可能导致解析 XML 的应用程序中出现拒绝服务。此问题被称为 CVE 2023-52425

PyPI 上关于 defusedxml 的文档提供了有关所有已知攻击向量的更多信息,其中包含示例和参考资料。

defusedxml

defusedxml 是一个纯 Python 包,其中包含所有 stdlib XML 解析器的修改后的子类,可以防止任何潜在的恶意操作。建议任何解析不受信任的 XML 数据的服务器代码使用此包。该包还附带示例漏洞利用和有关更多 XML 漏洞(如 XPath 注入)的扩展文档。