開発・設計者向け / 第9章 サプライチェーン攻撃

ページ 2 / 5

第9章セキュリティ

約4分で読む

サプライチェーン攻撃

「公開されている部品なら、そのまま使っても安全?」

取り込む部品に危険が混ざる場合と、採用前・実行時にできる対策を見てみましょう。

  1. 01リスク

    新しい部品が届いた

    由来と版を確認

    公開された部品にも、悪意ある処理が混ざるおそれがあるんだ。

  2. 02対策

    採用前に確かめる

    待機も一層の対策

    すぐには入れず、由来や変更内容を確認する時間を取ろう。

  3. 03効果

    怪しい版を避ける

    取り込む前の確認

    採用前に異常が見つかれば、その版を取り込まずに済むね。

  4. 04残る注意

    待つだけでは分からない

    取り込み後にも備える

    待っても安全とは限らない。実行時の権限や隔離も必要だね。

この章の合言葉

部品は採用前に確かめ、実行時の権限も絞る。

※クールダウンは新しい版の採用を一定期間待つ運用です。安全を保証するものではなく、緊急修正の例外手順も必要です。

読みはじめる

なぜ「使っている部品」が狙われるのか

いまどきのソフトウェアは、直接・間接あわせて何百もの『借り物』の部品(ライブラリ)で組み上がっています。攻撃者は守りの堅いあなたを正面から狙わず、必ず使う部品の供給元に毒を仕込みます。上流を1か所汚せば、下流の何千ものプロジェクトへ一度に広がるからです。

サプライチェーン攻撃の広がり方

アカウント乗っ取り / 悪意ある貢献上流に侵入毒入りの新バージョンを公開毒入りを公開「最新版」として配信可能に最新版になる依存を追加 / 更新(install)取り込む毒入りバージョンを取得毒が届くインストール時スクリプトが自動実行毒が動く認証情報・トークンを外部送信秘密を盗むビルド成果物に毒が混入製品に混ざる製品として配布される下流へ拡散
攻撃者毒を仕込む人
OSSパッケージメンテナ / 上流
レジストリnpm / PyPI など
あなたの開発・CIinstall / build
利用者・本番配布先

各ステップ・参加者・分岐をクリックすると、その仕組みの説明がここに表示されます。

この図をテキストで読む

シーケンス図「サプライチェーン攻撃の広がり方」。参加者5人、ステップ9個。 【参加者】(左から右) - 攻撃者: 毒を仕込む人 - OSSパッケージ: メンテナ / 上流 - レジストリ: npm / PyPI など - あなたの開発・CI: install / build - 利用者・本番: 配布先 【流れ】(上から下へ) ── ① 仕込み(上流をひそかに汚す) ── 1. 攻撃者 → OSSパッケージ: アカウント乗っ取り / 悪意ある貢献 2. OSSパッケージ → レジストリ: 毒入りの新バージョンを公開 3. レジストリ(自身で処理): 「最新版」として配信可能に ── ② 取り込み〜拡散(あなた経由で下流へ) ── 4. あなたの開発・CI → レジストリ: 依存を追加 / 更新(install) 5. レジストリ → あなたの開発・CI: 毒入りバージョンを取得(応答) 6. あなたの開発・CI(自身で処理): インストール時スクリプトが自動実行 7. あなたの開発・CI → 攻撃者: 認証情報・トークンを外部送信 8. あなたの開発・CI(自身で処理): ビルド成果物に毒が混入 9. あなたの開発・CI → 利用者・本番: 製品として配布される

1つの毒入り更新が、ドミノ式に下流へ流れます。

どこで食い止めるか ── 多層防御の関所

