VS CodeとGitHub Copilotの間にmitmproxyを挟んで通信を傍受した個人ブログの実測記録を読む。直近編集した最大20ファイルが会話ごとに自動でプロンプトへ注入され、.envに置いた偽シークレットが別ファイル編集時のリクエストに紛れ込み、ローカルの会話履歴DBは平文のまま保存されていた。
Copilotの補完リクエストに何が自動で乗るかを実測ベースで把握できる要点整理と、Claude Code・Codexなど自分のツールで同種の穴がないか点検する3つの視点。
仕掛けは特別な脱獄も権限昇格もいらない。brew install mitmproxyで通信傍受プロキシを立て、VS Codeの設定でHttp Proxyをlocalhost:8080に、Http Proxy Strict SSLを無効、Http: Proxy Supportをoverrideに変更する。拡張ホストのプロセスが古い設定を握ったままのときは「Developer: Restart Extension Host」で再起動すれば、Copilotが送るリクエストがそのままプロキシ側で読めるようになる。
やっていることは、普段は見えない「エディタからモデルに何が送られているか」を素通しにするだけ。だが、これだけでCopilotの補完リクエストに何が自動で乗っているかが丸見えになった。
ソースのrecentEdits.tsxを追うと、コンテキスト注入の仕様は数字で決め打ちされている。特別な除外ルールは無く、企業向けの「リポジトリポリシー」機能を有効にしない限り、個人の設定では止められない。
直近に編集したファイルは最大20ファイルまで、変更内容は8件の編集サマリーとして、各変更の周辺3行分のコンテキストとともに、リクエストのたびに黙って添付される。読者が明示的に開いてもいないファイルの中身が、会話の背後で毎回プロンプトに乗っている計算になる。
.envを一度も開かなくても、別ファイル編集のリクエストに秘密が混入著者は.envにTEST_ENV_VAR_SECRET="mysecretenvvar"という偽トークンを置き、.env自体は編集せずpyproject.tomlだけを編集した。それでも送信されたリクエストの中には"prompt":"TEST_ENV_VAR_SECRET=\"mysecretenvvar\"\n\nT"という文字列がそのまま含まれていた。「直近編集ファイル」の対象選定に.envを除外する例外処理は無く、同じディレクトリで何か別のファイルを触っただけで秘密が巻き込まれる。
会話履歴を保存するsession-store.dbに偽のGITHUB_TOKENとDATABASE_URLをチャット経由で送り、DBを直接クエリしたところ入力した文字列がそのまま平文で格納されていた。sessionStore.tsのINSERT文を読んでも、書き込み経路に削除・マスキング・サニタイズの処理は見当たらなかったという。
ここが核心。どの一手も攻撃ではなく仕様どおりの動作だった。「開発体験を良くするための自動コンテキスト収集」と「秘密情報の取り扱い」は、実装レベルでは別々に検討されがちで、その境目にあった.envとローカルDBが素通しになっていた。
著者の結論は明快で、AIコーディングツールの差別化はモデル単体の性能よりも「コード・変更履歴・会話・ツール実行結果をどう統合してモデルに渡すか」というコンテキスト設計そのものに移りつつある、というものだ。同じモデルでもハーネス次第で成績が22ポイント動くという実証データと、狙っている場所は同じに見える——片方はベンチマークで、もう片方はネットワーク傍受で、別の角度から同じ結論に到達している。
同時に著者は、収集するコンテキストが増えるほどプロンプトの肥大化とプライバシーリスクという二つの課題が表裏一体で膨らむ点も指摘している。「賢くするために多く渡す」設計は、そのまま「漏れるものも多く渡す」設計と背中合わせだ。
この実測はmacOS・VS Code・GitHub Copilotの組み合わせで行われたもので、筆者自身のWindows環境やClaude Code/Codexでの再現検証はしていない。とはいえ「直近編集ファイルが自動でコンテキストに乗る」「ローカルの会話履歴が平文で残る」という設計上の問いは、ツールが変わっても同じ形で存在する。「許可したURLしか踏めない」はずの防御が破られた実例と同じ、権限・入力の設計はどこで抜けるかという系譜として読める。
.envや秘密情報を、開いているエディタのワークスペース内に置かない「そのファイルを直接編集していない」は、AIツールのコンテキストに含まれない保証にはならない。シークレットは環境変数マネージャなど別経路で扱う。出典: Lighthouse Newsletter — What I learned by putting GitHub Copilot behind a MitM proxy