ITADN
tiran/defusedxml
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

defusedxml -- 解除 XML 炸弹及其他漏洞利用

Latest Version Supported Python versions Travis CI codecov PyPI downloads Code style: black

“这只是 XML,大概能出什么错呢?”

Christian Heimes <christian@python.org>

概要

对存在漏洞的 XML 库发起攻击的后果可能相当 严重。攻击者仅用几百 字节 的 XML 数据,就能在几内 占用数吉字节的内存。攻击者还可以利用小到中等规模的 请求让 CPU 长时间保持忙碌。在某些情况下,甚至可能访问 服务器上的本地文件,绕过防火墙,或滥用服务将 攻击反弹给第三方。

这些攻击利用并滥用了 XML 及其解析器中较少见的特性。 大多数开发者对 XML 从 SGML 继承而来的处理指令和实体展开等特性并不熟悉。他们充其量只是从 HTML 经验中了解 <!DOCTYPE>,但 并不知道文档类型定义 (DTD) 可以生成 HTTP 请求或从文件系统加载文件。

这些问题都不是新出现的。它们早已为人所知。 Billion laughs 最早于 2003 年被报告。尽管如此,一些 XML 库和 应用程序仍然存在漏洞,即使是 XML 的重度用户也会对这些特性感到 惊讶。很难说该责怪谁造成了这种局面。将所有责任都推给使用不安全 默认设置的 XML 解析器和 XML 库是短视的。毕竟,它们正确地实现了 XML 规范。应用程序开发人员不能依赖库在默认情况下总是针对安全 和潜在有害数据进行配置。

目录

攻击向量

十亿次笑声 / 指数级实体扩展

The Billion Laughs attack -- also known as exponential entity expansion --uses multiple levels of nested entities. The original example uses 9 levels of 10 expansions in each level to expand the string lol to a string of 3 * 10 9 bytes, hence the name "billion laughs". The resulting string occupies 3 GB (2.79 GiB) of memory; intermediate strings require additional memory. Because most parsers don't cache the intermediate step for every expansion it is repeated over and over again. It increases the CPU load even more.

一个仅几百字节的 XML 文档就能在几秒内扰乱机器上的所有服务。

示例 XML:

<!ENTITY b "&a;&a;&a;&a;&a;&a;&a;&a;">
<!ENTITY c "&b;&b;&b;&b;&b;&b;&b;&b;">
<!ENTITY d "&c;&c;&c;&c;&c;&c;&c;&c;">
]>
<bomb>&d;</bomb>

二次爆炸实体展开

二次方爆炸攻击类似于 Billion Laughs 攻击;它同样滥用了 实体扩展。它不是使用嵌套实体,而是反复重复一个包含数千字符的大型 实体。该攻击的效率不如指数级情况,但它避免了触发解析器针对深度嵌套实体的 反制措施。某些解析器 会限制单个实体的深度和广度,但不会限制整个 XML 文档中 扩展文本的总量。

一个中等大小的 XML 文档,仅有几百千字节, 可能需要几百 MB 到几 GB 的内存。当攻击 结合一定程度的嵌套展开时,攻击者能够 获得更高的成功率。

<!DOCTYPE bomb [
<!ENTITY a "xxxxxxx... a couple of ten thousand chars">
]>
<bomb>&a;&a;&a;... 重复</bomb>

外部实体展开(远程)

