現代のソフトウェアは、自分が書いたコードより取り込んだ依存パッケージの方が圧倒的に多いのが当たり前です。npm install 一発で何百もの第三者コードが自分の環境とCIで実行される——その信頼を逆手に取るのがソフトウェアサプライチェーン攻撃です。Sonatype は累計120万件超の悪性パッケージを追跡しており、2025年9月の自己増殖ワーム Shai-Hulud 以降、攻撃の頻度と技術的な深さは「いたずらの時代」から「高被害の時代」へと一段上がりました。
本記事は、個別事件の速報ではなく、npm/PyPIを狙う攻撃を6つの類型に整理し、2026年の実例とともに「どこを守ればよいか」を体系立てて解説します。攻撃の入口は違っても、防御の勘所は共通しています。
なぜ依存パッケージが狙われるのか
理由は単純で、費用対効果が圧倒的だからです。人気パッケージを1つ汚染できれば、それを使う何千ものプロジェクトとCI環境に一気に到達できます。しかもパッケージのインストールは、多くの場合スクリプトの自動実行を伴います。
- npm:
preinstall/postinstallなどのライフサイクルスクリプトが、依存の検証より前・インストール時に自動実行される。 - Python(PyPI):
setup.pyの実行や、import した瞬間のコード実行が悪用される。
つまり「インストールしただけ」「import しただけ」で、開発者のトークン・環境変数・クラウド認証情報が抜かれ得ます。狙われるのは最終的にCIのシークレットとクラウドの鍵です。
サプライチェーン攻撃の6類型
1. タイポスクワッティング(typosquatting)
人気パッケージと1文字違いの名前で悪性パッケージを公開し、打ち間違いを待つ手口。2026年初頭には PyPI で boto3・requests・numpy 等の1文字違いを狙うキャンペーンがあり、import 時にリバースシェルを張り、環境変数を窃取しました。データサイエンス/ML チームが標的でした。
2. 依存関係混同(dependency confusion)
社内のプライベートパッケージと同名のパッケージを公開レジストリに、より高いバージョン番号で公開する手口。ビルドツールが「新しい方」を優先して公開側を取り込んでしまう設定の隙を突きます。社内名がソースやログから漏れていると刺さります。
3. slopsquatting(AIの幻覚を悪用)
2026年ならではの新類型です。AIコーディングツールは、実在しないパッケージ名を「もっともらしく」提案(ハルシネーション)することがあります。攻撃者はAIがよく幻覚する名前を先回りして登録し、開発者がAIの提案を鵜呑みに install するのを待ちます。「AIが言ったから存在するはず」という思い込みが穴になります。
4. メンテナアカウント乗っ取り
正規パッケージの作者アカウントを乗っ取り、本物のパッケージに悪性コードを仕込む手口。フィッシングや トークン窃取 で公開権限を奪います。2026年には TanStack・Mistral AI・UiPath・OpenSearch など実在の有名パッケージ群がまとめて汚染され、累計5.18億ダウンロード規模に影響しました。利用者からは「いつもの信頼できるパッケージ」に見えるため発見が遅れます。
5. 悪意あるインストール/ライフサイクルスクリプト
前述の preinstall / postinstall や import 時実行を悪用するもの。2026年4月の SAP関連npmパッケージ侵害では、preinstall スクリプトが検証や多くのセキュリティツールが走る前に実行され、認証情報を窃取しました。TrapDoor キャンペーン(2026年5月〜)は npm・PyPI・crates.io にまたがり、34超のパッケージ・384超のバージョンを、暗号通貨・AIツール・セキュリティ関連を装った名前で配布しています。
6. 自己増殖ワーム
最も新しく、最も厄介な類型。汚染されたパッケージが感染した開発者のトークンを使って、その人の他のパッケージへ自動的に感染を広げる。 Shai-Hulud がその嚆矢で、2025年12月の Shai-Hulud 2.0、2026年5月の Mini Shai-Hulud(170超のnpm+PyPIパッケージ、404の悪性バージョン、「Shai-Hulud: Here We Go Again」を含む400超のリポジトリ作成)と再来・変異を繰り返しています。人手を介さず連鎖するため、被害が指数関数的に広がります。
図解案:汚染がCIのシークレットに届くまで
[攻撃者] 6類型のいずれかで悪性パッケージを公開/汚染
│
▼
[開発者/CI] npm install ・ pip install
│ postinstall(npm) / import時実行(Python) が自動発火
▼
[実行環境] 環境変数・.npmrc・クラウド鍵・CIシークレットを窃取
│
├─▶ クラウド侵害(漏れた鍵で本番へ)
└─▶ 盗んだ公開トークンで他パッケージへ感染(=ワーム化)
★ 守る要点:①取り込む前に止める ②install時の自動実行を抑える
③漏れても被害を限定する(最小権限・環境分離)防御策
取り込む前に止める(入口)
- バージョン固定とlockfile:
package-lock.json/poetry.lockで完全性ハッシュ込みに固定。勝手な更新で汚染版を引き込まない。 - 導入前のクールダウン:公開直後の新バージョンを即採用せず、数日寝かせて事故報告を待つ。ワーム対策に有効。
- リポジトリファイアウォール/許可リスト:未知・新規・低評価のパッケージをプロキシでブロックし、承認済みのみ通す。タイポスクワッティング/slopsquatting を入口で弾く。
- 名前を確認する習慣:AIが提案したパッケージ名をそのまま信じず実在と正当性を確認。社内名と公開名の衝突(依存関係混同)にも注意。
インストール時の自動実行を抑える(実行)
--ignore-scriptsを既定にし、必要なパッケージだけ明示的に許可する。ライフサイクルスクリプト悪用の大半を無効化できる。- CIを最小権限・環境分離で:ビルドジョブからクラウド本番鍵を見えなくする。シークレットはジョブ単位でスコープし、短命トークンに。
供給側・組織の信頼を固める
- Trusted Publishing(OIDC):長命な公開トークンを廃し、CIからの署名付き短命認証で公開する。メンテナアカウント乗っ取りの被害を縮小。
- メンテナ認証の強化:公開アカウントにフィッシング耐性のあるMFA(Passkey/FIDO2)を必須化。
- 署名・来歴(provenance):npm provenance や Sigstore で「どのソース・どのCIから来たか」を検証可能にする。
漏れても被害を限定する(可視化と対応)
- SBOM(ソフトウェア部品表)と継続スキャン:「いま何のどのバージョンが入っているか」を即答できる状態に。既知の悪性パッケージとの照合を自動化する。
- 侵害時はトークン即rotate:漏れた可能性のある認証情報・公開トークンを直ちに失効・再発行。ワームの連鎖を断つ。
まとめ
サプライチェーン攻撃は、「開発の土台になっている信頼」そのものを武器化します。6類型(タイポスクワッティング/依存関係混同/slopsquatting/メンテナ乗っ取り/悪意あるスクリプト/自己増殖ワーム)は入口こそ違え、ゴールは共通——install/import の自動実行を足がかりに、CIのシークレットとクラウドの鍵を奪うことです。
守りも共通します。取り込む前に止める(固定・クールダウン・許可リスト)、install時の自動実行を抑える(--ignore-scripts・環境分離)、漏れても限定する(最小権限・SBOM・即rotate)。具体的なワームの挙動は Shai-Hulud 詳解、AIエージェント基盤に固有のサプライチェーンは MCPのセキュリティ も合わせてご覧ください。
※ 本記事のキャンペーン名・統計値・パッケージ名は、Sonatype/Unit 42/Microsoft/各セキュリティベンダーの公表内容および報道に基づきます。状況は急速に更新されるため、対応時は最新の公式情報をご確認ください。