XML 處理模組¶
原始碼:Lib/xml/
Python 處理 XML 的介面被歸類於 xml
套件中。
警告
XML 模組無法抵禦錯誤或惡意建構的資料。如果你需要剖析不受信任或未經身份驗證的資料,請參閱 XML 漏洞 和 defusedxml 套件 段落。
請務必注意 xml
套件中的模組要求至少有一個可用的 SAX 相容 XML 剖析器。Expat 剖析器包含在 Python 中,所以總是可以使用 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 功能來執行阻斷服務攻擊 (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) |
安全 |
安全 |
安全 |
安全 |
脆弱 |
大型 token |
脆弱 (6) |
脆弱 (6) |
脆弱 (6) |
脆弱 (6) |
脆弱 (6) |
Expat 2.4.1 及更新的版本不易受到「十億笑聲」和「二次爆炸」漏洞的影響。但仍可能由於依賴系統提供的函式庫而被列為易受攻擊的項目。請檢查
pyexpat.EXPAT_VERSION
。xml.etree.ElementTree
不會擴展外部實體,並在實體出現時引發ParseError
。xml.dom.minidom
不會擴展外部實體,只會逐字回傳未擴展的實體。xmlrpc.client
不會擴展外部實體且會忽略它們。從 Python 3.7.1 開始,預設情況下不再處理外部通用實體。
Expat 2.6.0 及更新版本不易受到剖析大型 token 所導致的二次 runtime 阻斷服務的影響。由於可能依賴系統提供的函式庫,因此仍被列為易受攻擊的項目。請參考
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 函式庫。對於攻擊者來說,它可以將傳輸的資料量減少三個或更多數量級。
- 大型 token
Expat 需要重新剖析未完成的 token;如果沒有 Expat 2.6.0 中引入的保護,這可能會導致二次 runtime 而導致剖析 XML 的應用程式出現阻斷服務。此問題記錄於 CVE 2023-52425。
PyPI 上的 defusedxml 文件包含有關所有已知攻擊媒介 (attack vector) 的更多資訊以及範例和參考資料。
defusedxml
套件¶
defusedxml 是一個純 Python 套件,其中包含所有標準函式庫中 XML 剖析器的修正版本子類別,可防止任何潛在的惡意操作。當伺服器程式會剖析任何不受信任的 XML 資料時建議使用此套件。該套件還附帶了更多有關 XML 漏洞(例如 XPath 注入)的範例和延伸文件。