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 功能來執行阻斷服務攻擊 (denial of service attack)、存取本地檔案、生成與其他機器的網路連接或繞過防火牆。

下表概述了已知的攻擊以及各個模組是否易有漏洞。

種類

sax

etree

minidom

pulldom

xmlrpc

十億笑聲 (billion laughs)

脆弱 (1)

脆弱 (1)

脆弱 (1)

脆弱 (1)

脆弱 (1)

二次爆炸 (quadratic blowup)

脆弱 (1)

脆弱 (1)

脆弱 (1)

脆弱 (1)

脆弱 (1)

外部實體擴展 (external entity expansion)

安全 (5)

安全 (2)

安全 (3)

安全 (5)

安全 (4)

DTD 檢索

安全 (5)

安全

安全

安全 (5)

安全

解壓縮炸彈 (decompression bomb)

安全

安全

安全

安全

脆弱

large tokens

Vulnerable (6)

Vulnerable (6)

Vulnerable (6)

Vulnerable (6)

Vulnerable (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 and newer is not vulnerable to denial of service through quadratic runtime caused by parsing large tokens. Items still listed as vulnerable due to potential reliance on system-provided libraries. Check pyexpat.EXPAT_VERSION.

十億笑聲 / 指數實體擴展

十億笑聲攻擊(也稱為指數實體擴展 (exponential entity expansion))使用多層巢狀實體。每個實體多次引用另一個實體,最終的實體定義包含一個小字串。指數擴展會產生數 GB 的文本,並消耗大量記憶體和 CPU 時間。

二次爆炸實體擴展

二次爆炸攻擊類似於十億笑聲攻擊;它也濫用實體擴展。它不是巢狀實體,而是一遍又一遍地重複一個具有幾千個字元的大型實體。該攻擊不如指數擴展那麼有效率,但它不會觸發那些用來防止深度巢狀實體的剖析器對策。

外部實體擴展 (external entity expansion)

實體聲明不僅僅可以包含用於替換的文本,它們還可以指向外部資源或本地檔案。XML 剖析器會存取資源並將內容嵌入到 XML 文件中。

DTD 檢索

一些 XML 函式庫(例如 Python 的 xml.dom.pulldom)從遠端或本地位置檢索文件類型定義。該功能與外部實體擴展問題具有類似的含義。

解壓縮炸彈 (decompression bomb)

解壓縮炸彈(又名 ZIP bomb)適用於所有可以剖析壓縮 XML 串流(例如 gzip 壓縮的 HTTP 串流或 LZMA 壓縮檔案)的 XML 函式庫。對於攻擊者來說,它可以將傳輸的資料量減少三個或更多數量級。

large tokens

Expat needs to re-parse unfinished tokens; without the protection introduced in Expat 2.6.0, this can lead to quadratic runtime that can be used to cause denial of service in the application parsing XML. The issue is known as CVE-2023-52425.

PyPI 上的 defusedxml 文件包含有關所有已知攻擊媒介 (attack vector) 的更多資訊以及範例和參考資料。

defusedxml 套件

defusedxml 是一個純 Python 套件,其中包含所有標準函式庫中 XML 剖析器的修正版本子類別,可防止任何潛在的惡意操作。當伺服器程式會剖析任何不受信任的 XML 資料時建議使用此套件。該套件還附帶了更多有關 XML 漏洞(例如 XPath 注入)的範例和延伸文件。