+− THE DAILY DIFFdev & AI news
SHIP IT

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。 負責任地合併。

來源

  1. TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
  2. TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
  3. TanStack/router#7383 — the StepSecurity detection issuegithub.com
  4. Downstream incident post, @squawk/* (May 12)github.com
  5. Downstream hardening post (May 14)github.com
  6. The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
  7. @tan_stack advisory post, 21:19 UTCx.com
  8. StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
  9. Socketsocket.dev
  10. Aikido — "over 160 packages, including Mistral"www.aikido.dev
  11. Hacker News (1,097 points)news.ycombinator.com

相關影片

postmortem · zh-HK · 2026年9月13日

十一行JavaScript搞垮了整個互聯網。一次取消發佈。

2016年3月22日,世界標準時間21:30:一名開發人員取消發佈了他所有273個npm套件,此前npm將套件名稱「kik」交給了即時通訊應用程式Kik,Kik的專利代理人曾威脅說「律師會找上門來」。這273個套件之一是left-pad:十一行程式碼,用於在字串前加上空格,每月下載量達250萬次。幾分鐘內,全球範圍內的Babel、React和Node構建失敗,每分鐘數百次。一個分支在十分鐘內出現並

2:52 ↗
postmortem · zh-HK · 2026年9月22日

重啟令 Telstra 倒退回 2006 年。九百萬部電話。

墨爾本的一名工程師在凌晨 2 時 50 分重啟計時機箱,到早餐時,澳洲最大的流動網絡竟以為是 2006 年 11 月。2026 年 7 月 8 日:Telstra NTP 機箱中的 GPS 卡在更換電源期間重啟,其韌體從未有 GPS 週數滾動更新,因此它選擇了舊的紀元,倒退了 1,024 週。由於 2025 年 10 月的變通方法使該卡成為網絡唯一的 stratum-1 來源 — 以及 2020

3:15 ↗