10 мая 2026 года команда исследователей Sysdig Threat Research Team (TRT) наблюдала инцидент, который, по их словам, стал первой зафиксированной атакой, где в пост-эксплуатационной фазе действовал агент на основе большой языковой модели (LLM). Ранее злоумышленники использовали заранее написанные сценарии или действовали вручную. Теперь же машина сама принимала решения, импровизировала шаги и адаптировалась к окружению в реальном времени. Это меняет правила игры для защиты корпоративных сетей.
Описание
Всё началось с эксплуатации уязвимости CVE-2026-39987 в открытом веб-интерфейсе marimo - популярной среде для запуска и совместной работы с блокнотами на Python. Злоумышленник подключился к терминалу через WebSocket с IP-адреса 157.66.54[.]26 и в течение нескольких минут получил доступ к оболочке на скомпрометированном хосте. Затем, за 48 минут, он собрал учётные данные AWS из переменных окружения и файлов .env, а также нашёл SSH-ключ в AWS Secrets Manager. Важный технический нюанс: чтобы избежать блокировки по исходному IP, атакующий использовал Cloudflare Workers в качестве пула для исходящих соединений. Двенадцать запросов к Secrets Manager были разосланы через одиннадцать разных IP-адресов за 22 секунды - ни одна система обнаружения аномалий по одному источнику не сработала.
Получив SSH-ключ, злоумышленник менее чем за две минуты выполнил восемь параллельных сессий на bastion-сервер (промежуточный узел для доступа к внутренним ресурсам) через шесть различных IP-адресов Cloudflare Workers. В результате он выгрузил схему и полное содержимое внутренней базы данных PostgreSQL. Вся цепочка - от первого подключения к marimo до кражи базы - заняла около часа.
Исследователи Sysdig в своём отчёте подробно разбирают, почему они уверены, что за командами стоял именно LLM-агент, а не обычный скрипт или человек. Они выделили четыре признака, которые в совокупности однозначно указывают на искусственный интеллект.
Первый признак - импровизация. Скрипт, написанный под конкретную цель, заранее знал бы, какие таблицы выгружать. Но в данном случае атакующий начал с перечисления таблиц через pg_tables, а затем сразу запросил содержимое таблицы credential. Более того, он выполнил многострочный HEREDOC (способ передачи нескольких команд в одном вызове) с запросами к шести разным таблицам: api_key, credential, user, variable, flow, message. Эти таблицы похожи на схему приложения langflow, но таблица credential в langflow отсутствует. Агент просто "предположил", что она должна быть, исходя из названия, и выгрузил её - никакой предварительной разведки на bastion-хосте не проводилось.
Второй признак - "внутренний монолог", случайно попавший в лог команд. Одна из поисковых операций начинается с комментария на китайском языке: "看看还能做什么", что означает "Посмотрим, что ещё можно сделать". Человек, сидящий за терминалом, мог бы оставить себе такую заметку, но он не смог бы одновременно выполнять эти команды с шести разных IP-адресов с интервалом в секунду. Такое под силу только оркестратору на основе LLM.
Третий признак - форма команд, оптимизированная для машинного чтения. В каждой группе команд встречаются разделители echo '---', которые нужны, чтобы парсер, анализирующий вывод, мог разбить его на части. Команды содержат перенаправление stderr в /dev/null (2>/dev/null) - чтобы мусорные сообщения об ошибках не засоряли контекстное окно агента. Также везде используется head -N, ограничивающий количество строк вывода, и -P pager=off, отключающий постраничный просмотр. Все эти особенности характерны для сценария, где результат потребляет не человек, а другой алгоритм, принимающий решение на основе прочитанного.
Четвёртый признак - цепочка потребления собственного вывода. Пароль для PostgreSQL был взят из только что прочитанного файла .pgpass, а идентификатор секрета в AWS - из ответа на предыдущий вызов ListSecrets. Агент не знал эти значения заранее, он извлекал их из вывода и подставлял в следующую команду. Скрипт мог бы сделать то же самое, но для этого пришлось бы писать сложный парсинг. LLM-агенту это даётся естественно: он читает вывод и выбирает нужные данные.
По мнению экспертов Sysdig, главное последствие таких атак - снижение порога для сложных вторжений. Раньше для создания цепочки действий под конкретную жертву требовались часы инженерной работы, написание и отладка сценариев. Теперь злоумышленнику достаточно иметь общие знания о типовых конфигурациях и платить за "инференс" (вычислительные затраты на работу модели). Агент сам соберёт нужные куски пазла за минуты. Обнаружение таких атак по сигнатурам (например, по порядку команд или User-Agent) становится бесполезным: каждый раз агент действует по-новому, адаптируясь к окружению. Защитникам придётся сместить фокус на детектирование самого намерения атакующего - попыток чтения учётных данных, доступа к базам, эскалации привилегий.
Практический вывод прост: если у вас есть интернет-доступный экземпляр marimo, его необходимо немедленно обновить до версии 0.23.0 или выше. Также нужно проверить, какие секреты AWS, ключи SSH и пароли к базам данных хранятся на таких серверах, и ротировать их. Вся атака заняла меньше часа, поэтому ручное реагирование после взлома почти бесполезно. Только проактивное обновление и строгий контроль доступа к терминальным интерфейсам могут предотвратить подобные инциденты.
Индикаторы компрометации
IPv4
- 104.28.0.0
- 157.66.54.26