Apache Struts 是一個免費的開放原始碼程式開發架構,用來開發 Java 網站應用程式。我們仔細研究了過去 Apache Struts 被發現的幾個遠端程式碼執行 (Remote Code Execution,簡稱 RCE) 漏洞之後發現,歹徒大多使用 Object Graph Navigation Language (OGNL) 這個程式語言。OGNL 之所以很容易讓駭客從遠端執行任意的程式碼,是因為 Apache Struts 在大多數的流程當中都用到這個語言。
最近,一位研究人員在 Apache Struts 2 當中新發現一個關於 OGNL 的遠端程式碼執行漏洞:CVE-2017-5638。此外,一份報告也指出網路上已出現實際的漏洞攻擊案例,我們的研究和監控團隊也見過利用該漏洞的攻擊。
攻擊手法
駭客可以發送一個精心設計的網站請求給含有漏洞的伺服器,就能將一個檔案上傳至使用 Jakarta 外掛模組來處理檔案上傳請求的伺服器。
駭客接著在 Content-Type 標頭當中包含所要執行的指令來讓受害的伺服器執行指令。網路上已經出現示範這項攻擊手法的概念驗證。
漏洞分析
為了深入了解這項漏洞,我們仔細研究了一下該漏洞的修補程式,我們發現廠商在 FileUploadInterceptor.java 當中已放棄使用「LocalizedTextUtil」這個類別。此類別原本是用來在 HTTP 檔案上傳請求失敗時提供錯誤訊息給使用者。
圖 1:修補程式修改之處。
為了提供適當的錯誤訊息,程式使用了「LocalizedTextUtil 」當中所定義的「findText」函式來取得預先定義的錯誤訊息。
圖 2:Apache Struts 檔案上傳功能預先定義的錯誤訊息。
findText 函式的定義如下:
public static String findText(Class aClass, String aTextName,
Locale locale, String defaultMessage, Object[] args )
此函式會搜尋儲存在本地端的訊息文字來對應函式參數所傳入的「aTextName」錯誤代碼。此函數的參數如下:
aClass:FileUploadInterceptor 傳入此類別來指定錯誤訊息搜尋的起始點。
aTextName:錯誤代碼,用來尋找對應的錯誤訊息。
Locale:指定要讀取哪個地區所對應的錯誤訊息。
defaultMessage:如果找不到對應的訊息文字,即傳回此預設訊息。
args:錯誤參數的資源包 (resource bundle)。
如果程式找到對應的訊息,就會當成一個 OGNL 敘述來處理。因此,如果駭客在 Content-Type 標頭中傳遞 OGNL 敘述時指定了「multipart/form-data」屬性,程式就會處理並讓駭客有機會從遠端執行任意程式碼。
為了修正此問題,廠商放棄使用「LocalizedTextUtil」類別以及可能讓駭客用來輸出執行結果的「java.io.File」類別。
根據報告,包括 Struts 2.3.5 至 Struts 2.3.31 以及 Struts 2.5 至 Struts 2.5.10 的 Apache Struts 版本都受到影響。若您正在使用 Jakarta 做為檔案上傳的 Multipart 處理模組,建議您升級至 Apache Struts 2.3.32 或 2.5.10.1 版。當然您也可以改用 其他的 Multipart 處理模組。
- 趨勢科技解決方案
趨勢科技Deep Security 和 趨勢科技 Vulnerability Protection 漏洞防護 都能透過 虛擬修補 來防止端點裝置遭到此漏洞的威脅。趨勢科技 OfficeScan™ 的漏洞防護功能,也能在修補程式部署之前防止端點裝置遭到已知及未知的漏洞攻擊。Deep Discovery 能夠偵測、深入分析並主動回應漏洞攻擊以及其他類似威脅,利用特殊的引擎、客製化 沙盒模擬分析以及密切的交叉關聯分析,完整涵蓋網路攻擊的所有階段,甚至不須更新引擎或病毒碼就能偵測這類攻擊。
Deep Security™ 可利用下列深層封包檢查 (DPI) 規則來防止利用前述漏洞的威脅:
- 1008207 – Apache Struts2 Remote Code Execution Vulnerability (CVE-2017-5638)
Deep Discovery Inspector 客戶可透過以下 DDI 規則來防範這項威脅:
- Beta Rule ID: 3421 – CVE-2017-5638_HTTP_APACHESTRUTS_EXPLOIT
TippingPoint 客戶可利用以下 Custom Shield Writer (CSW) 和 MainlineDV 過濾規則來防範這項威脅:
- CSW: HTTP: Apache Struts Content-type Command Injection Vulnerability (CVE-2017-5638)
- 27410: HTTP: Apache Struts Content-type Command Injection Vulnerability (CVE-2017-5638)
原文出處:CVE-2017-5638: Apache Struts 2 Vulnerability Leads to Remote Code Execution 作者:Suraj Sahu (漏洞研究工程師)