数日経過公開直後一致不一致・改ざん隔離OK権限過大
持ち込み依存の更新
関所3つの防御
受け入れ安全に採用
取り込みあなた ⁠/ CI
防御ゲート3つの関所
結果止める ⁠/ 安全に取り込む
依存を追加 ⁠/ 更新
公開から数日たっている⁠?① クールダウン
保留⁠:数日待って再確認公開直後は受け入れない
固定したバージョン⁠・ハッシュと一致⁠?② 固定⁠・整合性
ビルドは最小権限⁠・隔離されている⁠?③ 最小権限⁠・隔離
取り込みを中止改ざん⁠・権限過大を検知
安全に取り込む ⁠/ ビルド3つの関所を通過
  • 焦点

各工程・分岐・レーンをクリックすると、その仕組みの説明がここに表示されます。

この図をテキストで読む

業務フロー図「どこで食い止めるか(多層防御の関所)」。レーン3本、工程7個。 【レーン(担当)】(左から右) - 取り込み: あなた / CI - 防御ゲート: 3つの関所 - 結果: 止める / 安全に取り込む 【図の符号】色つきの工程=焦点 【工程】(上から下へ。担当 → 工程名) ── フェーズ: 持ち込み(依存の更新) ── 1. 取り込み: 依存を追加 / 更新〔開始・終了〕 ── フェーズ: 関所(3つの防御) ── 2. 防御ゲート: 公開から数日たっている?〔分岐〕(① クールダウン) 数日経過 → 固定したバージョン・ハッシュと一致? 公開直後 → 保留:数日待って再確認 3. 結果: 保留:数日待って再確認〔開始・終了〕(公開直後は受け入れない) 4. 防御ゲート: 固定したバージョン・ハッシュと一致?〔分岐〕(② 固定・整合性) 一致 → ビルドは最小権限・隔離されている? 不一致・改ざん → 取り込みを中止 5. 結果: 取り込みを中止〔開始・終了〕(改ざん・権限過大を検知) 6. 防御ゲート: ビルドは最小権限・隔離されている?〔分岐〕(③ 最小権限・隔離) 隔離OK → 安全に取り込む / ビルド 権限過大 → 取り込みを中止 ── フェーズ: 受け入れ(安全に採用) ── 7. 取り込み: 安全に取り込む / ビルド〔開始・終了〕(3つの関所を通過)

待ち時間・由来・実行制御・最小権限を組み合わせます。

いつものビルドで、中身が変わる?

昨日と同じコードを用意したのに、今日のインストールで別のライブラリが入ると、差を追いにくくなります。ロックファイルは、実際に選んだ依存関係の版を記録するものです。Gitで管理し、開発とCIでその内容に従ってインストールすることで、意図しない版の変化を抑えます。

更新するときは、ロックファイルの差分も確認します。公開直後の版を一定時間待つクールダウンは、その間に発見された攻撃を避ける一層の対策になります。pnpm等のインストール時のスクリプト制限も組み合わせます。

一方、緊急の脆弱性修正まで機械的に待つと危険が残ります。採用する版と理由を限定した例外を設け、確認して更新できるようにします。

固定した版が安全とは限らない

ロックファイルは依存関係を再現するための記録です。悪意のある版や脆弱な版を固定してしまう可能性は残ります。

押さえておきたい用語

サプライチェーン攻撃
使う部品やツールの『供給元』を汚し、下流の利用者まで一度に攻撃する手口。1か所の汚染が広く連鎖する。
依存(直接 / 間接)
アプリに必要な部品のこと。自分で入れた直接依存と、その部品が使う間接依存があり、毒は間接依存に潜みやすい。
レジストリ(npm / PyPI)
ライブラリを公開・配布する倉庫。誰でも公開・取得できる手軽さの裏返しで、汚染の通り道にもなる。
クールダウン
新しい版の採用を一定時間待つ運用。発見済みの不正な版を避けやすくするが、安全の保証ではなく緊急修正の例外も必要。
ロックファイル / 整合性ハッシュ
版と内容の同一性を確認する仕組み。記録した内容と一致することを示すが、その内容が無害とは保証しない。
最小権限 / 隔離ビルド
install / build を、権限とネットワークを絞った隔離環境で動かすこと。毒が動いても被害を小さく抑える。
ページ 2 / 5