XML 的安全漏洞
本文是 Python XML 的文档,这个章节描述了 Python 内置的 XML 处理模块无法抵抗精心构造过的恶意数据。
攻击者可以通过滥用 XML 的特性达到 Dos,越权访问本地文件,远程连接到别的机器,或者绕开防火墙。
几种常见的攻击:
- billion laughs / exponential entity expansion: 多级嵌套的 entity 其中的每一级都引用别的级很多次,所以 xml 本身自由一丢丢,但是扩展开以后会指数增长,知道内存撑爆
- quadratic blowup entity expansion: 同上,也撑爆内存,不过是通过一遍又一遍地扩展千余个字符,虽然效率比上面低,但是可以绕过解析器深度嵌套的防御。
- external entity expansion: 因为 XML 中可以饮用 local / remote 文件,所以攻击者可以塞入一些本地或者远程的有害 XML 进来。
- DTD retrieval:
xml.dom.pulldom
会尝试拉远程的 DTD,同样,也是有害的。 - decompression bomb: 对一些支持解析 gzipped 或者 LZMA-compressed 的 XML 库,攻击者可以传假设 333M 数据,达到放大到 1G 进行攻击
总之:
- 如果信任来源,都是自产自销的 xml,倒也还好,总之绝对不能用这些库处理不信任来源的 xml(比如用户提交的)
- 非要用的话,使用 defusedxml