# Dependabot 的碰撞發佈了一個蠕蟲。22 個套件。

Published: 2026-09-17

一個機器人開啟了一個拉取請求。一個人類在 24 分鐘後將其合併。95 分鐘後，一個蠕蟲以其名義，使用在其 CI 中找到的令牌，發佈了其 22 個 npm 套件的 110 個惡意版本。

Canonical: https://thedailydiff.dev/zh-HK/video/2026-09-17-dependabot-tanstack/

## 本影片涵蓋的內容

- 一個機器人、一個人類、一個蠕蟲
- 事情是如何發生的，為何 npm 允許它，誰該負責
- 時間軸：中毒的緩存
- 21:48 — Dependabot 碰撞
- 為何它會奏效

## 章節

- 0:00 一個機器人、一個人類、一個蠕蟲
- 0:20 事情是如何發生的，為何 npm 允許它，誰該負責
- 0:30 時間軸：中毒的緩存
- 1:15 21:48 — Dependabot 碰撞
- 1:50 為何它會奏效
- 2:20 git blame
- 2:45 影響範圍
- 3:00 裁決

## 翻譯的文字記錄

從英文原文旁白翻譯。可用的音頻和字幕由 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)](https://tanstack.com/blog/npm-supply-chain-compromise-postmortem) — tanstack.com
- [TanStack "Hardening TanStack After the npm Compromise" (May 12)](https://tanstack.com/blog/incident-followup) — tanstack.com
- [TanStack/router#7383 — the StepSecurity detection issue](https://github.com/TanStack/router/issues/7383) — github.com
- [Downstream incident post, @squawk/\* (May 12)](https://github.com/neilcochran/squawk/discussions/251) — github.com
- [Downstream hardening post (May 14)](https://github.com/neilcochran/squawk/discussions/264) — github.com
- [The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)](https://github.com/neilcochran/squawk/pull/246) — github.com
- [@tan\_stack advisory post, 21:19 UTC](https://x.com/tan_stack/status/2053948103766716630) — x.com
- [StepSecurity — worm internals, bypass\_2fa search, Dependabot-style branch names](https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem) — www.stepsecurity.io
- [Socket](https://socket.dev/blog/tanstack-npm-packages-compromised-mini-shai-hulud-supply-chain-attack) — socket.dev
- [Aikido — "over 160 packages, including Mistral"](https://www.aikido.dev/blog/mini-shai-hulud-is-back-tanstack-compromised) — www.aikido.dev
- [Hacker News (1,097 points)](https://news.ycombinator.com/item?id=48100706) — news.ycombinator.com
