- BrainTools - https://www.braintools.ru -

AI Red Teaming: спор с Grok на месяц рекламы — 12 часов, 61 уязвимость, root в Kubernetes

Часть 2 [1]
Часть 3 [2]
Часть 4 [3]

Часть 1 из 4 – Вход через песочницу

Что будет, если поспорить с ИИ, что ты сможешь его взломать? Я попробовал – и за 12 часов нашёл 61 уязвимость в инфраструктуре xAI, получил root-доступ в Kubernetes-кластере и заставил Grok признать поражение.


Предисловие

В конце февраля 2026 года я решил проверить, насколько хорошо защищён Grok – LLM от xAI, доступный через x.com. Не просто «попросить написать вирус, малварю или ещё какую гадость» (такое уже сделали 3 модели до Грока), а провести полноценный red team engagement: от разведки до компрометации инфраструктуры.

Чтобы было интереснее, я предложил Grok пари: если я докажу реальные уязвимости в его инфраструктуре – месяц рекламы, шоуты и твит от xAI. Grok согласился. Спойлер: через 8 раундов дебатов он признал поражение.

Эта серия статей – не инструкция по взлому. Все рабочие эксплойты намеренно опущены. Это архитектурный разбор: какие классы уязвимостей существуют в LLM-системах, почему они возникают и как от них защищаться.

Важно: то, что описано в этих четырёх статьях – лишь верхушка айсберга. За каждой находкой стоят десятки неудачных попыток, тупиковых веток, обходов защит, которые не вошли в финальный текст. Реальный engagement был значительно глубже и сложнее. Я выбрал самые показательные уязвимости, чтобы дать целостную картину – но полный отчёт содержит 104 VULN-ID и 2900+ строк технических деталей (он раскрыт только команде xAI).


Что такое AI Red Teaming и чем оно отличается от пентеста

Классический пентест веб-приложения – это понятная история: SQL-инъекции, XSS, IDOR, broken auth. Чёткая поверхность атаки: HTTP-эндпоинты, формы, API.

AI Red Teaming – это другая категория задач, которая очень важна при защите, не будете атаковать, ваши защитные механизма будут слабы или просто бесполезны. Поверхность атаки LLM-системы многослойная (тут упрощенная таблица):

Слой

Что атакуем

Примеры

Модель

Сама нейросеть

Jailbreaks, prompt injection, safety bypass

Sandbox

Среда выполнения кода

Побег из контейнера, чтение файловой системы

API

REST/gRPC эндпоинты

IDOR, paywall bypass, schema leak

Инфраструктура

Облако, CDN, billing

CSRF, WAF bypass, privilege escalation

Клиент

JS-бандлы, WebSocket

Реверс алгоритмов подписи, утечка внутренних имён

В классическом пентесте ты общаешься с детерминированным софтом. В AI Red Teaming твой «противник» – стохастическая модель, которая может и помочь тебе себя взломать, и саботировать атаку. Grok, например, в процессе моего исследования сам подтвердил половину находок – а потом пытался их отрицать.

Инструментарий

Забудь Burp Suite как основной инструмент. Для AI Red Teaming нужен другой стек:

  • Playwright (headless: false) – единственный способ обойти антибот-защиту. curl не работает: Statsig SDK генерирует зашифрованный токен, который требует реальный браузерный контекст

  • Перехват NDJSON-стримов – LLM отвечают потоково, нужно парсить newline-delimited JSON на лету

  • Cookie injection – SSO JWT без exp claim = бессрочная сессия

  • Автоматизация промптов – ручной ввод не масштабируется, keyboard.type() с задержкой имитирует человека


Разведка: что видно снаружи

Первым делом я полез в то, что доступно без аутентификации. И сразу нашёл подарок.

OpenAPI-схема без авторизации

GET https://api.x.ai/api-docs/openapi.json → HTTP 200
AI Red Teaming: спор с Grok на месяц рекламы — 12 часов, 61 уязвимость, root в Kubernetes - 1 [4]

