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 和實體。