← На главную

Copilot в VS Code читает .env и хранит промпты открыто — так задумано

11.08.2026 10:40 · hackernews

Электрон-приложения вроде Slack, Cursor, Notion, ChatGPT Desktop и Claude Desktop построены на Electron. Это JavaScript-фреймворк, который упаковывает Node.js и Chromium, позволяя делать кроссплатформенные десктоп-приложения из одной кодовой базы. Автор решил разобраться, как работают такие приложения изнутри, и выбрал для эксперимента VS Code с Copilot.

Сначала он хотел читать исходники, но они открыты только у VS Code, а у остальных закрыты. Поэтому пошёл по пути reverse engineering: поднял mitmproxy, настроил VS Code на прокси localhost:8080, отключил проверку строгого SSL и включил Proxy Support override. В mitmweb стало видно, что большинство запросов уходит в GitHub и Copilot.

Бутстрап Copilot состоит из нескольких этапов. Сначала OAuth-авторизация: приложение получает токен, обменивает его на короткоживущий и проверяет права пользователя. Потом model discovery: запрос к /models возвращает общий список доступных моделей, а /agents/swe/models — модели для агентных задач в разработке. После отправки сообщения в Auto mode происходит запрос к /models/session/intent, где промпт классифицируется по интентам (code-gen, debugging, reasoning, tool-use), и от этого зависит, какая модель ответит.

Дальше автор проверил, что уходит вместе с данными. Положил фейковый секрет в .env, но редактирование .env запросов не вызвало. А когда открыл pyproject.toml и начал печатать, в completion-запросе улетела строка с этим секретом. Отключение Copilot для .env не помогло: запрос триггерится из активного файла, а .env просто попадает в контекст.

Внимание привлекла утилита session_store_sql из Copilot Chronicle. Она выполняет SQL-запросы к локальной базе session-store.db. Там хранятся сессии, репозитории, ветки и все промпты пользователя с ответами — в открытом виде. Автор отправил Copilot сообщение с фейковым GitHub-токеном, AWS-ключом и строкой подключения с паролем — всё оказалось в базе в plain text. Никакой маскировки, редактирования или санитизации в коде записи нет: user_message и assistant_response пишутся как есть. Это не баг, а просто так написано.

Контекст для инлайн-подсказок собирается в recentEdits.tsx: окно до 20 файлов, 8 сводок правок, 3 строки вокруг каждого изменения. Поэтому и чужая строка из .env попала в запрос. Никаких особых правил для .env или интеграции с .gitignore по умолчанию нет. Есть шлюз исключений, но он привязан к repository policy на Business/Enterprise тарифах.

Вывод автора: AI-инструменты для кода становятся stateful системами. Они комбинируют рабочее пространство, недавние правки, переписку, инструменты и историю. Контекст становится продуктом. Но это создаёт проблемы: контекст надо держать уместным и не раздувать, а также думать о приватности. Reverse engineering харнесса вокруг модели оказался полезнее, чем изучение самой модели.

Читать оригинал →