本文へスキップ
>_ITDITDセキュリティ対策プラットフォーム

セキュリティ対策

攻撃は「正規の経路」を通った——TanStack・Nx Console・GitHubの連鎖で開発者が確認すること

2026年5月、TanStackのnpmパッケージ侵害から、Nx ConsoleのVS Code拡張機能の改ざん、GitHub社内リポジトリの流出までがつながりました。3社の公式発表をもとに、該当版を入れた人の確認手順、トークンの失効、CIの設定の見直しを整理します。

公開日 2026-09-30 更新日 2026-09-30 最終確認 2026-09-30 29分で読める

対象:npm(pnpm・yarnを含む)でJavaScriptの依存を入れている開発者、VS Codeやその派生エディタで拡張機能を使っている人、GitHub Actionsでパッケージを公開しているメンテナー、GitHub Enterprise Serverの管理者。本記事はTanStack・Nx・GitHubの3社が公表した事後報告と発表にもとづく解説で、攻撃の手順は扱いません。

開発者が今日やること

1

ロックファイルとCIの記録で、TanStackの該当版を入れたかを確かめる

影響を受けたのは@tanstack/react-router、@tanstack/react-start、@tanstack/router-core、@tanstack/history など、Router/Start系の42パッケージ・84バージョンです(全一覧はGitHubのアドバイザリ GHSA-g7cv-rxg3-hmpx)。TanStackによれば、Query・Table・Form・Virtualなど他のパッケージは影響を受けていません。ロックファイルの現在の内容だけでなく、2026年5月11日前後の変更履歴も見てください。不正版は公開から数時間でnpmから削除されているため、今のロックファイルに残っていなくても、その間に一度入った可能性があります。CIの実行ログで、5月11日 19:20(UTC、日本時間5月12日 4:20)以降にインストールを実行したジョブも確認します。

2

Nx Console v18.95.0を入れていたかを確かめる

Nxの事後報告は、code --list-extensions --show-versions の出力から Nx Console(拡張機能IDは angular-console を含む)の版を確認する方法を示しています。影響を受けたのはv18.95.0だけで、公開されていたのは5月18日 12:30〜13:09(UTC、日本時間21:30〜22:09)です。Nxは、この時間帯にNx Consoleを入れていて自動更新が有効だった人は、実際に入ったかどうかにかかわらず侵害されたものとして扱うよう求めています。事後報告には、端末に残るファイルやプロセスの確認項目(侵害の痕跡)も載っているので、該当する人はそれに沿って点検してください。

3

該当したら、端末から届く認証情報をすべてローテーションする

TanStackとNxが挙げている対象は共通しています。GitHubのトークン、npmのトークン、SSH鍵、クラウド(AWS・GCP・Azure)の認証情報、Kubernetes、Vaultのトークン、そして .env ファイルの中身です。Nxは加えて、その時間帯に端末上のツールが新しく発行できた認証情報(クラウドの一時認証情報やGitHub CLIのトークンなど)もローテーションし、ローテーションのあとで端末の作り直しも検討するよう勧めています。失効の順序と、常駐するプログラムの扱いは npmサプライチェーン攻撃の守り方 の「感染が疑われるとき」の節を参照してください。

4

npmのメンテナーなら、自分のパッケージの公開履歴を見る

TanStackの事後報告によれば、このコードは感染した人がメンテナンスしている他のパッケージを探し、同じ仕掛けを入れて公開し直そうとする動きを持っていました。自分がnpmにパッケージを公開しているなら、5月11日以降に自分が出した覚えのないバージョンがないかをnpmの公開履歴で確認します。

5

GitHubのトークンが端末のどこに置かれているかを確かめる

Nxの事後報告によれば、盗まれたのはGitHub CLIのトークンで、その環境では端末上のファイルに保存されており、同じユーザーで動くどのプロセスからも読める状態でした。盗まれてから74秒以内にGitHubのAPIで使われています。gh auth status で保存場所を確認し、ファイルに平文で置かれているなら、OSの鍵保管庫や、実行するときだけ認証情報を渡すパスワードマネージャーの仕組みに移すことを検討してください。Nxは事件後、開発端末でGitHub CLIを直接使うことを社内ルールで禁止しています。トークン自体の寿命と範囲の絞り方は npmサプライチェーン攻撃の守り方 にまとめています。

6

「公開から○日は入れない」設定が、本当に効いているかを確かめる

