摘要

本報告針對一種以 Bash 為基礎的模組化加密貨幣竊取軟體 (內部代號 NovaStealer) 進行了詳細的技術分析,該軟體目標鎖定桌面環境。本分析著重於惡意軟體的多階段執行、利用 LaunchAgents 和 GNU Screen 等本機系統工具的複雜持續性機制,以及其主要的malicious payload,包括錢包檔案外傳和進階的應用程序替換技術。本研究強調了構成惡意軟體隱匿性和操作彈性的技術設計選擇,尤其是其利用命令列工具進行低階系統操作,例如 Dock 和 Launchpad 的修改。研究結果凸顯了威脅態勢的發展,即便是簡單的腳本語言也被用來建立高度模組化和持續性的資訊竊取活動。

用簡單腳本做大事:Bash 腳本成為新寵?深入理解模組化竊密軟體的 C2 通訊與資料外傳 | 資訊安全新聞

1. 簡介

桌面作業系統的威脅態勢持續演進,Threat actors 越來越依賴本機腳本語言和內建工具來縮小其足跡並規避偵測。NovaStealer 活動即為此趨勢的範例,它主要建構於 Bash scripting [1] 之上,採用了多元件的架構。這種方法提供了一種低複雜度、高效能的方式來建立持續性並動態部署malicious payload。本報告剖析了 NovaStealer 的技術實現,重點關注其執行流程、持續性技術、模組化設計以及用於竊取加密貨幣錢包認證的新穎應用程序替換機制。

2. 執行流程和持續性機制

感染的初始階段涉及一個未知的投遞程序執行第一階段腳本 mdriversinstall.sh [1]。此腳本負責設定惡意軟體的作業環境。它會建立一個隱藏的目錄結構 ( ~/.mdrivers ~/.mdrivers/scripts ) 並安裝核心元件: mdriversmngr.sh (協調程序) 和 mdrivers.sh (啟動器/安裝程序)。Threat actors 使用本機的 uuidgen 工具生成一個唯一識別碼並儲存在 ~/.mdrivers/user_id.txt 中,隨後用於 C2 通訊和遙測 [1]。

持續性是惡意軟體設計的關鍵要素,透過兩種主要的技術方法實現:

  1. LaunchAgent 設定: mdrivers.sh 腳本負責寫入一個 .plist 檔案來建立一個 LaunchAgent,確保腳本管理程序在系統開機時重新啟動。使用諸如 application.com.artificialintelligence 這樣看似良性的標籤是一種社交工程策略,目的是混入合法的系統程序中 [1]。
  2. GNU Screen 用於隱匿執行: 一個特別值得注意的技術選擇是使用 GNU Screen utility 來分離其元件的執行 [1]。此技術在典型的 macOS 惡意軟體中較不常見,但對於維持隱匿性和操作連續性非常有效。指令 screen -dmS <name> <path> 用於啟動腳本:
    • -d : 在分離狀態下啟動Session,以防止可見的終端機視窗。
    • -m : 強制建立一個新的Session。
    • -S <name> : 指派一個符號名稱,這對於協調程序的更新機制至關重要。
    這確保了子程序在背景中獨立執行,並且可以在使用者登出後繼續存在,使標準的程序監控工具難以偵測和終止 [1]。這種程序管理方法原則上類似於更複雜惡意軟體中使用的程序注入或分岔,但完全透過簡單的本機工具實現。

3. 協調和模組化架構

mdriversmngr.sh 腳本作為中央協調程序和 C2 客戶端運作。其主要職責是擷取、更新和管理各種malicious payload。這種模組化是關鍵的設計特徵,允許Threat actor在無需完全重新感染主機的情況下,快速部署新功能或修復錯誤 [1]。C2 伺服器以冒號分隔的 script_name:base64_content 格式回應,協調程序對其進行解碼並執行。

模組更新機制是透過檢查是否存在與腳本名稱相對應的現有 screen Session 來實現。如果需要更新,協調程序會向正在運行的Session和程序發送終止訊號,然後寫入新腳本並重新啟動它。此程序的概念邏輯如下:

  1. # Conceptual logic for module update in mdriversmngr.sh
  2. # Check if a screen session with the script's name exists
  3. if screen -ls | grep -q "<script_name>"; then
  4. # Send 'quit' command to the screen session
  5. screen -S <script_name> -X quit
  6. # Kill the process associated with the script path
  7. pkill -f <script_path>
  8. fi
  9. # Write new script content (decoded from C2)
  10. # Restart script in a new detached screen session
  11. screen -dmS <script_name> <script_path>

觀察到的模組,每個負責一個特定的惡意行為,彙整於表 1 [1] 中。

表 1: NovaStealer malicious payload 模組和功能
模組名稱 主要功能 技術機制
mdriversfiles.sh 加密貨幣錢包檔案外傳。 使用 curl 搭配 --data-binary 鎖定特定錢包更新。
mdriversmetrics.sh 系統和環境列舉。 mdls ps 指令來收集系統資料和正在運行的程序。
mdriversswaps.sh 應用程序替換以進行認證網路釣魚。 sqlite3 , PlistBuddy , 和 defaults write 用於系統操作。
mdriversusers.sh 使用者特定的行為 (目前最少)。 載入 USER_ID 並睡眠,暗示更新的目標功能。

