ソフトウェア サプライチェーンアタック SOFTWARE SUPPLY CHAIN ashphy @[email protected] ATTACKS 2026年6月5日
DEFINITION サプライチェーン アタックとは 正規の配布物そのものに悪意を仕込み、 信頼ごと利用者のもとへ届ける攻撃。 出典:Committee on National Security Systems (CNSS) Glossary “ インストール前に 悪意のある第三 者によって挿入されたバックドア や脆弱性 を悪用し、データへの侵 入や、ハードウェア・ソフトウェア・ OS・周辺機器・サービスを ライフ サイクルのどの段階においても操 作可能 にする攻撃手法。 02
脆弱性を直接突かない ① 正面から突く ② 周囲から忍び込む ATTACKER 攻撃者 ↓ 直接攻撃 ATTACKER YOUR APP DEPENDENCY アプリ本体 強固なセキュリティ 攻撃者 ↓ 依存に侵入 VS ライブラリ / OS / CI 信頼されている供給元 ↓ 信頼ごと取り込み YOUR APP アプリ本体 防御は健在なのに素通り ✕ 堅牢な防御に阻まれる ○ 内側から侵入成功 ↓ 同じ依存を使う無数のアプリへ波及 正面なら弾ける強固な防御も、依存先を経由されれば正規ルートで内側に通してしまう。 03
CASE 01 — GITHUB 連鎖する侵害 TanStack → Nx → GitHub たった一つのPull Requestが、人気ライブラリ・開発ツール・そしてGitHub本体 へと、わずか8日でドミノ倒しのように広がった。
CASE 01 — GITHUB GitHubの内部リ ポジトリが流出 犯行声明を出したのは TeamPCP 。 ここに至る引き金は、まったく無関係に見 える一本のPRだった。 は、脆弱性スキャナ Trivy を狙った 攻撃でも知られる同一アクターだ。 約 3,800 GitHub内部リポジトリが流出 TeamPCP 05
きっかけはTanStack CASE 11:11 05-11 自動実行 01 — GITHUB - TANSTACK 攻撃者がPRを作成 が pull_request_target で起動し、benchmark-pr ジョブが をチェックアウトする設定だった。 refs/pull/7378/merge(=PR側のコード) bundle-size.yml 本体権限のままPRのコードを実行 と pnpm nx run @benchmarks/bundle-size:build が走り、PR内の vite_setup.mjs が実行された。 pnpm install 通常のfork PRはシークレット無しの隔離環境で動く。問題は pull_request_target + PRコ ードのチェックアウトという組み合わせ。本体の権限を持ったまま第三者のコードを実行する誤設 定(Pwn Request)だった。 06
汚染を main のキャッシュに仕込む CASE 11:29 05-11 11:31 05-11 01 — GITHUB - TANSTACK checkoutのpostを乗っ取り、共有キャッシュを汚染 が actions/checkout のpostスクリプトを書き換え、ジョブ終了時にランナーのキ ャッシュ書き込みトークンで依存の共有キャッシュ(pnpmストア)を保存。本来PRスコープのはずが リリースが次に要求するキーと一致するよう仕込まれた。= キャッシュ refs/heads/main スコープで、 ポイズニング vite_setup.mjs 証拠を消して隠蔽 Pull Requestの変更を元に戻し、差分を0に戻して痕跡を消す。きれいなコードと、汚染されたキャッシ ュだけが残る。 でも防げない。キャッシュ書き込みは GITHUB_TOKEN ではなくランナ ー内部のトークンを使うため、権限設定をすり抜けた。 permissions: read-only 07
リリースプロセスで動き出す CASE 19:16 05-11 19:20 05-11 01 — GITHUB - TANSTACK 通常のリリースが汚染キャッシュを復元 別の PR#7382 のマージで release.yaml が起動。汚染されたキャッシュが復元され、 リリース権限を持つジョブの中で毒入りコードが動き出した。 OIDCトークンをメモリから抜き取り、汚染公開 Actionsランナーの Runner.Worker プロセスのメモリからOIDCトークンを直接奪取。npmに直接 POSTし、悪意ある42個のパッケージ(84バージョン)を公開。 盗まれたOIDCトークンの有効期限は15分未満。短命でも、リリースが動く間はメモリ上にむき出 しだった。 08
公開から 検知まで CASE 01 — GITHUB - TANSTACK 26 分 外部の研究者が気付いて報告 するまで 19:20 05-11 19:46 05-11 20:00 05-11 21:03 05-11 21:30 05-11 23:55 05-11 汚染パッケージがnpmに公開される 外部の研究者が異変に気付きIssueを起 票 TanStackが対応を開始 すべての汚染バージョンを非推奨化 原因を特定 npmがtarballを削除 09
汚染パッケージが認証情報を吸い上げる CASE 01 19:20 05-11 20:43:01 05-11 — GITHUB CONSOLE Nxの開発者がpnpm installを実行。GitHub CLIの認証情報が抜かれる。 2 3 05-11 NX 汚染された42個の @tanstack/* が公開状態に 1 20:43:51 - 汚染された @tanstack/[email protected] を取り込む prepare スクリプトが自動で起動する 2.3MBの難読化された収集スクリプトが走り、gh(GitHub CLI)のOAuthトークンを ~/.config/gh/hosts.yml から抜き取る 盗んだトークンで組織のシークレットまで奪う わずか50秒後。盗んだ gh トークンで nrwl/nx に悪意あるコミットをpushし、組織スコープの GitHubシークレットを吸い出すワークフローを仕込んだ。 ※ Nxとは、複数プロジェクトを一括管理するモノレポ向けのビルドシステム。VS Code拡張「Nx Console」を提供し、多くの開発現場で使われている。 10
被害に気付いたのは7日後 CASE 01 00:12:49 05-12 12:30 05-18 12:36 05-18 12:47 05-18 — GITHUB - NX CONSOLE TanStackへの攻撃が公開される この時点でNx側は自分が被害に遭っていることに気付いていない。 攻撃者が拡張機能の汚染版を公開 盗んだ資格情報でNx Console v18.95.0をマーケットプレイスに公開。正規のコントリビューターと して振る舞う。 公開通知メールで異常を認識 公開のたびに自動送信される「拡張機能を更新しました」メールが届く。リリース予定がないのに通知が 来たことで、異変に気付く。 拡張機能を非公開化 11
そしてGitHub社内へ届く CASE 05-18 23 時頃 05-19 23:48 05-19 01 — GITHUB GitHub社員のVS CodeにNx Consoleが入る 汚染された開発ツールが、ついにGitHub社内の端末に到達した。 TeamPCPが犯行声明を書き込む GitHubが不正アクセスの調査開始を報告 最初のPRから、わずか8日間の出来事だった。 12
一本のPRがGitHubに届くまで CASE 01 — GITHUB 1 TanStack悪意あるPRをCIが自動実行 → mainのキャッシュを汚染 2 TanStackリリース時にキャッシュ復元 → OIDC奪取 → 42パッケージを汚染公開 3 Nx Console開発者が毒入り @tanstack/* をinstall → 認証情報が流出 4 Nx Console盗まれた資格情報で拡張機能が汚染公開される 5 GitHub社員のVS Codeに着弾 → 内部リポジトリ約3,800件が流出 どの組織も「自分のコード」は安全だった。信頼していた外部の供給元が、次々と踏み台にされた。 13
Mini Shai-Hulud CASE 01 — GITHUB - CAMPAIGN GitHubへの侵害は、攻撃グループ TeamPCP が展開する大規模キャンペーンMini Shai-Huludの、ひとつの波に過ぎなかった。 自己増殖するワーム 盗んだトークンでアクセスできる全パッケージを列 挙し、人手を介さずパッチ版を汚染公開する。感染し たCI/CDが、そのまま次の拡散経路になる。 指数関数的に広がる タイポスクワッティングや一度きりの汚染とは異な り、ひとつの認証情報の流出が、エコシステム全体へ の連鎖に繋がる。 14
同じ手口が次々と 月 Trivy(脆弱性スキャナ)を侵害 CASE 3 2026 5/19 2026 6/1 2026 01 — GITHUB - CAMPAIGN セキュリティツール自身が踏み台に。自己増殖ワーム CanisterWormが拡散し、Microsoftが検知・防 御のガイダンスを公表した。 AntV = 過去最大の波 わずか約22分で323パッケージに639版を自動公 開。npmに留まらずPyPI・GitHub Actions・VS Code拡張へと広がった。 Red Hatのnpmを侵害 類似ワームMiasmaが の32パッケージを汚 染。手口は今も使い回されている。 @redhat-cloud-services npm + PyPI 500+ 汚染パッケージ(各波の累計) 最大の波だけで5.18億超の ダウンロード。AWS・Vault・ GitHubの認証情報がCI/CD から抜かれた。 15
CASE 02 — XZ UTILS 人を欺く、長期潜入 XZ Utils コードではなく、人の信頼を攻撃する。3年がかりでメンテナの座を奪い、世界中の Linuxに手をかけた事件。
CASE 02 — XZ UTILS 圧縮ライブラリ経 由でsshdに穴が 空く 広く使われる圧縮ソフトウェア XZ Utils にバックドアが仕込まれた。 問題は仕込まれた先で、このライブラリ は多くのLinuxで sshd に取り込まれ ていた。 IMPACT 認証を突破し、リモートからサー バーを乗っ取れる 攻撃者だけが開けられる「裏口」を 鍵もパスワードも要らずに、外 sshd に。 部から任意コードを実行できる状態だっ た。 ※ sshd 自身は XZ Utils に依存していない。一部ディストリが systemd 連携のため sshd に当てていたパッチ経由で libsystemd がリンクされ、その依存 先である liblzma(XZ Utils)が sshd のプロセスに読み込まれていた。 17
CASE 02 — XZ UTILS バレた理由は、 わずかな遅さ。 DETECTED BY パフォーマンスの異常 ~0.5 秒 ある開発者がベンチマークを取っていた SSHログインに生じた、わずかな ところ、予想外にCPUを消費しているこ とに気付いた。その違和感を放置せず追 いかけたことで、巧妙なバックドアが暴か れた。 遅延 もし誰も気付かなければ、世界規模の侵 害になっていた。発覚はほぼ偶然だっ た。 18
CASE 02 — XZ UTILS Jia Tan 2021.11 2022 2023.03 2024.02 が信頼を積み上げた3年 Jia Tan(@JiaT75)がGitHubに登録 1年以上にわたり、複数のオープンソースプロジェクトで地道に活動を続ける。 XZ Utilsへ定期的な貢献を開始 小さく無害な修正を積み重ね、常連のコントリビューターとして信頼を築く。 XZ Utilsの主要メンテナの座を獲得 信頼を勝ち取った裏では、複数の偽アカウントが原作者に「更新が遅い」と圧力をかけ続けた。その後押し もあり、中枢に入り込んだ。 バックドアを仕込むことに成功 正規メンテナの権限で、誰にも怪しまれずに「裏口」を本体へ。 脆弱性ではなく「信頼される人間」そのものが攻撃ベクトルになった。 19
CASE 03 — AXIOS 信頼そのものを乗っ取る ・ 標的型ソーシャルエンジニアリング Axios コードもCIも関係ない。メンテナという「人」を直接だまし、アカウントごと奪う。
CASE 03 - AXIOS メンテナーの アカウントを奪う はJavaScript用のHTTPクラ イアントライブラリ。膨大なプロジェクト が依存する定番だ。そのメンテナーのア カウントが乗っ取られ、悪意のあるアッ プデートが公開された。 Axios WHAT IS AXIOS JavaScript用 HTTPクライアント ATTACK 正規メンテナの権限で、毒入り更 新をそのまま配布 21
企業ごと偽装 CASE 03 - AXIOS 1 実在企業の創業者になりすまして接触。人 物像も企業も丸ごと複製 2 CIに合わせてブランディングした偽 Slackへ招待。LinkedIn共有や偽プロフ ィール多数 3 MS Teamsでミーティング。複数の関係 者がいるように演出 4 「システムが古い」表示 → 不足項目をイン ストール → 実体はトロイの木馬 “ 何もかもが極めて入念に連携され ていて、本物らしく見え、プロフェ ッショナルなやり方で実行されて いました。 — 標的にされたOSSメンテナー の証言 22
CASE 03 - AXIOS この一連の工作を行っていたのは Sapphire Sleet 北朝鮮と関係のある攻撃アクター 愉快犯でも個人ハッカーでもない。国家が背景にある組織が、時間と資金をかけて OSSのサプライチェーンを狙っている。 ※出典:Mitigating the axios npm supply chain compromise(Microsoft) 23
WHAT YOU CAN DO できる対策 明日から効く、実践チェックリスト
リリース直後を、 使わない できる対 策 = 公開から一定期 間が経過したパッケージのみインストー ルする設定。汚染版が公開されても、多く は数時間〜数日で削除される。「待つ」だ けで踏まずに済む。 min-release-age 速報 対応ツール / 設定 npm pnpm uv VS Code v11.10.0以降 v10.16.0 〜 (v11で既定有効:1日) v0.9.17以降 拡張機能の自動更新をオフに VS Code 1.123 から拡張機能の自動更新に2時間の遅延が標準導入 25
できる対 策 自動実行スクリプト をブロック postinstallスクリプトを既定で実 対応方針 npmには postinstall スクリプトがあ り、npm install 直後に自動で実行さ れる。これが認証情報窃取の入口にな る。 Nxの被害は prepare / installスクリプトが 認証情報収集コードを走らせたことが原因。 pnpm 行しない npm 同様のブロック機構が提案中 –ignore-scripts も活用 26
できる対 策 — D O C K E R バージョンを固定する — Docker 同じタグ名でも、中身は差し替わりうる。digestまで指定して、中身ごと固定する。 中身が差し替わりうる FROM node:20-alpine ↓ @sha256 で中身まで固定する FROM node:20-alpine@sha256:6f3d9…e1c 中身まで一意に固定 確認 imagetools inspect / dockerfile-pin 更新 Renovate / Dependabot 27
できる対 策 — G I T H U B A C T I O N S バージョンを固定する — GitHub Actions のようなタグは作者が付け替えられる。フルコミットSHAで固定 @v4 uses: actions/checkout@v4 タグは付け替え可能 ↓ コミット SHA で固定する uses: actions/checkout@08c6903…dd907a8 付け替え不可 自動化 pinact / Dependabot 28
できる対 策 入られる前提で監視する SIEMに集約 でログを集約し、 見覚えのないリリースやアクセスを 検知できる状態にしておく。 GitHub → SIEM 通信を出口で止める installスクリプトが認証情報を外 部へ送る通信を出口でブロック。依 存パッケージの不審な挙動 (postinstall・難読化・外部通信)も スキャンして警告する。 socket.dev Harden-Runner ※ SIEM(Security Information and Event Management):各所のログやイベントを1か所に集約し、相関分析して異常や攻撃の兆候を検知する仕組み。 29
まとめのチェックリスト RECAP — TODAY'S CHECKLIST ✓ リリース直後を使わない ✓ 自動実行をブロック ✓ バージョンをpinする ✓ 監視・検知する min-release-age。VS Codeの自 動更新もオフに。 Dockerはdigest、 ActionsはコミットSHAで固定。 postinstallを信用しない。pnpm 採用や --ignore-scripts 。 SIEM・Firewallで異常に気付ける 状態に。 30
REFERENCES — 1 / 3 参考情報 トークン奪取と汚染版公開 — CASE 01 連鎖する侵害① TANSTACK — NPM 01 Postmortem: TanStack npm supply-chain compromise 02 TanStack公式の事後検証。トークン奪取から汚染版公開までの全経 緯。 03 侵害を受けてTanStackが講じた再発防止の取り組み。 Inside the GitHub Actions Cache Poisoning vite_setup.mjs によるActionsキャッシュ汚染の技術詳細。 NX → GITHUB — INSTALL 04 Hardening TanStack After the npm Compromise スクリプト悪用と組織への波及 Postmortem: Nx Console v18.95.0 supplychain compromise installスクリプトが認証情報を収集した事案のNx公式検証。 05 Investigating unauthorized access to GitHub-owned repositories GitHub公式のインシデント調査報告。 31
REFERENCES — 2 / 3 参考情報 — CASE 01② / 02・03 連鎖する侵害② の手口分析( 拡張) CASE 01 06 10 VS CODE Decoding the GitHub 2026 Breach TeamPCPによる一連の侵害の流れを解説。 CASE 02 08 — TEAMPCP 07 トロイの木馬化したVS Code拡張の解析。 長期潜入( X Z ) / C A S E 0 3 乗っ取り( A X I O S ) Everything I Know About the XZ Backdoor Jia Tanの正体とXZバックドア全容の総まとめ分析(CASE 02)。 TeamPCP Strikes (again): Trojan VS Code Extension 09 Post Mortem: axios npm supply chain compromise axios汚染版が公開された事案の事後検証(CASE 03・GitHub issue)。 Mitigating the axios npm supply chain compromise Microsoftによるaxios侵害の解析と緩和策。攻撃アクターSapphire Sleetに言及(CASE 03)。 32
REFERENCES — 3 / 3 参考情報 — 対策 サプライチェーン対策の公式ガイド・リリースノート 11 13 Mitigating supply chain attacks(pnpm) pnpmが推奨するサプライチェーン対策の公式ガイド。 12 Delayed extension autoupdates(VS Code 1.123) 拡張機能の自動更新に2時間の遅延を標準導入したVS Code公式リ リースノート(速報)。 Security Best Practices — Supply chain attacks(Node.js) Node.js公式のセキュリティベストプラクティス。サプライチェーン攻撃 への対策を解説。 33