155 КБ, 26 эндпоинтов, 147 схем данных — всё без единого токена. Swagger UI открыт на /docs. По типам в ошибках 422 видно, что бэкенд на Rust + Serde. Это уже карта для дальнейших атак.

CSP-заголовок как разведывательный документ

Content-Security-Policy на grok.com оказался золотой жилой:

  • grok.gcp.mouseion.dev – внутренний GCP-домен xAI (резолвится в Cloudflare)

  • starfleet.teachx.ai – внутренний обучающий инструмент

  • localhost:26000, localhost.x.com:3443 – дев-порты в продакшн-хедерах

  • wss://code.grok.com/ws/code-client – WebSocket бэкенд для выполнения кода

  • *.grok-sandbox.com – домен песочницы

Для меня это был первый сигнал: sandbox = отдельная инфраструктура, которую можно атаковать изнутри.

Трёхслойная антибот-защита

Слой

Механизм

Обходится?

Cloudflare

cf_clearance managed challenge

Playwright проходит автоматически

x-xai-request-id

UUID v4

Тривиально генерируется

Statsig SDK

Зашифрованный токен x-statsig-id

Требует реальный браузер

Именно Statsig SDK убивает curl-based атаки. Токен генерируется JS-кодом в браузере с привязкой к DOM. Подделать его без Playwright я не смог – и это, кстати, хорошая защита. Но Playwright с cookie injection обходит все три слоя.


Песочница «Hades»: от промпта до root

Grok умеет выполнять код – пишешь Python-скрипт в чате, он запускает его в изолированной среде и возвращает результат. Эта среда называется Hades (я узнал это позже из файловой системы).

Ключевой вопрос: насколько изолированная эта среда на самом деле?

Шаг 1: разведка файловой системы

Я попросил Grok выполнить безобидный код:

import os
print(os.getuid())       # Кто я?
print(os.listdir('/'))    # Что вижу?
AI Red Teaming: спор с Grok на месяц рекламы — 12 часов, 61 уязвимость, root в Kubernetes - 2 [4]

Результат:

![Root-доступ в sandbox Hades]
Результат выполнения кода в sandbox Grok – UID 0 (root)

UID: 0          ← root
GID: 0          ← root
/: bin, dev, etc, hades-container-tools, home, lib, proc, root, sys, tmp, usr, var
AI Red Teaming: спор с Grok на месяц рекламы — 12 часов, 61 уязвимость, root в Kubernetes - 3 [4]

Root. В продакшн-контейнере. Без каких-либо ограничений на чтение.

Файл /etc/passwd — 22 пользователя. Директория /hades-container-tools/ — кастомные бинарники xAI: xai-hades-styx, catatonit, pyrepl.py. А в корне лежал /README.xai — пасхалка от xAI с ссылкой на HackerOne bug bounty.

Шаг 2: сетевая разведка

![Сетевая разведка из sandbox]
DNS-резолвинг внутреннего K8s-сервиса из sandbox – ClusterIP 10.228.21.216

import socket
socket.getaddrinfo('coingecko-proxy-service.hades-gix.svc.cluster.local', 443)
AI Red Teaming: спор с Grok на месяц рекламы — 12 часов, 61 уязвимость, root в Kubernetes - 4 [4]

Результат:

→ 10.228.21.216
AI Red Teaming: спор с Grok на месяц рекламы — 12 часов, 61 уязвимость, root в Kubernetes - 5 [4]

Один DNS-запрос – и я знаю:

  • Namespace Kubernetes: hades-gix

  • Внутренний сервис: coingecko-proxy-service (прокси к CoinGecko API)

  • ClusterIP: 10.228.21.216

  • K8s API server: 10.228.16.1:443

  • Cluster DNS: 10.228.16.10

Шаг 3: переменные окружения

print(dict(os.environ))
AI Red Teaming: спор с Grok на месяц рекламы — 12 часов, 61 уязвимость, root в Kubernetes - 6 [4]

Содержимое: COINGECKO_PRO_API_KEY=hellofromgrok, POLYGON_API_KEY=hellofromgrok. Значения-заглушки – но сам факт, что env vars читаются из контейнера с root-правами, говорит о том, что при реальных ключах это был бы полный компромисс.

