pipeline poisoning とは? build そのものを改ざんする
pipeline poisoning とは、CI/CD pipeline に攻撃者が制御するコードを実行させ、信頼された build を攻撃者の道具に変えるあらゆる攻撃です。
あなたの pipeline は信頼されています。シークレットを保持し、リリースに署名し、本番に deploy します。pipeline poisoning は、攻撃者が制御する命令を build に忍び込ませることで、その信頼を転覆させます。pipeline がそれらを実行すると、攻撃者は pipeline ができるすべてを引き継ぎます。これは現代のソフトウェアデリバリーにおいて最もレバレッジの高い攻撃の 1 つです。
どこから毒が入るか
- pull request 内で改変された workflow または pipeline 定義。
- build 中に引き込まれた悪意ある依存関係。
- 侵害されたサードパーティ action または共有ライブラリ。
- 改ざんされた build スクリプトまたは Makefile。
直接的 poisoning と間接的 poisoning
直接的 poisoning は pipeline 定義そのものを編集します。間接的 poisoning は pipeline には手を付けず、それが実行するもの - 依存関係、スクリプト、ツール - を破損させます。間接的な攻撃は、pipeline ファイルが手つかずに見えるため、より巧妙です。
pull request の観点
特に危険な変種は、コントリビューターの変更をレビュー前にフルのシークレットとともに実行するものです。攻撃者は、認証情報を盗んだり backdoor を注入したりするよう build を改変する PR を提出し、pipeline は素直にそれを実行します。これが poisoned pipeline execution のパターンです。
pipeline を防御する
pipeline の変更にレビューを必須とし、信頼できない PR をシークレットなしで実行し、依存関係や action を正確なバージョンまたは digest に固定し、poison された実行ができることを減らすよう最小権限を適用します。pipeline 定義を、同じ管理下にある本番コードとして扱ってください。
poison された実行を封じ込める
poison されたジョブであっても閉じ込めるべきです。isolation された ephemeral なランナーは、侵害された build が他のジョブに触れたりホスト上に残ったりするのを防ぎ、egress フィルタリングは外部への通信を防ぎます。被害範囲は、1 つの使い捨て環境の中に留まります。
重要なポイント
- pipeline poisoning は、信頼された CI/CD pipeline に攻撃者が制御するコードを実行させる。
- 直接的(pipeline を編集)にも間接的(pipeline が実行するものを破損)にもなりうる。
- レビュー、依存関係の固定、最小権限、isolation が中核的な防御である。