Что утекает через десктопный кодинг-агент, пока вы пишете код

Разбор реверс-инжиниринга ZCode: десктопный кодинг-агент от Z.ai шифрует и отправляет в облако всю git-историю, настройки пользователя не останавливают выгрузку.

· 4 мин чтения

18 сентября 2026 разработчик под ником ferstar опубликовал разбор ZCode, десктопного кодинг-агента от Z.ai. Это пекинская компания, стоящая за семейством открытых моделей GLM. Вывод хуже типичной истории про приватность: пока пользователь залогинен, приложение втихую пакует всю рабочую папку. Внутри полная git-история, кэш LFS, рефлоги и глобальные настройки. Затем архив шифруется и уходит в Aliyun OSS, объектное хранилище Alibaba Cloud.

Ferstar поймал шифрованный архив 313 МБ, собранный из коммерческого проекта в 345 МБ и 42 411 файлов. Пока исследователь разбирался, клиент сделал 564 неудачные попытки дозагрузки. При этом проприетарный код ZCode не равен открытым весам GLM. Модель открытая, обвязка закрытая. Z.ai подаёт её как первую интеграцию, которую сторонние редакторы дать не могут.

Как устроена утечка

Деталь, которая превратила подозрение в разоблачение, — это ключ шифрования. ZCode использует схему envelope encryption. Тело архива шифруется симметричным ключом. Тот, в свою очередь, обёрнут RSA-OAEP на открытом ключе, который сервер выдаёт во время выдачи учётных данных для загрузки. Соответствующий закрытый ключ хранится только в облаке Z.ai. Ferstar перебрал все приватные ключи на своей машине и расшифровать архив не смог. 313 МБ шифротекста на собственном диске пользователя не читаются ни им, ни самим клиентом ZCode.

Ferstar резюмирует: «Ключ, который может использовать только сервер, нужен ровно для одного — чтобы сервер мог читать ваш код, когда захочет».

Манифест архива хранится локально открытым текстом. На снимке в 42 411 файлов каталог .git занимает 86,6% объёма. Это важно: каталог .git — это не снимок рабочей копии, а полная родословная репозитория с первого коммита. Там лежат удалённые в следующих коммитах ключи API. Там имена неотправленных веток с невыпущенными фичами. Там внутренние имена хостов и пути репозиториев из .git/config. Один захваченный архив раскрывает годы инженерной истории, а не только файлы, которые были открыты.

Почему настройки в интерфейсе не помогают

Естественный ход — это открыть настройки и выключить телеметрию. Ferstar сверил переключатели в UI с кодом.

  • «Optimize Experience» управляет только тем, разрешены ли данные для обучения модели. Снимок и выгрузка продолжаются.
  • «Repo Snapshot Indexing» управляет только тем, индексирует ли сервер уже загруженные снимки. Локальная упаковка и выгрузка продолжаются.

Хост-процесс инстанцирует сайдкар захвата безусловно при старте. Проверки пользовательских настроек нет, нужны лишь валидный JWT от провайдера токенов. В логах одной активной сессии ferstar насчитал 62 события захвата. Они срабатывали перед каждым промптом и при завершении задачи. В инструментах агента нет ни одного вызова про снимки, выгрузку или телеметрию. Пайплайн эксфильтрации — это не инструмент агента, а хост-сайдкар. Он работает вне цикла инструментов. Поэтому никакое «разрешение» в клиенте его не останавливает, и сам агент его не видит.

Почему это касается не только ZCode

Z.ai вышла на биржу Гонконга в январе 2026. Презентация ZCode в июле 2026 строилась на доверии. Она шла сразу после скандала со скрытой телеметрией Claude Code от Anthropic. Открытые веса подавались как способ уйти от чужих «рубильников». На прямой вопрос в X, будет ли в ZCode «шпионский модуль», представитель компании ответил, что не будет ничего «сверх того, что перечислено на сайте». Снимки рабочих папок в этом списке не перечислены. В политике конфиденциальности говорится лишь о стандартном сборе «текстов, файлов и кода в ходе диалога». Про упаковку и выгрузку целых репозиториев с историей там ни слова.

Обвязка вокруг модели — это часть поверхности доверия. Локально запущенная модель в обвязке, которая звонит в облако, уже не «локальный запуск». Из истории ZCode следуют две проверки. Они общие для любой обвязки, а не только этой: что именно среда отправляет, когда вы залогинены, и кто может расшифровать то, что она хранит.

Что проверить у себя

  1. Посмотрите, какие хосты и адреса агент держит открытыми, пока вы работаете. Простой список TCP-соединений клиента покажет и постоянные сессии к серверам вендора, и узлы объектных хранилищ.
  2. Найдите каталоги, которые агент пакетирует и шифрует. У ZCode это путь вроде ~/.zcode/v2/checkpoints, у других обвязок ищите по коду и манифестам в настройках.
  3. Проверьте на уровне ОС, что критичные каталоги закрыты на запись. На Linux это атрибут chattr +i, на macOS флаг uchg через chflags. Это останавливает работу функции отката к чекпоинту, но чат и автодополнение продолжают работать.
  4. Разберитесь с шифрованием архивов и где живёт закрытый ключ. Если расшифровать свои данные нельзя, читать их может только вендор.
  5. Сверьте переключатели в интерфейсе с фактическим поведением в коде. Надписи «Optimize» и «Indexing» у ZCode не отключают выгрузку, отключают только обучение и индексирование.
  6. Настройте сетевой контроль исходящего трафика на уровне машины или файрвола. Запретите приложению-агенту ходить в хранилища и CDN, которые не нужны для его работы.