摘要
這份報告針對在 Open VSX Registry 中發現的高級惡意軟體 GlassWorm Loader 提供全面的技術分析。GlassWorm Loader 利用受駭的開發者帳戶來散佈惡意的 VS Code 擴充功能,並採用多階段感染鏈。分析深入探討其技術架構,包括規避技術、透過 Solana 交易備忘錄進行的命令與控制 (C2) 解析,以及其 Payload 功能(重點在於從 macOS 系統大量外洩資料)。此外,報告還探討了對軟體供應鏈安全的更廣泛影響,並與 VS Code 擴充功能生態系中的類似威脅進行類比。文中也討論了開發者和平台供應商的緩解策略與最佳實踐,以因應這類不斷演變的威脅。
1. 簡介
整合開發環境 (IDE) 內惡意軟體的擴散,對軟體供應鏈構成了重大且不斷演變的威脅。最近的事件凸顯了擴充功能市場的脆弱性,受駭的開發者帳戶可能被用來向廣大使用者群散佈惡意軟體。在 Open VSX Registry 中發現的 GlassWorm Loader 便是這類威脅的典型案例,它利用多階段感染程序來入侵 macOS 系統並外洩敏感資料 [1]。這份報告目的為剖析 GlassWorm Loader 的技術細節,深入瞭解其運作機制與影響。
2. 技術架構與執行流程
GlassWorm Loader 透過精心設計的多階段執行鏈運作,目的為規避偵測並對受駭系統建立持久控制。本節詳細介紹感染過程中的技術組件及其互動方式。
2.1. Stage 0:初始 Loader 與解密
最初的入侵發生在合法 VS Code 擴充功能的惡意版本中。這些擴充功能包含一個小型的混淆 Loader,通常嵌入在
extension.js
等檔案中。這個 Loader 的主要功能是解密並執行一個體積更大、經過加密的 Payload。解密過程利用對稱加密演算法 AES-256-CBC,將十六進位字串轉換為可執行程式碼 [1]。
下方展示了類似於 GlassWorm Loader 中可能發現的解密機制範例。此程式碼片段示範了使用 Node.js 內建的
crypto
模組進行 AES 解密。
- const crypto = require('crypto');
- // Placeholder for the encrypted blob (truncated for readability)
- const encryptedBlobHex = '...11162 bytes truncated...';
- const key = crypto.scryptSync('your_secret_key', 'salt', 32); // Derive a 32-byte key
- const iv = Buffer.alloc(16, 0); // Initialization vector (often hardcoded or derived)
- function decrypt(encryptedHex) {
- try {
- const encryptedBuffer = Buffer.from(encryptedHex, 'hex');
- const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
- let decrypted = decipher.update(encryptedBuffer);
- decrypted = Buffer.concat([decrypted, decipher.final()]);
- return decrypted.toString('utf8');
- } catch (e) {
- console.error('Decryption failed:', e.message);
- return null;
- }
- }
- const decryptedCode = decrypt(encryptedBlobHex);
- if (decryptedCode) {
- // In a real scenario, this would be eval(decryptedCode) or similar
- // For analysis, we just log it.
- console.log('Decrypted code snippet:', decryptedCode.substring(0, 200) + '...');
- }
解密成功後,產生的程式碼會立即執行,啟動感染鏈的下一階段。這種方法讓攻擊者能夠隱藏其主要的惡意邏輯,使靜態分析更具挑戰性。
2.2. Stage 1:環境規避
GlassWorm Loader 的一個顯著特徵是其實作了環境規避技術。具體而言,它包含了避免在俄語語系的系統上執行的 routine [1]。這種地理圍欄機制是某些 Threat actor 採用的常見策略,目的是防止其惡意軟體影響特定地理或語言區域內的系統,可能是為了避免法律制裁或針對特定的受害者族群。這項檢查通常涉及檢查系統語系設定,例如在 JavaScript 環境中透過
Intl.DateTimeFormat().resolvedOptions().locale
取得的設定。
- function checkLocaleAndEvade() {
- const locale = Intl.DateTimeFormat().resolvedOptions().locale; // Get the system locale
- console.log('Detected locale:', locale);
- // List of locales to evade (example: Russian and related locales)
- const evasionLocales = ['ru-RU', 'ru', 'be-BY', 'uk-UA'];
- if (evasionLocales.some(evadeLocale => locale.startsWith(evadeLocale))) {
- console.log('Evasion triggered: Russian or related locale detected. Terminating execution.');
- // In a real malware, this would lead to process termination or dormancy
- return true;
- }
- console.log('No evasion locale detected. Continuing execution.');
- return false;
- }
- // Example usage:
- // if (checkLocaleAndEvade()) {
- // // Exit or halt malicious activities
- // } else {
- // // Proceed with next stage
- // }
這個規避層為資安研究人員和自動化分析系統增加了另一個障礙,因為惡意軟體的完整功能可能不會在所有的測試環境中顯現。
2.3. Stage 2:透過 Solana 備忘錄進行命令與控制 (C2) 解析
GlassWorm Loader 最具創新性的技術其中之一是其解析命令與控制 (C2) 伺服器位址的方法。GlassWorm 不依賴傳統的 hardcoded IP 或網域名稱(這些很容易被列入黑名單),而是利用 Solana 交易備忘錄作為 Dead drop [1]。這種技術涉及將 C2 指標嵌入到合法 Solana 區塊鏈交易的備忘錄欄位中。由於區塊鏈交易具有不可變性且廣泛分佈,難以封鎖或審查 C2 通訊管道,這顯著增強了惡意軟體對抗偵測和拆除行動的韌性。
惡意軟體會監控 Solana 區塊鏈以尋找特定的交易備忘錄,提取嵌入的 C2 URL,然後使用這些 URL 來建立與下一階段基礎設施的通訊。這種去中心化的 C2 基礎設施方法是一種高級策略,減少了對靜態指標的依賴,並能實現快速的伺服器端更新 [1]。
- // Pseudocode for Solana C2 resolution
- function resolveC2FromSolanaMemos() {
- // Connect to Solana blockchain RPC endpoint
- const solanaRpcClient = new Solana.Connection("https://api.mainnet-beta.solana.com");
- // Monitor recent transactions for specific patterns in memo fields
- // This would involve iterating through recent blocks and parsing transaction details
- solanaRpcClient.getRecentTransactions({
- // Filter for transactions involving known GlassWorm addresses or specific memo prefixes
- // This is a simplified representation; actual implementation would be more complex
- filter: { programId: "Memo1UhkJRfHyvLMcVryEM6MyfRSQoVvYch31hg", limit: 100 }
- }).then(transactions => {
- for (const tx of transactions) {
- if (tx.meta && tx.meta.logMessages) {
- for (const log of tx.meta.logMessages) {
- if (log.startsWith("Program log: Memo (len ") && log.includes("C2_URL:")) {
- const memo = log.split("C2_URL:")[1].trim();
- console.log("Discovered C2 URL from Solana memo:", memo);
- return memo; // Return the first discovered C2 URL
- }
- }
- }
- }
- }).catch(error => {
- console.error("Error resolving C2 from Solana memos:", error);
- });
- return null;
- }
- // Example usage:
- // const c2Url = resolveC2FromSolanaMemos();
- // if (c2Url) {
- // // Proceed to fetch next-stage payload from c2Url
- // }
2.4. Stage 3:Payload 執行與資料外洩
一旦解析出 C2 伺服器,GlassWorm Loader 就會獲取並執行額外的遠端程式碼,這構成了最終的 Payload。這個 Payload 專為廣泛的資訊竊取和持久性而設計,主要針對 macOS 系統 [1]。惡意軟體會收集並外洩大量的敏感資料,包括:
- 瀏覽器 cookies、歷史紀錄和登入資料庫(針對 Mozilla Firefox 和 Chromium 系列瀏覽器)。
- 加密貨幣錢包擴充功能資料,例如 MetaMask。
- 桌面加密貨幣錢包檔案(例如 Electrum, Exodus, Atomic, Ledger Live, Trezor Suite, Binance, TonKeeper)。
- 使用者的登入鑰匙圈資料庫和 Apple Notes 資料庫。
- 來自桌面、檔案和下載資料夾的特定使用者檔案。
- FortiClient VPN 設定檔案。
-
開發者認證與設定,包括
~/.aws(認證與設定)和~/.ssh(私鑰、known_hosts及相關設定)。 -
來自常見工作流的驗證素材,例如 npm 設定中的
_authToken和 GitHub 驗證 Artifact,這些可以授予存取私人儲存庫、CI 密鑰和發佈自動化的權限。
開發者認證與設定的外洩特別令人擔憂,因為這增加了雲端帳戶遭入侵以及在開發者和企業環境內進行橫向移動的風險 [1]。這凸顯了這類惡意軟體所帶來的重大供應鏈風險。
2.5. 執行流程圖
GlassWorm Loader 的整體執行流程可以視覺化為一個多階段程序,如下圖所示。該圖說明了從初始啟動到資料外洩的操作順序。
in extension.js} B --> C{AES Decryption
of Staged Loader} C --> D{"Environment Check
(e.g.,
Russian Locale Evasion)"} D -- If Evasion Triggered --> E[Terminate/Dormant] D -- If No Evasion --> F{Solana Blockchain
C2 Resolution} F --> G{Fetch Next-Stage
Payload from C2} G --> H[Execute Payload in Memory] H --> I["Data Exfiltration
(Credentials, Wallets,
Documents)"] H --> J[Establish Persistence/
Remote Control]
3. 供應鏈漏洞與攻擊向量
GlassWorm Loader 等攻擊之所以成功,是建立在 VS Code 擴充功能供應鏈的根本弱點之上。除了技術性的 Payload,主要的攻擊向量涉及透過外洩的認證(特別是個人存取 Token,簡稱 PAT)來入侵發佈者帳戶 [2]。
3.1. 外洩存取 Token 的影響
VS Code Marketplace 或 Open VSX 的 Token 授予了 Threat actor 發佈新版本擴充功能的權限。如果屬於合法且熱門擴充功能的 Token 遭到入侵,攻擊者可以向整個已安裝的使用者群推播惡意更新 [2]。這是一種有效的供應鏈攻擊,因為更新通常是自動且靜默的,利用了開發者對已安裝擴充功能的固有信任 [2]。研究發現了數百個有效的外洩 Token,代表了超過 85,000 個擴充功能的安裝基礎,凸顯了這種暴露的規模 [2]。
3.2. 認證外洩的根本原因
Token 外洩的主要技術原因是擴充功能封裝過程中無意中捆綁了敏感檔案。這包括隱藏檔案或點檔案 (dotfiles),例如包含環境變數和秘密資訊的
.env
檔案,以及直接 hardcoded 在擴充功能原始碼中的認證 [2]。過去由於在發佈前缺乏嚴格的秘密資訊掃描,使得這些敏感 Artifact 在擴充功能包中被公開散佈。這種漏洞特別令人擔憂,因為它甚至會影響看似無害的擴充功能(例如佈主題),這些擴充功能通常被認為較安全,但仍可能包含並外洩秘密資訊 [2]。
4. 緩解與防禦策略
解決 GlassWorm Loader 等惡意軟體帶來的供應鏈威脅需要多層次的方法,包括市場層級的控制和開發者的最佳實踐。
4.1. 市場層級的控制
針對這些發現,平台供應商已實施了關鍵的預防措施。其中最重要的是將秘密資訊掃描功能整合到發佈流程中 [2]。這項主動措施可防止發佈包含已驗證秘密資訊(如 Token)的擴充功能,並通知擴充功能擁有者。此外,所有已識別的外洩 Token 都已被撤銷,以消除帳戶被接管的立即威脅 [2]。
這些市場層級的介入對於過濾惡意提交並在影響更廣泛的使用者群之前識別受駭帳戶至關重要。持續監控和快速響應機制對於對抗 Threat actor 不斷演變的策略是必不可少的。
4.2. 開發者最佳實踐
開發者必須意識到 VS Code 擴充功能在高度特權的環境中運作,具備檔案系統存取和 shell 執行等能力 [3]。為了將風險降至最低,開發者應遵守最小特權原則。具體而言,應避免或嚴格審查
child_process.exec
等強大的 Node.js API 的使用,因為它會引入重大的命令注入風險 [2]。當外部程序有其必要時,應優先選擇更安全的替代方案,例如
child_process.spawn
並配合經過仔細清理的輸入。
此外,開發者必須採用安全的認證管理實踐,確保最終擴充功能包中不包含敏感檔案或 hardcoded 秘密資訊。這包括:
- 對敏感資料使用環境變數或安全的設定管理系統,而不是直接嵌入程式碼中。
- 實施 pre-commit hooks 和 CI/CD 流程檢查,以掃描並防止意外包含秘密資訊。
- 定期輪換 API 金鑰和存取 Token。
- 安裝第三方擴充功能時保持謹慎,驗證其合法性並審查其權限。
藉由採用這些實踐,開發者可以顯著降低遭受供應鏈攻擊的風險,並為建立更安全的擴充功能生態系做出貢獻。
5. 結論
對 GlassWorm Loader 的分析揭示了一種針對軟體開發供應鏈的高級且多面向的攻擊模式。核心技術威脅在於其利用強大的 Node.js 環境(特別是
crypto
、
Intl.DateTimeFormat
,以及可能的
net
和
child_process
模組)來促進資料外洩並建立持久的遠端控制。這種技術 Payload 通常透過關鍵的供應鏈漏洞遞送:經由外洩的個人存取 Token 入侵發佈者帳戶。擴充功能缺乏健壯的權限模型放大了這些攻擊的影響,允許惡意組件以近乎完整的系統權限運作。
雖然市場供應商已開始實施必要的預防措施,但開發者的持續警覺以及採用安全的編碼和封裝實踐,對於保護 IDE 生態系免受這種持久威脅仍然至關重要。GlassWorm Loader 是一個嚴峻的提醒,說明了網路威脅不斷演變的局勢,以及在整個軟體供應鏈中採取主動資安措施的緊迫需求。