- 使用竊取的憑證在 npm 上發布了惡意版本的 jscrambler (8.14.0),其中包含一個隱藏的預安裝鉤子,該鉤子會釋放一個跨平台的 Rust 資訊竊取程式。
- 該竊取程式的目標是雲端憑證、加密錢包、密碼管理器、AI 編碼工具配置和訊息應用程序,並且還包括 Linux 核心級功能。
- 攻擊者在三個小時內推送了五個惡意版本,後來的版本透過將投放器嵌入到主程式碼中來繞過 --ignore-scripts。
- Jscrambler 發布了乾淨版本 (8.22.0),並建議使用者輪換所有暴露的憑證並審核其係統。
2026年7月11日,知名JavaScript混淆和安全軟體供應商Jscrambler的npm套件遭遇了一次供應鏈攻擊,其危害遠超簡單的程式碼注入。攻擊者利用竊取的npm發布憑證推送了8.14.0版本,該版本帶有預安裝鉤子,會在受害者的機器上靜默部署並執行一個本地二進位。 Socket.dev在惡意版本上線僅六分鐘後就將其標記出來,但此時對於在此期間安裝過該版本的用戶來說,損害已經造成。
這次被入侵的軟體包並非個案。在接下來的三個小時內,同一攻擊者又推送了四個惡意版本——8.16.0、8.17.0、8.18.0 和 8.20.0——每個版本都攜帶了相同的跨平台 Rust 資訊竊取程式。這次攻擊利用了人們對 npm 生態系統的根本信任,一個被攻破的帳戶就能將一個合法的開發工具變成攻擊依賴它的開發者的武器。
攻擊:被盜憑證和隱藏有效載荷
8.14.0 版本引入了兩個先前全新發布版本 8.13.0 中沒有的新檔案:dist/setup.js 和 dist/intro.js。儘管名為 intro.js,但它並非 JavaScript 文件,而是一個大約 7.8 MB 的容器,其中包含三個經過 gzip 壓縮的本地二進位檔案——分別適用於 Linux x86-64、Windows x86-64 和 macOS arm64。在安裝過程中,setup.js 會識別主機作業系統,將相應的二進位檔案寫入系統暫存目錄中一個隨機命名的文件,並將其標記為可執行文件,然後隱藏其輸出並啟動它。此有效載荷隨後以與安裝過程相同的權限運行,這在開發人員機器或 CI 運行器上通常包括存取敏感憑證和令牌的權限。
Jscrambler 隨後證實,攻擊者竊取了 npm 發布憑證,並利用該憑證繞過了專案的正常發布流程。在 GitHub 公共倉庫中,沒有與 8.14.0 版本相符的提交、標籤或拉取請求。該版本直接推送至 npm,表示其帳戶或建置流程已被劫持。該公司撤銷了該憑證,輪換了金鑰,並加強了發布流程,但惡意版本仍然存在於 npm 上——雖然已被棄用,但仍可透過特定版本進行安裝。
竊賊的目標
這款以 Rust 編寫的資訊竊取工具的目標範圍廣泛,主要針對開發者。根據 Socket、StepSecurity 和 JFrog 的分析,它會掃描AWS、Azure 和 Google Cloud 的雲端憑證,包括 CI 運行器使用的元資料端點。它還會竊取 MetaMask、Phantom、Exodus、TrustWallet 和 Coinbase Wallet 等加密貨幣錢包及其助記詞,以及 Bitwarden 密碼管理器的保險庫。瀏覽器儲存的密碼和 cookie,以及 Discord、Slack、Telegram 和 Steam 的會話訊息,也都在其攻擊範圍之內。
這款竊取工具的獨特之處在於它專注於人工智慧編碼工具。它的目標是 Claude Desktop、Cursor、Windsurf、VS Code 和 Zed 的設定文件,這些檔案中通常儲存著 API 金鑰和模型上下文協定 (MCP) 伺服器憑證。 JFrog 的分析還顯示,該惡意軟體會竊取 VPN 設定檔、Tor 隱藏服務金鑰,甚至還會竊取 Metasploit、Sliver 和 Havoc 等紅隊框架的安裝資料夾——這表明攻擊者的目標明確指向安全研究人員和滲透測試人員。
戰役演變與規避戰術
攻擊者並未止步於最初的預安裝鉤子。從 8.18.0 版本開始,其傳播方式發生了變化:投放器被移至軟體包的主程式碼和命令列入口點,因此它會在軟體包被導入或運行時觸發,而不是在安裝過程中觸發。這項變更繞過了許多開發者所依賴的 `npm install --ignore-scripts` 安全機制,也避開了僅檢查安裝腳本的掃描器。後續版本也加入了針對 Windows 和 macOS 的反調試檢查,並且竊取程式內建了持久化機制——一個隱藏的 Windows 計劃任務,設定為每分鐘重新啟動一次;以及一個 macOS LaunchAgent,會在登入時重新載入。
在Linux系統上,此攻擊負荷更進一步,連結了核心的BPF函式庫,並將一個eBPF程式直接從記憶體載入到核心中。這使得攻擊者能夠直接控制內核,而不僅限於通常的用戶空間文件存取。 StepSecurity和SafeDep都偵測到了這項功能,但eBPF程式的具體用途仍在分析中。命令與控制的詳細資訊在二進位檔案中仍然加密,但StepSecurity的執行時間監控發現,該二進位檔案會連接到兩個硬編碼的IP位址和Tor基礎設施。
妥協指標和緩解措施
已識別的惡意版本包括 8.14.0、8.16.0、8.17.0、8.18.0 和 8.20.0。介於前兩個版本之間的 8.15.0 版本看起來是安全的,Jscrambler 已將8.22.0 版本指定為安全升級版本。安全公司已公佈了新增檔案及其解壓縮有效載荷的 SHA-256 雜湊值,以及兩個 C2 伺服器 IP 位址:37.27.122.124 和 57.128.246.79。主機上的殘留檔案包括系統暫存目錄中一個隨機命名的隱藏文件,以及一個用於持久化的隱藏 Windows 排程任務或 macOS LaunchAgent。
如果您或您的建置系統安裝了任何受影響的版本,第一步是立即升級到 8.22.0 版本,並從鎖定檔案和快取中清除所有惡意版本的痕跡。接下來,審核拉取該軟體包的工作站或 CI 運行器。檢查安裝日誌中 dist/setup.js 的執行情況,並找出安裝前後是否有意外的子程序或臨時目錄執行。在 Windows 系統上,檢查任務排程器中是否存在隱藏任務;在 macOS 系統上,檢查 ~/Library/LaunchAgents 目錄中是否存在不熟悉的 plist 檔案。最後,將該機器可能存取的所有金鑰視為已被竊取——輪換雲端金鑰、npm 和 GitHub 代幣、AI 工具和 MCP API 金鑰,撤銷 Discord、Slack、瀏覽器和 Bitwarden 會話,並將該主機上錢包中的所有加密貨幣轉移出去。
這次攻擊凸顯了一個嚴峻的現實:在 npm 生態系統中,一個被洩漏的憑證就能將一個原本受信任的開發工具變成憑證竊取和橫向移動的途徑。雖然首次發布僅用了六分鐘就檢測到了攻擊,速度令人印象深刻,但攻擊者能夠推送多個版本並調整發布方式,這表明供應鏈防禦必須超越簡單的腳本檢查。目前,最穩健的做法是鎖定經過驗證的版本,並將任何暴露視為對受影響環境的全面入侵。