全球警惕HeadCrab!針對Redis的新型惡意軟件已出現(xiàn)
近期,一種新的難以捉摸的嚴(yán)重威脅已經(jīng)出現(xiàn),自2021年9月以來,它一直在滲透并駐留在全球的服務(wù)器上。這種被稱為HeadCrab的高級威脅利用了一種最先進(jìn)的定制惡意軟件方式,使得該惡意軟件無法被無代理和傳統(tǒng)的防病毒解決方案檢測到,會危害大量 Redis 服務(wù)器。HeadCrab僵尸網(wǎng)絡(luò)已經(jīng)控制了至少 1,200 臺服務(wù)器。
本報告將深入研究HeadCrab 攻擊的細(xì)節(jié),研究其操作方法、用于逃避檢測的技術(shù)以及組織可以采取的保護(hù)其系統(tǒng)的步驟。
什么是 Redis?
Redis是一種開源的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲,可用作數(shù)據(jù)庫、緩存或消息代理。默認(rèn)情況下,Redis服務(wù)器不啟用身份驗(yàn)證,旨在運(yùn)行在安全、封閉的網(wǎng)絡(luò)上,而非暴露在互聯(lián)網(wǎng)上。這使得可從Internet訪問的默認(rèn)Redis服務(wù)器容易受到未經(jīng)授權(quán)的訪問和命令執(zhí)行的攻擊。
Redis集群提供了一種運(yùn)行Redis安裝的方法,其中數(shù)據(jù)自動劃分并存儲在多個Redis節(jié)點(diǎn)上。在一個集群中,有一個主服務(wù)器和一個從服務(wù)器,可以方便地復(fù)制和同步數(shù)據(jù)。
默認(rèn)的Redis命令之一是SLAVEOF,它指定一個服務(wù)器作為集群中另一個Redis服務(wù)器的從屬服務(wù)器。當(dāng)服務(wù)器被定義為從服務(wù)器時,它將與主服務(wù)器同步,包括下載主服務(wù)器中存在的任何Redis模塊。
Redis模塊是可執(zhí)行的共享對象文件,可用于以各種方式增強(qiáng)服務(wù)器的功能。通過上傳模塊并通過Redis端口使用MODULE LOAD命令將模塊加載到服務(wù)器上。Redis 模塊使用Redis API執(zhí)行與服務(wù)器管理和控制相關(guān)的各種任務(wù),例如使用RedisModule_CreateCommand API 定義自定義命令。
近年來,Redis 服務(wù)器已成為攻擊者的目標(biāo),通常是通過錯誤配置和漏洞。隨著 Redis 服務(wù)器變得越來越流行,攻擊的頻率也越來越高。
攻擊流程
這個故事始于對一個蜜罐的攻擊,當(dāng)時攻擊者以 Redis 服務(wù)器為目標(biāo)。該服務(wù)器最終使用SLAVEOF 命令被攻破,將其設(shè)置為攻擊者控制的另一臺 Redis 服務(wù)器的從服務(wù)器。Redis 主服務(wù)器隨后啟動了從服務(wù)器的同步,從服務(wù)器又將惡意Redis模塊 HeadCrab 惡意軟件下載到從服務(wù)器(蜜罐)上。攻擊者已使用此技術(shù)一段時間,并允許他們將惡意 Redis 模塊加載到受影響的主機(jī)上。如下圖所示,這些是從入站網(wǎng)絡(luò)數(shù)據(jù)收集中獲得的Redis命令日志。攻擊者首先列出所有可用模塊,配置服務(wù)器以允許上傳新模塊,然后將模塊下載到/tmp目錄。
將受害Redis服務(wù)器設(shè)置為從服務(wù)器
一旦模塊下載到受害服務(wù)器上的/tmp目錄,它就會使用MODULE LOAD /tmp/<module_name>命令加載到 Redis 進(jìn)程中。如下面的屏幕截圖所示,攻擊者在最終成功之前嘗試加載多個模塊。
HeadCrab 惡意軟件模塊加載
在對加載的模塊進(jìn)行逆向工程后,我們發(fā)現(xiàn)了一種復(fù)雜的、長期開發(fā)的惡意軟件。它為攻擊者提供了許多高級功能,并最終完全控制目標(biāo)服務(wù)器。該模塊引入了 8 個自定義命令,以模式rds*命名,攻擊者使用這些命令在受感染的服務(wù)器上執(zhí)行操作。HeadCrab 惡意軟件的技術(shù)分析部分討論了惡意軟件功能和命令的完整列表。
蜜罐顯示攻擊的主要影響是用于加密貨幣挖掘的資源劫持。從內(nèi)存中提取的礦工配置文件顯示,礦池主要托管在私人合法 IP 地址上。對這些 IP 地址的檢查表明,它們要么屬于干凈的主機(jī),要么屬于一家領(lǐng)先的安全公司,這使得檢測和歸屬變得更加困難。在配置文件中找到了一項(xiàng)公共 Monero 礦池服務(wù),但礦工在運(yùn)行時未使用該服務(wù)。
我們不僅發(fā)現(xiàn)了HeadCrab惡意軟件,還發(fā)現(xiàn)了一種在Redis服務(wù)器中檢測其感染的獨(dú)特方法。當(dāng)這一方法應(yīng)用于暴露在外的服務(wù)器時,發(fā)現(xiàn)了大約 1,200 臺活躍的受感染服務(wù)器。受害者似乎沒有什么共同點(diǎn),但攻擊者似乎主要針對Redis服務(wù)器,并且對Redis模塊和API有深刻的理解和專業(yè)知識,正如惡意軟件所展示的那樣。
我們注意到攻擊者已竭盡全力確保其攻擊的隱蔽性。該惡意軟件旨在繞過基于卷的掃描,因?yàn)樗鼉H在內(nèi)存中運(yùn)行,而不存儲在磁盤上。此外,使用Redis模塊框架和API刪除日志。攻擊者與合法IP地址(主要是其他受感染的服務(wù)器)通信,以逃避檢測并降低被安全解決方案列入黑名單的可能性。該惡意軟件主要基于不太可能被標(biāo)記為惡意的Redis進(jìn)程。有效載荷通過memfd加載,內(nèi)存文件,內(nèi)核模塊直接從內(nèi)存加載,避免磁盤寫入。
HeadCrab 惡意軟件的技術(shù)分析
HeadCrab 惡意軟件是一種高度復(fù)雜且先進(jìn)的威脅。作為惡意Redis模塊框架構(gòu)建,它擁有眾多選項(xiàng)和功能。本節(jié)將概述通過我們的靜態(tài)和動態(tài)分析確定的惡意軟件的主要功能。
如截圖所示,HeadCrab樣本在Virus Total (MD5=c5b992c76b7c9fa3b9bd755dd3b5af76) 上只有少量安全產(chǎn)品可以檢測。盡管我們嘗試獲取更多樣本,目前還沒有發(fā)現(xiàn)更多的樣本,這讓我們更加懷疑這是一種高度規(guī)避的新型惡意軟件。
驗(yàn)證它在執(zhí)行時只運(yùn)行一次
在初始執(zhí)行時,惡意軟件利用RedisModule_OnLoad函數(shù),該函數(shù)在Redis服務(wù)器加載模塊時觸發(fā)。然后,惡意軟件會保存相關(guān)Redis API函數(shù)的地址以備后用,并檢查是否已加載名為rds的模塊,如果已加載,則立即退出而不進(jìn)行任何惡意操作。
初始環(huán)境范圍界定
存儲啟動模塊加載的連接信息以供將來檢查。此外,惡意軟件會檢查它是作為特權(quán) root 用戶還是作為名為redis的特權(quán)較低的用戶運(yùn)行。
重視操作安全性(幻數(shù))
該模塊可以加載2個參數(shù)(幻數(shù)),它們實(shí)際上是2個全局幻數(shù),用作加密密鑰并驗(yàn)證它的操作者是否真的是威脅者。之后,惡意軟件可以在其執(zhí)行流程中的不同位置對這些幻數(shù)進(jìn)行一些操作。該模塊可以加載或不加載幻數(shù),這將影響惡意軟件執(zhí)行期間的某些功能。如果模塊加載了2個參數(shù),一些Redis默認(rèn)命令(8個命令:Module、Client、Debug、Shutdown、Monitor、Slaveof、Replicaof、Config) 被主要返回錯誤的命令覆蓋。這樣做是為了避免惡意軟件檢測。如果模塊未加載2個參數(shù),則跳過此步驟。修改后的默認(rèn)命令如下:
此外,惡意軟件會刪除Redis日志文件,如果它是通過將其截斷為0大小重新創(chuàng)建的,則將其清空。
準(zhǔn)備工作
惡意軟件會進(jìn)行一些檢查以確定操作過程。我們不會詳細(xì)介紹這些檢查,但會檢查/testing路徑和執(zhí)行日期,并根據(jù)某些功能是否正在執(zhí)行來進(jìn)行檢查。信號處理函數(shù)被替換并被惡意軟件用來與其子進(jìn)程通信。
隱藏代碼執(zhí)行
惡意軟件找到動態(tài)加載程序的路徑,以便它可以執(zhí)行進(jìn)程。通過簡單地提供所需可執(zhí)行文件的路徑作為參數(shù),動態(tài)加載程序可用于以其名稱執(zhí)行進(jìn)程。這可用于繞過基于檢查進(jìn)程執(zhí)行來檢測惡意文件的安全解決方案。由于動態(tài)加載器是一個合法的二進(jìn)制文件,它不會被標(biāo)記為惡意的,并且惡意軟件可以在這些安全解決方案中隱藏自己。
從內(nèi)存中執(zhí)行
該惡意軟件試圖在memfd_create系統(tǒng)調(diào)用的幫助下創(chuàng)建無文件文件。如果成功,它會創(chuàng)建10個memfd或臨時文件并保存它們供以后使用。
強(qiáng)調(diào)在容器中執(zhí)行
惡意軟件檢查進(jìn)程ID是否低于31。我們推測這樣做是為了檢測服務(wù)是否在容器中運(yùn)行。如果惡意軟件不在容器上運(yùn)行,則會檢查幾個服務(wù)管理程序,如systemd、initd、upstart等。如果安裝了它們中的任何一個,它們將被標(biāo)記,稍后將用于將持久化的服務(wù)和腳本放置在適當(dāng)?shù)奈恢谩N覀兗僭O(shè)惡意軟件在容器上跳過了這一步,因?yàn)樗菬o效的。
創(chuàng)建新的Redis命令
然后惡意軟件創(chuàng)建新的 Redis 命令,用于使攻擊者能夠操作惡意軟件:
- rdsa該命令接受兩個參數(shù)。一個是 Redis 配置文件的路徑,第二個是惡意 Redis 模塊的路徑。此函數(shù)在 Redis 配置中添加一行,用于加載帶有幻數(shù)的惡意模塊。為了獲得惡意軟件的進(jìn)一步持久性,它隱藏了loadmodule命令輸出。此命令用于加載惡意模塊,并通過向打印到屏幕的輸出添加填充來隱藏其活動。
- rdss執(zhí)行帶有popen并返回進(jìn)程輸出作為命令輸出
- rdsp將默認(rèn)命令替換為惡意函數(shù)以逃避檢測。
- rdsi通過截斷更新加密中使用的幻數(shù)和空日志。
- rdsmMONITOR是一個 Redis 調(diào)試命令,它流回 Redis 服務(wù)器處理的每個命令。它也被 rdsp 命令或使用 2 個參數(shù)加載模塊所取代。這個新命令負(fù)責(zé)恢復(fù)對MONITOR命令的更改——重新啟用服務(wù)器調(diào)試。
- rdsc偵聽所需端口上的傳入連接,并啟用與 C2 服務(wù)器建立加密通信通道。下面的附錄部分詳細(xì)描述了可用的命令。為了強(qiáng)調(diào)它的一些強(qiáng)大功能,惡意軟件可以創(chuàng)建一個新套接字并將其連接到 C2 命令套接字,將網(wǎng)絡(luò)隧道連接到另一個 IP 地址和端口對,執(zhí)行 shell 命令,將文件內(nèi)容發(fā)送到 C2,將數(shù)據(jù)寫入打開 memfd 文件,讀取保存的 memfd 文件的內(nèi)容并發(fā)送回 C2,加載無文件內(nèi)核模塊,以及許多其他強(qiáng)大的功能。
- rdsr與 C2 服務(wù)器建立加密通信通道。與上面的 rdsc 相同。
- rdsx恢復(fù)被覆蓋的命令并將它們恢復(fù)為默認(rèn)的 Redis 命令。
在以下截圖中,您可以看到對其中一些命令的模擬:
覆蓋和恢復(fù)默認(rèn)命令的示例
誰是HeadCrab?或者,什么是 HeadCrab?
這個攻擊者和惡意軟件為什么被稱為HeadCrab。答案很簡單。攻擊者在攻擊過的機(jī)器中留下了如下信息。
正如以上截圖所示,攻擊者被識別為HeadCrab,這是游戲《半條命》中的一種怪物,它會附著在人類身上并將他們變成僵尸。這很合理,因?yàn)槲覀円呀?jīng)看到這種威脅使 Redis服務(wù)器僵尸化并使用它們橫向移動到其他服務(wù)器。
此外,攻擊者還創(chuàng)建了一個專門針對Nautilus團(tuán)隊(duì)的博客條目。此參考適用于有關(guān)Redigo的博客。Redigo是一種針對Redis服務(wù)器的新型惡意軟件,攻擊者利用了一個允許從LUA沙箱中逃逸的漏洞,并導(dǎo)致目標(biāo)服務(wù)器上的遠(yuǎn)程代碼執(zhí)行 (CVE-2022-0543)。在進(jìn)一步審查新發(fā)現(xiàn)的惡意軟件并在惡意軟件中發(fā)表個人專用評論后,我們認(rèn)為到Redigo惡意軟件也在利用主從技術(shù),而不是 LUA 沙箱逃逸。
這個攻擊組織是高度離散的,因此無法在開源中找到其活動的許多跡象。我們確實(shí)找到了上圖中出現(xiàn)的“pamdicks”。在Trend Micro的博客中,提到了一個名為netlink的rootkit用于更改與CPU相關(guān)的統(tǒng)計(jì)信息(可以隱藏pamdicks進(jìn)程和 CPU 負(fù)載)來隱藏加密挖礦。但很可能是攻擊者所指的內(nèi)容。
運(yùn)行時檢測
HeadCrab惡意軟件旨在偷偷攻擊Redis服務(wù)器,無論它們是在容器中還是在VM上運(yùn)行。企業(yè)都需要使用容器安全或主機(jī)安全類解決方案進(jìn)行實(shí)時檢測,我并使用實(shí)時惡意行為指標(biāo)來識別 HeadCrab 惡意軟件等隱秘攻擊。
將攻擊映射到 MITRE ATT&CK 框架
這里我們將上述攻擊中的組件映射到MITRE ATT&CK框架的相應(yīng)攻擊技術(shù):
總結(jié)、補(bǔ)救和緩解
在此報告中,我們揭示了負(fù)責(zé)創(chuàng)建高級惡意Redis框架的攻擊者 HeadCrab 的威脅。我們深入研究惡意軟件的內(nèi)部工作原理并展示其豐富的功能。調(diào)查顯示,HeadCrab 的僵尸網(wǎng)絡(luò)已經(jīng)控制了 1,200 多臺服務(wù)器,所有服務(wù)器都感染了該惡意軟件。我們有理由相信,HeadCrab 將堅(jiān)持使用尖端技術(shù)滲透服務(wù)器,無論是通過利用錯誤配置還是漏洞。
立即修復(fù)受感染的服務(wù)器
如果您的服務(wù)器遭到破壞,則必須假設(shè)您的網(wǎng)絡(luò)也遭到破壞并立即啟動您的事件響應(yīng)流程。這將幫助您檢測違規(guī)的程度、隔離受感染的系統(tǒng)并清理受影響的環(huán)境。雖然可以通過刪除關(guān)聯(lián)的服務(wù)和腳本來刪除惡意軟件,但刪除加載模塊從Redis配置和重啟服務(wù)器來看,攻擊者仍然保留了一些能力,包括刪除文件、執(zhí)行二進(jìn)制文件、竊取 SSH 密鑰、掃描和與其他系統(tǒng)通信以及加載內(nèi)核模塊的能力。這使得攻擊者可以在網(wǎng)絡(luò)中橫向移動。從服務(wù)器中完全消除攻擊者的存在可能是一項(xiàng)復(fù)雜的任務(wù)。為確保您的網(wǎng)絡(luò)安全,我們建議將Redis數(shù)據(jù)庫的備份保存到一個文件中,并盡可能將其遷移到具有適當(dāng)授權(quán)和流量控制并且不能直接從Internet訪問的新服務(wù)器。
緩解建議
為了降低 Redis 服務(wù)器的風(fēng)險,您希望通過確保Redis配置符合安全最佳實(shí)踐來強(qiáng)化環(huán)境。
在本報告中,攻擊者使用“主從”技術(shù)從遠(yuǎn)程服務(wù)器復(fù)制數(shù)據(jù)庫到目標(biāo)服務(wù)器(蜜罐)。此功能最初由Redis創(chuàng)建以提高性能和創(chuàng)建冗余,但被攻擊者積極使用以迅速感染目標(biāo)并逃避檢測。我們建議采取以下步驟來加強(qiáng)您的Redis服務(wù)器的安全性:
(1) Redis 旨在供受信任環(huán)境中的受信任客戶端訪問。
這意味著通常,將Redis實(shí)例直接暴露給Internet或通常暴露給不受信任的客戶端可以直接訪問Redis TCP端口或UNIX套接字的環(huán)境并不是一個好主意。
(2) 每當(dāng)您在云中使用Redis時,最好啟用保護(hù)模式以增強(qiáng)安全性。
保護(hù)模式確保數(shù)據(jù)庫只響應(yīng)環(huán)回地址,并生成錯誤作為對所有從其他IP地址連接的節(jié)點(diǎn)的答復(fù)。
(3) 使用綁定參數(shù)接受來自已知主機(jī)的通信.
您的Redis服務(wù)器將只監(jiān)聽通過bind選項(xiàng)指定的地址的連接。這是一種安全措施,允許丟棄不是在網(wǎng)絡(luò)內(nèi)部建立的連接。
(4) 如果沒有主動使用“slaveof”功能,我們強(qiáng)烈建議禁用它。
(5) 您可以在Redis安全管理部分或他們的相關(guān)博客中閱讀更多安全建議。
可以采取一些進(jìn)一步的步驟來減輕對云中軟件開發(fā)生命周期的威脅,我們建議遵循以下準(zhǔn)則:
- 未知威脅和零日漏洞將繼續(xù)存在。即使您做的每件事都正確,您也無法始終保護(hù)您的運(yùn)行時環(huán)境免受此類攻擊。因此,您需要監(jiān)視運(yùn)行時環(huán)境。部署 容器安全或主機(jī)安全解決方案以保護(hù)您的運(yùn)行時環(huán)境。運(yùn)行時監(jiān)控是一種基本實(shí)踐,可幫助快速緩解問題并最大程度地減少中斷。監(jiān)視過程還適用于可能發(fā)生可疑活動(例如,下載惡意二進(jìn)制文件)的運(yùn)行時環(huán)境。
- 掃描您的軟件供應(yīng)鏈。您可以使用開源工具,例如 Chain-bench,旨在根據(jù)新的 CIS 軟件供應(yīng)鏈基準(zhǔn)審核您的軟件供應(yīng)鏈堆棧的安全合規(guī)性。
- 為您的開發(fā)人員、DevOps 和安全團(tuán)隊(duì)提供掃描漏洞和錯誤配置的工具。除了 商業(yè)化軟件工具,您還可以找到特定的開源工具(例如 Trivy)來掃描此類漏洞。