Rootkit 是植入操作系統最深處的惡意軟件。儘管在紙面上它們似乎對攻擊者很有吸引力,但創建它們會帶來重大的技術挑戰,並且最輕微的編程錯誤都有可能使受害計算機完全崩潰。在對2022 年的APT 預測中,我們注意到儘管存在這些風險,但預計會有更多的攻擊者達到開發此類工具所需的複雜程度。嵌入在如此低級別的操作系統中的惡意軟件的主要吸引力之一是,它極難被檢測到,而且在固件rootkit的情況下,即使重新安裝操作系統或用戶完全更換了計算機的硬盤驅動器,也會確保計算機保持在感染狀態。
在本文中,我們會介紹一個名為CosmicStrand 的UEFI 固件rootkit。
受影響的設備雖然我們無法發現受害計算機最初是如何被感染的,但對其硬件的分析揭示了CosmicStrand 可以感染的設備。 rootkit 位於技嘉或華碩主板的固件映像中,我們注意到所有這些映像都與使用H81 芯片組的設計有關。這表明可能存在允許攻擊者將其rootkit 注入固件映像的常見漏洞。
在這些固件映像中,對CSMCORE DXE 驅動程序進行了修改,其入口點已被修補以重定向到.reloc 部分中添加的代碼。此代碼在系統啟動期間執行,會觸發一個長執行鏈,從而導致在Windows 中下載和部署惡意組件。
查看我們能夠獲得的各種固件映像,我們評估這些修改可能是使用自動修補程序執行的。如果是這樣,則攻擊者可以事先訪問受害者的計算機,以提取、修改和覆蓋主板的固件。這可以通過已經部署在計算機或物理訪問上的預先植入的惡意軟件來實現。
感染過程概述在深入了解組成這個rootkit 的各種組件之前,我們想提供一個關於它試圖完成的任務的高級視圖。此執行鏈的目標是在每次啟動時從受感染的UEFI 組件開始將內核級植入部署到Windows 系統中。
UEFI 惡意軟件開發者面臨一個獨特的技術挑戰:他們的植入程序在啟動過程中很早就開始運行,以至於操作系統(在本例中為Windows)甚至還沒有加載到內存中。到那時,UEFI執行上下文已經終止了。 rootkit完成的主要任務是找到一種方法,將惡意代碼一路傳遞到各個啟動階段。
工作流程包括連續設置掛鉤,允許惡意代碼持續存在,直到操作系統啟動之後。所涉及的步驟是:
初始受感染的固件引導整個鏈。
該惡意軟件在啟動管理器中設置了一個惡意掛鉤,允許它在執行之前修改Windows 的內核加載程序。
通過篡改操作系統加載程序,攻擊者能夠在Windows 內核的功能中設置另一個掛鉤。
當稍後在操作系統的正常啟動過程中調用該函數時,惡意軟件最後一次控制了執行流程。
它在內存中部署一個shellcode 並聯繫C2 服務器以檢索實際的惡意有效負載以在受害者的計算機上運行。
下圖中總結了這些步驟:
UEFI 植入
在確定了惡意軟件植入的目的之後,我們現在可以更詳細地了解這些步驟是如何執行的。
整個執行鏈從EFI 驅動程序開始,它似乎是一個名為CSMCORE 的合法版本的補丁版本(旨在促進通過MBR 在傳統模式下啟動計算機),其中攻擊者修改了指向HandleProtocol 啟動服務函數的指針。每次調用此函數時,都會將執行重定向到攻擊者提供的代碼,該代碼試圖確定調用它的組件(它正在尋找要感染的特定組件——efi)。通過檢查函數參數以及位於返回地址的字節,CosmicStrand 可以識別它正在尋找的確切“調用”。
之所以選擇執行中的這個特定點,是因為在這個階段,引導管理器已經加載到內存中,但還沒有運行。 CosmicStrand抓住了這個機會來修補它的Archpx64TransferTo64BitApplicationAsm中的一些字節。
該函數稍後在正常的操作系統啟動過程中被調用也是在一個關鍵時刻:那時Windows 操作系統加載程序也存在於內存中,並且可以反過來進行修改。
當它運行時,Archpx64TransferTo64BitApplicationAsm 通過查找特定的字節模式從OS 加載器(OslArchTransferToKernel) 中定位一個函數。 然後CosmicStrand 在它的末端添加一個掛鉤。
OslArchTransferToKernel 在執行從Windows 加載程序轉移到Windows 內核之前被調用,這使其成為此類rootkit 的傳統掛鉤點。
在Windows 內核有機會運行之前,CosmicStrand 在ZwCreateSection 中設置了另一個掛鉤。惡意代碼被複製到內存中的ntoskrnl.exe的映像中,並且ZwCreateSection的第一個字節被重寫以重定向到它。我們注意到,攻擊者小心翼翼地將惡意代碼放在ntoskrnl.exe的.text部分的空閒空間中,這使得這種重定向在可能的安全產品眼中不那麼顯眼。
此時,CosmicStrand 似乎還試圖禁用PatchGuard,這是一種用於防止修改內存中Windows 內核的關鍵結構的安全機制。為此,它會定位ntoskrnl.exe 的KiFilterFiberContext 函數並對其進行修改,使其無需執行任何工作即可返回。值得注意的是,該函數的本地化也是通過搜索硬編碼模式來實現的,非常詳盡,甚至包含與2016 年8 月發布的Redstone 1 對應的模式。
然後,Windows內核啟動,並在正常運行時調用掛鉤的ZwCreateSection函數。當這種情況發生時,CosmicStrand會再次獲得執行的控制權,並在運行更多惡意代碼之前恢復原始代碼。
ZwCreateSection 掛鉤的主要目的是收集內核提供的API 函數的地址,並為下一個組件創建一個導入表。通過使用解析函數,它還在內核地址空間中分配了一個緩衝區,在調用shell代碼之前,它在這個地址空間映射shell代碼。
內核shellcode到目前為止描述的所有步驟僅用於將代碼執行從UEFI 傳播到Windows 內核。這個shellcode 是迄今為止鏈中第一個真正的惡意組件。它設置了一個線程通知例程,每次創建新線程時都會調用該例程。 CosmicStrand 一直等到winlogon.exe 出現,然後在這個高權限上下文中執行回調。
這樣,CosmicStrand 會休眠10 分鐘並測試受感染計算機的互聯網連接。 CosmicStrand 不依賴高級API 函數來生成網絡流量,而是直接與傳輸設備接口交互:它生成所需的IRP(I/O 請求數據包)並通過將IOCTL 發送到TCP 或UDP 設備對象。 DNS請求可以通過谷歌的DNS服務器(8.8.8[.]8)或自定義的DNS服務器(222.222.67[.]208)來實現。
CosmicStrand 通過向其C2 服務器update.bokts[.]com 發送自定義的UDP或TCP 數據包來檢索其最終有效負載。回复預計將返回一個或多個包含528 字節塊的數據包,遵循以下結構:
各種數據塊被重新組裝成一家族字節,這些字節映射到內核空間並解釋為shellcode。不幸的是,我們無法獲得來自C2 服務器的數據副本。然而,我們確實在我們可以研究的一台受感染計算機上找到了內存中的用戶模式樣本,並相信它與CosmicStrand 相關聯。該示例是一個可執行文件,它運行命令行以便在受害者的計算機上創建一個用戶(“aaaabbbb”)並將其添加到本地管理員組。
我們可以由此推斷,從C2 服務器接收到的shellcode 可能是攻擊者提供的PE 可執行文件的暫存器,而且很可能存在更多。
較舊的CosmicStrand 變體在調查過程中,我們還發現了這個rootkit 的舊版本。它們具有相同的部署過程,它們的細微差別與內核shellcode 有關。
它試圖從exe 而不是winlogon.exe 劫持線程。
為獲得額外的shellcode 以運行而聯繫的C2 域是不同的(erda158[.]to)。
每次在系統中創建新進程時,舊變體都會打印調試消息。
根據我們對這兩種變體使用的基礎設施的分析,我們估計舊的一種在2016 年底至2017 年中期之間使用,而當前的一種在2020 年曾非常活躍。
基礎設施我們知道有兩個C2服務器,每個變體對應一個。根據對他們可用的被動DNS數據,這些域有一個很長的生命週期,並在有限的時間內解析到IP地址,否則,rootkit 將無法運行。因此值得注意的是,雖然攻擊者選擇部署極其持久的植入程序,但對受害計算機的實際利用可能只有幾個月。但是,這些域可能偶爾會在很短的時間內被重新激活,並且此信息不會被被動DNS 系統記錄。
細心的讀者會注意到這兩個域的活動期之間存在三年的差距。在此期間,攻擊者可能正在使用通過CosmicStrand 部署的用戶模式組件控制受害者的計算機,或者更有可能我們還沒有發現的其他變體和C2服務器。
受害者目前,研究人員在中國、越南、伊朗和俄羅斯發現CosmicStrand 的受害者。
總結綜合分析,CosmicStrand 是由說中文的開發者開發的,或者是利用了講中文的攻擊者的資源。具體來說,CosmicStrand中的一些代碼模式也在另一個惡意軟件家族MyKings殭屍網絡中被觀察到(例如,MD5 E31C43DD8CB17E9D68C65E645FB3F6E8)。 Sophos在2020年記錄了這個用於部署加密器的殭屍網絡。
與CosmicStrand 的相似之處包括:
使用MBR rootkit 在MyKings 中建立隱秘持久性。
CosmicStrand 和MyKings 在內核模式(Proc 和GetM)中分配內存時使用相同的標籤。
兩個家族都以相同的方式生成網絡數據包,並直接利用UDP 和TCP 設備對象。
兩者使用的API 哈希碼是相同的,如下面的截圖所示。據我們所知,這種算法只在另外兩個rootkit 中被發現,即MoonBounce 和xTalker。
除了這種代碼相似性之外,CosmicStrand 使用的硬編碼後備DNS 服務器位於CHINANET-BACKBONE (AS4134) 這一事實可能被視為攻擊者屬於中文網絡的一個非常低的置信度的跡象。
CosmicStrand 是一個複雜的UEFI 固件rootkit,它允許其所有者實現持久性攻擊。