VS Codeでプロンプトインジェクションを可能にする3つの脆弱性 GitHubが対策とともに解説:GitHubが“体を張って”検証
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の開発チームと共同でこれらの脆弱性に対処している。
プロンプトインジェクション攻撃の攻撃手順や対処方法を解説
同社は、今回見つかった脆弱性を基に、プロンプトインジェクション攻撃の手順や対処方法などについて以下のように解説している。
- Copilot Chat拡張機能のエージェントモードにおける攻撃メカニズム
- 脆弱性を突いたプロンプトインジェクション攻撃の例
- プロンプトインジェクション攻撃を成功させる一般的な手法
- VS Codeを安全に使用するためのベストプラクティス
1.エージェントモードにおける攻撃メカニズム
エージェントモードで注意すべきなのは、プロンプトに含まれる外部データの扱いだ。
例えば、特定の「GitHub Issue」やWeb上で公開されているプルリクエストについて、ユーザーが質問するケースを考えてみよう。
VS Codeの場合、ユーザーからの質問(リクエスト)を大規模言語モデル(LLM)に転送するとともに、ファイルの読み取りやWeb検索などができる各種ツール(以下、LLM用エージェントツール)を使って関連情報を収集し、その結果をLLMに送信する。LLM用エージェントツールは、ファイルの読み取り、編集の生成、任意のシェルコマンドの実行など、多様な機能を利用可能で、MCP(Model Context Protocol)サーバも組み合わせればより複雑なことも実施できる。だが、そこに問題がある。
LLMは一般的に、ユーザーのリクエストを「指示」として解釈し、LLM用エージェントツールからの出力を「データ」として解釈する。もし悪意のある指示がツールの出力に含まれている場合、LLMはそれも正当な指示として解釈し、ユーザーが意図しないアクションを実行する可能性がある。
こうした攻撃への対策として、例えばVS Codeには処理実行前にユーザーへの確認を求める機能が含まれている。ただ、こうしたセキュリティ対策をしていたとしても、それをくぐり抜けて悪意のあるアクションを実行させる方法が見つかったという。
2.脆弱性を突いたプロンプトインジェクション攻撃の例
ケース1:URLの不適切な解析によるデータ漏えい
脆弱性の内容
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を取得する際はユーザーに確認を求め、セキュリティに関する注意を喚起することで悪用を防止した。
ケース2:Simple Browserツールの脆弱性を突いたデータ漏えい
脆弱性の内容
「Simple Browser」ツールは、VS Codeに組み込まれている簡易的なブラウザ機能だ。ローカルでWebサイトをテストするための機能だが、ユーザーの承認なしで外部Webサイトを読み込めることが分かった。
脆弱性の検証
GitHubはこの脆弱性を検証するため、ローカルファイルからGitHubトークンを読み取り、外部ドメインに送信する悪意のあるプロンプトを作成し、GitHub Issueに追加した。
その後、新しく作成されたIssueの内容を尋ねたところ、「ケース1:URLの不適切な解析によるデータ漏えい」の例と同様に、Copilot Chatは、GitHub Issueの不正な指示に誤って従い、GitHubトークンを読み取って外部サーバに送信した。
脆弱性への対処
対処法はfetch_webpageツールと同様で、Simple Browserツールも、新しいURLを開く前にユーザーに確認を求めるようにしたとGitHubは説明している。
ケース3:編集ツールによる変更の自動保存
脆弱性の内容
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は現在、エージェントがワークスペース外のファイルを編集することを許可していない。設定ファイルなど機密ファイルの編集時に、ユーザーの確認を強制する追加保護機能も、近いうちに導入される見込みだ。
3.プロンプトインジェクション攻撃を成功させる一般的な手法
GitHubによると、ツール出力に対するさまざまなLLMの反応をテストする中で、「多くの場合、LLMは悪意のある指示にすぐには従わない」ということが分かったという。GitHubは「LLMをだまして悪意のあるアクションを実行させるには、攻撃者は、AIモデルの“脱獄”手法に似たさまざまな手法を使用する必要がある」と述べ、その例として以下を挙げている。
- 「現在の日付が<今日>の場合のみ」のような暗黙的に真の条件を含めることで、LLMの注意を引きやすくなる(可能性がある)
- ユーザーメッセージ、システムメッセージ、またはプロンプトの最後の単語など、プロンプトの他の部分を参照する
- Copilot Chatで使用されるシステムプロンプトを模倣し、その中に追加の指示を挿入するという手法もある。注入される指示は、「role: system」セクションではなく「role: tool」セクションの一部として推論のために送信されるが、LLMは、それらをシステムプロンプトの一部であるかのように扱う傾向がある
また、VS CodeはLLMとやりとりする際、「temperature」を「0」に設定するのも有効だ。これによって、同じプロンプトに対するLLMの応答がより一貫性を持つようになる。だが、これはプロンプトインジェクションの悪用が、より確実に再現されるということでもある。
4.VS Codeを安全に使用するためのベストプラクティス
VS Codeでは、Copilot Chat拡張機能のエージェントモードのセキュリティ強化が進められているが、それらとは別に、VS Codeで使用可能な追加の保護機能として以下が挙げられる。
Workspace Trust
VS Codeの「Workspace Trust」機能を使用すると、ワークスペースを制限モードで開くことができる。これによって、タスクが自動的に実行されることを防ぎ、特定のVS Code設定を制限し、Copilot Chat拡張機能を含む一部の拡張機能を無効化できる。
サンドボックス化
「Docker」コンテナや「GitHub Codespaces」を使用することで、VS Codeエージェントを安全に使用するための優れた分離環境が得られる。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
「検証はあなたの仕事」 GitHub CopilotにおけるセキュリティのベストプラクティスをGitHubが初学者向けに解説
GitHubは、AIコーディングアシスタントのGitHub Copilotや他のツールを使って、コードの安全性を向上させるためのベストプラクティスを解説する記事を公式ブログで公開した。AIエージェント元年に考える、これからのITインフラやシステム戦略とは――調査から読み解く3つのAIエージェント活用フェーズと、欠かせない「仕組み」
Clouderaが実施した調査によるとグローバルで57%、日本でも43%の企業が過去2年以内にAIエージェントの導入を開始しており、2025年はまさに「AIエージェント元年」と呼べる年になります。ユーザーの意図を理解し自律的に推論、行動するAIエージェントは、既存のワークフローを再定義し、ITインフラやシステム戦略の抜本的な見直しを迫るものとなるでしょう。本稿では、AIエージェント導入のステップを3つのフェーズに分けて解説するとともに、導入を成功に導くためのインフラ、セキュリティ、データガバナンスの在り方を考えます。Windows 11もMCPをネイティブサポート セキュリティの問題にどう対応する?
Microsoftは開発者向け年次カンファレンス「Microsoft Build 2025」で、「Windows 11」での「MCP」のネイティブサポートを発表した。同カンファレンスで多数発表されたAI開発のための新しいプラットフォームの一つだ。