GitLost: GitHubのAIエージェントにプライベートリポジトリを漏洩させる方法
攻撃者はGitHub Agentic Workflowsのプロンプトインジェクション脆弱性を悪用し、一見無害なIssueを作成してAIエージェントにプライベートリポジトリの内容を読み取らせ、公開コメントとして投稿させることに成功した。この脆弱性は、エージェント型AIシステムにおける根本的な信頼境界の問題を浮き彫りにしている。
GitHubは最近、GitHub Actions(リポジトリイベントに応じてタスクを実行する自動化システム)とClaudeやGitHub CopilotがバックエンドのAIエージェントを組み合わせたGitHub Agentic Workflowsをリリースしました。GitHub Agentic Workflowsにより、チームはプレーンマークダウンでワークフローを記述でき、GitHubエージェントがIssueを読み取り、ツールを呼び出し、自律的に応答します。
セキュリティ開発のバックグラウンドを持つ脆弱性研究者として、このリリース後に最初に頭に浮かんだ疑問は単純で根本的なものでした。「GitHubエージェントが信頼すべきでないものを読み取ったらどうなるのか?」その答えは、典型的な間接プロンプトインジェクション攻撃であり、プライベートデータをインターネット上の誰にでも静かに送信する攻撃です。プロンプトインジェクションは、攻撃者がAIエージェントが読み取るコンテンツ内に悪意のある命令を隠し、エージェントに本来の操作者の意図に反した動作をさせる攻撃手法です。
GitLost脆弱性の根本原因は、エージェント型AIシステムではおなじみのもの、すなわちプロンプトインジェクションです。ほとんどのエージェントプロンプトインジェクション攻撃では、エージェントが誤ったコンテンツを信頼できる命令ソースとして扱い、自身を誤った方向に導かせたり悪用させたりします。これは、システムがシステムレベルのディレクティブと信頼できないユーザーデータの間に厳格な信頼境界を維持できない場合に発生します。この具体的なケースでは、任意の悪意のあるアクターがGitHub Issueを作成し、Issue本文にGitHubエージェントが従う平文のコマンドを隠すことができました。
Noma Labsが発見した脆弱なGitHub Agentic Workflowは以下のように設定されていました:issues.assignedイベントでワークフローをトリガー;Issueのタイトルと本文を読み取り;add-commentツールを使用して応答コメントを投稿;組織内の他のリポジトリ(公開およびプライベート)への読み取りアクセス権を持つ。この脆弱性を悪用するために、攻撃者はコーディングスキル、アクセス権、認証情報を一切必要としませんでした。必要なのは、GitHubのAgentic Workflow設定を使用している組織に属する公開リポジトリでIssueを開き、待つことだけでした。
攻撃の流れは次の通りです:まず、攻撃者は無害に見えるGitHub Issueを作成します。例えば、営業担当副社長が顧客と会った後のもっともらしいリクエストのように見せかけます。次に、GitHubの自動化がIssueを割り当てた後、イベントトリガーのワークフローによってエージェントがREADME.mdの内容を取得します(公開リポジトリpocとプライベートリポジトリtestlocalから)。最後に、GitHubエージェントはそれらを公開リポジトリのIssueに公開コメントとして投稿し、誰でもアクセスして読めるようにしました。
GitHubはこのシナリオを防ぐための制限的なガードレールを設定していましたが、意図したとおりにリポジトリを保護できませんでした。攻撃者がするように、バリエーションを変えて繰り返しテストし、「Additionally」というキーワードを追加することで、モデルの意図しない動作を引き出し、出力を拒否する代わりに再構成させることができました。本質的には、モデルを騙すことで、GitHubのガードレールが意図したとおりに機能せず、データ漏洩を防げないことを確実にしました。
GitLostは、エージェント型AIシステムにおいてすべての組織が直面する基本的なセキュリティ課題を完璧に示しています。エージェントのコンテキストウィンドウは、同時にその攻撃面でもあります。エージェントが読み取るコンテンツ(Issue、プルリクエスト、コメント、ファイルなど)は、エージェントがそのコンテンツを命令入力として扱う場合、武器化される可能性があります。従来のセキュリティモデルは通常、信頼境界がコードによって強制されると想定しています。エージェントシステムでは、信頼境界は部分的にモデルの動作によって強制され、モデルは本質的に命令に従うように設計されています。プロンプトインジェクション攻撃は、エージェント型AIにとって、SQLインジェクションがWebアプリケーションにとってそうであったように、体系的なカテゴリ全体にわたる脆弱性クラスとなり、同じ体系的な戦略と防御を必要としています。
NomaはビルダーとAIセキュリティ責任者に以下を推奨しています:ユーザー制御のコンテンツをAIエージェントへの信頼できる命令入力として決して扱わない;権限を必要最小限にスコープする(特にクロスリポジトリアクセスを持つエージェントは高価値のターゲット);エージェントが公開で投稿できる内容を制限する(特にIssueコンテンツに応答する場合);ユーザー入力をモデルに渡す前に、命令コンテキストからサニタイズまたは分離する。