GitHub Copilot 内部アーキテクチャ: コンテキスト注入とセッションストレージの分析

Man-in-the-Middle (MitM) プロキシと VS Code のソースコードを介した GitHub Copilot のネットワークトラフィックの分析により、このツールがステートフルなシステムへと進化していることが明らかになりました。これは、ユーザーのワークスペースデータ、最近の編集、会話履歴、およびローカルの SQLite データベースを組み合わせて、LLM 用のコンテキストを組み立てることで実現されています。

モデルのルーティングと検出

GitHub Copilot は、特定のユーザーリクエストをどのモデルが処理すべきかを決定するために、マルチステージのプロセスを使用します。このプロセスは、拡張機能が OAuth を介して認証を行い、利用可能なモデルを検出するブートストラップ段階から始まります。

モデルの検出

Copilot は、利用可能な機能を特定するために 2 つの異なるリクエストを行います:

  1. /models へのリクエストにより、利用可能なモデルの一般的なリストを取得します。
  2. /agents/swe/models へのリクエストにより、特にエージェント的なソフトウェアエンジニアリング (SWE) 機能に適したモデルを特定します。

意図に基づくルーティング

ユーザーが "Auto" モードでメッセージを送信すると、Copilot はすぐに生成モデルを呼び出すわけではありません。代わりに、プロンプトを /models/session/intent エンドポイントに送信します。システムは、code-gendebuggingreasoning、および tool-use といった様々な意図に対してプロンプトをスコアリングし、この分類を使用して、タスクに最も適切なモデルにリクエストをルーティングします。

コンテキスト注入とプライバシーのリスク

Copilot の関連性の高い提案を提供する能力は、プロンプトに注入されるコンテキストに依存しています。しかし、このメカニズムは、ユーザーが現在編集していないファイルの機密データを不注意に漏洩させる可能性があります。

「最近の編集」による漏洩

Copilot は、コンテキスト用にスライディングウィンドウを実装しており、これには最大 20 個のファイル、8 つの編集サマリー、および各変更の周囲 3 行のコンテキストが含まれます。このウィンドウはワークスペース全体の最近の編集を追跡するため、.env ファイルに保存されたシークレットが、全く無関係なファイル (例: pyproject.toml ファイル) でのキーストロークによってトリガーされたプロンプトに含まれてしまう可能性があります。

デフォルトのシークレット・フィルタリングの欠如

VS Code のソースコードの分析により、コンテキストの書き込みパスにおいて、デフォルトのスクラビング、リダクション、またはシークレット・フィルタリングのステップが存在しないことが確認されました。Business および Enterprise プランでは特定のファイルを制限するための "repository policies" が存在しますが、個別プランには .env ファイルを特別に扱うデフォルトのルールはなく、また、機密性の高いファイルを API に送信することを防ぐための .gitignore との連携もありません。

ローカル状態と Chronicle ツール

GitHub Copilot は、Chronicle と呼ばれるツールを介して、セッションをまたいだ長期的なメモリを提供するために、ローカル状態を維持しています。

session-store.db

Copilot は、セッションのサマリー、リポジトリ、ブランチ、およびユーザーのプロンプトとアシスタントの応答の完全な履歴を保存するために、session-store.db という名前のローカル SQLite データベースを利用しています。

平文での保存とツールへのアクセス

session-store.db 内の user_message および assistant_response カラムは、平文で保存されています。LLM は session_store_sql というツールを通じてこの履歴にアクセスでき、これによりモデルは、以前の作業について質問に答えるため (例: "What did I work on this week?"), SQL クエリをローカルデータベースに対して実行できます。

sessionStore.ts のソースコード分析により、turn.user_message がマスキングやサニタイズなしにそのままデータベースに挿入されることが確認されました。

分析の技術的実装

これらの挙動を明らかにするために、研究者は Electron ベースの VS Code アプリケーションと GitHub のサーバー間の HTTPS トラフィックを mitmproxy を使用してインターセプトしました。

インターセプトの設定

VS Code は Electron (Chromium + Node.js) 上で構築されているため、以下の設定を行うことで、トラフィックをプロキシ経由でルーティングできます:

  • Http Proxy: http://localhost:8080
  • Http Proxy Strict SSL: チェックを外す (mitmproxy CA 証明書を許可するため)。
  • Http: Proxy Support: 拡張機能に対してプロキシサポートを強制するために override に設定する。

代替の観察方法

コミュニティの議論では、Copilot の内部動作を観察するための他の方法が示唆されています:

  • eBPF: eBPF を使用すると、暗号化前または復号化後の生の平文データをワイヤーから直接キャプチャできるため、証明書ピン留めや mTLS と戦う必要がなくなります。
  • Agent Debug Logs: VS Code には、Copilot 会話メニューの "show agent debug logs" オプションからアクセス可能な組み込み機能があり、ツール呼び出し、プロンプト、、およびモデルの選択ロジックを表示します。

結論: コンテキストとしての製品

AI コーディングツールの差別化は、基盤となるモデルの生のパワーから、適切なコンテキストを組み立てる「ハーネス」—つまり、システムがコンテキストを組み立てる仕組み—の洗精度の向上へと移行しています。主なエンジニアリングの課題は、コンテキストの密度 (プロンプトを軽量かつキャッシュに優しい状態に保つこと) と、機密性の高い開発者ステートがモデル API や平文のローカルストレージに渡らないようにするための厳実格なプライバシー境界とのバランスを取ることです。

Sources

関連

  • プロジェクト
  • プロジェクト
  • Dispatch
  • プロジェクト
  • Dispatch