最終更新:

サプライチェーン攻撃の仕組み — アプリに届くまでの経路を守る


アプリが届くまでに、どこを守る?

📦 外部部品 + 自分のソース使う版と入手先を確認⚙ ビルドする工程📬 配布 → 利用者⚠ 各段階が攻撃の入口に
部品だけでなく作成・配布の経路も確認します。署名やハッシュ、SBOMなどは、それぞれ役割と確認できる範囲が異なります。
✅ このガイドで学べること
  • 身近な例から役割をつかむ
  • 確認できる結果と成立条件を区別する
  • 次の学習や導入判断につなげる
ひよこ ひよこ
自分のコードが正しくても、攻撃されるの?
ペンギン先生 ペンギン先生
外から使うライブラリや、アプリを作って配る経路が狙われることがあるよ。お店なら食材だけでなく、仕入れや配送も確認するようなイメージだね。
ひよこ ひよこ
アップデートすると必ず感染するの?
ペンギン先生 ペンギン先生
そういう意味ではないよ。悪意ある内容が配布されても、実行や悪用には環境や条件が関係するんだ。安全のために更新を全部止めると、既知の弱点を残すことにもなるよ。
ひよこ ひよこ
どこに悪いものが入るの?
ペンギン先生 ペンギン先生
保守アカウント、ソース、依存パッケージ、ビルド環境、配布先などが入口になり得るよ。自分のコードだけ見ても、届くまでの経路全体は分からないんだ。
ひよこ ひよこ
普通の脆弱性と同じ?
ペンギン先生 ペンギン先生
区別しよう。正規のライブラリにある弱点を悪用することと、供給経路へ意図的に不正な内容を入れることは違うよ。両方への対策が必要だけど、事例を混同しないようにしよう。
ひよこ ひよこ
lockファイルがあれば安心?
ペンギン先生 ペンギン先生
選ぶ版や配布物をそろえる助けにはなるけど、固定した内容が安全だという証明ではないよ。確認した版へ更新する手順とセットで使おう。
ひよこ ひよこ
署名が正しければ悪意もない?
ペンギン先生 ペンギン先生
署名は誰の鍵やIDで署名されたか、内容が変わっていないかを確認する手掛かりだよ。期待した提供元と照合する必要があり、署名済みでも不正な内容がない保証にはならないんだ。
ひよこ ひよこ
SBOMや来歴は何に使うの?
ペンギン先生 ペンギン先生
SBOMは主に何が入っているかを追う材料、来歴は何から・どんな工程で作られたかを追う材料だよ。受け取った記録を検証し、弱点の影響調査や判断へつなげよう。
ひよこ ひよこ
どう覚えよう?
ペンギン先生 ペンギン先生
「サプライチェーン攻撃」って出てきたら「ソフトウェアが作られ届く経路を狙う攻撃」と思えばだいたいOK!どこから来て、どう作られたかも確認しよう。

自分のアプリに届くまでをたどる

小さな商品アプリでも、外部のライブラリ、ビルドツール、CI、配布先などを使うことがあります。サプライチェーン攻撃は、こうしたソフトウェアの供給経路を悪用する攻撃です。

例えば、依存ライブラリの保守アカウントが乗っ取られ、不正な版が公開される場合があります。別の入口として、ビルド環境を改変し、読んだソースとは違う成果物を配ることも考えられます。どの環境で何が実行されるかによって影響は変わります。

弱点の悪用と、供給経路への不正混入を分ける

正規のライブラリにある脆弱性が攻撃されることと、攻撃者が配布物へ意図的に不正コードを入れることは同じではありません。ライブラリを使った事件を全てサプライチェーン攻撃と呼ぶと、確認すべき場所を見誤ります。

2024年のXZ Utilsでは、公式の説明によると5.6.0と5.6.1のリリースtarballにバックドアが含まれていました。それらは署名されてもいました。「署名されている」「有名なプロジェクト」という理由だけで内容の安全まで保証できない例です。全てのXZの版や、使った全端末が同じ被害を受けたという意味ではありません。

対策の役割を分けて考える

材料・対策役立つことそれだけでは分からないこと
lockファイル・版の固定選ぶ依存をそろえるその版に不正や弱点がないか
ハッシュ承認した値と内容が一致するか承認前の内容が安全か
署名・IDの照合期待した提供者の署名か署名者や工程が侵害されていないか
SBOM含まれる部品を追う全部品の安全性
来歴(provenance)元のソースやビルド工程を追う全ての不正や設計上の弱点

比較するハッシュや署名者の情報自体も、信頼できる経路で入手する必要があります。攻撃者の配布ページにあるハッシュへ合わせただけでは確認になりません。署名や来歴も、期待するIDや方針へ照合して使います。

初心者が最初に確認する5つ

  1. 入手先:公式の案内からパッケージ名・提供元・リポジトリを確認する。似た名前にも注意する。
  2. 変更内容:依存の追加・更新で、lockファイルがどう変わったかを見る。
  3. 必要な権限:テスト用CIへ公開鍵・クラウドの書き込み権限などを不用意に渡さない。
  4. 記録:使った版、構成、確認した情報を残し、問題発生時に影響を調べられるようにする。
  5. 更新手順:新しい版の確認、テスト、復旧の手順を用意する。古い版を永久に固定しない。

npm ciはlockファイルと設定の整合を使い、食い違えば失敗しますが、悪意を判定する機能ではありません。Pythonのpip freezeは版の一覧を作る操作で、配布物のハッシュ検証を自動的に有効化するものではありません。pipでは--require-hashesなどを使う別の設定が必要です。

CIの部品にも更新と権限の方針を

GitHub Actionsのactionは、提供元を確認した完全なコミットSHAへ固定することで、タグが指す内容の変更を避けられます。それでも固定したコードの安全性は別の問題です。権限を絞り、信頼できないpull requestのコードがSecretsや公開権限を使わないよう、実行条件を確認します。

SLSAは、ソースやビルドの完全性に関わる脅威・対策を整理しています。全てのソフトウェアの弱点をなくす規格ではありません。まずはGitHub Actions入門の権限を絞ったテストから、使う部品と経路を見えるようにしてみましょう。

参考資料