实体声明可以包含不仅仅是用于替换的文本。 它们还可以通过公共标识符或 系统标识符指向外部资源。系统标识符是标准的 URI。当 URI 是一个 URL(例如 http:// 定位符)时,某些解析器会从远程位置下载资源 并将其原样嵌入到 XML 文档中。

解析外部实体的简单示例:

<!DOCTYPE external [
<!ENTITY ee SYSTEM "http://www.python.org/some.xml">
]>
<root>&ee;</root>

解析外部实体的情况仅适用于有效的 XML 内容。 XML 标准还支持带有 NData declaration 的未解析外部实体。

外部实体展开为大量利用打开了大门。攻击者 可以利用存在漏洞的 XML 库和应用,以服务器的 IP 地址重新绑定 并转发网络请求。具体可能利用的类型 高度依赖于解析器和应用。例如:

  • 攻击者可以绕过防火墙并访问受限资源,因为所有请求均来自内部且可信的 IP 地址,而非来自外部。
  • 攻击者可以利用该服务攻击、监视或对你的服务器发起 DoS 攻击,但也可以针对第三方服务。攻击被伪装成服务器的 IP 地址,并且攻击者能够利用大型机器的高带宽。
  • 攻击者可以耗尽机器上的额外资源,例如通过向不响应或响应非常大的文件的服务发送请求。
  • 攻击者可能会获取有关 XML 文档何时、以何种频率以及从哪个 IP 地址被访问的知识。
  • 如果 URL 处理器支持 smtp:// URI,攻击者可以从你的网络内部发送邮件。

外部实体扩展(本地文件)

引用本地文件的外部实体是外部实体扩展的一个子情况。它被列为额外的攻击,因为它值得额外关注。一些 XML 库(如 lxml)默认禁用网络访问,但仍然默认允许使用本地文件访问进行实体扩展。本地文件要么通过 file:// URL 引用,要么通过文件路径(相对或绝对)引用。 此外,lxml 的 libxml2 支持目录。像 /etc/xml/catalog 这样的 XML 目录是 XML 文件,它们将模式 URI 映射到本地文件。

攻击者可能能够访问并下载应用程序进程可读的所有文件。这可能包括关键的配置文件。

<!DOCTYPE external [
<!ENTITY ee SYSTEM "file:///PATH/TO/simple.xml">
]>
<root>&ee;</root>

DTD 检索

这种情况也与外部实体扩展类似。一些 XML 库,例如 Python 的 xml.dom.pulldom,会从远程或本地位置检索文档类型定义。外部实体案例中的几种攻击场景同样适用于此问题。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head/>
    <body>text</body>
</html>

Python XML 库

kindsaxetreeminidompulldomxmlrpc
billion laughsMaybe (1)Maybe (1)Maybe (1)Maybe (1)Maybe (1)
quadratic blowupMaybe (1)Maybe (1)Maybe (1)Maybe (1)Maybe (1)
external entity expansion (remote)False (2)False (3)False (4)False (2)false
external entity expansion (local file)False (2)False (3)False (4)False (2)false
DTD retrievalFalse (2)FalseFalseFalse (2)false
gzip bombFalseFalseFalseFalseTrue
xpath support (6)FalseFalseFalseFalseFalse
xsl(t) support (6)FalseFalseFalseFalseFalse
xinclude support (6)FalseTrue (5)FalseFalseFalse
C libraryexpatexpatexpatexpatexpat

漏洞与特性

  1. expat 解析器 >= 2.4.0 具有针对 XML 炸弹的十亿次笑声 防护 (CVE-2013-0340)。解析器为 XML_SetBillionLaughsAttackProtectionMaximumAmplificationXML_SetBillionLaughsAttackProtectionActivationThreshold 提供了合理的默认值。
  2. Python >= 3.6.8、>= 3.7.1 和 >= 3.8 不再使用 urllib 获取本地和 远程资源,参见 bpo-17239
  3. xml.etree 不展开实体,并在出现实体时引发 ParserError。
  4. minidom 不展开实体,而是原样返回未展开的实体。
  5. 该库具有(有限的)XInclude 支持,但需要额外步骤来处理包含。
  6. 这些是特性,但它们可能引入可利用的漏洞,参见 其他需要考虑的事项

标准库中的设置

xml.sax.handler 特性

feature_external_ges (http://xml.org/sax/features/external-general-entities)
禁用外部实体展开

feature_external_pes (http://xml.org/sax/features/external-parameter-entities)
该选项被忽略,不会修改任何功能

DOM xml.dom.xmlbuilder.Options

external_parameter_entities
被忽略

external_general_entities
被忽略

external_dtd_subset
被忽略

entities
不确定

defusedxml

defusedxml 包PyPI 上的 defusedxml)包含 多个仅适用于 Python 的针对 Python XML 库中拒绝服务 及其他漏洞的变通方案和修复措施。为了获得 这些保护,你只需从正确的 defusedxml 模块中导入并使用 列出的函数/类,而不是使用原始模块。仅仅 defusedxml.xmlrpc 是作为 猴子补丁实现的。

不要使用:

>>> from xml.etree.ElementTree import parse
>>> et = parse(xmlfile)

请将代码更改为:

>>> from defusedxml.ElementTree import parse
>>> et = parse(xmlfile)

备注

defusedxml 模块并非其标准库对应模块的直接替代品。这些模块仅提供与 XML 解析和加载相关的函数和类。对于其他所有功能,请使用标准库模块中的类、函数和常量。例如:

>>> from defusedxml import ElementTree as DET
>>> from xml.etree.ElementTree as ET

>>> root = DET.fromstring("<root/>")
>>> root.append(ET.Element("item"))
>>> ET.tostring(root)
b'<root><item /></root>'

此外,该包还有一个未经测试的函数,用于使用 defusedxml.defuse_stdlib() 对所有标准库模块进行猴子补丁。

警告

defuse_stdlib() 应当避免使用。它可能会破坏第三方包或 导致意外的副作用。相反,你应当显式使用 defusedxml 的解析 功能。

所有函数和解析器类都接受三个额外的关键字 参数。它们返回与原始函数相同的对象 或兼容的子类。

forbid_dtd(默认值:False)
禁止包含 <!DOCTYPE> 处理指令的 XML,并在发现 DTD 处理指令时抛出 DTDForbidden 异常。

forbid_entities(默认值:True)
禁止 DTD 内部包含 <!ENTITY> 声明的 XML,并在声明实体时抛出 EntitiesForbidden 异常。

forbid_external(默认值:True)
禁止访问外部实体或 DTD 中的任何远程或本地资源,并在 DTD 或 实体引用外部资源时抛出 ExternalReferenceForbidden 异常。

defusedxml(包)

DefusedXmlException, DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden, NotSupportedError

defuse_stdlib()(实验性

defusedxml.cElementTree

注意 defusedxml.cElementTree 已弃用,并将在 未来版本中移除。请改为从 defusedxml.ElementTree 导入。

parse(), iterparse(), fromstring(), XMLParser

defusedxml.ElementTree

parse(), iterparse(), fromstring(), XMLParser

defusedxml.expatreader

create_parser(), DefusedExpatParser

defusedxml.sax

parse(), parseString(), make_parser()

defusedxml.expatbuilder

parse(), parseString(), DefusedExpatBuilder, DefusedExpatBuilderNS

defusedxml.minidom

parse(), parseString()

defusedxml.pulldom

parse(), parseString()

defusedxml.xmlrpc

该修复以 monkey patch 的形式实现,针对标准库的 xmlrpc 包 (3.x)或 xmlrpclib 模块(2.x)。函数 monkey_patch() 启用这些修复,unmonkey_patch() 移除补丁并将代码 恢复到先前状态。

该 monkey patch 可防范与 XML 相关的攻击,以及 解压炸弹和过大的请求或响应。 默认设置对请求、响应和 gzip 解压均为 30 MB。 你可以通过修改模块变量 MAX_DATA 来更改默认值。值为 -1 时禁用该限制。

defusedxml.lxml

已弃用 该模块已弃用,并将在未来 版本中移除。

lxml 对大多数攻击场景是安全的。lxml 使用 libxml2 进行 XML 解析。该库内置了对十亿次笑声 和二次方膨胀攻击的缓解措施。解析器允许一定数量的实体 展开,超出后则失败。lxml 默认还禁用了网络访问。 libxml2 lxml FAQ 列出了安全解析的额外建议,例如针对 压缩炸弹的对策。

默认解析器会解析实体,并防范巨大的树和 深度嵌套的实体。要禁用实体展开,请使用自定义 解析器对象:

from lxml import etree

parser = etree.XMLParser(resolve_entities=False)
root = etree.fromstring("<example/>", parser=parser)

该模块作为一个示例,展示了如何保护使用 lxml.etree 的代码。它实现了一个自定义 Element 类,用于过滤掉 Entity 实例,一个自定义解析器工厂以及用于解析器 实例的线程本地存储。它还包含一个 check_docinfo() 函数,用于检查树 中是否存在内部或外部 DTD 以及实体声明。为了检查 实体,需要 lxml > 3.0。

parse(), fromstring() RestrictedElement, GlobalParserTLS, getDefaultParser(), check_docinfo()

defusedexpat

The defusedexpat package (defusedexpat on PyPI) is no longer supported. expat parser 2.4.0 and newer come with billion laughs protection against XML bombs.

如何避免 XML 漏洞

更新到 Python 3.6.8、3.7.1 或更高版本。SAX 和 DOM 解析器不会 从文件或网络资源加载外部实体。

将 expat 更新到 2.4.0 或更高版本。它具有十亿笑声保护 ,并配有合理的默认限制,以缓解十亿笑声和二次方爆炸问题。

python.org 提供的官方二进制文件自 3.7.12、3.8.12、3.9.7 和 3.10.0(2021 年 8 月)起使用 libexpat 2.4.0。 第三方供应商可能使用较旧或较新版本的 expat。pyexpat.version_info 包含 libexpat 的当前运行时版本。供应商可能已将修复措施回溯移植到 旧版本中,而未提升版本号。

示例:

import sys import pyexpat

has_mitigations = ( sys.version_info >= (3, 7, 1) and pyexpat.version_info >= (2, 4, 0) )

最佳实践

  • 不允许 DTD
  • 不展开实体
  • 不解析外部资源
  • 限制解析深度
  • 限制总输入大小
  • 限制解析时间
  • 对于潜在的大数据,优先使用 SAX 或类似 iterparse 的解析器
  • 验证并正确引用 XSL 转换和 XPath 查询的参数
  • 不要使用来自不可信来源的 XPath 表达式
  • 不要应用来自不可信来源的 XSL 转换

(基于 Brad Hill 的《Attacking XML Security](https://www.isecpartners.com/media/12976/iSEC-HILL-Attacking-XML-Security-bh07.pdf)》)

其他需要考虑的事项

XML、XML 解析器以及处理库拥有更多功能, 以及可能导致应用程序中出现 DoS 漏洞或安全 利用的潜在问题。我整理了一份不完整的 理论问题列表,这些问题需要进一步研究和更多关注。该 列表刻意持悲观态度,且略显偏执。它包含 在古怪情况下可能出错的内容。

属性膨胀 / 哈希碰撞攻击

XML parsers may use an algorithm with quadratic runtime O(n 2) to handle attributes and namespaces. If it uses hash tables (dictionaries) to store attributes and namespaces the implementation may be vulnerable to hash collision attacks, thus reducing the performance to O(n 2) again. In either case an attacker is able to forge a denial of service attack with an XML document that contains thousands upon thousands of attributes in a single node.

我尚未研究 expat、pyexpat 或 libxml2 是否存在漏洞。

解压炸弹

解压炸弹(又称 ZIP 炸弹)的问题适用于所有能够解析压缩 XML 流的 XML 库,例如 gzip 压缩的 HTTP 流 或 LZMA 压缩的文件。对于攻击者而言,这可以将 传输的数据量减少三个数量级或更多。Gzip 能够将 1 GiB 的零压缩到大约 1 MB,而 lzma 的效果更好:

$ dd if=/dev/zero bs=1M count=1024 | gzip > zeros.gz
$ dd if=/dev/zero bs=1M count=1024 | lzma -z > zeros.xy
$ ls -sh zeros.*
1020K zeros.gz
 148K zeros.xy

Python 标准库中的 XML 库均不解压流, xmlrpclib 除外。该模块容易受到 <https://bugs.python.org/issue16043> 解压炸弹的攻击。

lxml 可以通过 libxml2 透明地加载和处理压缩数据。 libxml2 能够高效地处理非常大的压缩数据块, 而不会占用过多的内存。但它并不能保护应用程序免受 解压炸弹的攻击。精心编写的 SAX 或类似 iterparse 的方法 可能是安全的。

处理指令

像这样的 PI

<?xml-stylesheet type="text/xsl" href="style.xsl"?>

可能会对 XML 处理带来更多威胁。这取决于处理器是否以及如何 处理处理指令。涉及网络或本地文件访问的 URL 检索问题同样适用于处理指令。

其他 DTD 特性

DTD 还有更多 特性,例如 <!NOTATION>。我尚未研究这些特性如何 构成安全威胁。

XPath

XPath 语句可能引入 DoS 漏洞。代码绝不应 执行来自不可信源的查询。攻击者还可能 创建使某些 XPath 查询代价高昂或 资源消耗巨大的 XML 文档。

XPath 注入攻击

XPath 注入攻击的工作原理与 SQL 注入攻击非常相似。 XPath 查询的参数必须正确引用和验证, 特别是当它们来自用户时。页面 避免 XPath 注入的危险 列出了 XPath 注入的一些后果。

Python 标准库不支持 XPath。Lxml 支持 参数化 XPath 查询,能够进行正确的引用。你只需 正确使用其 xpath() 方法即可:

# 不要这样做
>>> tree.xpath("/tag[@id='%s']" % value)

# 而应该这样做
>>> tree.xpath("/tag[@id=$tagid]", tagid=name)

XInclude

XML 包含 是 加载和包含外部文件的另一种方式:

<root xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="filename.txt" parse="text" />
</root>

当处理来自不可信来源的 XML 文件时,应禁用此功能。某些 Python XML 库和 libxml2 支持 XInclude,但没有沙箱化包含并将其限制在允许目录中的选项。

XMLSchema 位置

验证型 XML 解析器可能会根据 xsi:schemaLocation 属性中的信息下载模式文件。

<ead xmlns="urn:isbn:1-931666-22-9"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd">
</ead>

XSL 转换

请记住,XSLT 是一种图灵完备语言。切勿处理来自未知或不可信来源的 XSLT 代码!XSLT 处理器可能允许你以你甚至无法想象的方式与外部资源交互。某些处理器甚至支持允许读写文件系统、访问 JRE 对象或使用 Jython 进行脚本编写的扩展。

来自 Attacking XML Security 针对 Xalan-J 的示例:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime"
 xmlns:ob="http://xml.apache.org/xalan/java/java.lang.Object"
 exclude-result-prefixes= "rt ob">
 <xsl:template match="/">
   <xsl:variable name="runtimeObject" select="rt:getRuntime()"/>
   <xsl:variable name="command"
     select="rt:exec($runtimeObject, &apos;c:\Windows\system32\cmd.exe&apos;)"/>
   <xsl:variable name="commandAsString" select="ob:toString($command)"/>
   <xsl:value-of select="$commandAsString"/>
 </xsl:template>
</xsl:stylesheet>

相关 CVE

CVE-2013-1664
不受限制的实体展开在 Python XML 库中引发 DoS 漏洞(XML 炸弹)

CVE-2013-1665
Python XML 库中的外部实体展开导致潜在安全缺陷和 DoS 漏洞

其他语言 / 框架

其他几种编程语言和框架也存在漏洞。其中一些受 libxml2 2.9.0 及更早版本缺乏针对二次方膨胀攻击保护的影响。大多数框架在实体展开和外部实体方面也存在潜在危险的默认设置。

Perl

Perl 的 XML::Simple 易受二次方实体展开和外部实体展开(包括本地和远程)攻击。

Ruby

Ruby 的 REXML 文档解析器易受实体展开攻击(包括二次方和指数级),但默认情况下不执行外部实体展开。为了对抗实体展开,你必须禁用该功能:

REXML::Document.entity_expansion_limit = 0

libxml-ruby 和 hpricot 在默认配置下不展开实体。

PHP

PHP 的 SimpleXML API 易受二次方实体展开攻击,并从本地和远程资源加载实体。选项 LIBXML_NONET 禁用了网络访问,但仍允许本地文件 访问。LIBXML_NOENT 在 PHP 5.4.6 中似乎对实体展开没有影响。

C# / .NET / Mono

XML DoS and Defenses (MSDN) 中的信息表明, .NET 在默认设置下存在漏洞。该文章包含 用于创建安全 XML 读取器的代码片段:

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.MaxCharactersFromEntities = 1024;
settings.XmlResolver = null;
XmlReader reader = XmlReader.Create(stream, settings);

Java

未测试。Xerces 及其 Xerces SecurityMananger 的文档表明, Xerces 在默认设置下也可能容易受到十亿次笑声攻击。 当配置了 org.xml.sax.EntityResolver 时,它也会执行实体解析。 我尚不确定此处的默认设置。

Java 专家建议使用自定义的 builder factory:

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); builderFactory.setXIncludeAware(False); builderFactory.setExpandEntityReferences(False); builderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, True); # either builderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", True); # or if you need DTDs builderFactory.setFeature("http://xml.org/sax/features/external-general-entities", False); builderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", False); builderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", False); builderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", False);

TODO

  • DOM: 使用 xml.dom.xmlbuilder 选项处理实体
  • SAX: 考虑 feature_external_ges 和 feature_external_pes (?)
  • 测试对标准库模块的实验性猴子补丁
  • 改进文档

License

Copyright (c) 2013-2023 by Christian Heimes <christian@python.org>

Licensed to PSF under a Contributor Agreement.

See https://www.python.org/psf/license for licensing details.

Acknowledgements

Brett Cannon (Python Core developer)
审查和代码清理

Antoine Pitrou (Python Core developer)
代码审查

Aaron Patterson, Ben Murphy and Michael Koziarski (Ruby community)
非常感谢来自 Ruby 社区的 Aaron、Ben 和 Michael 的报告和协助。

Thierry Carrez (OpenStack)
非常感谢 Thierry 代表 OpenStack 安全团队向 Python Security Response Team 提交的报告。

Carl Meyer (Django)
非常感谢 Carl 代表 Django 安全团队向 PSRT 提交的报告。

Daniel Veillard (libxml2)
非常感谢 Daniel 在 libxml2 方面提供的见解和协助。

semantics GmbH (https://www.semantics.de/)
非常感谢我的雇主 semantics 允许我在工作时间作为 semantics 开源计划的一部分处理该问题。

References

Changelog

defusedxml 0.8.0

Release date: 2023

  • 修复无 lxml 环境下的测试
  • 在 3.13-dev 和 PyPy 3.9 上进行测试

defusedxml 0.8.0rc2

Release date: 29-Sep-2023

  • 静默 defuse_stdlib 中的弃用警告。
  • 更新 lxml 安全信息

defusedxml 0.8.0rc1

Release date: 26-Sep-2023

  • 停止支持 Python 2.7、3.4 和 3.5。
  • 在 3.10、3.11 和 3.12 上进行测试。
  • 添加 defusedxml.ElementTree.fromstringlist()
  • 更新 README 中的 vulnerabilities and features 表格。
  • Pending removal defusedxml.lxml 模块自 2019 年以来已停止维护并弃用。该模块将在 下一个版本中移除。
  • Pending removal defusedxml.cElementTree 将在 下一个版本中移除。请改用 defusedxml.ElementTree

defusedxml 0.7.1

发布日期:2021年3月8日

  • 修复回归问题 defusedxml.ElementTree.ParseError (#63) 该 ParseError 异常现在再次与 xml.etree.ElementTree.ParseError 是同一个类对象。

defusedxml 0.7.0

发布日期:2021年3月4日

  • 无更改

defusedxml 0.7.0rc2

发布日期:2021年1月12日

  • 重新添加并弃用 defusedxml.cElementTree
  • 使用 GitHub Actions 替代 TravisCI
  • 在修补后恢复 xml.etree 模块的 ElementTree 属性

defusedxml 0.7.0rc1

发布日期:2020年5月4日

  • 添加对 Python 3.9 的支持
  • defusedxml.cElementTree 在 Python 3.9 中不可用。
  • Python 2 已弃用。对 Python 2 的支持将在 0.8.0 中移除。

defusedxml 0.6.0

发布日期:2019年4月17日

  • 提高测试覆盖率。
  • 在 README 中添加徽章。

defusedxml 0.6.0rc1

发布日期:2019年4月14日

  • 在 Python 3.7 稳定版和 3.8-dev 上进行测试
  • 停止支持 Python 3.4
  • 不再向 XMLParse 传递 html 参数。该参数已弃用 且长期被忽略。DefusedXMLParser 仍然接受 html 参数。当该参数为 False 时发出弃用警告, 当为 True 时发出 TypeError。
  • 当 pyexpat 标准库模块不可用或损坏时, defusedxml 现在会提前失败。
  • defusedxml.ElementTree.__all__ 现在将 ParseError 列为公共 属性。
  • defusedxml.ElementTree 和 defusedxml.cElementTree 模块存在 拼写错误,使用了 XMLParse 而不是 XMLParser 作为 DefusedXMLParser 的别名。旧名称和修正后的名称现在均可用。

defusedxml 0.5.0

发布日期:2017-02-07

  • 无变更

defusedxml 0.5.0.rc1

发布日期:2017-01-28

  • 添加对 Python 3.6 的兼容性
  • 停止支持 Python 2.6、3.1、3.2、3.3
  • 修复 lxml 测试(XMLSyntaxError: Detected an entity reference loop)

defusedxml 0.4.1

发布日期:2013-03-28

  • 添加更多演示利用代码,例如 python_external.py 和 Xalan XSLT 演示。
  • 改进了文档。

defusedxml 0.4

发布日期:2013-02-25

  • 根据 http://seclists.org/oss-sec/2013/q1/340 请拒绝 CVE-2013-0278、CVE-2013-0279 和 CVE-2013-0280,并使用 CVE-2013-1664、CVE-2013-1665 用于 OpenStack 等。
  • 为 sax.make_parser() 添加缺失的 parser_list 参数。不过,该参数 会被忽略。(感谢 Florian Apolloner)
  • 添加针对 Python SAX 解析器、 XML-RPC 和 WebDAV 的外部实体攻击演示利用代码。

defusedxml 0.3

发布日期:2013-02-19

  • 改进文档

defusedxml 0.2

发布日期:2013-02-15

  • 将 ExternalEntitiesForbidden 重命名为 ExternalReferenceForbidden
  • 将 defusedxml.lxml.check_dtd() 重命名为 check_docinfo()
  • 统一回调中的参数名称
  • 为异常添加参数和格式化表示
  • 为所有函数和类添加 forbid_external 参数
  • 更多测试
  • 大量文档
  • 添加其他语言(Ruby、Perl、PHP)和解析器 (Genshi)的示例代码
  • 为 xmlrpclib 添加针对 XML 和 gzip 攻击的保护

defusedxml 0.1

发布日期:2013-02-08

  • 面向 PSRT 评审的初始及内部发布