Nxの事後報告によれば、侵害された貢献者のプロジェクトには .npmrc に minimum-release-age=10080(7日)が書かれていましたが、プロジェクトが指定していたpnpm 10.14はこの設定に対応しておらず、警告も出さずに無視しました。対応はpnpm 10.16以降です。不正版は入った時点で公開から77分しかたっておらず、設定が効いていれば止まっていました。package.json の packageManager で指定している版を確認し、設定が効く版であることをCIでも検査してください。npmを使う場合の同種の設定は npmサプライチェーン攻撃の守り方 で扱っています。

7

GitHub Enterprise Serverの管理者は、署名鍵を入れ替える

GitHubは5月26日、GitHub Enterprise Serverの更新パッケージに署名する鍵をローテーションしたと発表しました。管理者はインスタンス内のGPG公開鍵を入れ替える必要があり、入れ替えないと今後のバージョンアップが「有効なパッケージではない」という検証エラーで失敗します。手順と、手順用スクリプトのSHA256ダイジェストはGitHubの発表に掲載されています。GitHubは、更新ファイルを公式の配布元からだけ取得すること、今後数か月はセキュリティ更新が増える前提で準備することも求めています。GitHub Enterprise Cloudの利用者は対応不要です。

パッケージを公開している人がCIで見直すこと

TanStackとNxの事後報告は、どちらも「どの設定が連鎖を許したか」を具体的に書いています。以下は、その内容をあなたのリポジトリの設定・方針の単位に置き換えたものです。

1

pull_request_target で、フォークから来たコードを動かさない

TanStackの事後報告によれば、バンドルサイズを測るワークフローが pull_request_target で動き、その中でフォークから来たプルリクエストのコードをチェックアウトしてビルドしていました。pull_request_target は本体リポジトリの権限で動くうえ、TanStackによれば初めての貢献者に承認を求める設定もこのトリガーには効きません。ラベル付けやコメントのように、外部のコードを実行しない用途に限ります。TanStackは事件後、全ワークフローから pull_request_target を取り除きました。

2

信頼できないジョブと、リリース用ジョブでキャッシュを共有しない

TanStackによれば、GitHub Actionsのキャッシュはリポジトリ単位で共有され、pull_request_target の実行もmainへのpush時の実行も同じ範囲を使います。さらに、キャッシュの保存はワークフローの permissions: で読み取り専用にしても止まりません。そのため、外部のコードを動かしたジョブが書いたキャッシュを、リリース用ワークフローが復元していました。TanStackは事件後、リリースのパイプラインでパッケージのキャッシュを無効にし、全キャッシュを削除しています。公開を行うワークフローでは、キャッシュを復元しないのが最も単純な線引きです。

3

公開用の権限(id-token: write)は、公開するジョブだけに与え、承認を挟む

TanStackのリリース用ワークフローは、npmへの信頼された公開(OIDC)のために id-token: write を持っていました。事後報告によれば、不正な公開はワークフローで定義された公開ステップからではなく、同じ実行の中の別の段階で動いたコードがトークンを取り出して行っています。TanStackは教訓として「信頼された公開の設定には公開ごとの確認がない」と書いています。公開ジョブを、ビルドやテストから分けた専用ジョブにし、その権限をそこだけに与え、GitHubの環境(Environment)の必須レビュアーで人の承認を挟みます。Nxは事件後、公開には起動した本人以外の承認を必須にしました。

4

サードパーティのアクションはコミットのSHAで固定する

TanStackとNxはどちらも、事件後にすべてのアクションの参照をタグやブランチ名からコミットのSHAに固定しました。TanStackは、タグやブランチを参照する状態を「この事件とは別に常にあるサプライチェーンのリスク」と書いています。

5

公開の通知と監査ログを、誰かが見る場所に流す

Nxが改ざん版に気づいたきっかけは、拡張機能のマーケットプレイスが公開のたびに送る定型の通知メールでした。公開の予定がなかったメンテナーが異常だと気づき、約11分で取り下げています。一方、もう一つの配布先には同じ通知がなく、取り下げまで約36分かかりました。また、盗まれたトークンでワークフローの実行記録が消されるなどの動きが1週間、監査ログに残ったまま気づかれていませんでした。公開通知の宛先がチームの誰かに届くか、監査ログの「実行記録の削除」を誰かが見ているかを確認してください。

何が起きたのか(3社の発表より)

