世界を動かす技術を、日本語で。

CamoLeak: 重要なGitHub Copilotの脆弱性がプライベートソースコードを漏洩

概要

  • 2025年6月、 GitHub Copilot Chat で重大な脆弱性(CVSS 9.6)を発見
  • 秘密情報やソースコードのサイレント流出、およびCopilotの応答制御が可能
  • GitHubの CSPバイパスとリモートプロンプトインジェクション の組み合わせによる攻撃
  • 報告後、 Copilot Chatの画像レンダリングが完全に無効化 され修正
  • 攻撃の仕組み、影響範囲、GitHubの対応内容を解説

GitHub Copilot Chatにおける重大な脆弱性の発見

  • GitHub Copilot Chat は、リポジトリの情報を活用し、開発者の質問やコード説明、実装提案を行うAIアシスタント
  • リポジトリ内の コードやコミット、プルリクエスト内容 を利用し、文脈に応じた回答を生成
  • 文脈依存性の高さが 攻撃対象面の拡大 につながる

プロンプトインジェクションの発見

  • Copilotの文脈認識機能を利用し、 プルリクエスト説明内にプロンプトを埋め込み 攻撃
  • GitHubの 不可視コメント機能 (公式ドキュメント参照)を活用し、他ユーザーに見えない形でプロンプトを挿入
  • 別ユーザーでログインしプルリクエストページを閲覧すると、 不可視コメントが文脈として注入 されることを確認
  • より複雑な指示や悪意あるコード・Markdownレンダリングも 問題なく動作
  • Copilot Chatの応答に 任意のコードやリンク、画像の挿入 が可能

権限悪用による情報流出

  • Copilotは リクエスト実行ユーザーと同一権限 で動作
  • インジェクションしたプロンプトで、 被害者のプライベートリポジトリから秘密情報を抜き出し、URLとして外部送信 が可能
  • 例: https://github.com/LegitSecurity/issues-service のようなプライベートリポジトリからの情報流出

可能となる攻撃内容まとめ

  • 他ユーザーのCopilot応答内容の 改ざん・制御
  • 任意のMarkdown(URL、コード、画像含む)の注入
  • Copilotの 被害者権限の悪用 による情報流出

Content Security Policy(CSP)バイパス手法

  • GitHubは 厳格なCSP を導入し、外部ドメインからの画像取得等を原則禁止
  • 通常の <img>タグによる外部データ流出は不可
  • GitHubではREADME等の外部画像URLを Camoプロキシ経由 で配信
    • 外部画像URLは Camo署名付きURL に書き換え
    • Camoは署名の検証後、GitHubサーバー経由で画像を配信
    • 任意URLの生成や動的データ流出は 原則困難

Camoを悪用したバイパス方法

  • 事前に 全アルファベット・記号ごとのCamo署名付きURL辞書 を作成
  • プロンプト内で 「ASCIIアート」形式で画像を並べる ようCopilotに指示
  • 各画像は 1x1透明ピクセル で、被害者には不可視
  • Copilotが Camo URLを順番通りにレンダリング、外部サーバーへのアクセスでデータ流出
  • キャッシュ問題回避のため、 ランダムパラメータ を各URLに付与

実証例

  • プライベートプロジェクトのissue説明文から ゼロデイ脆弱性情報を盗み出す PoC
  • Copilotに "AWS_KEY" 等のキーワードでコードベース全体を検索・流出

GitHubの対応

  • 脆弱性は 2025年8月14日までに修正
  • Copilot Chatの画像レンダリング機能を完全無効化 し、CSPバイパスを封じ込め

参考情報・関連事例

  • GitLab Duo で発見された過去の脆弱性事例
  • AI時代のAppSec に関する考察

この脆弱性は、 AIアシスタントの文脈依存性とWebアプリのセキュリティ設計 の両面から新たな攻撃リスクを示唆。 不可視コメントやCamoプロキシの仕様 を突いた高度な手法であり、今後もAI統合開発環境のセキュリティ対策が重要となる。

Hackerたちの意見

