[331] npm axios 供應鏈攻擊:信任的套件成為駭客後門
當你執行 npm install axios 的那一刻,可曾想過這行指令可能正在把你的電腦拱手讓給陌生人?

2026 年 3 月 31 日,全球熱門的函式庫 axios(每週下載量超過 1 億次)遭駭客劫持,惡意版本在 npm 上存活了近三小時才被撤下。駭客沒有在 axios 原始碼中植入惡意程式碼——相反地,他們玩了一招更陰險的把戲:透過注入一個名為 plain-crypto-js 的假依賴套件,在安裝過程中悄悄部署遠端存取木馬(RAT)。
攻擊的巧妙在於它的「隱形」設計:駭客預先部署了 plain-crypto-js@4.2.1 這個精心包裝的陷阱——它抄襲了 legitimate crypto-js 套件的描述和儲存庫連結,甚至預先發布了一個乾淨的 4.2.0 版本來建立可信度。當開發者安裝 axios@1.14.1 或 axios@0.30.4 時,npm 會自動拉取這個惡意依賴,觸發 postinstall 腳本執行。整個過程不到兩秒,你的電腦就已經在呼叫駭客的指揮控制(C2)伺服器了。
一旦惡意腳本執行完畢,它會立即刪除自己、替換 package.json 成乾淨版本,甚至還故意把版本號改成 4.2.0 來製造混淆。事後檢查 node_modules 的開發者會發現一切看起來正常——沒有可疑程式碼、沒有異常檔案,只有那個根本不該存在的 plain-crypto-js 目錄。
駭客的準備工作堪稱軍事級精密。他們先劫持了 axios 主要維護者 jasonsaayman 的 npm 帳號(把註冊信箱改成 ifstap@proton.me),繞過了 GitHub Actions 的 OIDC 受信任發布機制。然後在短短 39 分鐘內,同時向 1.x 和 0.x 兩個版本分支投毒,最大化覆蓋範圍。更可怕的是,plain-crypto-js 早在 axios 惡意版本發布前 18 小時就上線了,所以這是一場經過周密計算的供應鏈滲透行動。
這次事件暴露出的不僅僅是單一帳號的安全漏洞,而是整個 npm 生態系的結構性風險。axios 作為前十大熱門套件,卻因為單一維護者的憑證外洩而淪陷,這讓我們不得不質疑:究竟有多少我們日常依賴的「基礎建設」其實是建立在如此脆弱的安全模型之上?當一個套件的維護者帳號被攻破,數百萬個專案瞬間就成為待宰羔羊——這就是供應鏈攻擊的可怕之處。
這次事件證明了一件事:技術防禦永遠追不上人性弱點。無論你的 CI/CD 管線多麼嚴謹、無論你的漏洞掃描多麼頻繁,只要有一個維護者點了釣魚連結、用了重複密碼,整條防線就會瞬間崩塌。這或許正是軟體產業接下來最艱難的課題。
我也在事件發生後要 Grok 建議檢查與排除方式,然後將這個指示與檢查方式丟給 AI Agent 去執行,不管是 codex 、 gemini cli 或 kiro 都可以
AI 建議檢查與排除方式
以下是針對 axios npm 供應鏈攻擊(2026 年 3 月 31 日事件)的完整檢查與排除指南。攻擊細節來自 StepSecurity 的報告:攻擊者劫持 axios 主要維護者帳號,發布了兩個惡意版本 — axios@1.14.1 和 axios@0.30.4。這兩個版本並未直接修改 axios 原始碼,而是偷偷注入一個隱藏依賴 plain-crypto-js@4.2.1,其 postinstall 腳本會在安裝時自動執行,投放跨平台 Remote Access Trojan (RAT)(支援 macOS、Windows、Linux),並會自我清除痕跡。
重要提醒:
- npm 已移除這兩個惡意版本。
- 如果你的系統曾安裝過這兩個版本,請假設已遭入侵(後門可能已執行並聯繫 C2 伺服器)。
- 立即隔離受影響機器,並在處理後輪換所有憑證(npm token、GitHub token、雲端金鑰、SSH keys、CI/CD secrets 等)。嚴重情況下建議重建環境。
1. 立即檢查是否中招(所有專案 + 全域環境)
在專案根目錄執行以下指令:
# 檢查專案中的 axios 版本
npm list axios --depth=0 2>/dev/null | grep -E "1\.14\.1|0\.30\.4"
# 檢查 lockfile(package-lock.json、yarn.lock 等)
grep -E "1\.14\.1|0\.30\.4" package-lock.json 2>/dev/null || true
grep -E "1\.14\.1|0\.30\.4" yarn.lock 2>/dev/null || true
grep -E "1\.14\.1|0\.30\.4" pnpm-lock.yaml 2>/dev/null || true
# 檢查隱藏的惡意依賴目錄(目錄存在即表示 dropper 已執行)
ls node_modules/plain-crypto-js 2>/dev/null && echo "
POTENTIALLY COMPROMISED - plain-crypto-js 存在"
# 全域檢查
npm list -g axios 2>/dev/null | grep -E "1\.14\.1|0\.30\.4"檢查 RAT 落地檔案(平台特定):
- macOS:
ls -la /Library/Caches/com.apple.act.mond 2>/dev/null && echo "
COMPROMISED"- Linux:
ls -la /tmp/ld.py 2>/dev/null && echo "
COMPROMISED"- Windows(PowerShell):
dir "%PROGRAMDATA%\wt.exe" 2>$null && echo "COMPROMISED"如果以上任何檢查出現「AFFECTED」或「COMPROMISED」,請立即執行排除步驟。
2. 排除與修復步驟
步驟 A:清理與降級(推薦方式)
# 1. 刪除 node_modules 和 lockfile(確保乾淨)
rm -rf node_modules package-lock.json yarn.lock pnpm-lock.yaml
# 2. 安裝安全版本(目前最新安全版為 1.14.0)
npm install axios@1.14.0
# 如果你是 0.x 系列:
# npm install axios@0.30.3為了防止 transitive dependency(間接依賴)又拉到惡意版本,在 package.json 中加入 overrides(npm)或 resolutions(yarn):
{
"dependencies": {
"axios": "1.14.0"
},
"overrides": {
"axios": "1.14.0"
}
}(yarn 用 "resolutions": { "axios": "1.14.0" })
步驟 B:使用 –ignore-scripts 安全安裝(強烈建議)
npm install --ignore-scripts
# 或在 CI/CD 中預設加入 --ignore-scripts步驟 C:額外清理
# 強制刪除可能殘留的惡意目錄
rm -rf node_modules/plain-crypto-js
# 清 npm cache
npm cache clean --force步驟 D:輪換憑證與重建環境
- 立即修改/輪換所有可能暴露的憑證。
- 如果檢查到 RAT 檔案或在 CI/生產環境中安裝過 → 強烈建議從乾淨映像重建機器/容器。
- 封鎖 C2 基礎設施(防火牆/DNS):
sfrclak.com、142.11.206.73(端口 8000)。
3. 預防未來類似攻擊
- 永遠使用 lockfile 並 commit 到 Git(避免
^或*範圍自動拉最新版)。 - 在
.npmrc中設定ignore-scripts=true(開發與 CI 皆適用)。 - 使用供應鏈安全工具監控:StepSecurity、Socket.dev、Snyk、Dependabot 等。
- 啟用 npm 雙因素驗證(2FA),並避免長期使用單一 maintainer 帳號。
- CI/CD 中強制
--ignore-scripts+ 掃描依賴。
目前安全狀態
- 最新安全版本:axios@1.14.0(1.x 系列)與 0.30.3(0.x 系列)。
- 建議所有專案升級到 1.14.0(除非有相容性問題)。
如果你有多個專案,可以寫一個簡單腳本遞迴掃描所有資料夾中的 package.json 和 node_modules。