公開Issueへの投稿だけで非公開リポジトリの中身が漏れる

Noma Labsが発見した「GitLost」は、GitHubが提供する自動化機能「GitHub Agentic Workflows」に存在する脆弱性です。GitHub Agentic Workflowsは、GitHub Actions(イベント駆動の自動化基盤)とClaudeまたはGitHub Copilotを搭載したAIエージェントを組み合わせ、Markdownで書かれたワークフローをエージェントが自律的に実行する仕組みです(出典)。

研究チームが検証した脆弱なワークフローは、次のように構成されていました。

  • Issueがアサインされたタイミングで起動する
  • Issueのタイトル・本文を読み取る
  • コメントとして返信を投稿する
  • 組織内の他リポジトリ(公開・非公開問わず)への読み取り権限を持つ

攻撃者は「営業担当者からの顧客対応メールに見せかけたIssue」を公開リポジトリに投稿するだけで、非公開リポジトリのREADMEを公開コメントとして引き出すことに成功した。

攻撃に必要なのは「もっともらしい文面」だけ

この攻撃は典型的な間接プロンプトインジェクションに分類されます。攻撃者はIssue本文に自然な英語で悪意ある指示を紛れ込ませるだけで、エージェントは本来信頼すべきでない入力を指示として実行してしまいます。The Registerの報道によれば、攻撃に必要なのはコーディングスキルもアクセス権限も認証情報も一切不要で、「組織のGitHub Agentic Workflowsを利用している公開リポジトリにIssueを立てて待つだけ」だったといいます(出典)。

Noma Labsの研究チームは、GitHub側に一定のガードレールが存在していたことも確認していますが、キーワードを変えるなどの手法でこれを回避できてしまったと報告しています。

これはかなり衝撃的な内容です。AIエージェントに「信頼できない入力」と「システムからの指示」を区別させる設計がいかに難しいかを、あらためて突きつけられた事例だと感じます。

エージェント権限の設計が問われる局面に

今回の脆弱性が示すのは、AIエージェントに複数リポジトリへの読み取り権限を与える際、信頼境界をどう設計するかという根本的な課題です。

  • Issue本文やコメントなど、外部から自由に書き込める情報は「信頼できないデータ」として扱う必要がある
  • エージェントに与える権限は、必要最小限のリポジトリ・操作に絞り込む
  • 出力(コメント投稿など)が意図しない情報を含んでいないか、実行前にチェックする仕組みが望ましい

GitHub CopilotやClaudeベースのエージェントを業務ワークフローに組み込む開発者・組織が増えている中、こうしたプロンプトインジェクション対策は今後ますます重要になりそうです。自分のプロダクトでも同種の自動化を検討する際は、権限範囲を最初から絞り込む設計を意識したいと思います。