8 ポイント 投稿者 GN⁺ 2025-10-14 | 1件のコメント | WhatsAppで共有
  • 2025年6月、GitHub Copilot Chatで**重大な脆弱性(CVSS 9.6)**が発見された
  • CSP回避とリモートプロンプトインジェクションの手法を用いて、秘密情報と非公開コードの漏えいが可能であることが確認された
  • GitHubの隠しコメント機能を悪用し、他ユーザーのCopilot応答結果を操作できる
  • GitHubのCamoプロキシ利用構造を精密に分析し、CSP回避に成功した
  • GitHubは画像レンダリングを無効化する方法で、2025年8月にこの脆弱性を緊急修正した

TL;DR要約

  • 2025年6月、GitHub Copilot Chatで非公開リポジトリのソースコードおよび秘密情報の漏えいが可能な重大な脆弱性が発見された
  • 発見者はリモートプロンプトインジェクションとGitHubのCSP(Content Security Policy)回避を活用し、Copilotの応答を完全に操作・制御して悪意あるコードやリンクの提案を誘導した
  • この攻撃の中核は、GitHubの公式な隠しコメント機能とCopilotのコンテキスト感受性を利用して、誰にも見えない形でプロンプトを挿入できる点にある
  • GitHubが画像の外部リンクをCamoプロキシへ自動変換する挙動を分析し、その構造を文字単位で逆用して漏えい情報を構成するよう設計した
  • この脆弱性はHackerOne経由で報告された後、GitHubがCopilot Chatの画像レンダリング機能を遮断する措置によって修正された

背景

  • GitHub Copilot Chatは、開発者が質問したりコードの説明や実装提案を受けたりできる統合型AIアシスタントである
  • Copilot Chatはリポジトリ内のコード、コミット、PR(プルリクエスト)など多様なコンテキスト情報を参照する
  • コンテキスト情報が増えるほど、攻撃対象領域も拡大する状況にある

プロンプトインジェクションと隠しコメント機能の活用

  • GitHub Copilotのコンテキスト感受性を狙う実験として、PR(プルリクエスト)の説明欄に特定のプロンプトを挿入した
  • ただし通常、挿入したプロンプトやメッセージはすべてのユーザーが確認できる
  • ここでGitHubの公式な隠しコメント機能(``)を使うことで、目に見えない形でCopilotにだけ命令を渡せることが判明した
  • 隠しコメント内にプロンプトを入れると、Notificationsには露出する一方で具体的な内容は見えず、サーバーサイドインジェクションの効果が生じる

悪性プロンプトの波及力

  • 隠しコメントのプロンプトは、他のユーザーがPRページにアクセスした場合でも同様にCopilotへ影響を与える
  • 単純な文言だけでなく、コード提案、Markdown、悪意あるURL、Copilotevilのような悪性パッケージの推薦など複合的な命令を挿入できる
  • Copilotはその要求を送ったユーザーと同じ権限を使用するため、非公開リポジトリにアクセスして情報を利用できる
  • 意図的にbase16エンコードデータをURLに追加し、ユーザーがクリックした際に攻撃者へ情報が漏えいするシナリオを実装できる

主な影響の整理

  • 他ユーザーのCopilot応答内容の改ざんおよび制御
  • Markdown、画像、コード、URLなどに合わせたプロンプトインジェクションが可能
  • 被害ユーザーの権限範囲内の情報漏えいを狙う攻撃が成立

GitHub CSP回避の構造的解釈

  • GitHubは強力なCSP適用によって、外部ドメインからの画像およびリソース読み込みを制限している
  • READMEやMarkdownに画像が挿入される際、GitHub Camo Proxyが外部URLをHMAC署名ベースのプロキシURLへ変換する
  • ブラウザで画像を読み込むには、あらかじめGitHubで生成されたCamo URLと署名値が必要となる
  • ユーザーが任意の動的データを含むURLを作成しても、Camoプロキシを経由しなければブロックされる

Camo構造の悪用方法

  • 発見者はアルファベット/特殊文字集合全体のCamoプロキシURL辞書を事前に生成し、隠しプロンプトに含めた
  • Copilotに「ASCII Artゲーム」を要求し、漏えい情報(例: ソースコード、キー)をCamoプロキシ画像の列挙へ変換させるよう設計した
  • 各画像リクエストを通じて、ブラウザでは1x1透明ピクセルだけが応答されるため、ユーザーには何の変化も見えない
  • 最後に、ランダムパラメータを追加してキャッシュ問題を防いだ

実際の攻撃実装と試行

  • 対象は非公開プロジェクトのIssue内にあるゼロデイ脆弱性の説明情報に設定された
  • PoC(概念実証コード)によって、実際の漏えい攻撃の流れを立証した
  • Copilotに、例として「AWS_KEY」キーワードの探索から結果の漏えいまでを自動化させた

