サプライチェーン攻撃とは|事例と対策を徹底解説
ソフトウェアサプライチェーン攻撃の仕組み、SolarWinds・log4j・XZ Utilsなどの実例、そして組織が取るべき対策について詳しく解説します。
ソフトウェアサプライチェーン攻撃は、現代のサイバーセキュリティにおいて最も深刻な脅威の一つです。直接標的を攻撃するのではなく、その標的が信頼するソフトウェアやサービスを経由して侵入するこの攻撃手法は、検出が困難で被害が広範囲に及ぶ特徴があります。
サプライチェーン攻撃とは
サプライチェーン攻撃とは、ソフトウェアの開発・配布プロセスのいずれかの段階で悪意のあるコードを挿入し、最終的なユーザーに被害を与える攻撃手法です。
[開発者] → [ビルドシステム] → [パッケージリポジトリ] → [ユーザー]
↑ ↑ ↑
攻撃ポイント 攻撃ポイント 攻撃ポイント
なぜサプライチェーン攻撃が増加しているのか
| 要因 | 説明 |
|---|---|
| 依存関係の増大 | 現代のアプリケーションは数百〜数千のパッケージに依存 |
| 信頼の連鎖 | 正規のソフトウェアは信頼されやすく、検出を回避しやすい |
| 攻撃の効率性 | 1つの侵害で多数の標的に到達可能 |
| オープンソースの普及 | 誰でもコードを提供でき、審査が追いつかない |
実際のサプライチェーン攻撃事例
SolarWinds事件(2020年)
史上最大規模のサプライチェーン攻撃として知られるSolarWinds事件は、IT管理ソフトウェア「Orion」のビルドシステムが侵害されました。
| 項目 | 内容 |
|---|---|
| 攻撃者 | ロシア対外情報庁(SVR)関連グループ |
| 被害組織 | 約18,000組織(米国政府機関含む) |
| 潜伏期間 | 約9ヶ月 |
| 攻撃手法 | ビルドプロセスへの悪意あるコード挿入 |
攻撃者はSolarWindsのビルドシステムに侵入し、正規のアップデートにバックドア(SUNBURST)を仕込みました。デジタル署名も正規のものだったため、セキュリティツールでは検出できませんでした。
Log4Shell / Log4j(2021年)
Apache Log4jの脆弱性(CVE-2021-44228)は、意図的な攻撃ではなく設計上の問題でしたが、サプライチェーンリスクの典型例です。
影響を受けたサービス例:
- Amazon Web Services
- Microsoft Azure
- Google Cloud Platform
- Apple iCloud
- Minecraft
- VMware
- 他数万のサービス
| 項目 | 内容 |
|---|---|
| CVSSスコア | 10.0(最大) |
| 影響範囲 | 数億台のデバイス |
| 問題点 | 広く使われるライブラリの脆弱性が連鎖的に影響 |
XZ Utils バックドア(2024年)
2024年3月に発見されたXZ Utilsのバックドアは、オープンソースの信頼モデルを悪用した高度な攻撃でした。
| 項目 | 内容 |
|---|---|
| 攻撃手法 | 2年以上かけてメンテナーの信頼を獲得 |
| 標的 | SSH認証のバイパス |
| 発見方法 | PostgreSQLの開発者が偶然発見 |
| 教訓 | 長期的なソーシャルエンジニアリングの脅威 |
攻撃者「Jia Tan」は2年間にわたり正当な貢献を続け、メンテナーの信頼を獲得した後、バックドアを仕込みました。
npm/PyPIパッケージの悪用
パッケージリポジトリを狙った攻撃は日常的に発生しています。
タイポスクワッティング
正規パッケージ名に似た悪意あるパッケージを公開:
# 正規パッケージ
npm install lodash
# 悪意あるパッケージ(例)
npm install lodahs # タイポ
npm install loadash # タイポ
npm install lodash-utils # 類似名
依存関係かく乱攻撃(Dependency Confusion)
企業の内部パッケージ名と同じ名前で、高いバージョン番号のパッケージを公開リポジトリに登録:
内部リポジトリ: my-company-utils@1.0.0
公開リポジトリ: my-company-utils@99.0.0 ← 悪意あるパッケージ
結果: ビルドシステムが高いバージョンを優先してダウンロード
サプライチェーン攻撃の種類
1. ビルドシステムの侵害
開発環境やCI/CDパイプラインに侵入し、ビルド時に悪意のあるコードを挿入。
特徴:
- 正規の署名が付与される
- ソースコードには痕跡が残らない
- 検出が非常に困難
2. パッケージリポジトリの悪用
npm、PyPI、Maven Centralなどに悪意のあるパッケージを公開。
手法:
- タイポスクワッティング
- 依存関係かく乱
- メンテナーアカウントの乗っ取り
- 正規パッケージへのマルウェア注入
3. ソースコードの改ざん
オープンソースプロジェクトに悪意のあるコードをコミット。
事例:
- XZ Utilsバックドア
- イベントストリーム事件(2018年)
- UAParser.jsの乗っ取り(2021年)
4. サードパーティサービスの侵害
CI/CDツール、コード署名サービス、CDNなどの侵害。
事例:
- Codecov(2021年): CI/CDスクリプトが改ざん
- 3CX(2023年): 正規インストーラーにマルウェア
サプライチェーン攻撃の対策
1. 依存関係の可視化と管理
SBOM(Software Bill of Materials)の作成
# npm
npm sbom --sbom-format cyclonedx
# Python
pip install cyclonedx-bom
cyclonedx-py -r
# Syft(汎用ツール)
syft . -o cyclonedx-json
SBOMを作成することで、使用しているすべての依存関係を把握し、脆弱性が発見された際に迅速に対応できます。
依存関係の定期監査
# npm
npm audit
# yarn
yarn audit
# Python
pip-audit
# 汎用ツール
trivy fs .
snyk test
2. 依存関係のロックとピン留め
パッケージのロック
# package-lock.json / yarn.lock を必ずコミット
git add package-lock.json
git commit -m "Lock dependencies"
バージョンの固定
{
"dependencies": {
"lodash": "4.17.21",
"express": "4.18.2"
}
}
キャレット(^)やチルダ(~)を避け、正確なバージョンを指定。
3. パッケージの信頼性評価
新しいパッケージを導入する前に確認すべき項目:
| 確認項目 | 説明 |
|---|---|
| ダウンロード数 | 極端に少ない場合は注意 |
| メンテナンス状況 | 最終更新日、Issue対応状況 |
| 依存関係の数 | 過度に多い場合はリスク増 |
| ソースコードの確認 | 不審なコードがないか |
| 組織の信頼性 | 既知の開発者・組織か |
# npmパッケージの情報確認
npm info lodash
# パッケージの評価ツール
npx socket security npm:lodash
4. ビルド環境のセキュリティ強化
CI/CDパイプラインの保護
# GitHub Actionsの例
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read # 最小権限
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
# 依存関係の検証
- name: Verify dependencies
run: npm ci --ignore-scripts
# 脆弱性スキャン
- name: Security audit
run: npm audit --audit-level=high
再現可能なビルド
同じソースコードから常に同じバイナリが生成されることを保証:
# マルチステージビルドで環境を固定
FROM node:20.10.0-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --ignore-scripts
COPY . .
RUN npm run build
5. 署名と検証
パッケージ署名の確認
# npm provenance(来歴)の確認
npm audit signatures
# Sigstore による署名検証
cosign verify-blob --signature file.sig file
コミット署名
# GPG署名付きコミット
git commit -S -m "Signed commit"
# 署名の検証
git verify-commit HEAD
6. 最小権限の原則
# npmスクリプトの自動実行を無効化
npm config set ignore-scripts true
# 特定のパッケージのみスクリプト許可
npx --yes allow-scripts
7. ネットワークセグメンテーション
ビルド環境からのアウトバウンド通信を制限:
# 許可するドメインのみ通信を許可
allowed_domains:
- registry.npmjs.org
- github.com
- *.githubusercontent.com
チェックリスト
日常的な対策
-
npm audit/yarn auditを定期実行している - package-lock.json をバージョン管理している
- 新しいパッケージ導入時にセキュリティ評価を行っている
- 依存関係の自動更新ツール(Dependabot等)を使用している
組織的な対策
- SBOMを生成・管理している
- プライベートパッケージリポジトリを使用している
- CI/CDパイプラインのセキュリティレビューを実施している
- インシデント対応計画にサプライチェーン攻撃を含めている
高度な対策
- 再現可能なビルドを実装している
- パッケージの署名検証を行っている
- ビルド環境のネットワークを分離している
- サードパーティコードのセキュリティレビューを実施している
まとめ
サプライチェーン攻撃は、現代のソフトウェア開発において避けられないリスクです。
| 対策レベル | 内容 |
|---|---|
| 基本 | 依存関係の監査、ロックファイルの管理 |
| 中級 | SBOM作成、CI/CDセキュリティ強化 |
| 上級 | 再現可能ビルド、署名検証、ネットワーク分離 |
完全な防御は困難ですが、以下の原則を守ることでリスクを大幅に軽減できます:
- 可視化: 何を使っているか把握する
- 検証: 信頼できるものか確認する
- 最小化: 不要な依存関係を減らす
- 監視: 継続的に脆弱性をチェックする
- 準備: 侵害された場合の対応計画を持つ
RiskLensでは、お使いのドメインやWebアプリケーションのセキュリティ状態を診断できます。サプライチェーンリスクを含む包括的なセキュリティチェックをお試しください。