XML 外部實體注入 (XXE)

OWASP 類別:MASVS-CODE:程式碼品質

總覽

XML eXternal Entity 注入 (XXE) 是針對剖析 XML 輸入內容的應用程式發動的攻擊。當含有外部實體參照項目的不受信任 XML 輸入內容,遭到設定不嚴格的 XML 剖析器處理時,就會發生 XXE 攻擊。這類攻擊可用於發動多項事件,包括拒絕服務、檔案系統存取或資料外洩。

影響

應用程式剖析 XML 文件時,可以處理文件中包含的任何 DTD (文件類型定義,也稱為外部實體)。攻擊者可以藉由插入惡意程式碼作為 DTD 來利用此行為。這段程式碼接著可存取裝置的部分檔案系統,該系統僅供應用程式存取,且可能含有私密資料。此外,這段惡意程式碼可能會從裝置發出要求,繞過邊界安全措施。

最後,如果應用程式擴充 DTD,可能會導致引用實體的多次疊代,耗盡裝置的資源,並導致服務遭到拒絕。

因應措施

停用 DTD

如要防範 XXE,最安全的方法就是一律完全停用 DTD (外部實體)。視使用的剖析器而定,方法可能類似下列 XML Pull Parser 程式庫的範例:

Java

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

Kotlin

val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)

停用 DTD 也會讓剖析器免於遭受阻斷服務攻擊。如果無法完全停用 DTD,就必須以每個剖析器特有的方式停用外部實體和外部文件類型宣告。

由於市面上有許多 XML 剖析引擎,防範 XXE 攻擊的方式會因引擎而異。詳情請參閱引擎說明文件。

執行輸入清理作業

應用程式應重新設定,以免使用者在 XML 文件的前置程式中插入任意程式碼。由於用戶端控件可被略過,因此必須在伺服器端進行驗證。

使用其他程式庫

如果無法以安全的方式設定所用程式庫或方法,建議您考慮使用其他程式庫或方法。XML 提取剖析器SAX 剖析器都可以以安全的方式進行設定,禁止使用 DTD 和實體。

資源