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 功能來執行拒絕服務攻擊,訪問本地檔案,生成與其他機器的網路連線,或繞過防火牆。

下表概述了已知的攻擊以及各個模組是否容易受到這些攻擊。

型別

sax

etree

minidom

pulldom

xmlrpc

十億笑

易受攻擊 (1)

易受攻擊 (1)

易受攻擊 (1)

易受攻擊 (1)

易受攻擊 (1)

二次爆炸

易受攻擊 (1)

易受攻擊 (1)

易受攻擊 (1)

易受攻擊 (1)

易受攻擊 (1)

外部實體擴充套件

安全 (5)

安全 (2)

安全 (3)

安全 (5)

安全 (4)

DTD 檢索

安全 (5)

安全

安全

安全 (5)

安全

解壓縮炸彈

安全

安全

安全

安全

易受攻擊

大型令牌

易受攻擊 (6)

易受攻擊 (6)

易受攻擊 (6)

易受攻擊 (6)

易受攻擊 (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 及更高版本不受因解析大型令牌而導致的二次執行時拒絕服務攻擊的影響。由於可能依賴於系統提供的庫,因此仍被列為易受攻擊項。檢查 pyexpat.EXPAT_VERSION

十億笑/指數實體擴充套件

十億笑 攻擊,也稱為指數實體擴充套件,使用多層巢狀實體。每個實體多次引用另一個實體,最終的實體定義包含一個短字串。指數擴充套件會導致生成數 GB 的文字,並消耗大量記憶體和 CPU 時間。

二次爆炸實體擴充套件

二次爆炸攻擊類似於 十億笑 攻擊;它也濫用實體擴充套件。它不是巢狀實體,而是重複包含幾千個字元的大型實體。此攻擊不如指數攻擊高效,但它避免觸發禁止深度巢狀實體的解析器對策。

外部實體擴充套件

實體宣告可以包含的不僅僅是用於替換的文字。它們還可以指向外部資源或本地檔案。XML 解析器訪問該資源並將內容嵌入到 XML 文件中。

DTD 檢索

某些 XML 庫(如 Python 的 xml.dom.pulldom)從遠端或本地位置檢索文件型別定義。此功能與外部實體擴充套件問題具有相似的含義。

解壓縮炸彈

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

大型令牌

Expat 需要重新解析未完成的令牌;如果沒有 Expat 2.6.0 中引入的保護,這可能會導致二次執行時,從而可能導致解析 XML 的應用程式中出現拒絕服務。此問題被稱為 CVE 2023-52425

PyPI 上關於 defusedxml 的文件提供了有關所有已知攻擊向量的更多資訊,其中包含示例和參考資料。

defusedxml

defusedxml 是一個純 Python 包,其中包含所有 stdlib XML 解析器的修改後的子類,可以防止任何潛在的惡意操作。建議任何解析不受信任的 XML 資料的伺服器程式碼使用此包。該包還附帶示例漏洞利用和有關更多 XML 漏洞(如 XPath 注入)的擴充套件文件。