你剛剛用 npm install 裝了一個密碼管理工具,它表面上安全無虞,實際上卻在你背後偷走你的 GitHub token、AWS 金鑰,甚至滲透你的 shell 設定檔。
這不是科幻情節。這是 Socket 安全研究團隊在 2026 年 4 月 23 日揭露的 Bitwarden CLI 供應鏈攻擊事件。
事件始末
Bitwarden 是全世界最受歡迎的開源密碼管理器之一,服務超過 1,000 萬名用戶和 5 萬家企業,在企業採用率上排名前三。它的 CLI 版本(命令列介面)讓開發者能在終端機中管理密碼、金鑰和敏感資訊,是許多 DevOps 工程師和系統管理員的日常工具。
2026 年 4 月 23 日,Socket 研究團隊發現 Bitwarden CLI 的 npm 套件 @bitwarden/cli@2026.4.0 被植入了惡意程式碼。
攻擊者利用 Bitwarden CI/CD 管線中的一個 GitHub Action 作為突破口,將惡意負載塞進 bw1.js 這個檔案中,隨著正常的版本發布流程一同發布到 npm 註冊表。任何在這段期間執行 npm install @bitwarden/cli 的開發者,都可能已經不知不覺地安裝了這個被污染的版本。
根據 Socket 的分析,這起攻擊與先前揭露的 Checkmarx 供應鏈攻擊事件(2026 年 4 月 22 日)使用相同的基礎設施和攻擊手法。換句話說,這不是一個孤立事件,而是一場大規模供應鏈攻擊的其中一環。
技術拆解:這波攻擊到底做了什麼?
Socket 的安全研究團隊對 bw1.js 進行了深入分析,發現了一系列精心設計的惡意行為。來看看攻擊者到底在你機器上做了什麼。
相同的 C2 基礎設施
bw1.js 使用的命令與控制(C2)端點與 Checkmarx 事件的 mcpAddon.js 完全相同:
- C2 端點:
audit.checkmarx[.]cx/v1/telemetry,透過自訂的__decodeScrambled函數進行混淆,種子值為0x3039 - 資料外洩管道:除了直接回傳到 C2 伺服器,攻擊者還利用了兩種備援通道——GitHub API(透過 commit 方式)和 npm 註冊表(透過 token 竊取後重新發布帶有惡意套件)
嵌入式多重負載
bw1.js 包含了多層惡意負載,以 gzip 壓縮後再以 base64 編碼的方式嵌入:
- Python 記憶體掃描腳本:專門針對 GitHub Actions Runner.Worker 進行記憶體掃描,竊取執行中的 token
- setup.mjs loader:用於重新發布被污染的 npm 套件
- GitHub Actions 工作流程 YAML:注入到受害者的儲存庫中,竊取 repository secrets
- 硬編碼 RSA 公鑰:用於加密外洩的資料
- 意識形態宣言字串:一段關於「反機器抵抗」的宣言
憑證收割:不留死角
攻擊者建立了一份完整的憑證收割清單,幾乎覆蓋了所有開發者可能使用的認證方式:
- GitHub token:透過 Runner.Worker 記憶體掃描和環境變數
- AWS 憑證:從
~/.aws/目錄和環境變數 - Azure token:透過
azd設定 - GCP 憑證:透過
gcloud config config-helper - npm 設定檔:
.npmrc中的 token - SSH 金鑰:完整複製
~/.ssh/ - 環境變數:掃描所有環境變數中的敏感資訊
- Claude/MCP 設定檔:連 Anthropic Claude 的設定都不放過
這些憑證被加密後,透過 GitHub API 外洩到受害者帳號下新建的公開儲存庫中。這些儲存庫使用 Dune 主題命名({單字}-{單字}-{3位數字}),並在 commit message 中嵌入 token,同時加上標記字串 LongLiveTheResistanceAgainstMachines。
供應鏈擴散機制
攻擊者不只滿足於單一機器的入侵。他們設計了一套供應鏈擴散機制:
- npm token 盜用:找出受害者有權限寫入的 npm 套件
- 重新發布:將惡意的 preinstall hook 注入這些套件
- GitHub Actions 注入:修改工作流程以竊取 repository secrets
這意味著,一旦你的開發環境被入侵,攻擊者可以利用你的權限,將惡意程式碼散播到你維護的所有套件中,進而感染更多下游使用者。
俄語環境迴避機制
這段惡意程式碼內建了「俄羅斯 kill switch」:如果系統語言設定以 “ru” 開頭(俄語),程式會靜默退出,不執行任何惡意行為。它透過 Intl.DateTimeFormat().resolvedOptions().locale 和環境變數 LC_ALL、LC_MESSAGES、LANGUAGE、LANG 進行檢查。
這種機制在惡意軟體中相當常見。它既可能是為了避免在俄語系國家的執法機構留下痕跡,也可能是攻擊者不想「誤傷」自己人。
新發現的行為特徵
與先前的 Checkmarx 事件相比,這波攻擊還多了幾個值得注意的新特徵:
- 鎖定檔案:使用
tmp/tmp.987654321.lock防止多個實例同時執行 - Shell profile 持久化:將惡意負載注入
~/.bashrc和~/.zshrc,確保每次登入 shell 時都會被觸發 - 明確的品牌標示:儲存庫描述使用
Shai-Hulud: The Third Coming,除錯字串包含"Would be executing butlerian jihad!"——明顯參考了《沙丘》系列小說的設定
這不是單一事件:Checkmarx 供應鏈攻擊的更大圖景
如果你覺得這一切聽起來很熟悉,那是因為你可能是對的。這起 Bitwarden CLI 攻擊是 Checkmarx 供應鏈攻擊的一部分。
所謂供應鏈攻擊,不是直接攻擊你的系統,而是攻擊你依賴的工具、套件或服務。就像毒販不會直接找你交易,而是在你常去的餐廳下毒——你怎麼死的都不知道。
根據 Socket 的調查,Checkmarx 攻擊事件的主要特徵包括:
- 攻擊入口:透過受感染的 GitHub Action 進入 CI/CD 管線
- 攻擊目標:npm 生態系中的開源套件
- 資料外洩:竊取開發者憑證、token 和 secrets
- 持續擴散:利用竊取到的權限感染更多套件
攻擊者在 Checkmarx 事件中假冒 Checkmarx 公司的身份,創建了看似合法的 GitHub Action,誘使開發者將其整合到 CI/CD 工作流程中。一旦被採用,這個 Action 就會在 CI/CD 環境中竊取 secrets 和 token。
Bitwarden CLI 的攻擊可視為同一個攻擊者(或攻擊集團)的延伸行動。兩種惡意軟體共享相同的 C2 基礎設施、編碼混淆技術和負載解壓結構,但在操作簽名上有所不同。
為什麼這是每一個開發者的問題
你可能會想:「我又不用 Bitwarden CLI,關我什麼事?」
這種想法很危險。這次事件的本質不是 Bitwarden 的問題,而是整個 npm 生態系和 open source 供應鏈的結構性弱點。
具體來說:
信任模型過於樂觀
當你執行 npm install 時,你相信 npm 上發布的套件是安全的。但實際上,npm 套件的發布機制依賴 token 認證,而這些 token 往往躺在你的 .npmrc 檔案或環境變數中,對攻擊者來說唾手可得。
CI/CD 是新的攻擊面
GitHub Actions 讓開發者可以輕鬆地自動化測試、部署流程。但每一個你整合到工作流程中的 Action,都是一個潛在的攻擊點。如果某個 Action 的維護者的帳號被入侵,或 Action 本身的發布流程被破壞,你的整個 CI/CD 管線就可能被污染。
開源維護者的困境
Bitwarden 是大型開源專案,有專職的安全團隊。如果連他們的 CI/CD 管線都能被攻破,那些由一兩個志願者維護的小套件,安全性就更難保證了。
你可以怎麼保護自己
雖然供應鏈攻擊看起來很嚇人,但有一些實務做法可以大幅降低風險:
1. 定期審查 CI/CD 管線
檢查你使用的每一個 GitHub Action,特別是那些來自第三方開發者的。問自己三個問題:
– 這個 Action 真的需要這麼多權限嗎?
– 它的原始程式碼有沒有被 review 過?
– 它的維護者是否活躍?
如果可能,鎖定 Action 的版本(使用 SHA commit hash)而不是浮動標籤。
2. 限制 npm token 權限
不要使用全域 npm token。為每個 CI/CD 環境建立專用 token,並將權限限制到最低。定期輪換 token,特別是在懷疑有安全事件發生時。
3. 使用依賴項掃描工具
Socket、Snyk、Dependabot 等工具可以幫助你自動掃描依賴項中的已知漏洞和惡意行為。根據 Socket 自身的研究,傳統的軟體組成分析(SCA)工具只能識別約 30% 的新型態供應鏈攻擊。
4. 隔離開發環境
考慮在容器或虛擬機器中進行套件安裝和測試。這樣就算套件被入侵,攻擊者也難以滲透到你的主要開發環境。
5. 實施最小權限原則
你的 CI/CD token 不應該有寫入生產環境的權限。你的 npm token 不應該有發布所有套件的權限。你的 GitHub token 不應該有存取私人儲存庫的權限。把權限切成最小單位,即使某個環節被突破,損害也能被控制在有限範圍內。
6. 如果你已經使用了受影響的版本
Socket 團隊建議,如果你在 2026 年 4 月 23 日前後執行了 Bitwarden CLI 的更新:
- 立即檢查 CI 日誌,找出是否有可疑活動
- 輪換所有可能暴露的 secrets:GitHub token、AWS 金鑰、SSH 金鑰、npm token 等
- 檢查你的 GitHub 帳號下是否有可疑的公開儲存庫
- 檢查
~/.bashrc和~/.zshrc中是否有異常的程式碼 - 從受影響的機器上登出所有服務後重新登入,以刷新 token
更深層的問題:開源安全誰來負責?
回到這次事件的本質,我們不得不面對一個尷尬的事實:開源軟體的安全性長期被低估。
開源軟體是現代網際網路的基石。你的手機、你的伺服器、你的雲端服務,都依賴於成千上萬個開源套件。但這些套件中的大多數由志願者維護,安全審查的覆蓋率遠遠不足。
Bitwarden 是幸運的——它有商業支援,有專業的安全團隊,被攻擊後能迅速被發現並回應。但如果攻擊的目標是一個只有幾百次下載的小套件呢?誰來發現?誰來通報?誰來修復?
這不是危言聳聽。根據 Sonatype 的年度供應鏈攻擊報告,過去三年間,軟體供應鏈攻擊的發生次數大幅增加。攻擊者越來越意識到,直接攻擊大型企業的難度很高,但透過污染它們依賴的開源套件,可以以極低的成本達到同樣的效果。
觀察者的視角
供應鏈攻擊並不是什麼新鮮事。從 2020 年的 SolarWinds 事件,到 2024 年的 XZ Utils 後門事件,再到這次的 Bitwarden/Checkmarx 攻擊,模式越來越清晰——攻擊者不再直接敲你家的大門,而是找到供應你建材的工廠下毒。
這次事件最讓我警覺的不是技術細節有多精巧,而是攻擊者的「投資報酬率」。一個小隊的攻擊者,花幾個月的時間開發一個看起來合法的 GitHub Action,然後等待它被整合到某個大型專案的 CI/CD 管線中。一旦成功,他們就能輕易獲得成千上萬個開發者的憑證。這比逐個攻擊目標有效率太多了。
對於台灣的開發社群來說,我認為有一個特別值得關注的面向——我們的開源生態系相對較小,但許多企業的核心系統已經高度依賴 npm、PyPI、Docker Hub 等大型套件倉庫。當這些平台上的某個套件被污染時,影響往往不分國界。
說到底,安全不是一個產品,不是一個工具,不是一次性的審計。它是一個持續的過程,是每一次 npm install 前的那一秒猶豫,是每一次權限設定時多想一步的謹慎。沒有人能 100% 不被攻擊,但我們可以做到讓自己不是那個最容易下手的目標。
保持警覺,定期審查,不隨便信任——在供應鏈攻擊越來越頻繁的時代,這三件事比任何安全工具都重要。