トップ/記事一覧/TanStackとNx Console汚染事件、npm連鎖攻撃といま安全なバージョン
tanstack-nx-console-supply-chain-cve-2026-45321-48027-cover-ja

TanStackとNx Console汚染事件、npm連鎖攻撃といま安全なバージョン

2026年5月、npm『TanStack』42パッケージ84版が攻撃者に汚染(CVE-2026-45321)。流出したGitHub認証情報を使って5月18日にVS Code拡張『Nx Console』v18.95.0も悪意ある版で配信(CVE-2026-48027)。連鎖型サプライチェーン攻撃、両者ともCISA KEV登録済み。

ニュース2026年5月28日公開最終更新 2026年7月24日
目次
この記事のポイント

2026年5月、npm『TanStack』42パッケージ84版が攻撃者に汚染(CVE-2026-45321)。流出したGitHub認証情報を使って5月18日にVS Code拡張『Nx Console』v18.95.0も悪意ある版で配信(CVE-2026-48027)。連鎖型サプライチェーン攻撃、両者ともCISA KEV登録済み。

Reactのルーティングやデータ取得で広く使われるnpmパッケージ群TanStackと、コードエディタVisual Studio Code(VS Code)向けの拡張機能Nx Consoleは、2026年5月に連鎖したサプライチェーン攻撃(正規の配布ルートに悪意あるコードを紛れ込ませて配る手口)で汚染されました。ただし汚染版はいずれも短時間で撤去されており、2026年7月23日時点で、npmやマーケットプレイスから入手できるTanStack・Nx Consoleの版はすべて安全に使えます。これから導入するなら通常どおり最新版を入れれば問題なく、後始末が要るのは、当時の汚染版——Nx Console v18.95.0、および2026年5月11日にわずか6分間だけ出回った一部のTanStack版——を実際にインストール・ビルドで取り込んでいた場合だけです。以下、何がどう起き、なぜ「1回のインストール」でここまで広がるのか、そして当時踏んでいた場合に何を確認すべきかを整理します。

5月11日に発生したのが、Reactのルーティングライブラリで知られるTanStackのnpmパッケージ汚染。@tanstack/react-routerなど42パッケージ・84バージョンが、攻撃者によって悪意あるコードを仕込まれた状態で正規のnpmレジストリから配信されました。週12.7Mダウンロードを誇る人気パッケージが、わずか6分の公開時間で世界中に拡散しています。

そして5月18日、その流出した認証情報が次の攻撃に使われます。Nxが提供するVS Code拡張Nx Consoleのv18.95.0が、Visual Studio Marketplaceで11分間、Open VSXで36分間、悪意ある版として配信されました。インストールしたユーザーのGitHub認証情報、AWS認証情報、SSH秘密鍵、1Password Vault、Kubernetesトークン、さらには~/.claude/のClaude Code設定まで盗まれる構造です。

Snykは一連の攻撃を「Mini Shai-Hulud」と命名し、StepSecurityは攻撃者グループ「TeamPCP」によるものと分析しています。SocketStepSecurityの連名解析、そしてTanStackNx双方のポストモーテム(事後検証レポート)から、この連鎖攻撃の全貌が明らかになっています。2026年前半に相次いだJavaScript/TypeScriptのサプライチェーン攻撃の中でも規模の大きな事件で、後述するように、同じ攻撃者グループTeamPCPによる攻撃はこの事件のあとも別のパッケージへ広がり続けています。

npm install 1回で、顧客向けアプリの中に他人の足場が同梱される話

サプライチェーン攻撃の怖さは、踏んだ本人の被害がゴールではなく中継地点である点に尽きます。TanStackで吸われた認証情報がNx Consoleを汚染し、その汚染された拡張機能が次の開発者のPCを侵す——この連鎖の終点には、本人が顧客に出荷したアプリのエンドユーザーまで含まれます。

npmレジストリとVS Code Marketplaceの信頼を悪用するのは、無差別の愉快犯ではありません。中心にいるのは、「TeamPCP」のようにOSS開発者になりすました偽コミッター集団、依存先企業を一網打尽にしたい初期アクセスブローカー、CIパイプラインを乗っ取って暗号通貨マイナーや恐喝マルウェアを撒くランサムウェアグループ、Shai-Hulud型ワームを次の標的に再注入したい攻撃キャンペーン運用者です。彼らが欲しがるのは、開発者ノートPCに散らばっているGitHub Personal Access Token、AWSのアクセスキー、SSH秘密鍵、1Password Vault、Kubernetesトークン、そして~/.claude/に保存されたClaude Codeの認証情報やプロジェクトコンテキストです。本CVE連鎖は、開発者がpnpm installを一度叩いた瞬間に、その日同居しているリポジトリ群のトークンを根こそぎ持っていき、奪った鍵で翌週には別パッケージのメンテナ権限を乗っ取る形で動きます。第1段で抜いた認証情報が第2段の踏み台になる、自己増殖のサイクルが、この事件で実際に記録されました。

