AsyncAPI 四套件遭落毒:合法 npm provenance 點解照樣失守
Tech News

AsyncAPI 四套件遭落毒:合法 npm provenance 點解照樣失守

圖片:via iThome — https://www.ithome.com.tw/news/177812
TechLab 編輯部(譯)·

惡意版本已下架,但載入過套件嘅開發機同 CI runner 仲要查

呢宗 AsyncAPI 供應鏈攻擊發生喺 2026 年 7 月 14 日,唔係 8 月初先爆發。iThome 8 月 3 日報道事件時,五個惡意版本已經無法經 npm registry 取得,latest tag 亦已指返去乾淨版本。不過套件一旦入咗 lockfile、公司快取、build artifact 或開發機,從 registry 下架唔會自動清走,所以用 Node.js 跑 CI/CD、文件生成或 event-driven API 工具嘅團隊仲有手尾要跟。

四個套件、五個惡意版本

今次涉及四個套件、五個惡意版本,當中 @asyncapi/specs 有正式版同 alpha 版各一個:

套件 惡意版本 可回退嘅已知乾淨版本
@asyncapi/generator 3.3.1 3.3.0
@asyncapi/generator-helpers 1.1.1 1.1.0
@asyncapi/generator-components 0.7.1 0.7.0;npm latest 而家係 1.0.0
@asyncapi/specs 6.11.26.11.2-alpha.1 6.11.1

幾份研究都提到呢批套件合計每星期約有 290 萬次下載,數字主要來自 @asyncapi/specs呢個只代表平時嘅潛在接觸面,唔等於 290 萬部機中招,更唔係已確認受害者數目。 真正要追嘅係事故時段有邊個環境解析到上述版本,跟住有冇載入過套件。

Wiz 截圖顯示 AsyncAPI 有問題嘅 GitHub Actions workflow 配置

圖片:Wiz Research

pull_request_target 點樣變成入場券

pull_request_target 本身係 GitHub Actions 畀專案處理外來 pull request 嘅高權限模式,例如自動加標籤或留言。佢會喺原專案嘅可信環境執行,可以接觸 secrets 同有寫入權限嘅 token。AsyncAPI 出事嘅 workflow 卻 checkout 咗提交者控制嘅程式碼再執行,變相畀陌生人帶自己嘅指令入高權限 runner。

GitHub 紀錄顯示,有貢獻者早喺 4 月 29 日用 proof of concept 示範問題,5 月 17 日再提出拆開可信同不可信工作嘅修補方法。修補未合併,58 日後攻擊者一次過開咗 37 個 pull request,其中一個藏住混淆程式碼。PR 冇合併,但 workflow 已經跑完,asyncapi-bot 嘅高權限 PAT 亦落入對方手上。

官方發布、合法簽署,入面一樣可以有毒

攻擊者用偷返嚟嘅 PAT 直接改動連住發布流程嘅 branch,AsyncAPI 自己嘅 GitHub Actions 跟正常設定啟動,再用 npm OIDC trusted publisher 推出套件。JFrog 核對過,五個版本都有有效 provenance,資料亦正確指向 AsyncAPI 嘅 repository、commit 同發布 workflow。

呢點值得拆清楚:provenance 證明「邊條 pipeline 整出呢個套件」,冇判斷「觸發 pipeline 嗰次改動係咪可信」。 當 source branch、bot token 或發布 workflow 已經俾人控制,provenance 一樣會顯示簽署有效,但唔代表套件安全。iThome 報道提到攻擊者取得 npm 發布權杖;Wiz 同 JFrog 重組嘅流程就顯示,主要憑證係 GitHub PAT,之後由官方 OIDC 發布,未見一定要偷長效 npm token。

裝過未必啟動,載入過就要當成事故

惡意碼冇靠常見嘅 preinstallpostinstall script,而係等程式 importrequire 套件先郁手。即係 npm install --ignore-scripts 都未必幫到你;安裝後一直冇載入,風險會低一截,但 build、文件生成、測試同間接 dependency 都可能靜靜載入佢,單靠開發者記憶去判斷唔穩陣。

Wiz 發現載入器會另開 Node.js process,經 IPFS 下載第二階段程式,再寫到 Linux 嘅 ~/.local/share/NodeJS/sync.js、macOS 嘅 ~/Library/Application Support/NodeJS/sync.js,或者 Windows 嘅 %LOCALAPPDATA%\NodeJS\sync.js。研究亦列出 miasma-monitor.service、C2 IP 85.137.53.71、IPFS 流量同異常 detached Node.js process 等線索。惡意程式具備遙距指令、檔案操作同憑證蒐集能力,但唔同團隊對 Miasma、Mini Shai-Hulud 同相關攻擊者嘅關係未有一致結論,暫時唔適合寫死歸因。

中過版本,應該點處理

先隔離有關開發機同 runner,再用乾淨裝置改憑證。 搜尋 package-lock.jsonpnpm-lock.yamlyarn.lock、dependency cache、container layer 同舊 build artifact,確認五個版本曾經去過邊度;再用 process、檔案、網絡同 CI job 紀錄,分清只下載過,抑或真係載入過。共用或可重用嘅 runner 最好重新建立,唔好淨係刪 sync.js 就當處理完。

任何載入過惡意版本、或者紀錄不足以排除執行嘅環境,都要當 secrets 可能外洩。由乾淨裝置撤銷同重發 GitHub PAT、GitHub App/Actions secrets、npm token、SSH key、AWS 或其他雲端 access key,亦要檢查瀏覽器儲存嘅密碼同 session。跟住翻查 GitHub audit log、npm 發布紀錄、雲端 API 活動同 repository branch,睇吓有冇陌生 push、workflow、登入或新憑證。

最後鎖定上表嘅乾淨版本,刪走舊 dependency cache,再由可信來源重建。8 月 3 日核對 npm registry 時,五個惡意版本已無法解析,不過自動跟 latest 只解決下一次安裝,舊 lockfile、內部鏡像同已建好嘅 container 仲要逐一清。維護 GitHub Actions 嘅團隊亦應搜尋 pull_request_target,凡係會 checkout 或執行外來 PR 內容嘅 workflow,都要拆開權限、收窄 token,同保護連住自動發布嘅 branch。


參考來源

本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。

分享:WhatsAppThreadsTelegramFacebook