本篇文章更新時間:2026/04/01
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持 。
內容目錄
axios 套件遭全面投毒:攻擊鏈解析與開發者必讀警訊
來自 StepSecurity 的深度剖析
編輯前言:axios 是每週下載量破億的 JavaScript HTTP 客戶端。這次事件之所以震撼,是因為攻擊者不是動了 axios 的程式碼,而是利用維護者帳號、依賴注入與自毀機制,完成了極其隱蔽的供應鏈攻擊。本篇筆記整理自 StepSecurity 的完整事件分析:axios Compromised on npm - Malicious Versions Drop Remote Access Trojan。
核心觀點 (Key Takeaways)
- 攻擊者入侵了 axios 維護者的 npm 帳號,發佈兩個惡意版本:1.14.1 與 0.30.4。
- 惡意版本加入一個從未出現在 axios 中的依賴 [email protected],真正的攻擊載體藏於其 postinstall 腳本。
- 安裝後,系統會被植入跨平台 RAT(遠端存取木馬),可在 macOS、Windows、Linux 背景執行。
深入解析
這篇分析讓我印象最深刻的有兩個字:精準與隱蔽。攻擊者不但掌握了維護者帳號,還完整模擬一個「看似正常的 npm 釋出流程」。真正的惡意行為完全不在 axios 程式碼內,而藏在被悄悄加入的依賴。
原文直指:「There are zero lines of malicious code inside axios itself, and that's exactly what makes this attack so dangerous.」
攻擊者的操作步驟非常工整:
- 事先佈署乾淨版本的 plain-crypto-js(4.2.0)建立可信度,18 小時後再發佈含惡意程式的 4.2.1。
- 在兩條主要 axios 分支同時投毒(1.x 與 0.x),間隔僅 39 分鐘。
- plain-crypto-js 的程式碼 99% 都是 crypto-js 的完整複製,只有三個檔案不同:package.json(加入 postinstall)、setup.js(木馬載荷)、package.md(用來之後偽裝成乾淨版)。
而最狡猾的是攻擊流程完成後的反取證技巧:
- setup.js 執行完會刪除自己。
- 會刪除惡意 package.json。
- 會把預先放好的 package.md 改名為 package.json,偽裝成乾淨版本。
換句話說:攻擊成功後,node_modules 看起來就像什麼都沒發生過。
1. 帳號攻擊:npm token 遭竊取
axios 的主要維護者 jasonsaayman 的 npm 帳號被入侵,攻擊者用它繞過 GitHub Actions 的 OIDC 發佈流程,直接手動將惡意版本推上 npm。
- legit 版本皆由 GitHub Actions OIDC 發佈
- 惡意版本無 OIDC、無 gitHead、無任何對應的 GitHub tag
這些元資料不一致,是事後判斷攻擊的一個關鍵證據。
2. 偽裝良好的惡意依賴:plain-crypto-js
攻擊者的整個包幾乎是 crypto-js 的鏡像,唯一真正的武器是:
postinstall: node setup.js
setup.js 會根據平台(macOS、Windows、Linux)下載不同的二階段 Payload(RAT)。更可怕的是,它採用雙層混淆、背景執行、錯誤完全吞掉,使得 npm install 永遠顯示成功。
3. Dropper 的跨平台攻擊鏈
- macOS:下載二階段執行檔到
/Library/Caches/com.apple.act.mond,並以 AppleScript 執行。 - Windows:複製 PowerShell 至看似正常的
wt.exe,並以 VBS 啟動隱藏的 payload。 - Linux:下載
/tmp/ld.py,以 nohup 背景執行。
每個平台都用看似正常的 system utility(curl、powershell、python)作為執行跳板。
筆者心得與啟發
這起事件讓我重新審視 npm 套件供應鏈的「信任模型」究竟有多脆弱。攻擊者並沒有去鑽 npm 的漏洞,也沒有碰 axios 的原始碼;他只需要:
- 偷到一組 npm token
- 發佈一個惡意依賴
- 利用 npm 的 postinstall 機制
整個攻擊鏈就成立了。這對所有使用 npm 的開發者來說提出了一個殘酷的現實:我們以為自己在安裝的是程式碼,但事實上安裝的是別人的權限。
實務上,我會建議團隊:
- 在 CI 中強制
npm ci --ignore-scripts - 為 npm packages 設立「新版本冷卻期」
- 不論專案大小皆應上鎖 node_modules egress
- 定期審查是否存在「無使用卻被安裝的依賴」
更重要的是,任何一個遭惡意 npm 套件感染的系統,都應視為全面淪陷:token、SSH key、cloud credential 都必須重新輪換。
這次事件做得如此隱蔽,如此精準。我想,未來類似事件只會越來越多,這只是開始。