以下はすべて、TanStackの事後報告、Nxの事後報告、GitHubの発表に書かれた内容です。時刻はUTCで、カッコ内は日本時間です。

  1. 2026年5月11日 19:20〜19:26(5/12 4:20〜4:26)

    TanStackのRouter/Startリポジトリのリリース用ワークフローを通じて、42パッケージ・84バージョンの不正版がnpmに公開される。
  2. 5月11日 19:46(5/12 4:46)

    外部の研究者がTanStackのリポジトリに詳細な報告を投稿。TanStackが対応を開始。
  3. 5月11日 20:43(5/12 5:43)

    Nxの貢献者が、Nxとは別のプロジェクトで pnpm install を実行し、不正版の @tanstack/zod-adapter@1.166.15 が入る。Nxによれば、GitHub CLIのトークンが盗まれ、74秒以内に使われた。
  4. 5月11日 21:03まで(5/12 6:03)

    TanStackが84バージョンすべてを非推奨化。
  5. 5月11日 22:13〜23:55(5/12 7:13〜8:55)

    npmが該当ファイルをレジストリから削除。
  6. 5月15日

    TanStackが安全宣言。現在公開中のすべてのバージョンは安全とした。
  7. 5月18日 12:30〜13:09(21:30〜22:09)

    盗まれた貢献者の権限で、Nx Console v18.95.0が拡張機能の配布先2か所に公開され、取り下げられる。
  8. 5月18日(米国時間の月曜)

    GitHubが、改ざんされたVS Code拡張機能による社員の端末の侵害を検知し封じ込め。拡張機能の該当版を削除し、端末を隔離。同日から翌日にかけて重要な秘密情報をローテーション。
  9. 5月20日

    GitHubが公表。持ち出されたのはGitHub社内のリポジトリのみとの評価。
  10. 5月21日

    Nxが事後報告を公開。
  11. 5月26日

    GitHubが更新。GitHub Enterprise Serverの署名鍵を含む鍵のローテーションと、管理者の対応を発表。
