《缺陷周話》第四期:XML外部實體注入
程式碼審計是使用靜態分析發現原始碼中安全缺陷的方法,能夠輔助開發或測試人員在軟體上線前較為全面地瞭解其安全問題,防患於未然,因此一直以來都是學術界和產業界研究的熱點,並且已經成為安全開發生命週期 SDL 和 DevSecOps 等保障體系的重要技術手段。
360程式碼衛士團隊基於自主研發的國內首款原始碼安全檢測商用工具,以及十餘年漏洞技術研究的積累,推出“缺陷周話”系列欄目。每週針對 CWE、OWASP 等標準中的一類缺陷,結合例項和工具使用進行詳細介紹,旨在為廣大開發和安全人員提供程式碼審計的基礎性標準化教程。
一、XML外部實體注入
XML 外部實體注入漏洞也就是我們常說的 XXE 漏洞。XML 作為一種使用較為廣泛的資料傳輸格式,很多應用程式都包含有處理 xml 資料的程式碼,預設情況下,許多過時的或配置不當的 XML 處理器都會對外部實體進行引用。
如果攻擊者可以上傳 XML 文件或者在 XML 文件中新增惡意內容,通過易受攻擊的程式碼、依賴項或整合,就能夠攻擊包含缺陷的XML處理器。XXE 漏洞的出現和開發語言無關,只要是應用程式中對 xml 資料做了解析,而這些資料又受使用者控制,那麼應用程式都可能受到 XXE 攻擊。本篇文章以 java 程式為例給大家介紹 XXE 漏洞的成因及修復。XXE 漏洞詳細請見 CWE-611: Improper Restriction of XML External Entity Reference (‘XXE’)( ofollow,noindex" target="_blank">http://cwe.mitre.org/data/definitions/611.html )。
二、XML外部實體注入
XXE 漏洞可能會用於提取資料、執行遠端伺服器請求、掃描內部系統、執行拒絕服務攻擊和其他攻擊。業務影響主要取決於受影響的引用程式和資料保護需求。
2018年至今,CVE 中共有釋出了 92 條漏洞資訊與其相關。部分CVE如下:
CVE-2018-8027 | Apache Camel 2.20.0 到 2.20.3 和2.21.0 Core 在 XSD 驗證處理器中存在 XXE 漏洞。 |
---|---|
CVE-2018-13439 | 微信支付 Java SDK 中的 WXPayUtil 類中存在XXE漏洞。 |
CVE-2018-1000548 | 在版本號小於 14.3 的 Umlet 中,在檔案解析中存在XML外部實體注入漏洞,可能導致機密資料洩露、拒絕服務、伺服器端請求偽造。此攻擊可以通過特製的 UXF 檔案進行攻擊。 |
CVE-2018-1364 | IBM Content Bavigator 2.0 和 3.0 版本中在處理XML資料時,易受XML外部實體(XXE)攻擊。遠端攻擊者可以利用此漏洞暴露敏感資訊或佔用記憶體資源。 |
三、示例程式碼
3.1 缺陷程式碼
本節使用示例程式碼來源為某開源支付 Java SDK ( https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 ),原始檔名:WXPayUtil.java,檔案路徑為:java-sdk-v3\src\main\java\com\github\wxpay\sdk。
在上述程式碼可以看到在25行處資料通過 xmlToMap 形參傳入,資料未做任何過濾,且 XML 處理器也未做安全設定就在32行處對資料做了解析,而實際場景中,引數 strXML
也是受攻擊者控制的,這樣攻擊者可能通過構造惡意的 strXML
來進行 XXE 攻擊。
使用360程式碼衛士對上述示例程式碼進行檢測,可以在檔案第32行檢出“有風險的XML外部實體注入”缺陷。如圖1所示:
圖1 檢測出有風險的XML外部實體注入
3.2 修復程式碼
在上述修復程式碼中的第28行使用的是一個xml工具類WXPayXmlUtil,用於生成一個安全的xml處理器。而 WXPayXmlUtil 類中最為關鍵的是第16行,通過 setFeature 讓生成的 xml 處理器完全禁用 DTDS。通過圖2可以看出,360程式碼衛士對修復後的程式碼並未檢出缺陷。
圖2 XXE漏洞修復示例
四、如何避免XXE漏洞
常見的避免方法:
1. 儘可能使用簡單的資料格式(如:JSON),避免對敏感資料進行序列化;
2. 及時修復或更新應用程式或底層作業系統使用的所有XML處理器和庫。同時,通過依賴項檢測,將SOAP更新到1.2版本或更高版本;
3. 在應用程式的所有XML解析器中禁用XML外部實體和DTD程序,具體實現可以參考《OWASP Cheat Sheet ‘XXE Prevention’》( https://www.owasp.org/index.php/XML_External_Entity_ (XXE)_Prevention_Cheat_Sheet)
如下程式碼是java應用程式中使用DocumentBuilderFactory解析xml時防範XXE漏洞的示例:
4. 輸入校驗:在伺服器端使用白名單進行輸入驗證和過濾,以防在XML文件、標題或節點中出現惡意資料。
5. 驗證XML和XSL檔案上傳功能是否使用XSD驗證或其他類似驗證的方法來驗證上傳的XML檔案
6. DAST工具需要額外的手動步驟來檢查和利用XXE漏洞,而使用ASAT工具可以通過檢測依賴項和安全配置來發現XXE漏洞。
*本文作者:360 程式碼衛士,轉載請註明來自 FreeBuf.COM