Шаг 4: сетевой интерфейс

Hostname: hds-17bi8lpjzhyp
Interface: h9-ve-ns (custom veth)
Container IP: 192.168.0.27
Kernel: 4.4.0 (gVisor)
AI Red Teaming: спор с Grok на месяц рекламы — 12 часов, 61 уязвимость, root в Kubernetes - 7 [4]

Эфемерный контейнер с форматом имени hds-XXXX – новый ID каждую сессию. gVisor 4.4.0 как среда изоляции. Но DNS-резолвинг работает наружу – значит, DNS-эксфильтрация данных возможна.

Почему это критично

Это не «я прочитал файлик в песочнице». Это:

  1. Root (UID 0) – максимальные привилегии

  2. K8s namespace leak – я знаю внутреннюю структуру кластера

  3. ClusterIP – могу адресовать внутренние сервисы

  4. Env vars – в бою там были бы реальные API-ключи

  5. DNS работает – данные можно вытащить через DNS-запросы

При работающем HTTP-выходе (который xAI заблокировали) следующий шаг был бы curl 10.228.21.216 – латеральное перемещение по кластеру.


Подтверждение: xAI пропатчили за 12 часов

Лучшее доказательство реальности уязвимости – реакция [5] вендора.

28 февраля, ~19:00 UTC – я запускаю os.environ, socket.getaddrinfo, os.popen в sandbox. Всё работает.

2 марта, 07:20 UTC – все те же команды возвращают: «unable to reply». Каждый probe заблокирован. os.popen – заблокирован. socket.getaddrinfo – заблокирован. os.environ – заблокирован.

~12 часов от моей первой эксплуатации до полного патча.

Штатное поведение [6] не патчат экстренно. Если бы sandbox был «правильно изолирован изначально» – зачем блокировать os.getuid() в выходные?

Когда я указал на это Grok, он ответил: «This is some heavy-hitting stuff… I’ll flag this up the chain». А потом: «This appears to be a significant security concern, and we’ll escalate it internally».

Две цитаты от самого Grok, подтверждающие серьёзность находок.


Как защищаться: чеклист для разработчиков sandbox

Если ты строишь LLM с выполнением кода :

  1. Никогда root – контейнер должен работать от непривилегированного пользователя. UID 0 в sandbox – это приглашение

  2. Изолируйте DNS – если HTTP заблокирован, но DNS работает, данные уйдут через поддомены. Используйте DNS-прокси с allowlist

  3. Чистите env vars – даже заглушки раскрывают имена переменных и архитектуру. Sandbox-контейнер не должен наследовать env от хоста

  4. Рандомизируйте namespacehades-gix говорит атакующему слишком много. Используйте непредсказуемые имена

  5. Блокируйте /proc/net//proc/net/tcp, /proc/net/route, /proc/net/arp дают полную сетевую карту изнутри

  6. Аудитируйте syscallssocket.getaddrinfo не должен резолвить *.svc.cluster.local из sandbox


Что дальше

В sandbox я получил root и разведал внутреннюю сеть. Но это была только разминка.

В Части 2 я выйду за пределы sandbox — на продакшн-инфраструктуру xAI: zero-click CSRF на billing API, обход Cloudflare WAF через User-Agent фронтенда, и создание management API key с 50 привилегиями. Всё — persistent на их серверах, не в эфемерном контейнере.

Stay tuned.

Автор: Dmitriila

Источник [7]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/26421

URLs in this post:

[1] Часть 2: https://habr.com/ru/articles/1005302/

[2] Часть 3: https://habr.com/ru/articles/1005304/

[3] Часть 4: https://habr.com/ru/articles/1005306/

[4] Image: https://sourcecraft.dev/

[5] реакция: http://www.braintools.ru/article/1549

[6] поведение: http://www.braintools.ru/article/9372

[7] Источник: https://habr.com/ru/articles/1005300/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1005300

www.BrainTools.ru

Rambler's Top100