サプライチェーン攻撃の対策¶
チェック¶
- [ ] 本文を確認した
- [ ] 概要を確認した
- [ ] タグを確認した
- [ ]
inbox/直下へ移行した
概要¶
npmを中心に、PyPI、RubyGems、Maven、Go modules、コンテナイメージまで含めたソフトウェアサプライチェーン攻撃の対策メモ。 Shai-Hulud、Axios侵害、Dependency Confusion、タイポスクワッティングなどを背景に、依存取得・ビルド・CI/CD・認証情報の守り方を整理している。 実務で参照すべき軸は、install時任意コード実行の抑止、リリース後のクールダウン、lockfileの厳格運用、署名・Provenance、権限最小化、事後対応の準備。
本文¶
背景¶
記事は、npmエコシステムを直撃したShai-Hulud系攻撃、Axiosの直接侵害、PyPIやRubyGemsの悪性パッケージ、SolarWinds、Dependency Confusionなどを例に、サプライチェーン攻撃のパターンを整理している。
攻撃パターンは大きく次の3つ。
- アカウントハイジャック: メンテナの認証情報を盗み、正規パッケージに悪性バージョンをpublishする
- タイポスクワッティング: 類似名パッケージを公開して誤インストールを狙う
- Dependency Confusion: 内部パッケージと同名の公開パッケージを登録し、レジストリ解決を悪用する
共通する弱点は、ビルドシステムが未検証の外部コードを自動取得し、install時やbuild時に実行してしまうこと。
対策の6原則¶
記事では対策を次の6つにまとめている。
- install時任意コード実行を止める
- リリース後の猶予を置く
- lockfileで完全性を担保する
- 署名・Provenanceなどの信頼シグナルを検証する
- 権限とネットワークを最小化する
- 事後に即応できる状態を保つ
lifecycleスクリプトを止める¶
postinstall / preinstall は攻撃で繰り返し悪用されている。
npmではグローバルまたは個別installでscript実行を抑止できる。
npm config set ignore-scripts true
npm config set allow-git none
npm install --ignore-scripts --allow-git=none <package>
pnpm、Bun、LavaMoatなどでは許可リスト方式で必要な依存だけbuild scriptを許可する設計が紹介されている。 Python、Ruby、Rust、Java、.NETでも、それぞれsetup.py、extconf.rb、build.rs、Maven plugin、NuGet install scriptなどの実行点を把握する必要がある。
クールダウンを置く¶
攻撃は公開から数時間から数日で検知・削除されることが多い。 新規公開バージョンをすぐ取り込まないだけで、汚染ウィンドウを避けられる可能性が上がる。
例:
pnpm、Bun、Yarn、Dependabot、Renovate、Snykにも同種の遅延・cooldown設定がある。
Go modulesなどネイティブ機能がないエコシステムでは、社内GOPROXYやRenovateの minimumReleaseAge で補う。
バージョン固定とlockfile¶
SemVerの ^ や latest は、攻撃者がpublishした新バージョンへの自動解決を許す。
本番アプリケーションでは完全固定または狭いレンジを優先し、無差別な npm update や npx npm-check-updates -u を避ける。
CI/CDではlockfileを厳格に扱う。
Goなら go.mod / go.sum と GOFLAGS=-mod=readonly、go mod verify が対応する考え方になる。
lockfileインジェクションと署名¶
lockfileの resolved URLやintegrity hashを改ざんし、攻撃者管理のホストからパッケージを取得させる手口がある。
lockfile差分は、単なる機械生成物ではなくレビュー対象にする。
SBOM、署名、SLSA Provenance、Sigstore、npm provenanceなどの信頼シグナルは、依存取得後に何を信じてよいかを判断する材料になる。
権限とネットワーク¶
CI/CDや開発環境のトークンは、読み取り専用、短命、必要最小限にする。 依存インストール中にクラウド認証情報やGitHub tokenへアクセスできると、postinstall系攻撃がそのまま秘密情報窃取につながる。
実務では次を確認する。
- install時に環境変数へ秘密情報を渡していないか
- CIジョブの権限が過大ではないか
- PR由来のコードがsecretへアクセスできないか
- self-hosted runnerが攻撃の踏み台にならないか
- 外部ネットワークへの送信を制限できるか
要点¶
- サプライチェーン攻撃は「依存を入れるだけ」「lockfileを更新するだけ」「CIでbuildするだけ」の自動化経路を狙う。
- install時任意コード実行、クールダウン、lockfile、署名、CI権限、ネットワーク制御をセットで考える必要がある。
- npm固有の話に見えても、PyPI、RubyGems、Maven、Go modules、コンテナイメージでも同じ原則が使える。
- lockfile差分と依存アップデートPRは、レビュー対象として扱う。