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 流的 XML 库,例如 gzip 压缩的 HTTP 流或 LZMA 压缩的文件。对于攻击者来说,它可以将传输的数据量减少三个数量级或更多。

大型标记

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

PyPI 上 defusedxml 的文档包含有关所有已知攻击向量的更多信息,并附带示例和参考。

defusedxml

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