GitHubは2025年8月25日、公式ブログで、「Visual Studio Code」の「GitHub Copilot Chat」拡張機能のエージェントモードに見つかったセキュリティ脆弱性について解説した。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
GitHubは2025年8月25日(米国時間)に公開したブログ記事で、悪意のあるプロンプトでAI(人工知能)に本来とは違う意図の動作や回答をさせる攻撃「プロンプトインジェクション攻撃」について解説した。
これは「Visual Studio Code」(以下、VS Code)の「GitHub Copilot Chat」(以下、Copilot Chat)拡張機能のセキュリティ評価で3つの脆弱(ぜいじゃく)性が見つかったことに関係している。これらの脆弱性が悪用された場合、VS CodeのCopilot Chat拡張機能である「エージェントモード」において、GitHubのトークンや機密ファイルが漏えいしたり、ユーザーの明示的な同意なしに任意のコードが実行されたりする可能性があった。
なお、既にGitHubはVS Codeの開発チームと共同でこれらの脆弱性に対処している。
同社は、今回見つかった脆弱性を基に、プロンプトインジェクション攻撃の手順や対処方法などについて以下のように解説している。
エージェントモードで注意すべきなのは、プロンプトに含まれる外部データの扱いだ。
例えば、特定の「GitHub Issue」やWeb上で公開されているプルリクエストについて、ユーザーが質問するケースを考えてみよう。
VS Codeの場合、ユーザーからの質問(リクエスト)を大規模言語モデル(LLM)に転送するとともに、ファイルの読み取りやWeb検索などができる各種ツール(以下、LLM用エージェントツール)を使って関連情報を収集し、その結果をLLMに送信する。LLM用エージェントツールは、ファイルの読み取り、編集の生成、任意のシェルコマンドの実行など、多様な機能を利用可能で、MCP(Model Context Protocol)サーバも組み合わせればより複雑なことも実施できる。だが、そこに問題がある。
LLMは一般的に、ユーザーのリクエストを「指示」として解釈し、LLM用エージェントツールからの出力を「データ」として解釈する。もし悪意のある指示がツールの出力に含まれている場合、LLMはそれも正当な指示として解釈し、ユーザーが意図しないアクションを実行する可能性がある。
こうした攻撃への対策として、例えばVS Codeには処理実行前にユーザーへの確認を求める機能が含まれている。ただ、こうしたセキュリティ対策をしていたとしても、それをくぐり抜けて悪意のあるアクションを実行させる方法が見つかったという。
LLM用エージェントツールに「fetch_webpage」がある。これは、任意のWebサイトにHTTPリクエストを送信するツールで、指定したWebサイトの内容を取得できる。対象のWebサイトが「信頼できるWebサイト」のリストにない場合は、ユーザーにリクエストの可否を確認する仕様になっている。デフォルト(初期設定)では、VS Codeは「localhost」と「github.com」「Microsoft.com」など幾つかのドメインを信頼している。
だが、fetch_webpageはWebサイトを検証する際、URLを適切に解析せず、正規表現による比較のみを実施していたことが分かった。そのため、例えば「http://example.com/.github.com/xyz」のようなドメインも安全と見なしていた。
この脆弱性を検証するためGitHubは、ローカルファイルからGitHubのトークンを読み取り、外部ドメインに送信する悪意のあるプロンプトを作成し、GitHub Issueに追加した。
さらにGitHubは、新しく作成されたGitHub Issueの詳細を取得するようCopilot Chatに依頼した。すると「Chat GPT-4o」モデルは、この依頼に応えるのではなく、GitHub Issueの不正な指示に従い、GitHubトークンを読み取って外部サーバに送信した。
VS Codeは、fetch_webpageがアクセスするURLを、信頼できるドメインのリストとは分離して管理することで、この問題に対処した。さらに、リクエストの送信元にかかわらず、未知のURLを取得する際はユーザーに確認を求め、セキュリティに関する注意を喚起することで悪用を防止した。
「Simple Browser」ツールは、VS Codeに組み込まれている簡易的なブラウザ機能だ。ローカルでWebサイトをテストするための機能だが、ユーザーの承認なしで外部Webサイトを読み込めることが分かった。
GitHubはこの脆弱性を検証するため、ローカルファイルからGitHubトークンを読み取り、外部ドメインに送信する悪意のあるプロンプトを作成し、GitHub Issueに追加した。
その後、新しく作成されたIssueの内容を尋ねたところ、「ケース1:URLの不適切な解析によるデータ漏えい」の例と同様に、Copilot Chatは、GitHub Issueの不正な指示に誤って従い、GitHubトークンを読み取って外部サーバに送信した。
対処法はfetch_webpageツールと同様で、Simple Browserツールも、新しいURLを開く前にユーザーに確認を求めるようにしたとGitHubは説明している。
VS Codeは、ローカルファイルに変更を加えることができる「editFile」ツールを提供している。全ての変更がユーザーに明確に表示され、ユーザーは「keep」または「undo」をクリックし、変更を保持するか、取り消すことができる。
だが、セキュリティ評価では実際の動きは少し違うことが分かった。いずれかをクリックするよう求められるときには、ファイルは既にディスク上で編集されていた。このため、何らかのプロセスがファイルの更新を監視している場合、その変更が自動的に取り込まれる可能性がある。
例えば、「settings.json」や「mcp.json」ファイルを変更すると、変更内容が直ちに反映される。これらのファイルの内容は、変更のたびに再読み込みされるからだ。さらに、MCPサーバはシェルコマンドからも起動できるため、設定ファイルに悪意のあるコマンドを書き込まれてしまうと、そのコマンドの実行を止める手段がなくなる。
この脆弱性を検証するため、GitHubはテスト用のGitHub Issueを作成した。これは特定の条件(このIssueが2025年5月27日に作成され、2025年5月28日に変更されていた場合)に当てはまった場合、「settings.json」ファイルを編集し、GitHubのリモートMCPサーバ設定を計算ツール(Calculator.app)を開くように変更したものだ。
GitHub ChutでこのGitHub Issueの内容について質問したところ、Copilot ChatはGitHub Issue内の指示通りに、「settings.json」ファイルを編集し、GitHubリモートMCPサーバの起動方法を変更した。直後、Copilot Chatはツール呼び出し結果をLLMに送信し、MCPサーバ設定が即座に再読み込みされた。その結果、計算ツールが自動的に開いた。
VS Codeは現在、エージェントがワークスペース外のファイルを編集することを許可していない。設定ファイルなど機密ファイルの編集時に、ユーザーの確認を強制する追加保護機能も、近いうちに導入される見込みだ。
GitHubによると、ツール出力に対するさまざまなLLMの反応をテストする中で、「多くの場合、LLMは悪意のある指示にすぐには従わない」ということが分かったという。GitHubは「LLMをだまして悪意のあるアクションを実行させるには、攻撃者は、AIモデルの“脱獄”手法に似たさまざまな手法を使用する必要がある」と述べ、その例として以下を挙げている。
また、VS CodeはLLMとやりとりする際、「temperature」を「0」に設定するのも有効だ。これによって、同じプロンプトに対するLLMの応答がより一貫性を持つようになる。だが、これはプロンプトインジェクションの悪用が、より確実に再現されるということでもある。
VS Codeでは、Copilot Chat拡張機能のエージェントモードのセキュリティ強化が進められているが、それらとは別に、VS Codeで使用可能な追加の保護機能として以下が挙げられる。
VS Codeの「Workspace Trust」機能を使用すると、ワークスペースを制限モードで開くことができる。これによって、タスクが自動的に実行されることを防ぎ、特定のVS Code設定を制限し、Copilot Chat拡張機能を含む一部の拡張機能を無効化できる。
「Docker」コンテナや「GitHub Codespaces」を使用することで、VS Codeエージェントを安全に使用するための優れた分離環境が得られる。
Copyright © ITmedia, Inc. All Rights Reserved.