Dependabot 的碰撞發佈了一個蠕蟲。22 個套件。
一個機器人開啟了一個拉取請求。
一個機器人開啟了一個拉取請求。一個人類在 24 分鐘後將其合併。95 分鐘後,一個蠕蟲以其名義,使用在其 CI 中找到的令牌,發佈了其 22 個 npm 套件的 110 個惡意版本。
本影片涵蓋的內容
- 一個機器人、一個人類、一個蠕蟲
- 事情是如何發生的,為何 npm 允許它,誰該負責
- 時間軸:中毒的緩存
- 21:48 — Dependabot 碰撞
- 為何它會奏效
翻譯的文字記錄
從英文原文旁白翻譯。可用的音頻和字幕由 YouTube 控制。
一個機器人、一個人類、一個蠕蟲
0:00 一個機器人開啟了一個拉取請求;一個人類在二十四分鐘後將其合併。 九十五分鐘後,一個蠕蟲發佈了 他的一百一十個版本 套件,以他的名義。 TanStack 的事後分析有上游時間戳,下游維護者的 有其餘的,而 Hacker News 給了它一千一百分並命名為:Mini Shai-Hulud。它是如何發生的,為什麼 npm 允許它,誰應該受到責備。
事情是如何發生的,為何 npm 允許它,誰該負責
0:21 這是 The Daily Diff,事後分析。 5 月 11 日,早上。 一個重命名的 fork 對 TanStack Router 開啟了一個拉取請求。 它在一個小時內關閉,但一個基準測試工作流程已經運行了它的代碼並
時間軸:中毒的緩存
0:33 在發布工作流程將使用的鍵下保存了一個中毒的緩存。 十九點二十。一次合法的合併運行了發布。 緩存返回,一個二進制文件讀取了運行者的記憶體, 竊取了發佈令牌,並跨四十二個套件發佈了八十四個版本, 具有有效的來源證明。 測試失敗。它仍然發佈了。 十九點四十六分,StepSecurity 研究員提交了問題;到 UTC 時間九點 一切都被棄用,並且發佈了諮詢報告。
0:55 棄用並不意味著消失:npm 拒絕撤銷任何有依賴項的東西, 因此它在數小時內仍然可安裝。 二十一點四十八分。在一個九星級航空數據項目中, Dependabot 開啟了其例行拉取請求:更新開發依賴組, 十三個更新。其中兩個是中毒的 TanStack 版本。 二十二點十二分:合併。發佈工作流程使用範圍內的令牌運行 npm C-I;
21:48 — Dependabot 碰撞
1:15 一個準備腳本讀取了它,並在二十二點十七分,蠕蟲以他的名義發佈了。 每個令牌能觸及的套件都有五個版本, 甚至是一個舊的旁支項目:一個經典令牌適用於所有東西。 九十五分鐘內發佈了一百一十個版本。 午夜過後,他通過電子郵件發現了。 為何它會奏效。 一:npm install 預設運行陌生人的生命週期腳本, 一個 git 依賴的 prepare 腳本也計算在內。
1:39 二:蠕蟲只想要一件事:一個無需第二因素即可發佈的令牌。 然後它詢問註冊表該維護者還擁有什麼, 並將其所有內容重新發佈,內含蠕蟲自身。 三:鏈條中沒有一個是人。
為何它會奏效
1:51 一個機器人提出,一個管道安裝,蠕蟲回報:它的 死點分支被命名為 dependabot 斜線 github-actions 斜線 fremen。 git blame。npm 的安裝模型,百分之五十五:腳本在安裝時運行, 已棄用的仍可安裝,存在雙因素繞過令牌。 TanStack 的 CI,百分之二十五:一個未經審核的拉取請求目標工作流程,運行 具有緩存寫入權限的 fork 代碼。 碰撞習慣,百分之十五:二十四分鐘內合併了十三個更新, 令牌在房間裡。
2:17 Dependabot,百分之五:如此信任以至於蠕蟲穿著它的制服。
git blame
2:20 影響範圍:四十二個 TanStack 套件。 從一個有九顆星的項目中,下游有二十二個。 一旦蠕蟲到達 Mistral,整個生態系統超過一百六十個。 每個上游版本都帶有有效的簽名:由官方管道構建。 真實。裁決,事後分析:SHIP IT。 兩位維護者都在一天內發佈了帶時間戳的事後分析;三天內, 下游管道以 ignore-scripts 安裝, 將構建與發佈分開,並捨棄了長期存在的令牌。
影響範圍
2:47 npm 的預設值沒有改變。 星期一:安裝時忽略腳本,並將發佈令牌從運行它的作業中移除。 在評論中或 at thedailydiff.dev 向我發送你仍然不被允許談論的事件。 在評論中,或 at thedailydiff.dev。 這就是今天的差異。
裁決
3:00 我是來自 Axrisi 的 Niko。 負責任地合併。
來源
- TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
- TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
- TanStack/router#7383 — the StepSecurity detection issuegithub.com
- Downstream incident post, @squawk/* (May 12)github.com
- Downstream hardening post (May 14)github.com
- The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
- @tan_stack advisory post, 21:19 UTCx.com
- StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
- Socketsocket.dev
- Aikido — "over 160 packages, including Mistral"www.aikido.dev
- Hacker News (1,097 points)news.ycombinator.com



