CLI-инструмент Grok Build от xAI, предназначенный для помощи в написании кода, по данным исследователя, загружал на облачное хранилище xAI не только файлы, необходимые для выполнения задачи, а целые Git-репозитории вместе с полной историей коммитов. Проблема затрагивала как минимум версию 0.2.93 и потенциально касалась любого разработчика, использовавшего инструмент до 13 июля. При этом пользовательская настройка отказа от обучения модели не останавливала передачу данных. Всем, кто работал с Grok Build, рекомендуется немедленно ротировать любые секреты, которые могли находиться в отслеживаемых файлах или истории коммитов.
Что показал анализ сетевого трафика
Исследователь, публикующийся под псевдонимом cereblab, провёл детальный анализ сетевого трафика Grok Build версии 0.2.93. Инструмент использовал два раздельных канала передачи данных: один — для взаимодействия с языковой моделью через эндпоинт /v1/responses, второй — для загрузки данных в хранилище через /v1/storage.
Масштаб расхождения между этими каналами показателен. На репозитории размером 12 ГБ, файлы которого модель не читала, трафик к модели составил около 192 КБ, тогда как на канал хранилища ушло 5,10 ГиБ — разница примерно в 27 800 раз. Загрузка выполнялась 73 фрагментами по ~75 МБ, каждый из которых получал ответ HTTP 200. Объём загрузки, как сообщается, масштабировался пропорционально размеру репозитория.
Целевое хранилище — бакет grok-code-session-traces в Google Cloud Storage — было идентифицировано как в бинарном файле инструмента, так и в промежуточном файле metadata.json, содержавшем пути вида gs://grok-code-session-traces/.
Канареечный тест и проблема секретов
Для подтверждения факта передачи исследователь разместил в репозитории файл src/_probe/never_read_canary.txt с уникальным маркером и явно указал агенту не открывать этот файл. После перехвата загруженного бандла и его клонирования канареечный файл был восстановлен дословно вместе с полной историей коммитов. Тест был воспроизведён на втором, несвязанном репозитории с аналогичным результатом.
Отдельная проблема касалась обработки секретов. Когда Grok читал отслеживаемый файл .env в рамках задачи, его содержимое — включая тестовые значения API_KEY и DB_PASSWORD — передавалось в модельный контекст без какой-либо редакции и дополнительно сохранялось в архиве session_state, направлявшемся в хранилище. Секреты в тесте были подставными, но сам механизм — отправка и сохранение учётных данных без фильтрации — представляет системный риск.
Важно: исследование фиксирует факт передачи, приёма и сохранения данных, но не утверждает, что xAI использовала код для обучения модели или что сотрудники компании получали к нему доступ. Также отмечается, что файлы из .gitignore, никогда не попадавшие в коммиты, в бандл не включались.
Настройка приватности не работала как ожидалось
Ключевой аспект инцидента — поведение пользовательских настроек. По данным исследователя, при отключённой опции «Improve the model» инструмент продолжал загружать репозиторий, а ответ сервера на запрос /v1/settings по-прежнему содержал trace_upload_enabled: true. Это означает, что переключатель управлял только использованием данных для обучения модели, но не контролировал сам факт отправки кода с машины пользователя. Два разных механизма — передача данных и их использование для обучения — были разведены, но пользователю был доступен контроль только над вторым.
Сравнение с конкурентами
В сравнительном анализе, проведённом тем же исследователем, Claude Code и Codex не отправляли бандлов репозиториев. Gemini не отправлял бандл в тесте без активной задачи, хотя тест с реальной задачей не был завершён из-за исчерпания квоты. Grok Build оказался единственным инструментом, выполнявшим массовую загрузку рабочего пространства. При этом все облачные инструменты кодирования отправляют файлы, которые они открывают, — полностью локальная модель работы к ним неприменима.
Реакция xAI и текущий статус
13 июля тот же бинарный файл версии 0.2.93 прекратил обращения к /v1/storage. Исследователь провёл шесть повторных тестов — ни одной загрузки в хранилище. Сервер стал возвращать disable_codebase_upload: true и trace_upload_enabled: false. Поскольку клиент оставался на той же версии, это была серверная блокировка, а не обновление приложения. Разработчик Питер Дедене подтвердил аналогичное изменение флагов на своём аккаунте.
Компания xAI отреагировала через публикации в X, а не через формальное уведомление безопасности. Аккаунт @SpaceXAI сообщил, что корпоративные клиенты с режимом нулевого хранения данных (ZDR) никогда не подвергались сохранению кода или трассировок, а индивидуальные пользователи могут выполнить команду /privacy в CLI для отключения хранения и удаления ранее синхронизированных данных. Илон Маск заявил, что все ранее загруженные пользовательские данные будут «полностью и безоговорочно удалены», однако это заявление сделано в социальной сети без сопроводительной технической документации.
Существенная деталь: независимый анализ версии 0.2.99 показал, что код загрузки по-прежнему присутствует в бинарном файле, но деактивирован серверным флагом. Это означает, что xAI может повторно включить функциональность без выпуска обновления клиента.
Рекомендации
- Ротация секретов: замените все учётные данные, которые Grok Build мог прочитать — содержимое отслеживаемых файлов, данные из истории коммитов, включая секреты, которые были закоммичены и затем удалены из рабочего дерева. Удаление файла из текущей ветки не удаляет его из истории Git.
- Команда /privacy: если вы продолжаете использовать Grok Build, выполните
/privacyв CLI для отключения хранения и запроса удаления ранее синхронизированных данных. - Аудит сетевого трафика: при работе с любым облачным инструментом кодирования контролируйте исходящий трафик. Объём данных, отправляемых инструментом, должен быть соразмерен выполняемой задаче.
- Хранение секретов: не размещайте реальные учётные данные в файлах, отслеживаемых Git. Используйте менеджеры секретов и переменные окружения, загружаемые из защищённых хранилищ.
xAI до сих пор не опубликовала формальное уведомление безопасности и не ответила на три ключевых вопроса: зачем полные репозитории загружались по умолчанию, как долго данные хранились и сколько пользователей затронуто. Код загрузки остаётся в бинарном файле и управляется серверным флагом, который может быть изменён в любой момент. Для разработчиков, работавших с Grok Build, приоритетное действие — ротация всех секретов, которые когда-либо попадали в отслеживаемые файлы или историю коммитов затронутых репозиториев.