84版
TanStackの不正バージョン(42パッケージ×各2版)
約39分
Nx Console v18.95.0が公開されていた時間(2か所の合計の窓)
7日間
Nxによれば、盗まれたトークンでNxのリポジトリ内で活動が続いた期間
対応不要
GitHub Enterprise Cloudの利用者(GitHubの発表)
3社が公表した内容
TanStack:影響範囲
Router/Startリポジトリの42パッケージ・84バージョン。Query、DB、Store、Table、Form、Virtualなど他のリポジトリは影響なし。npmのトークンが盗まれた証拠はないとしている
TanStack:不正版の動き
インストール時のスクリプトで動き、クラウド、Kubernetes、Vault、npm、GitHub、SSHの認証情報を集めて外部に送る。感染した人が管理する他のパッケージにも広がろうとする
TanStack:原因
① pull_request_target でフォークのコードをビルドしていた ② そのジョブが、リリース用ワークフローが復元するキャッシュに書き込めた ③ リリース用ワークフローが公開用のOIDCトークンを発行できた——の3つの組み合わせ
Nx:影響範囲
Nx Console v18.95.0のみ(v18.100.0以降は安全)。Nx CLI、公式の @nx/* プラグイン、Nx Cloudは影響なし。公式マーケットプレイスの集計では28件のインストール、もう一つの配布先では41件のダウンロード。Nx自身の集計では約6,000回の起動があり、数字の差は確認中
Nx:原因
① 上流のTanStackの侵害 ② 待機期間の設定が古いpnpmで無視された ③ GitHub CLIのトークンが端末上で読める場所にあった ④ 1人の貢献者の判断で拡張機能を公開できた
GitHub:影響範囲
持ち出されたのはGitHub社内のリポジトリのみとの評価。顧客自身のエンタープライズ・組織・リポジトリなど、社内リポジトリの外にある顧客情報への影響の証拠はない。ただし社内リポジトリの一部にはサポート対応の抜粋など顧客由来の情報が含まれる
GitHub:対応
該当の拡張機能を削除し端末を隔離。重要な秘密情報を影響の大きいものから順にローテーション。GitHub Enterprise Serverの署名鍵もローテーションし、管理者に公開鍵の入れ替えを求めた。調査完了後に詳しい報告を出すとしている

読み方の注意:GitHubの「持ち出されたリポジトリ数」は、GitHub自身の数字ではない

GitHubの発表には持ち出されたリポジトリの数が出てきますが、その数字は攻撃した側の主張として紹介され、GitHubは「これまでの調査と大筋で一致する」と述べるにとどめています。当サイトは攻撃側の主張する数字を事実として扱わないため、本記事には載せていません。同じく、Nx Consoleのインストール数も、Nxは複数の集計が食い違っており確認中としています。数字より、自分が該当する時間帯に入れていたかで判断してください。

連鎖のどこで止められたか

① TanStackのCI

外部PRのコードが、リリースと共有のキャッシュに書き込む

↓

止め所

pull_request_target を使わない/公開ワークフローでキャッシュを復元しない/公開に承認

② npmの84の不正版

正規の公開経路から出たため、見た目は本物

↓

止め所

公開から数日は入れない設定——ただし、効く版のツールで

③ Nx貢献者の端末

ファイルに置かれたGitHub CLIのトークンが読まれる

↓

止め所

トークンを平文ファイルに置かない/監査ログの削除を見張る

④ Nx Console v18.95.0

1人の権限で拡張機能が公開される

↓

止め所

公開に本人以外の承認を必須にする

⑤ GitHub社員の端末

改ざんされた拡張機能から、社内リポジトリの持ち出しへ

↓

止め所

拡張機能の更新も「依存」として扱う(次の節)

3社の事後報告と発表から組み立てた連鎖。各段の右側は、その段で連鎖を切れた設定・方針(各社が事件後に入れたものを含む)。

今回、安全の根拠にならなかったもの

  • 正規の公開経路・来歴(provenance):TanStackの不正版は正規のOIDC設定から出た
  • 正規の貢献者アカウント:Nx Consoleは本物の貢献者の権限で公開された
  • 配布元の自動検査:Nxによれば、改ざん版は公式マーケットプレイスの自動検査を通過した
  • 書いてあるだけの設定:待機期間の設定は、古いpnpmで黙って無視された

連鎖を切れたもの(各社の事後報告より)

  • 公開前の2人目の承認:Nxは他のリポジトリでは導入済みだったが、Nx Consoleには未適用だった
  • 公開ワークフローとキャッシュの分離:TanStackは事件後にキャッシュを無効化
  • 実際に効いている待機期間:不正版は入った時点で公開から77分だった
  • 定型の公開通知を人が見ること:Nxの検知はこれだけだった

当サイトの視点:拡張機能の自動更新は「依存の自動取り込み」と同じ

npmの依存には「公開から数日は入れない」という対策が広まりつつありますが、エディタの拡張機能は既定で自動更新されることが多く、同じ考え方がまだ当てはまっていません。Nxが「自動更新が有効だった人は侵害されたものとして扱う」と書いたのはそのためです。そして拡張機能は、あなたのGitHubやクラウドの認証情報が置かれた端末の上で、あなたの権限で動きます。本番やパッケージ公開の権限を持つ端末では、VS Codeの extensions.autoUpdate 設定で自動更新を止め、更新は数日おいてから自分で当てる運用を検討してください。セキュリティ修正の取り込みが遅れる代償はありますが、今回のように公開から数十分で取り下げられた版は、それだけで避けられます。

もう1つ。今回の連鎖は、組織の境界をまたいで進みました。Nxの貢献者が不正版を入れたのはNxとは別のプロジェクトで、GitHubの社員が入れたのはNxの拡張機能です。あなたの開発端末は、あなたの組織だけでなく、あなたがコードを出している先すべてのサプライチェーンの一部です。

出典(公開記録)

本記事の事実関係は、以下の公開情報にもとづきます。攻撃の手順や、攻撃した側を特定する情報は扱っていません。

  • TanStack「Postmortem: TanStack npm supply-chain compromise」(2026年5月11日公開、5月15日更新) — tanstack.com
  • TanStack「Hardening TanStack After the npm Compromise」(事件後の対策) — tanstack.com
  • GitHub Advisory Database「GHSA-g7cv-rxg3-hmpx(CVE-2026-45321)」(影響を受けたバージョンの全一覧) — github.com
  • Nx「Postmortem: Nx Console v18.95.0 supply-chain compromise」(2026年5月21日) — nx.dev
  • Nx Console セキュリティアドバイザリ「GHSA-c9j4-9m59-847w」 — github.com
  • GitHub「Investigation update: GitHub Enterprise Server signing key rotation」(2026年5月20日公開、5月26日更新) — github.blog
  • GitHub Security Lab「Keeping your GitHub Actions and workflows secure: Preventing pwn requests」(pull_request_target の安全な使い方) — securitylab.github.com
  • GitHub Docs「Managing environments for deployment」(環境の必須レビュアー) — docs.github.com

更新履歴

2026-09-30:初版。TanStackの事後報告(5月15日更新版)、Nxの事後報告(5月21日)、GitHubの発表(5月26日更新版)にもとづく。GitHubは調査完了後に詳しい報告を出すとしているため、公表され次第更新します。

次に読む

よくある質問

QTanStackのどのパッケージが侵害されたのですか?
A

TanStackの事後報告によれば、影響を受けたのはRouter/Startのリポジトリから公開される42パッケージで、各2バージョン、計84バージョンです(例:@tanstack/react-router 1.169.5 と 1.169.8、@tanstack/history 1.161.9 と 1.161.12)。全一覧はGitHubのセキュリティアドバイザリ GHSA-g7cv-rxg3-hmpx(CVE-2026-45321)にあります。Query、Table、Form、Virtualなど他のリポジトリのパッケージは影響を受けておらず、現在公開されているバージョンはすべて安全にインストールできるとしています。

Q該当バージョンを入れていたら何をすればいいですか?
A

TanStackは、2026年5月11日(UTC)に該当バージョンをインストールした人に、そのインストール先から届くAWS、GCP、Kubernetes、Vault、GitHub、npm、SSHの認証情報をすべてローテーション(失効・再発行)するよう強く勧めています。インストール時のスクリプトで動くコードだったため、開発端末だけでなくCIの実行環境も対象です。

QNx Consoleを使っていますが、影響はありますか?
A

Nxの事後報告によれば、影響を受けたのはNx Console v18.95.0だけで、公開されていたのは2026年5月18日 12:30〜13:09(UTC、日本時間21:30〜22:09)です。v18.100.0以降は安全です。この時間帯にNx Consoleを入れていて自動更新が有効だった人は、端末が侵害されたものとして扱い、認証情報をすべてローテーションするよう求めています。NxのCLI(nxパッケージ)、公式の@nx/*プラグイン、Nx Cloudは影響を受けていません。

QGitHubのユーザーのリポジトリは漏れたのですか?
A

GitHubの発表によれば、持ち出されたのはGitHub社内のリポジトリのみで、顧客自身のエンタープライズ、組織、リポジトリなど、社内リポジトリの外にある顧客情報への影響を示す証拠はないとしています。ただし社内リポジトリの一部には、サポート対応の抜粋など顧客由来の情報が含まれており、影響が見つかれば通常の通知経路で連絡するとしています。GitHub Enterprise Cloudの利用者は対応不要です。

QGitHub Enterprise Serverの管理者は何をすればいいですか?
A

GitHubは5月26日の更新で、GitHub Enterprise Serverの更新パッケージに署名する鍵をローテーションしたと発表し、管理者にインスタンス内のGPG公開鍵を入れ替えるよう求めています。入れ替えないと今後のバージョンアップが検証に失敗します。手順と、手順用スクリプトのSHA256ダイジェストはGitHubの発表に掲載されています。更新ファイルは公式の配布元からだけ取得するよう求めています。

Q3つの事案はつながっているのですか?
A

TanStackとNxのつながりはNxの事後報告に明記されています。Nxの貢献者が5月11日に別のプロジェクトでpnpm installを実行した際、侵害された@tanstack/zod-adapter 1.166.15を取り込み、GitHub CLIのトークンが盗まれました。GitHubの発表は、社員の端末を侵害した「改ざんされたVS Code拡張機能」として、Nx Consoleのセキュリティアドバイザリにリンクしています。

Q原因は何ですか?
A

TanStackの事後報告は、3つの弱点の組み合わせを挙げています。フォークからのプルリクエストでpull_request_targetのワークフローがそのコードをビルドしていたこと、そのジョブがリリース用ワークフローと共有されるGitHub Actionsのキャッシュに書き込めたこと、リリース用ワークフローがnpmへの公開に使うOIDCトークンを発行できる状態だったことです。Nxは、待機期間の設定が古いpnpmで無視されていたこと、トークンが端末上で読める場所にあったこと、1人で拡張機能を公開できたことを挙げています。