CI における認証情報の exfiltration とは? build から盗まれるシークレット
CI における認証情報の exfiltration とは、悪意ある step や依存関係が build で利用可能なシークレットを読み取り、攻撃者に送り出すことです。
CI ジョブはしばしば環境内に強力なシークレット - deploy キー、クラウド認証情報、registry トークン - を持ちます。認証情報の exfiltration は、実行中のジョブの内側からそれらのシークレットを盗む行為であり、通常は攻撃者があなたを騙して実行させたコードを介します。ジョブが正当にシークレットを保持しているため、その盗みは通常のアクティビティに見えることがあります。
exfiltration がどう起こるか
- 悪意ある依存関係が、env var を読み取る post-install スクリプトを実行する。
- poison された pull request が、シークレットを出力または送信するよう pipeline を改変する。
- 侵害された action が、アクセス権を持つトークンを exfiltrate する。
- build ツールが、環境を攻撃者の URL にアップロードするよう騙される。
なぜ気づきにくいか
悪意あるコードは本物の build と同じ権限で実行されます。数百バイトを外部ホストに送ることは、通常のネットワークトラフィックに紛れ込みます。特に、すでに多くの registry やサービスと通信している pipeline ではそうです。
pull request のリスク
信頼できない pull request でシークレットとともに実行される workflow は、典型的な exfiltration の経路です。外部のコントリビューターが、secrets を攻撃者のエンドポイントに吐き出す step を追加する PR を提出します。fork の PR でシークレットアクセスを制限すれば、この扉が閉じられます。
有効な防御
最小権限のトークンは、盗まれたシークレットができることを減らします。ジョブごとの ephemeral な認証情報は、有用になる前に失効します。egress フィルタリングは、build が未知の宛先に到達するのをブロックします。依存関係や action を正確なバージョンに固定すれば、予期しない更新の経路が排除されます。
backstop としての isolation
共有ランナーでは、exfiltrate されたシークレットに、そのホストが見た他のあらゆるものが加わりえます。isolation された ephemeral なランナー(Latchkey のマネージドランナーなど)は各ジョブを自身の環境に閉じ込め、その後破棄するため、攻撃者がジョブ間で収集できる共有状態がありません。
重要なポイント
- exfiltration は、ジョブ内で実行されるコードによる build のシークレットの窃取である。
- 悪意ある依存関係と poison された PR が主な経路である。
- 最小権限、ephemeral な認証情報、egress フィルタリング、isolation がそれを限定する。