XML處理模塊?
源碼: Lib/xml/
用于處理XML的Python接口分組在 xml 包中。
警告
XML 模塊對于錯誤或惡意構造的數據是不安全的。 如果需要解析不受信任或未經身份驗證的數據,請參閱 XML 漏洞 和 defusedxml 和 defusedexpat 軟件包 部分。
值得注意的是 xml 包中的模塊要求至少有一個 SAX 兼容的 XML 解析器可用。在 Pythonm中包含 Expat 解析器,因此 xml.parsers.expat 模塊將始終可用。
xml.dom 和 xml.sax 包的文檔是 DOM 和 SAX 接口的 Python 綁定的定義。
XML 處理子模塊包括:
xml.etree.ElementTree: ElementTree API,一個簡單而輕量級的XML處理器
xml.dom:DOM API 定義xml.dom.minidom:最小的 DOM 實現xml.dom.pulldom:支持構建部分 DOM 樹
xml.sax:SAX2 基類和便利函數xml.parsers.expat:Expat解析器綁定
XML 漏洞?
XML 處理模塊對于惡意構造的數據是不安全的。 攻擊者可能濫用 XML 功能來執行拒絕服務攻擊、訪問本地文件、生成與其它計算機的網絡連接或繞過防火墻。
下表概述了已知的攻擊以及各種模塊是否容易受到攻擊。
種類 |
sax |
etree |
minidom |
pulldom |
xmlrpc |
|---|---|---|---|---|---|
billion laughs |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
quadratic blowup |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
external entity expansion |
Safe (5) |
Safe (2) |
Safe (3) |
Safe (5) |
安全 (4) |
DTD retrieval |
Safe (5) |
安全 |
安全 |
Safe (5) |
安全 |
decompression bomb |
安全 |
安全 |
安全 |
安全 |
易受攻擊 |
Expat 2.4.1 and newer is not vulnerable to the "billion laughs" and "quadratic blowup" vulnerabilities. Items still listed as vulnerable due to potential reliance on system-provided libraries. Check
pyexpat.EXPAT_VERSION.xml.etree.ElementTree不會擴展外部實體并在實體發生時引發ParserError。xml.dom.minidom不會擴展外部實體,只是簡單地返回未擴展的實體。xmlrpclib不擴展外部實體并省略它們。從 Python 3.7.1 開始,默認情況下不再處理外部通用實體。
- billion laughs / exponential entity expansion (狂笑/遞歸實體擴展)
Billion Laughs 攻擊 -- 也稱為遞歸實體擴展 -- 使用多級嵌套實體。 每個實體多次引用另一個實體,最終實體定義包含一個小字符串。 指數級擴展導致幾千 GB 的文本,并消耗大量內存和 CPU 時間。
- quadratic blowup entity expansion(二次爆炸實體擴展)
二次爆炸攻擊類似于 Billion Laughs 攻擊,它也濫用實體擴展。 它不是嵌套實體,而是一遍又一遍地重復一個具有幾千個字符的大型實體。攻擊不如遞歸情況有效,但它避免觸發禁止深度嵌套實體的解析器對策。
- external entity expansion
實體聲明可以包含的不僅僅是替換文本。 它們還可以指向外部資源或本地文件。 XML 解析器訪問資源并將內容嵌入到 XML 文檔中。
- DTD retrieval
Python 的一些 XML 庫
xml.dom.pulldom從遠程或本地位置檢索文檔類型定義。 該功能與外部實體擴展問題具有相似的含義。- decompression bomb
Decompression bombs(解壓炸彈,又名 ZIP bomb)適用于所有可以解析壓縮 XML 流(例如 gzip 壓縮的 HTTP 流或 LZMA 壓縮的文件)的 XML 庫。 對于攻擊者來說,它可以將傳輸的數據量減少三個量級或更多。
PyPI上 defusedxml 的文檔包含有關所有已知攻擊向量的更多信息以及示例和參考。
defusedxml 和 defusedexpat 軟件包?
defusedxml 是一個純 Python 軟件包,它修改了所有標準庫 XML 解析器的子類,可以防止任何潛在的惡意操作。 對于解析不受信任的XML數據的任何服務器代碼,建議使用此程序包。 該軟件包還提供了有關更多 XML 漏洞(如 XPath 注入)的示例漏洞和擴展文檔。
defusedexpat 提供了一個修改過的 libexpat 和一個打過補丁的 pyexpat 模塊,它有針對實體擴展DoS攻擊的對策。 defusedexpat 模塊仍然允許合理且可配置的實體擴展量。 這些修改可能包含在 Python 的某些未來版本中,但不會包含在 Python 的任何修復版本中,因為它們會破壞向后兼容性。
