コンテンツにスキップ

サプライチェーン攻撃の対策

チェック

  • [ ] 本文を確認した
  • [ ] 概要を確認した
  • [ ] タグを確認した
  • [ ] 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などの実行点を把握する必要がある。

クールダウンを置く

攻撃は公開から数時間から数日で検知・削除されることが多い。 新規公開バージョンをすぐ取り込まないだけで、汚染ウィンドウを避けられる可能性が上がる。

例:

# .npmrc
min-release-age=7d

pnpm、Bun、Yarn、Dependabot、Renovate、Snykにも同種の遅延・cooldown設定がある。 Go modulesなどネイティブ機能がないエコシステムでは、社内GOPROXYやRenovateの minimumReleaseAge で補う。

バージョン固定とlockfile

SemVerの ^latest は、攻撃者がpublishした新バージョンへの自動解決を許す。 本番アプリケーションでは完全固定または狭いレンジを優先し、無差別な npm updatenpx npm-check-updates -u を避ける。

CI/CDではlockfileを厳格に扱う。

npm ci
pnpm install --frozen-lockfile
bun install --frozen-lockfile
yarn install --immutable

Goなら go.mod / go.sumGOFLAGS=-mod=readonlygo 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は、レビュー対象として扱う。

タグ

security #supply-chain #npm #dependency-management #ci-cd #sbom