11 августа 2026 года на Hacker News разлетелся разбор, который стоит прочитать каждому, кто держит AI-ассистента в рабочей IDE: исследователь поставил VS Code с GitHub Copilot за перехватывающий прокси и посмотрел, что именно уезжает на серверы. Выяснилось, что в запрос попадает заметно больше, чем строка, которую вы дописываете, — включая содержимое открытого .env в чистом виде.
Хорошая новость: проверить это может любой, и не только на Copilot. Ниже — рабочая инструкция, как за 20–30 минут поднять аудит трафика своего ассистента, что искать в перехваченных запросах и какие ограничения у штатных механизмов исключения файлов.
Зачем это делать самому
Документация вендора описывает политику, а не фактическое поведение клиента. Между «мы не используем ваш код для обучения» и «клиент не отправляет ваш код на сервер» — пропасть: чтобы сгенерировать подсказку, модель обязана получить контекст, и вопрос только в том, насколько широко клиент этот контекст собирает.
Аудит нужен, если вы:
- работаете по NDA или с персональными данными клиентов и обязаны знать, что уходит за периметр;
- держите в репозитории секреты, конфиги стендов, внутренние адреса и токены;
- отвечаете за комплаенс в команде и вам нужен не скриншот из настроек, а лог реальных запросов;
- просто хотите понять, почему ассистент внезапно «знает» про файл, который вы не открывали.
Что нашли в трафике Copilot
Разбор, о котором речь, опирался на классический mitmproxy: VS Code направили на локальный прокси на порту 8080 и отключили строгую проверку сертификата. Ключевые находки:
- Контекст шире одного файла. При инлайн-дополнениях клиент собирает до 20 файлов, 8 сводок последних правок и по 3 строки контекста вокруг каждого изменения, плюс полный текст текущего файла и недавно отредактированные файлы в виде диффов.
- Секреты не маскируются. В теле запроса поле
promptсодержало строку видаTEST_ENV_VAR_SECRET="mysecretenvvar"— то есть переменные окружения из открытого файла уезжали как обычный текст. - Локальная база тоже открыта. Файл
session-store.dbхранитuser_messageиassistant_responseбез шифрования и редактирования: в нём оседали токены, ключи облачных провайдеров и пароли из строк подключения, которые вы когда-то вставили в чат. - Служебные вызовы. Помимо собственно дополнений, клиент дёргает
/models,/agents/swe/models,/models/session/intentи OAuth-эндпоинты GitHub — по ним хорошо видно, как ассистент классифицирует ваш запрос ещё до генерации ответа.
Отдельно стоит помнить: клиент отправляет на сервер URL текущего репозитория, чтобы получить применимую политику исключений. Сам по себе этот факт безобиден, но он означает, что состав вашего рабочего дерева — тоже сигнал.
Пошагово: поднимаем перехват
- Поставьте mitmproxy и запустите его. Достаточно веб-интерфейса:
mitmweb. По умолчанию прокси слушает порт 8080, консоль открывается в браузере. Для CI и долгих сессий удобнееmitmdump. - Установите корневой сертификат. При первом запуске mitmproxy создаёт CA в каталоге
~/.mitmproxy(файлmitmproxy-ca-cert.cer). Его нужно добавить в доверенные — иначе клиент оборвёт TLS-соединение. На время аудита достаточно доверия на уровне пользователя; после — удалите сертификат, не оставляйте чужой CA в системе «на всякий случай». - Выберите режим перехвата. Их три, и правильный выбор экономит час возни:
- regular — обычный прокси, клиент настраивается явно. Самый предсказуемый вариант.
- local — прозрачный перехват приложений на этой же машине, без правки настроек программы:
mitmproxy --mode local:Codeпоймает только процесс VS Code,--mode local:42— процесс с указанным PID,--mode local:!curl— всё, кроме curl. Это лучший способ прослушать ассистента, у которого нет настройки прокси. - upstream — цепочка, когда за mitmproxy стоит ваш собственный прокси:
mitmdump --mode upstream:http://host:8081, а логин и пароль задаются опцией--set upstream_auth=user:pass.
- Направьте IDE в прокси (для regular-режима). В VS Code в
settings.json:"http.proxy": "http://127.0.0.1:8080""http.proxySupport": "override""http.proxyStrictSSL": false— только на время аудита. Этот флаг полностью отключает проверку сертификатов, и оставлять его в рабочем конфиге нельзя.
- Решите проблему сертификата по-взрослому. Расширение Copilot работает на Node, поэтому корректный путь — не отключать проверку, а собрать PEM с корневыми CA плюс сертификат mitmproxy и указать его через переменную окружения
NODE_EXTRA_CA_CERTS. IDE нужно перезапустить: переменная читается при старте процесса. - Пишите поток в файл. Смотреть глазами в реальном времени бесполезно — запросов десятки в минуту. Включите
--set save_stream_file=flows.dump, а чтобы не собирать всё подряд, ограничьте выборку через--set save_stream_filter=.... Потом файл спокойно разбирается офлайн. - Ищите по телу запроса, а не по URL. Практичный приём: положите в тестовый репозиторий файл-канарейку с уникальной строкой (например,
CANARY_9f3c_DO_NOT_SEND), откройте его в редакторе, поработайте в соседнем файле — и поищите канарейку в перехваченных телах. Так вы увидите не теоретический, а фактический радиус сбора контекста именно у вашей версии клиента.
Подводные камни
Лицензия может заблокировать перехват. На корпоративных планах Copilot отдаёт ошибку вида «Your current Copilot license does not support proxy connections with self-signed certificates». Это не баг прокси — клиент намеренно отказывается работать через самоподписанный CA. Лечится доверенным сертификатом на уровне системы или сборкой PEM для Node; если политика организации это запрещает, аудит придётся согласовывать с админом, а не обходить.
Пиннинг и QUIC. Часть клиентов ходит по HTTP/3 поверх QUIC, который обычный прокси не увидит. Если после включения перехвата приложение «работает, но в логе пусто» — почти всегда причина в этом: заблокируйте UDP/443 для тестового процесса, и клиент откатится на HTTP/2.
Телеметрия и полезная нагрузка идут разными путями. Не делайте вывод «ничего не уходит» по одному эндпоинту: смотрите весь список хостов, к которым обращается процесс, а не только тот, что упоминается в документации.
Юридическая рамка. Перехватывать трафик можно на своей машине и на своём аккаунте. Слушать чужой рабочий ноутбук без ведома владельца — это уже другая история, и никакая «безопасность» её не оправдывает.
Что делать с результатами
Если аудит показал, что в запросы попадают лишние файлы, штатные средства выглядят так — и у каждого есть заметное ограничение.
- Content exclusion. Официальный механизм GitHub, который запрещает Copilot использовать указанные пути. Доступен только на планах Business и Enterprise, настраивается администратором в настройках Copilot, поддерживается в VS Code, Visual Studio и JetBrains; в Xcode, Eclipse и Vim/Neovim — только для инлайн-подсказок.
- Главная дыра — агентный режим. Документация прямо говорит, что исключения не поддерживаются в режимах Edit и Agent в Copilot Chat, а также в Copilot CLI. То есть ровно там, где ассистент сам ходит по файлам, читает конфиги и запускает команды, платформенная фильтрация не применяется. Если вы полагаетесь на content exclusion как на единственный барьер — в агентном режиме барьера нет.
- .gitignore не защищает. Распространённое заблуждение: исключение из индекса Git не означает исключение из контекста ассистента.
- Организационный минимум. Секреты — в менеджер секретов, а не в
.envрядом с кодом; чат ассистента — не место для вставки строк подключения; локальную базу истории стоит чистить так же, как вы чистите историю shell.
Где здесь прокси и зачем он вам
У перехвата есть прикладное продолжение. Во-первых, upstream-режим позволяет пропустить весь трафик ассистента через контролируемый выходной узел: вы одновременно видите запросы и управляете тем, с какого адреса они уходят. Это нужно, когда API ассистента недоступно из вашего региона или когда корпоративная политика требует фиксированного исходящего IP — для такого сценария подходят стабильные датацентр-прокси с постоянным адресом.
Во-вторых, тот же стенд пригодится для отладки автоматизации: когда AI-агент сам ходит по сайтам, перехват показывает, какие заголовки он реально отправляет и на чём его ловят защиты. Мы разбирали эту связку в материале про прокси для AI-агентов на Playwright и MCP — там про выбор типа адреса под агентные сценарии, где нужен резидентный IP, а не серверный.
Если mitmproxy вы раньше не поднимали, начните с базовой настройки перехвата HTTPS — она подробно описана в нашем руководстве по перехвату трафика через mitmproxy, а уже поверх неё накручивайте режимы local и upstream.
Вывод
Аудит трафика AI-ассистента — это не паранойя, а нормальная инженерная гигиена, которая занимает один вечер и один раз. Разбор Copilot показал понятную картину: клиент собирает контекст широко, секреты в этот контекст попадают наравне с кодом, локальная история хранится открытым текстом, а штатные исключения не работают ровно в самом опасном режиме — агентном.
Проверяйте не документацию, а трафик. Поднимите mitmproxy в режиме local, положите в репозиторий канарейку, соберите поток в файл и посмотрите своими глазами, что уходит с вашей машины. Дальше решение простое: либо вы сознательно принимаете этот объём передачи, либо выносите секреты за пределы рабочего дерева до того, как их увидит чужой сервер.
