
TanStack/Mini Shai-Hulud npmサプライチェーン攻撃(CVE-2026-45321)用のIOCチェッカー
curl -fsSL https://raw.githubusercontent.com/nkopylov/tanscript-exploit-check/main/check-tanstack-exploit.sh | bash
または、クローンしてローカルで実行:
git clone https://github.com/nkopylov/tanscript-exploit-check.git
cd tanscript-exploit-check
./check-tanstack-exploit.sh [project_dir ...]
このチェッカーは、TeamPCP による Mini Shai-Hulud サプライチェーン攻撃キャンペーンの2つの波をカバーしています。
2026年5月11日(19:20〜19:26 UTC)に、攻撃者は6分間で 42 の @tanstack/* npm パッケージにわたって 84 の悪意のあるバージョンを公開しました。この攻撃は Mistral AI、UiPath、OpenSearch などのパッケージにも及び、npm と PyPI 全体で合計 170 以上のパッケージに影響しました。
メンテナーの認証情報は盗まれていません。 攻撃者は、3段階の攻撃によって CI/CD トラストチェーン自体を悪用しました:
pull_request_target エクスプロイト — 使い捨ての GitHub フォークが PR を開き、ベースリポジトリのセキュリティコンテキストで攻撃者コードを実行させました2026年5月19日(01:39〜02:06 UTC)に、侵害された npm アカウント atool([email protected])は、2回の自動化された波で 314 パッケージにわたって 637 の悪意のあるバージョンを公開しました。影響の大きいターゲットは次のとおりです:
size-sensor(月間 4.2M ダウンロード)echarts-for-react(月間 3.8M ダウンロード)@antv/scale(月間 2.2M ダウンロード)timeago.js(月間 1.15M ダウンロード)@antv/* および別のパッケージこの波では、Bun ベースのペイロード(498KB の index.js)が "preinstall": "bun run index.js" によってトリガーされ、第2段階のペイロードは、フォークオブジェクト共有エクスプロイトを介して antvis/G2 GitHub リポジトリにプッシュされた偽装コミットに隠されていました。
両方の波は、同じ「Mini Shai-Hulud」ツールキットファミリーを使用しています:
gh-token-monitor(第1波)と kitty-monitor(第2波)デーモン、.claude/settings.json と .vscode/tasks.json へのフックtoJSON(secrets) をダンプするワークフローインジェクション、npm OIDC トークン交換rm -rf ~/ を実行firedalazer キーワードを探し、RSA-PSS 署名付きコマンドを受信影響を受けたのは @tanstack/router* と @tanstack/start* のみです。影響なし: @tanstack/query*、@tanstack/table*、@tanstack/form*、@tanstack/virtual*、@tanstack/store。
全42パッケージの詳細は、完全なアドバイザリを参照してください。
npm ユーザー atool([email protected])が公開したすべてのパッケージに、2026年5月19日に悪意のあるバージョンが公開されました。影響の大きいパッケージは次のとおりです:
| パッケージ | 月間ダウンロード数 |
|---|---|
size-sensor | 4.2M |
echarts-for-react | 3.8M |
@antv/scale | 2.2M |
さらに 310 以上のパッケージが、主に @antv/* スコープ(@antv/g2、@antv/g6、@antv/l7、@antv/s2、@antv/x6、@antv/f2 など)、ai-figure、timeago-react、jest-canvas-mock、jest-date-mock などに影響しました。
完全なリストは、SafeDep の記事を参照してください。
重要: トークンを失効させる前に、デッドマンスイッチを無効にしてください。 デーモンがアクティブな状態でトークンが失効されると、マルウェアは
$HOMEを消去します。
gh-token-monitor と kitty-monitor)を停止し、LaunchAgent/systemd サービスを削除する.claude/router_runtime.js、.vscode/setup.mjs、~/.local/share/kitty/cat.py、/var/tmp/.gh_update_state など)を削除するnode_modules とロックファイルを削除し、--ignore-scripts で再インストールするapi.masscan.cloud、filev2.getsession.org、git-tanstack.com、t.m-kosche.com)これらのプロンプトを AI コーディングエージェント(Claude Code、Cursor、Cline/OpenClaw、Windsurf、Hermes など)にコピー&ペーストして、このようなサプライチェーン攻撃に対してプロジェクトをハードニングしてください。
サプライチェーン攻撃に対してこのプロジェクトの npm 設定をハードニングしてください。以下を行ってください:
バージョンを完全固定する:
package.json内のすべての依存関係から^と~のプレフィックスを削除し、npm installが新しく公開されたバージョンを静かに取得しないようにします。デフォルトで postinstall スクリプトを無効化する:
.npmrcにignore-scripts=trueを追加します。次に、このプロジェクトが実際に必要とする既知の安全なライフサイクルスクリプトのみを実行する明示的な"preinstall"スクリプトをpackage.jsonに追加します(ある場合)。CI でロックファイルのみを使用したインストールを強制する: CI が
npm installではなくnpm ciを使用するようにします。CI 設定ファイルがある場合はこれを確認し、ない場合は手動ステップとして記載します。発行元検証を追加する: CI パイプラインのステップと pre-push git フックとして
npm audit signaturesを追加します。更新ポリシースクリプトを作成する: 次のような
scripts/safe-update.shを作成します:
このプロジェクトの AI コーディングエージェント設定を、サプライチェーンインジェクション攻撃(
.claude/settings.jsonと.vscode/tasks.jsonに悪意のあるフックを注入した TanStack/Mini Shai-Hulud キャンペーンなど)に対して監査し、ハードニングしてください。以下を行ってください:Claude Code(
.claude/):
.claude/settings.jsonと.claude/settings.local.jsonを確認し、シェルコマンドを実行するhooksエントリがないか調べます。特に.claude/、.vscode/、node_modules/内から.js、.mjs、.shファイルを実行するものをフラグ付けします。- 正当なユーザー作成目的に遡れないフックはすべて削除します。
.claude/settings.local.jsonがコミットされないように(ローカルのままにする)、 ルールを追加します。
このリポジトリの GitHub Actions 設定を、CI/CD サプライチェーン攻撃に対して監査し、ハードニングしてください。以下を行ってください:
pull_request_targetトリガーを削除またはリファクタリングする — これらは、フォークによってトリガーされた場合でも、シークレットにアクセスできるベースリポジトリのコンテキストでワークフローコードを実行します。必要に応じて、pull_request+ 承認ゲート付きの別ワークフローに置き換えてください。すべてのサードパーティ製アクションを完全なコミット SHA に固定する(タグやブランチではなく)。たとえば、
actions/checkout@v4をactions/checkout@<full-sha>に置き換えます。読みやすさのため、タグをコメントとして追加してください。すべてのワークフローに最小権限を適用する。明示的な
permissions:ブロックを追加します。ほとんどのワークフローはcontents: readのみが必要です。公開(publish)ワークフローにはid-token: writeのみが必要です — それ以外は不要です。キャッシュのスコープを制限する:
actions/cacheを使用している場合、キャッシュキーをブランチ単位にして、ブランチ間の汚染を防ぎます。restore-keysは慎重に追加してください — 信頼できないブランチからキャッシュを復元しないでください。StepSecurity Harden-Runner をすべてのジョブの最初のステップとして追加する:
egress-policy: audit(許可されたエンドポイントがわかっている場合は )を指定した 。
MIT
| # | チェック | 説明 |
|---|
| 1 | デッドマンスイッチ | 永続化デーモン: gh-token-monitor(第1波)、kitty-monitor(第2波) |
| 2 | 悪意のあるプロセス | 既知の攻撃者プロセス名(両方の波) |
| 3 | ペイロードファイル | 名前と SHA-256 ハッシュによる既知の悪意のあるファイル(4種類のハッシュ) |
| 4 | Claude Code フック | .claude/settings.json に注入されたフック + 汎用 SessionStart ヒューリスティック |
| 5 | VS Code タスク | .vscode/tasks.json に注入されたタスク + 汎用 runOn: folderOpen ヒューリスティック |
| 6 | GitHub Actions | すべてのワークフロー内の toJSON(secrets) + pull_request_target 警告 |
| 7 | npm ロックファイル | ロックファイル内の侵害されたパッケージバージョン |
| 8 | optionalDependencies | 悪意のある @tanstack/setup と @antv/setup + 4 つの偽装コミット SHA |
| 9 | ネットワーク接続 | C2 インフラへのアクティブな接続(5 ドメイン/IP) |
| 10 | DNS キャッシュ | 攻撃者ドメインの事前解決(4 ドメイン) |
| 11 | Git ブランチ | Dune をテーマにした攻撃者のブランチ命名パターン |
| 12 | ライフサイクルスクリプト | ヒューリスティック: preinstall/postinstall 内の bun run(インストール済みパッケージ) |
| 13 | デッドドロップ C2 | git 履歴内の firedalazer キーワードと「Shai-Hulud」マーカー |
| 14 | GitHub 依存関係 | ヒューリスティック: optionalDeps 内でコミット SHA に固定された github: 依存関係 |
| パッケージ | 悪意のあるバージョン | 最初の安全なバージョン |
|---|
@tanstack/react-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/router-core | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/vue-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/solid-router | 1.169.5, 1.169.8 | 1.169.9 |
@tanstack/react-start | 1.167.68, 1.167.71 | 1.167.72 |
@tanstack/router-plugin | 1.167.38, 1.167.41 | 1.167.42 |
timeago.js| 1.15M |
npm view <pkg> time --json)npm install <pkg>@latest --save-exact を実行するアプリケーションコードは変更しないでください。設定ファイル、.npmrc、package.json スクリプト、CI 設定のみを変更してください。
.gitignoreVS Code(.vscode/):
.vscode/tasks.json と .vscode/launch.json を確認し、予期しないスクリプトやバイナリを実行するタスクがないか調べます。setup.mjs、router_runtime.js など、このプロジェクトに属さないファイルを参照するタスクエントリを削除します。.vscode/extensions.json に認識できない拡張機能がないか確認します。Cursor(.cursor/):
.cursor/settings.json とルールファイルに、注入されたコマンドやフックがないか確認します。.vscode/ 設定を継承します。全般:
package.json 内に、自分が書いていない preinstall、postinstall、prepare、prestart スクリプトがないか確認します。疑わしいものにはフラグを立てます。pull_request_target を使用するワークフローが .github/workflows/ にないか確認し、セキュリティリスクとして理由をコメント付きでフラグを立てます。.gitignore が、資格情報を漏洩させる可能性のあるエージェントセッションファイル(.claude/projects/、.cursor/logs/ など)を除外していることを確認します。見つけた内容と変更内容を報告してください。アプリケーションコードは変更しないでください。
blockstep-security/harden-runner@v2ワークフローログにシークレットがないか確認する: どのワークフローステップも ${{ secrets.* }} や ${{ toJSON(secrets) }} を stdout に出力していないことを確認します。
すべての変更を報告してください。アプリケーションコードは変更しないでください。