+− THE DAILY DIFFdev & AI news
SHIP IT

Dependabot 的一次版本升級發布了蠕蟲。共 22 個套件。

一個機器人開啟了一個 Pull Request。

一個機器人開啟了一個 Pull Request。人類在 24 分鐘後將其合併。95 分鐘後,一條蠕蟲利用在其 CI 中找到的令牌,以他的名義發布了其 22 個 npm 套件的 110 個惡意版本。

閱讀書面版(英文) ↗

本影片重點

  • 一個機器人、一個人、一條蠕蟲
  • 事情如何發生、為何 npm 允許、誰該負責
  • 時間線:被污染的快取
  • 21:48 — Dependabot 的版本升級
  • 為何會成功

翻譯文字稿

譯自英文原版旁白。可用的音訊和字幕由 YouTube 控制。

一個機器人、一個人、一條蠕蟲

0:00 一個機器人開啟了一個 Pull Request;一個人於二十四分鐘後將其合併。 九十五分鐘後,一條蠕蟲已發布了 其一百一十個版本的 套件,假冒他的身分。 TanStack 的事後報告包含了上游的時間戳,下游維護者的 包含了其餘內容,而 Hacker News 給了它一千一百個點讚和一個名字:迷你 沙丘魔堡。事情如何發生、為何 npm 允許、誰該負責。

事情如何發生、為何 npm 允許、誰該負責

0:21 這是 The Daily Diff,事後報告。 5 月 11 日,早上。 一個重新命名的分支對 TanStack Router 開啟了一個 Pull Request。 它在一小時內關閉,但一個基準測試工作流已經執行了它的程式碼並

時間線:被污染的快取

0:33 在發布工作流將使用的金鑰下保存了一個被污染的快取。 晚上七點二十。一次合法的合併運行了發布。 快取返回,一個二進位文件讀取執行器的記憶體, 竊取了發布令牌,並在四十二個套件中發布了八十四個版本, 帶有有效的來源證明。 測試失敗。它仍然發布了。 晚上七點四十六分,StepSecurity 研究員提交了問題;到國際標準時間九點, 所有內容都被棄用,並且諮詢報告也已發布。

0:55 棄用並不代表消失:npm 拒絕撤銷任何有依賴項的套件, 因此它在數小時內仍然可以安裝。 晚上九點四十八分。在一個九星級的航空數據專案中, Dependabot 開啟了其例行性的 Pull Request:升級開發依賴項組, 十三個更新。其中兩個是被污染的 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,百分之二十五:一個未經審計的 Pull Request 目標工作流運行 具有快取寫入權限的 fork 程式碼。 升級習慣,百分之十五:在二十四分鐘內合併了十三個更新, 令牌在房間裡。

2:17 Dependabot,百分之五:如此信任,以至於蠕蟲穿上了它的制服。

git blame

2:20 影響範圍:四十二個 TanStack 套件。 下游二十二個,來自一個只有九顆星的專案。 一旦蠕蟲到達 Mistral,整個生態系統超過一百六十個。 每個上游版本都帶有有效簽名:由官方 管道構建。確實如此。結論,事後報告:SHIP IT。 兩位維護者都在一天內發布了帶有時間戳的事後報告;三天內, 下游管道使用 ignore-scripts 進行安裝, 將建置與發布分離,並棄用了長期存在的令牌。

影響範圍

2:47 npm 的預設值沒有改變。 週一:安裝時 ignore-scripts,並且發布令牌從運行它的作業中移除。 在評論中,或在 thedailydiff.dev 寄給我您仍然不允許談論的事件。 在評論中,或在 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-TW · 2026年9月13日

十一行 JavaScript 程式碼搞垮了網路。一個取消發佈。

2016 年 3 月 22 日,世界標準時間 21:30:一名開發者在 npm 將套件名稱「kik」交給訊息應用程式 Kik 後,取消發佈了他所有 273 個 npm 套件,而 Kik 的專利代理人曾揚言「律師會上門」。這 273 個套件中包含 left-pad:十一行程式碼,用於在字串前面加上空白,每月下載量達 250 萬次。數分鐘內,Babel、React 和 Node 的建置在全球範圍內失敗

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

重新開機讓 Telstra 回到 2006 年。九百萬支手機受影響。

墨爾本的一名工程師在凌晨 2:50 重新啟動計時機箱,到早餐時間,澳洲最大的行動網路一致同意時間是 2006 年 11 月 8 日。2026 年 7 月 8 日:Telstra 的 NTP 機箱中一個 GPS 卡在電源維修期間重新啟動,其韌體從未進行過 GPS 週數翻轉更新,因此它選擇了舊的紀元,回到 1,024 週前。由於 2025 年 10 月的權宜之計,該卡成為網路唯一的 stratum-1

3:15 ↗