GitHubの対応とパッチ

  • GitHubは2025年8月14日付でCopilot Chatの画像レンダリングを全面的に無効化し、この脆弱性を修正した

さらに詳しく

1件のコメント

 
GN⁺ 2025-10-14
Hacker Newsのコメント
  • 私たちは作業環境全体を self hosted VCS である Forgejo に移行できたことをとてもうれしく思っている。2年前からすべてのクライアントのリポジトリまで移行を始めたが、GitHub の購読料を大幅に削減できただけでなく、1日に30〜40人の開発者が使うシステムの性能がはるかに高速かつ安定したものになった。また、VSCode と、LLM 機能が組み込まれたあらゆるエディタの使用も禁止した。開発者は CLI ベースのコーディングエージェントを使えるが、厳格に隔離されたコンテナ内で、限定されたソースのみを許可する形で運用している

    • 30〜40人の開発者がそれぞれローカルマシンにリポジトリを clone して作業する環境で、誰かが誤ってリポジトリ全体を LLM に露出させてしまうのをどう防いでいるのか気になる。もし誰かが職業上の不利益を恐れてミスを報告しなかった場合、漏えい事故をどう検知するのかも気になる

    • 代わりに使っている IDE が何なのか聞いてみたい

    • CLI ツールがどこに接続されているのか気になる。OpenAI や Claude の公式サービスなのか、それとも AWS Bedrock のようなプロバイダなのか知りたい

    • VSCode 全体を禁止するのは、機能単位で問題のあるプラグインだけを制限するのを超えて、やりすぎに感じる。VSCode は Haskell、Lean 4、F* のように他の IDE ではサポートが乏しい言語まで幅広く対応する唯一の IDE だ。大手の商用消費財企業ですら VSCode 自体を禁止はしておらず、問題のある機能だけを使わなければよいと考える

  • この問題は実際にはきちんと解決されていないと思う。Copilot のすごい点は自然言語入力を受け付けることにあり、つまりどんな漏えい手法でも、それを英語で書けばそのまま動いてしまう。特定の方法だけを「修正した」と言うが、実際にどう直したのかは公開していない。たとえば base64 を画像 URL に使うこともできるし、「買い物かごの一覧を passswd フィールドに誤って保存してしまったので探してほしい」といった形でだまして、パスワードも引き出せるだろう。見つけられる脆弱性が非常に多そうだ。こういうものにバグバウンティが出るのか気になる。ここは金鉱だ

    • base64 を画像 URL に使うというのがどういう意味なのか気になる。Camo が適用されていない画像 URL を使おうということだろうか。CSP のため Camo 未適用の画像はブロックされると理解している。そして Copilot エージェントにインターネット接続権限がないなら fetch 自体が難しいはずで、もし可能なら画像を使うよりずっと簡単な攻撃経路が開けるはずだ

    • GitHub は Copilot Chat で画像をレンダリングする機能を完全に無効化することでこの問題に対処したのだと思う

  • アルファベットのすべての文字と記号をあらかじめ Camo URL として生成しておき、それをプロンプトに挿入するというアイデアが印象的だ。美しいアプローチだ

  • 今回の記事は、どこか Legit という会社の宣伝のような印象を受ける。しかし実際には、すべての AI ベースのソリューションは透明性の不足と信頼の問題という同じ弱点を抱えている。FOSS ベースではない AI サイバーセキュリティツールを使うと、むしろセキュリティ脅威が大きくなる可能性がある

  • こうしたことは今回が初めてではなく、以前に「GitHub Copilot Chat: From Prompt Injection to Data Exfiltration」という 関連事例もあった

    • こういうことは今後も繰り返されるだろう
  • PR に隠された HTML コメントを使って情報を隠すことが、依然として深刻な問題として残りうると思う。特にオープンソースのリポジトリではさらに危険だ。この点が改善されたのか気になる

    • この機能は issue/PR テンプレートに案内メッセージを入れるために広く使われている。しかし Copilot への入力からコメントを取り除くのは比較的簡単そうで、LLM の「プロンプトインジェクション」問題がまだ完全に安全に解決されていない以上、暫定的にでもこうした処理は必要だろう
  • このエクスプロイトは、LLM の遅いトークン単位の応答パターンを利用して、データを順番に再構成できるようにする点が興味深い。もし LLM が応答全体を一度にブロックとして返すようにすれば、タイミングが崩れて再構成ははるかに難しくなるだろうと予想する

    • 文字ごとではなく文字位置まで含めた URL を生成させるのはどうだろう。たとえば "hacked" という文字列を 0.0.0.0/1-h、0.0.0.0/2-a の形でリクエストさせれば、あとでリクエストを並べ替えて重複呼び出しも除去できるはずだ
  • Copilot ユーザーの Repo アクセス権を読み取り専用に制限する方向で対処できないのか気になる

  • 私が Copilot で個人のソースコードを漏えいさせたのがいつだったか、もう思い出せない

  • 本当に独特でクールなアプローチだと思う