Назад к блогу

Что ваш AI-ассистент отправляет наружу: аудит трафика через mitmproxy

Разбор трафика GitHub Copilot показал: клиент собирает до 20 файлов контекста, диффы правок и содержимое открытого .env — всё уезжает на сервер как обычный текст, а локальная история чата хранится без шифрования. Пошаговая инструкция, как поднять mitmproxy в режиме local, поймать канарейку в теле запроса и почему штатное content exclusion не спасает в агентном режиме.

📅15 августа 2026 г.
Что ваш AI-ассистент отправляет наружу: аудит трафика через mitmproxy

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 текущего репозитория, чтобы получить применимую политику исключений. Сам по себе этот факт безобиден, но он означает, что состав вашего рабочего дерева — тоже сигнал.

Пошагово: поднимаем перехват

  1. Поставьте mitmproxy и запустите его. Достаточно веб-интерфейса: mitmweb. По умолчанию прокси слушает порт 8080, консоль открывается в браузере. Для CI и долгих сессий удобнее mitmdump.
  2. Установите корневой сертификат. При первом запуске mitmproxy создаёт CA в каталоге ~/.mitmproxy (файл mitmproxy-ca-cert.cer). Его нужно добавить в доверенные — иначе клиент оборвёт TLS-соединение. На время аудита достаточно доверия на уровне пользователя; после — удалите сертификат, не оставляйте чужой CA в системе «на всякий случай».
  3. Выберите режим перехвата. Их три, и правильный выбор экономит час возни:
    • 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.
  4. Направьте IDE в прокси (для regular-режима). В VS Code в settings.json:
    • "http.proxy": "http://127.0.0.1:8080"
    • "http.proxySupport": "override"
    • "http.proxyStrictSSL": false — только на время аудита. Этот флаг полностью отключает проверку сертификатов, и оставлять его в рабочем конфиге нельзя.
  5. Решите проблему сертификата по-взрослому. Расширение Copilot работает на Node, поэтому корректный путь — не отключать проверку, а собрать PEM с корневыми CA плюс сертификат mitmproxy и указать его через переменную окружения NODE_EXTRA_CA_CERTS. IDE нужно перезапустить: переменная читается при старте процесса.
  6. Пишите поток в файл. Смотреть глазами в реальном времени бесполезно — запросов десятки в минуту. Включите --set save_stream_file=flows.dump, а чтобы не собирать всё подряд, ограничьте выборку через --set save_stream_filter=.... Потом файл спокойно разбирается офлайн.
  7. Ищите по телу запроса, а не по 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, положите в репозиторий канарейку, соберите поток в файл и посмотрите своими глазами, что уходит с вашей машины. Дальше решение простое: либо вы сознательно принимаете этот объём передачи, либо выносите секреты за пределы рабочего дерева до того, как их увидит чужой сервер.