這種模組化設計讓人聯想到其他現代惡意軟體家族,例如 PylangGhost,該家族也採用結構化的多模組架構來實現其遠端存取和認證竊取功能 [2]。

4. 資料外傳和應用程序替換

4.1. 資料外傳

mdriversfiles.sh 模組旨在鎖定並外傳來自流行加密貨幣錢包 (包括 Trezor Suite、Exodus 和 Ledger Live) 的關鍵資料檔案 [1] 。鎖定目標非常明確,著重於包含敏感資訊的檔案,例如密碼、助記詞和設定資料。例如,它鎖定 Exodus 的 passphrase.json seed.seco 等檔案,以及來自 Trezor Suite 索引資料庫 (IndexedDB) 的紀錄檔 [1]。

外傳是使用 curl 工具執行的,該工具使用 --data-binary 旗標將原始檔案內容貼上到 C2 伺服器。惡意軟體在兩次外傳嘗試之間採用了長達 72,000 秒 (20 分鐘) 的睡眠間隔。這種不頻繁的外傳是一種技術選擇,可能是為了避免壓垮 C2 後端,並允許目標應用程式在下一個收集週期之前更新其資料,從而最大化被竊取資料的價值 [1]。

4.2. 應用程序替換技術

技術上最複雜的元件是 mdriversswaps.sh 模組,它實現了應用程序替換技術,以釣取錢包助記詞。此方法涉及用malicious payload、未簽名的複本替換合法的錢包應用程序 (Ledger Live 和 Trezor Suite) [1]。此程序需要對作業系統的使用者介面和設定檔案進行幾項低階操作:

  1. Launchpad 和應用程序移除: 腳本首先使用 sqlite3 從 Launchpad 資料庫中刪除項目,有效地從使用者的視圖中移除了合法應用程序圖示。然後,它使用 rm -rf /Applications 目錄中刪除原始應用程序套件。
  2. Dock 操作: 此步驟確保malicious payload應用程序顯著顯示並由使用者啟動。它涉及使用兩個強大的命令列工具來操作 com.apple.dock.plist 檔案:
    • /usr/libexec/PlistBuddy : 用於根據其在 persistent-apps 陣列中的索引來刪除合法應用程序的現有 Dock 項目。
    • defaults write com.apple.dock persistent-apps -array-add : 用於添加一個新的、精心製作的 XML 字典項目,將 Dock 圖示指向malicious payload應用程序更新,該更新暫存在使用者可寫入的目錄 ( ~/Library/LaunchAgents/ ) 中 [1]。

使用 PlistBuddy defaults write 修改系統偏好設定檔案是在桌面環境中實現持續性和視覺欺騙的經典但高效的技術。此程序以強制重新載入 Dock 來結束,確保malicious payload圖示立即對使用者可見 [1]。

5. 架構視覺化

下圖說明了 NovaStealer 惡意軟體的多階段執行和模組化架構,突顯了從初始執行到專業的malicious payload模組和 C2 基礎設施的流程。

graph TD A[Unknown Dropper] --> B(mdriversinstall.sh); B --> C{Setup & Persistence}; C --> D[Create
~/.mdrivers & Scripts]; C --> E["Generate USER_ID
(uuidgen)"]; C --> F["Launch mdrivers.sh
(screen -dmS)"]; F --> G(mdrivers.sh); G --> H[Write
LaunchAgent PLIST]; H --> I["mdriversmngr.sh
(Orchestrator)"]; I --> J{C2 Communication}; J --> K["Fetch Script List
(base64)"]; K --> L{Module Management}; L --> M[Check
screen session]; L --> N["Update/Restart Module
(pkill, screen -dmS)"]; N --> O1(mdriversfiles.sh); N --> O2(mdriversmetrics.sh); N --> O3(mdriversswaps.sh); O1 --> P1["Exfiltrate Wallet Files
(curl --data-binary)"]; O2 --> P2["Collect System Telemetry
(mdls, ps)"]; O3 --> P3["App Swap
(sqlite3, PlistBuddy,
defaults write)"]; P1 & P2 & P3 --> Q[C2 Server]; subgraph Core Components B G I end subgraph Persistence & Stealth F H end subgraph Malicious Modules O1 O2 O3 end

6. 結論

NovaStealer 代表了一個技術上引人注目的現代、模組化加密貨幣竊取軟體範例,它利用本機腳本和系統工具來實現隱匿性和持續性。它依賴 Bash 和 GNU Screen 工具進行分離執行,展示了一種務實的惡意軟體開發方法,優先考慮操作彈性和低階系統控制,而非複雜的編譯二進位檔。應用程序替換技術涉及透過 PlistBuddy defaults write 對 Dock 和 Launchpad 進行複雜操作,突顯了惡意軟體進階使用者欺騙的能力。模組化架構確保了Threat actor可以以最小的努力適應新的安全措施並鎖定新的應用程序。持續監控此類以 Bash 為基礎的威脅對於開發有效的端點偵測和響應策略至關重要。