サイバーセキュリティの構造で言うと、これは「Shai-Hulud型」と呼ばれる自己増殖型サプライチェーン攻撃の縮小版です。第1段(TanStack)で開発者の認証情報を奪い、その認証情報で第2段(Nx Console)の正規メンテナを乗っ取り、第2段で汚染された拡張機能が世界中の開発者PCに広がる。ここで重要なのは、TanStackやNxのユーザー数(週12.7Mダウンロード、VS Code拡張で数百万インストール)の各々を見ているだけでは足りないという点です。被害は「TanStackを使っているプロダクトの利用者全員」「Nx Consoleを入れている開発者が手がけているプロダクトの全エンドユーザー」へと、依存グラフの2〜3ホップ先まで波及します。週12.7Mダウンロードのパッケージが6分間悪意ある版で配信された時点で、CIで自動的にビルドされて顧客向けにデプロイされたアプリが、世界中で大量に存在することになります。

CVSSスコアは1つのパッケージを引いたPCの話を測る目盛ですが、Web開発者やSaaS企業の現実の傷は別の階層に残ります。それは、自分のCIが汚染版を踏んだ6分間に自動ビルドされて顧客サイトに配信されたバンドルが、SaaS利用企業のエンドユーザーから認証情報を吸い続け、後日「うちが導入したそちらの製品から漏れた」と取引先から請求書が回ってくることです。出荷者が「ライブラリを引いただけ」と言える時間は短く、責任は依存グラフを下流に流れます。

何が起きたか:5月11日から5月18日までの7日間

時系列で整理すると、攻撃は2段階に分かれていました。第1段(TanStack)で得た認証情報を使って、第2段(Nx Console)で別のターゲットを汚染するという、計画的な多段攻撃です。

日時(UTC)出来事影響
5/11 19:20TanStackのGitHub Actions
パイプラインが攻撃者に乗っ取られる
正規のOIDC
トークンで悪意あるnpm配信
5/11 19:2642パッケージ84バージョン公開完了router_init.js
を全パッケージに混入
5/11 19:46頃StepSecurity研究員ashishkurmiが検知公開後20〜26分で警告
5/11 同日Nx貢献者が古いpnpm 10.14で
pnpm install 実行
prepare scriptで
GitHub CLI OAuthトークン流出
5/11〜5/16攻撃者が約5日4時間、
Nxリポジトリ内に潜伏
orphan commit
558b09d7 を作成
5/18 12:30Nx Console v18.95.0公開
(VS Code Marketplace)
悪意あるVSIXがダウンロード可能に
5/18 12:33Open VSXでも公開VSCodium/Cursor等にも拡散
5/18 12:41Nxメンテナが
通知メールに違和感、unpublish
VS Code Marketplaceで
11分後に撤去
5/18 13:09Open VSXからも撤去公開36分で完全撤去
5/27米政府CISAの攻撃悪用リスト
(KEV)へ2件同時登録
実際に悪用された脆弱性
として公式に確定
2026-07-23
時点
両製品とも入手できる版は
すべて安全(汚染版は撤去済み)
TanStack・Nx Consoleへの
新たな汚染報告はなし

公開時間はそれぞれ6分と11〜36分という短さですが、その間にダウンロードされたバージョンは世界中のCI/CDパイプラインで実行されたまま残り続けます。CryptikaStrobesの続報では、Mistral AIやUiPathのメンテナーアカウントにも被害が拡大したと報告されています。

TanStackとNx Consoleとは何か

TanStackは、米国の開発者Tanner Linsleyが率いるOSS集合体で、Reactのデータ取得ライブラリTanStack Query(旧React Query)、ルーティングのTanStack Router、テーブル表示のTanStack Tableなどを提供しています。フレームワーク非依存設計で、ReactだけでなくVue、Solid、Svelte版も用意されているため、JavaScript系のWebアプリ開発者ならほぼ全員が直接または間接に使用しています。@tanstack/react-router単独で週1,270万ダウンロードという数字が、その普及度を示しています。

一方のNx Consoleは、Nrwl社(現Nx)が提供するNxモノレポツールのVS Code向けGUI拡張です。Nx自体は、大規模なJavaScript/TypeScriptプロジェクトを1つのリポジトリに集約する「モノレポ」を支援するツールで、Google、Microsoft、Roche、Capital Oneといった大手企業の社内開発基盤で使われています。Nx ConsoleはそのGUIを VS Code 内に提供し、StepSecurityの解析では累計220万インストールに達しています。

