Skip to content
Latchkey

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 がそれを限定する。

関連ガイド