Dependabotのバンプがワームを公開。22パッケージ。
ボットがプルリクエストを開き、人間が24分後にマージする。
ボットがプルリクエストを開き、人間が24分後にマージする。その95分後、ワームはCIで見つけたトークンを使って、彼の名前で、彼の22のnpmパッケージの悪意のあるバージョンを110個公開した。
この動画の要点
- ボット、人間、ワーム
- どのように起こったか、なぜnpmが許可したか、誰が非難されるべきか
- タイムライン:汚染されたキャッシュ
- 21:48 — Dependabotのバンプ
- なぜそれが機能するのか
翻訳されたトランスクリプト
オリジナルの英語ナレーションから翻訳されています。利用可能なオーディオとキャプションはYouTubeによって管理されています。
ボット、人間、ワーム
0:00 ボットがプルリクエストを開き、人間が24分後にそれをマージする。 95分後、ワームが公開したのは 彼のパッケージの110バージョン。 彼として。 TanStackの事後検証には上流のタイムスタンプがあり、下流のメンテナーの 残りはHacker Newsが1100ポイントと「Mini Shai-Hulud」という名前を与えている。どのようにして起こったのか、なぜnpmがそれを許可したのか、誰が責任を負うべきか。 Mini Shai-Hulud。どのようにして起こったのか、なぜnpmがそれを許可したのか、誰が責任を負うべきか。
どのように起こったか、なぜnpmが許可したか、誰が非難されるべきか
0:21 これはThe Daily Diff、事後検証です。 5月11日、朝。 名前を変更したフォークがTanStack Routerに対してプルリクエストを開く。 それは1時間以内に閉じられるが、ベンチマークワークフローは既にそのコードを実行し、
タイムライン:汚染されたキャッシュ
0:33 リリースワークフローが使用するキーの下に汚染されたキャッシュを保存していた。 19時20分。正当なマージがリリースを実行する。 キャッシュが戻り、バイナリがランナーのメモリを読み込み、 公開トークンを抜き取り、有効な証明書付きで42パッケージに84バージョンをSHIP ITする。 パッケージ、有効なプロベナンスと共に。 テストは失敗する。それでも公開される。 19時46分、StepSecurityの研究者が問題を報告。UTC午前9時までに すべてが非推奨となり、アドバイザリが公開される。
0:55 非推奨は消えたわけではない:npmは依存関係のあるものを非公開にすることを拒否する、 そのため、何時間もインストール可能な状態が続く。 21時48分。9つ星の航空データプロジェクトで、 Dependabotはルーチンのプルリクエストを開く:dev-dependenciesグループをバンプ、 13件の更新。そのうち2件は汚染されたTanStackバージョンだ。 22時12分:マージ。公開ワークフローはスコープ内のトークンでnpm C-Iを実行する。
21:48 — Dependabotのバンプ
1:15 prepareスクリプトがそれを読み取り、22時17分にワームが彼として公開する。 トークンが届くすべてのパッケージの5バージョン、 古いサイドプロジェクトさえも:すべてに使える古典的なトークンが1つ。 95分で110バージョン。 彼は深夜過ぎにメールで知る。 なぜそれが機能するのか。 1:npm installはデフォルトで他人のライフサイクルスクリプトを実行する、 そしてgit依存関係のprepareスクリプトも含まれる。
1:39 2:ワームが望むのは一つ:二要素認証なしで公開できるトークン。 次に、そのメンテナーが他に何を所有しているかをレジストリに尋ね、 それらすべてを自分自身を内包させて再公開する。 3:チェーンに人がいない。
なぜそれが機能するのか
1:51 ボットが提案し、パイプラインがインストールし、ワームがその恩恵を返す:その デッドドロップブランチはdependabotスラッシュgithub-actionsスラッシュfremenと名付けられている。 git blame。npmのインストールモデル、55パーセント:インストール時にスクリプトが実行され、 非推奨のままインストール可能で、二要素認証をバイパスするトークンが存在する。 TanStackのCI、25パーセント:監査されていないプルリクエストターゲットワークフローが キャッシュへの書き込みアクセス権を持つフォークコードを実行している。 バンプの習慣、15パーセント:24分で13の更新がマージされ、 部屋にトークンがある。
2:17 Dependabot、5パーセント:ワームがその制服を着るほど信頼されている。
git blame
2:20 影響範囲:42のTanStackパッケージ。 下流22件、9つ星のプロジェクトから。 ワームがMistralに到達すると、エコシステム全体で160件を超える。 すべてのアップストリームバージョンは有効な署名を運んでいた:公式パイプラインによってビルドされたもの。 真実。評決、事後検証:SHIP IT。 両方のメンテナーは1日以内にタイムスタンプ付きの事後検証を投稿する。3日以内に、 下流のパイプラインはignore-scriptsでインストールし、 ビルドと公開を分離し、長期生存トークンを削除する。
影響範囲
2:47 npmのデフォルトは変わっていない。 月曜日:インストール時にignore-scripts、そしてそれを実行するジョブから公開トークンを外す。まだ話すことを許されていないインシデントがあれば、 話すことを許されていないインシデントをコメントまたはthedailydiff.devまで送ってください。 コメントまたはthedailydiff.devまで送ってください。 本日のdiffは以上です。
評決
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