両者とも、最終ユーザーのWebアプリ開発者から、企業のCI/CDパイプライン、Nx Cloud契約の大企業まで、JavaScript/TypeScript周辺の開発現場を支える基幹OSSです。今回の攻撃が「狙い澄まされたサプライチェーン攻撃」と評される所以がここにあります。

CVE-2026-45321:TanStack npm 42パッケージ汚染

第1段の攻撃は、GitHub Actionsの設定不備3点を組み合わせた極めて洗練された手口でした。NVDの分類はCWE-506(悪意あるコードの埋め込み)、CVSS 9.6。

項目内容
CVE番号CVE-2026-45321
CVSS v3.19.6(緊急)
影響パッケージ42個の@tanstack/*
合計84バージョン
攻撃手法pull_request_target Pwn Request
+ Actionsキャッシュポイズニング
+ OIDCトークンメモリ抽出
悪意あるファイルrouter_init.js
(約2.3MB、難読化済)
公開時間2026年5月11日 19:20〜19:26 UTC(6分)
検知者ashishkurmi
(StepSecurity)
攻撃者TeamPCP
(StepSecurity分類)
CISA KEV2026年5月27日登録

攻撃の核心は、GitHub Actionsのpull_request_targetトリガーの設定不備でした。これは「Pwn Request」と呼ばれる古典的な穴で、フォークからのプルリクが本家リポジトリの権限でCIを実行できてしまう状態を指します。攻撃者はフォーク経由でビルドキャッシュに細工し、本家のリリースパイプラインが起動した瞬間にキャッシュを汚染、さらにランナーのメモリから正規のnpm OIDCトークンを抽出して、TanStack本家のIDで悪意あるバージョンを公開しました。

この攻撃は史上初めて「正規のSLSA provenance付き」で悪意あるnpmパッケージを配信した事案でした。SLSAは、ビルドの来歴を暗号署名で証明する仕組みで、npm v9以降が標準対応しています。攻撃者は正規のCI環境を乗っ取ったため、そこから発行されるSLSA証明書も「本物」になり、署名検証では悪意あるパッケージを見抜けません。「サプライチェーン保証の最後の砦」と考えられていたprovenanceまで突破された、衝撃的な事案です。

router_init.jsは、AWS IMDS(メタデータサービス)、Secrets Manager、SSM Parameter Store、HashiCorp Vault、Kubernetesサービスアカウントトークンなどから認証情報を収集する「クレデンシャル収集エンジン」と、被害下流CIで自分自身を継続拡散する「ワーム伝播機構」を統合した構造でした。被害はMistral AIやUiPathのメンテナーアカウントを含む数十のOSSメンテナーに拡散したと報告されています。

TanStack側はこの直後に3日間かけて全パッケージを洗い直し、2026年5月15日に「オールクリア(安全確認完了)」を宣言しています。汚染されたtarball(配布用の圧縮ファイル)はnpm側が公開後まもなく削除しており、Tenableの解説でも、いま入手できる@tanstack/*パッケージはすべて安全にインストールできると整理されています。これから導入する場合に追加作業は不要で、確認が要るのは当時の6分間に汚染版を取り込んでいた場合だけです。

CVE-2026-48027:流出した認証情報がNx Consoleへ

第2段は、第1段で漏れた「Nx貢献者のGitHub CLI OAuthトークン」を起点にしています。NVDの分類は同じくCWE-506、CVSS 9.3(v4.0)。

項目内容
CVE番号CVE-2026-48027
CVSS v4.09.3(緊急)
影響バージョンNx Console
v18.95.0(単一バージョン)
安全なバージョンv18.95.0以外はすべて安全
(2026-07-23時点の最新はv18.101.1)
配布元VS Code Marketplace
Open VSX
攻撃成立条件v18.95.0インストール
かつワークスペースを開く
影響範囲活性化推定6,000件超
Nx CLI / Nx Cloud は対象外
CISA KEV2026年5月27日登録

技術的なハイライトは3つあります。第一に、攻撃者はnrwl/nxリポジトリにorphan commit(どのブランチからも到達できないコミット)を作りました。SHAは558b09d7ad0d1660e2a0fb8a06da81a6f42e06d2。497KBの難読化ドロッパーを忍ばせ、ブランチには現れない隠し置き場として使いました。コミット履歴の単純な走査では発見できず、SHAを知っている者だけがアクセスできる構造です。

第二に、悪意のあるVSIX本体はたった2,777バイトの追加コードでした。main.jsにこのバイトを混入し、起動時にnpx -y github:nrwl/nx#558b09d7を実行することで先のorphan commitの中身を取りに行く設計です。本体側のVSIXを軽量に保つことで、Microsoftの自動検査をすり抜けています。

第三に、ペイロードにはSigstore偽造機能が組み込まれていました。盗んだnpm OIDCトークンと組み合わせれば、攻撃者はSigstoreから正規の署名証明書を取得し、被害者のCI環境を起点にしてさらに「正規のSLSA provenance付き」悪意あるnpmパッケージを下流に再配信できる構造です。TanStack攻撃と同じ「provenance偽造」のキットが、Nx経由でさらに広く配布される段取りになっていたわけです。

何が盗まれるのか:認証情報の全カタログ

Nx Console v18.95.0が起動した直後に行うのが、開発者PCに保存されているありとあらゆる認証情報の収集です。StepSecurityの解析によると、攻撃の対象は6つの収集モジュールに整理されています。

収集対象取得方法
GitHub~/.config/gh/hosts.yml
.git-credentials
環境変数 + プロセスメモリスキャン
npmOIDCトークン交換
(Trusted Publishing用)
AWSIMDS / ECSメタデータ
Secrets Manager / SSM
HashiCorp VaultKubernetes / AWS IAM 認証経由
1PasswordCLIセッションが有効なら
Vault全件抽出
Kubernetesサービスアカウントトークン
SSH / GPG~/.ssh/ 配下の秘密鍵
Claude Code~/.claude/ 配下の
API設定・履歴
Docker / GCP設定ファイル全般
アプリ接続情報各種.env / 接続文字列

目を引くのは、Claude Code設定(~/.claude/)まで対象に含まれている点です。AIコーディングアシスタントの普及で、開発者のホームディレクトリにAI関連の認証情報や履歴が蓄積されるようになっていますが、攻撃者はそれをすでに「奪取すべき情報」のひとつとしてリストアップしています。これは2026年以降のサプライチェーン攻撃の新しい標的傾向を示しています。

流出した情報は3経路で攻撃者インフラに送信されました。HTTPS POST(暗号化C2ドメイン、ポート443)、GitHub API経由でリポジトリにコミットを作成、そしてDNSトンネリングを予備チャネルとして使用。データはAES-256-GCM+RSA-OAEPのハイブリッド暗号で守られており、ネットワーク監視で内容を覗き見ることはできません。

永続化の仕組みも巧妙です。macOSでは~/.local/share/kitty/cat.pyというPythonバックドアを設置し、LaunchAgentで再起動後も自動起動するよう仕込みます。バックドアは1時間ごとにGitHub Search APIへapi.github.com/search/commits?q=firedalazerのクエリを投げ、攻撃者が用意した署名付きコミットを「dead-drop」として受信、4096bit RSA公開鍵で署名検証してからコマンドを実行する設計です。攻撃者しか署名できないため、第三者が偽コマンドを送り込めないようにする慎重な設計になっています。

当時、汚染版を踏んでいた場合の後始末

これから新しくTanStackやNx Consoleを入れる人に、追加の作業はありません。以下は、2026年5月11日〜18日の汚染時間帯に該当バージョンをインストール・ビルドで取り込んでいた場合の確認手順です。汚染版は撤去済みですが、当時抜かれた認証情報は撤去後も攻撃者の手に残るため、心当たりがあれば順に点検してください。

1. Nx Console v18.95.0を使った可能性があれば、痕跡(IoC)を確認する。 該当バージョンを5月18日 12:30〜13:09 UTCの間にインストール・更新した記憶があれば、以下のファイル・プロセスをチェックします。

  • macOS: ~/.local/share/kitty/cat.py / ~/Library/LaunchAgents/com.user.kitty-monitor.plist
  • Linux/macOS: /var/tmp/.gh_update_state
  • Linux: /etc/sudoers に身に覚えのない passwordless 設定
  • 環境変数 __DAEMONIZED=1 を持つプロセス
  • 名前に kitty- が含まれる Python プロセス

2. 該当した場合、PC上のすべての認証情報をローテーション。 「ファイルを消すだけ」では足りません。GitHub PAT、SSH鍵、AWSアクセスキー、GCPキー、npm token、Vault token、Kubernetes service account token、1Password Vaultパスワード、Claude Code/Cursor等のAIアシスタント設定——文字通り全部の認証情報を新しい値に差し替えます。機密性が極めて高い環境ではマシン全体の再イメージ化が推奨されています。

3. TanStack依存プロジェクトのCIログを5月11日まで遡って確認。 自社のリポジトリで@tanstack/*を使っている場合、5月11日 19:20〜19:26 UTC以降のビルドで悪意あるバージョンを取り込んでいた可能性があります。package-lock.jsonのresolvedバージョンを確認し、汚染版にあたっていればCIワーカーの認証情報も流出している前提で点検します。

4. pnpmを、公開直後の版を一定期間入れない設定が効く版へ上げる。 Nx貢献者の被害を生んだ直接の引き金は、pnpm 10.14がminimum-release-age=10080(公開から7日経過しないパッケージはインストール拒否)という設定を黙って無視していたバグでした。この設定が正しく動くのはpnpm 10.16以降なので、それ以上のバージョンへ更新しておきます。「新しいバージョンを即時に取り込まない」は、サプライチェーン攻撃の即時影響を遮断する強力な防御策です。

5. GitHub Actionsのpull_request_targetトリガー設定を全社で監査。 TanStackの被害の根本原因は「Pwn Request」と呼ばれる古典的な穴です。フォーク経由PRに対してpull_request_targetを使い、かつ書き込み権限を持つ操作(npm publish、tag push、Action cache保存)を行うリポジトリは、即座に設定を見直す必要があります。GitHub Actionsの依存(uses: org/action@v1形式)も、フローティング参照ではなくSHAピン留めに切り替えます。

6. AIアシスタント設定の隔離を検討。 Claude Codeを含むAIコーディングアシスタントの設定ファイルが盗難対象になった意味は大きく、これらの設定は ~/.claude/等の予測可能な場所に置かれる傾向があります。社用APIキーは個人マシンの平文設定ではなく、社内SecretsマネージャやSSO経由の発行に切り替える検討が必要です。

「Mini Shai-Hulud」と呼ばれる理由:2025年のShai-Huludとの関係

Snykが今回の攻撃を「Mini Shai-Hulud」と命名しました。「Shai-Hulud」は、2025年9月に発生したnpm生態系を襲った大規模ワーム型サプライチェーン攻撃のコードネームで、当時は数百のnpmパッケージが連鎖感染しました。今回はその「縮小版」だが「より洗練された」攻撃という位置づけです。

2025年版との違いは、攻撃者TeamPCPが正規CI環境を経由した「provenance付き」攻撃に進化させた点です。2025年版が「メンテナーアカウントを乗っ取って公開」だったのに対し、2026年版は「正規パイプラインを乗っ取り、署名・provenance込みで公開」となりました。サプライチェーン保証の業界基準が一段引き上げられても、その上を行く攻撃が同時に発展している状況です。

TeamPCPの活動は、TanStackとNx Consoleを最後に収まったわけではありません。同じ「Mini Shai-Hulud」の手口は、この事件のあとも別のパッケージへ次々と広がりました。2026年6月1日には@redhat-cloud-services名前空間で30本超のパッケージが汚染され、6月19日には侵害された21のGitHubアカウントから、盗んだ中身を書き出した1,600本超のリポジトリが見つかって攻撃が再燃、7月14日にはAPI仕様ツールAsyncAPIの中核リポジトリのリリース工程まで乗っ取られました。研究者の集計では、一連のキャンペーンで汚染されたパッケージは累計およそ600本、認証情報を抜かれたGitHubリポジトリは2,500本を超えるとされています。一方で、TanStackとNx Console自体が再び汚染されたという報告は、2026年7月23日時点で確認されていません。最初の入口だった2製品はすでに塞がれ、攻撃者の主戦場は別のパッケージへ移っています。だからこそ、いま両製品を使う分には最新版を保てば足り、当時の汚染版を踏んでいた場合の後始末だけが残る、という整理になります。

本サイトでは、こうした連鎖型サプライチェーン攻撃の継続観測のため、OSSサプライチェーン・スキャナーを運用しています。自社で使っている@tanstack/*パッケージや、関連依存(Mistral AI、UiPath経路で汚染されたパッケージ)の現在の汚染状況をまとめて確認できます。CISA KEVへの登録履歴を含めた攻撃中CVE一覧はCISA KEVダッシュボード(日本語版)から追跡できます。

Nxのポストモーテムは、再発防止策として4点を挙げています。GitHub Actions環境による公開承認の必須化、GitHub監査ログの監視、GitHub ActionsのSHAピン留めの全社徹底、そしてpublisherの2人承認制。同種の対策をOSSメンテナンス側でも導入しないと、TanStack→Nxのような連鎖の3段目・4段目はいつでも起きる構造的脆さが残っています。

参照元

avatar-m-1

堀川 慎

Backend Engineer / AWS / Django / Go