サプライチェーン攻撃

1か所の汚染が install を通じて下流へ連鎖する仕組みと、多層防御で止める勘所

この記事の要約

サプライチェーン攻撃は、あなたが使う部品の供給元に毒を仕込み、install を通じて下流へ広げる手口です。一番効く防御は、公開直後の最新版にすぐ飛びつかないことです。

  • 毒は install した瞬間に動き、間接依存にも潜む
  • 防御はクールダウン・固定とハッシュ・最小権限の三段構え

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

いまどきのソフトウェアは、直接・間接あわせて何百もの『借り物』の部品(ライブラリ)で組み上がっています。攻撃者は守りの堅いあなたを正面から狙わず、必ず使う部品の供給元に毒を仕込みます。上流を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つの関所を通過)

いちばん効く関所は『すぐ入れない』こと。

いちばん効くのは『すぐ入れない』

毒入りバージョンの多くは公開直後に発見・撤回されます。数日〜1週間寝かせてから取り込む『クールダウン』だけで、典型的な攻撃の多くをかわせます。このサイトのチームも、各自のPCに標準設定として入れています。

押さえておきたい用語

サプライチェーン攻撃
使う部品やツールの『供給元』を汚し、下流の利用者まで一度に攻撃する手口。1か所の汚染が広く連鎖する。
依存(直接 / 間接)
アプリに必要な部品のこと。自分で入れた直接依存と、その部品が使う間接依存があり、毒は間接依存に潜みやすい。
レジストリ(npm / PyPI)
ライブラリを公開・配布する倉庫。誰でも公開・取得できる手軽さの裏返しで、汚染の通り道にもなる。
クールダウン
公開されたてのバージョンをすぐ入れず、数日〜1週間寝かせてから採用する運用。待つだけで多くの攻撃をかわせる。
ロックファイル / 整合性ハッシュ
部品のバージョンと中身の指紋(ハッシュ)を記録する仕組み。同じ番号での中身すり替え・改ざんを検出できる。
最小権限 / 隔離ビルド
install / build を、権限とネットワークを絞った隔離環境で動かすこと。毒が動いても被害を小さく抑える。

ここから先へ

この解説とつながりのあるページ