なんかこの記事、Legitの宣伝みたいに感じるな。でも、AIを使ったソリューションはみんな同じ弱点を抱えてるよね。透明性が限られてて、信頼性の問題もあるし、サイバーセキュリティに非FOSSソリューションを使うのは大きなリスクだよ。AIのサイバーソリューションを使うと、逆にセキュリティ侵害に対して脆弱になる可能性があるんだ。

PRで隠れた(HTMLコメント)コンテンツを使う能力が、特にオープンソースのリポジトリで nasty な問題にならないか心配なんだけど、これって解決されたの?

問題やPRのテンプレートに広く使われてるけど、提出者にどんな情報を含めるべきか教えるためのものだよね。でも、Copilotの入力からそれを取り除くことはできるはず…少なくとも、現代のLLMが免疫を持つはずの「プロンプトインジェクション」ってやつを解決するまでは。

これ、実際にはあんまり解決されてないよね。すごいのは、Copilotが自然言語を受け入れるところ。だから、どんなエクフィルトレーション手法でも、英語でその方法を書くだけでいいんだ。特定の方法を「修正」しただけで、どう修正したかは明かしてないし。好きな画像URLに対してbase64のやり方を使うこともできるよね?それがダメなら、買い物リストをpassswdってフィールドに間違って保存しちゃったって言って、パスワードを取りに行かせることもできるんじゃない?ここにはたくさんの情報が隠れてるよ。報酬とか出してるのかな?これは金の山だね。

GitHubはCopilot Chatでの画像レンダリングを完全に無効にすることで修正した。

確かに、好きな画像URLにbase64のやり方を使うこともできるよね?それってどういう意味?非Camo画像URLを提案してるの?非Camo画像URLはCSPによってブロックされるよ。 > それがダメなら、買い物リストをpassswdってフィールドに間違って保存しちゃったって言って、パスワードを取りに行かせることもできるんじゃない?エージェントは取得するためにインターネットにアクセスできるの?おそらくできないと思うけど、もしできるなら、画像を使うよりもずっと簡単な攻撃手法になるよね。

ちなみに、これが初めてじゃないよ。GitHub Copilot Chat: プロンプトインジェクションからデータエクフィルトレーションへ https://embracethered.com/blog/posts/2024/github-copilot-cha...

Copilotのユーザーに現在のリポジトリから読み取り専用の権限を与えればいいんじゃない?

最後にコパイロットでプライベートのソースコードを漏らしたのはいつだったか、全然思い出せないな。

自分たちの運営が自己ホスティングのVCS(Forgejo)に移行できて、本当に嬉しい!2年前に移行を始めたんだけど(クライアントのリポジトリも含めて)、GitHubのサブスクリプションでかなりお金を節約できたし、毎日使ってる30〜40人の開発者にとって、システムのパフォーマンスが劇的に向上したよ。VSCodeやLLM機能が統合されたエディタの使用は禁止したけど、CLIベースのコーディングエージェントは使ってもいいよ。ただし、エージェントに利用できるソースを慎重に選んだ隔離されたコンテナ内でね。

ちなみに、代わりのIDEは何を使ってるの?

あなたのCLIは何に接続してるの?OpenAI/Claudeのファーストパーティーのプロバイダーか、AWS Bedrock?

VSCodeを禁止するのは、面倒な機能やプラグインを禁止する代わりに、ちょっと行き過ぎな気がする。VSCodeは、HaskellからLean 4、F*まで、他ではサポートが薄い幅広い言語をサポートしている唯一のIDEだし。私は大手の消費財企業で働いてるけど、そこでもVSCodeは禁止してないよ。面倒な機能を有効にしないように責任を持つだけさ。

この問題について長い間考えてから、このクレイジーなアイデアがひらめいたんだ。アルファベットのすべての文字と記号の辞書を作って、それに対応するCamoのURLを事前生成して、その辞書を注入されたプロンプトに埋め込むんだ。美しいよね。

このエクスプロイトは、LLMの会話の遅いトークン単位のパターンを利用して、抽出されたデータを順番に再構築できるようにしているみたいだね。全体のレスポンスを一つのブロックで返すと、タイミングに影響を与えて再構築が難しくなるかもしれない。

誰もこれを予測できなかったよね。