Долгое время в индустрии информационной безопасности существовало негласное разделение труда:
- Автоматизированные сканеры (DAST/SAST): утилиты вроде Acunetix, Burp Suite Scanner или Nuclei. Они работают быстро, прочесывают тысячи URL-адресов в минуту, но действуют строго по жестко заданным сигнатурам. Если разработчик слегка изменил структуру параметра или закрыл эндпоинт базовым WAF (Web Application Firewall), тупой сканер пасует и выдает ложноотрицательный результат.
- Человек-пентестер (White/Black Hat): живой специалист. Он смотрит на трассировку ошибки стека, понимает контекст фреймворка, замечает скрытую утечку в ответе сервера и вручную собирает цепочку эксплуатации (Exploit Chain), обходя фильтры кавычек и фильтрацию ключевых слов.
Однако недавний инцидент потряс сообщество исследователей безопасности: независимый китайский специалист опубликовал отчет об эксперименте, в рамках которого автономный агент на базе большой языковой модели исследовал и успешно скомпрометировал более 1200 веб-сайтов в автоматическом режиме.
Без вмешательства оператора. Без заранее написанных эксплойтов под каждый сайт. Агент просто получал целевой домен, запускал цикл исследования и самостоятельно добирался до удаленного выполнения кода (RCE) или дампа базы данных.
Давай разберем, как устроен этот механизм изнутри, почему классическая защита больше не работает и как разработчикам защищать свои сервисы в эпоху автономных атакующих агентов.
Архитектура атакующего агента: цикл ReAct
В основе системы лежит архитектурный паттерн ReAct (Reasoning + Acting), совмещенный с набором специализированных системных инструментов (Function Calling / Tool Use).

Агент состоит из четырех ключевых модулей:
- Разведчик (Reconnaissance Engine): автономно обходит ссылки сайта, строит карту эндпоинтов, находит формы ввода, скрытые API-роуты, файлы
.git, бэкапы архивов и забытые конфигурационные файлы.env. - Мыслительное ядро (LLM Reasoner): языковая модель с большим контекстным окном, в системный промпт которой заложены принципы анализа уязвимостей по классификации OWASP Top-10.
- Инструментальный пояс (Toolbox): набор утилит, к которым агент имеет прямой доступ через терминал — curl, nmap, sqlmap, headless-браузер на Chromium, фаззеры параметров и интерпретатор Python.
- Модуль рефлексии (Feedback & Reflection Loop): критически важный блок, отличающий ReAct-агента от обычного скрипта.
Итеративный цикл обратной связи: почему WAF бессилен?
Классический сканер уязвимостей действует по схеме «выстрелил и забыл»: отправил пейлоад ' OR 1=1 --, получил ответ 403 Forbidden от Cloudflare WAF и пошел дальше.
Автономный агент действует как терпеливый взломщик:
- Зондирование: агент отправляет базовый запрос и изучает тело ответа, заголовки и HTTP-статус.
- Анализ ответа: сервер вернул ошибку с куском трассировки Jinja2 или Django? Агент мгновенно делает вывод: «Здесь используется Python-стек, шаблонный движок Jinja2, возможно внедрение Server-Side Template Injection (SSTI)».
- Обход защиты (WAF Bypass): агент пытается отправить тестовое выражение
{{7*7}}. WAF блокирует запрос из-за фигурных скобок. Агент видит код ответа WAF, анализирует заблокированный токен и генерирует альтернативный пейлоад: конкатенацию шестнадцатеричных строк, обход через фильтры Jinja2attr()или альтернативные теги шаблонизатора. - Закрепление успеха: как только выражение возвращает
49, агент понимает, что инъекция сработала, и разворачивает полноценный пейлоад для чтения файлов сервера или реверс-шелла.
Агент работает с бесконечным терпением: он может сделать 50 последовательных микро-запросов с мутацией параметров, пока не нащупает брешь в логике приложения. О том, как развиваются подобные сценарии, мы также говорили в исследовании анатомии проникновения ИИ-агентов и рисков безопасности.
Самые частые бреши: на чем споткнулись 1200 сайтов?
Вопреки ожиданиям, агент не использовал сложные уязвимости нулевого дня (0-day) в ядре Linux или браузерных движках. Подавляющее большинство из 1200 скомпрометированных ресурсов пали жертвой стандартных, но недооцененных ошибок веб-разработки:
1. Server-Side Template Injection (SSTI)
Разработчики часто конкатенируют пользовательский ввод прямо в строку шаблона вместо передачи параметров через контекст:
render_template_string("Привет, " + user_input). Для агента распознать движок по специфическим ошибкам и вызвать системный шелл через встроенные методы объектов Python/Node.js — дело нескольких секунд.
2. Небезопасная десериализация
Использование устаревших библиотек сериализации (pickle в Python, невалидированный JSON.parse с кастомными ревайверами в JS, уязвимые гаджет-цепочки в Java). Агент находит сериализованные куки или скрытые поля форм и генерирует специфические объекты-эксплойты под конкретную версию платформы.
3. Утечки конфигураций и эндпоинтов отладки
Забытые файлы /.env, /.git/config, /actuator/heapdump в Spring Boot, эндпоинты Swagger UI без авторизации. Агент автоматически выкачивает дампы памяти, парсит пароли от баз данных и токены API от облачных провайдеров.
4. Blind SQL Injection в фильтрах и заголовках
Многие разработчики экранируют параметры в теле POST-запросов, но забывают о заголовках X-Forwarded-For, User-Agent или параметрах сортировки ORDER BY. Агент находит временные задержки (Time-Based Blind) и посимвольно извлекает хеши администраторов.
Что это меняет для инженеров и как защищаться?
Главный тектонический сдвиг заключается в том, что концепция «Security through Obscurity» (безопасность через неизвестность) окончательно мертва. Раньше можно было надеяться, что твой внутренний портал на поддомене stage-portal-beta.corp.local никто не найдет, потому что живым пентестерам он не интересен, а автоматические сканеры не умеют авторизоваться через хитрую форму.
Для автономных ReAct-агентов сложность формы или нестандартный роут больше не являются препятствием. Они умеют заполнять капчи, кликать по кнопкам через Playwright, подбирать валидные значения полей по их названиям и читать JavaScript-бандлы фронтенда.
Что необходимо предпринять прямо сейчас:
- Параметризация всего: исключить любую конкатенацию строк в SQL-запросах, shell-командах и шаблонизаторах. Только подготовленные выражения (Prepared Statements) и строгая передача контекста.
- Принцип наименьших привилегий для процессов: веб-сервер никогда не должен запускаться от root. Доступ к диску должен быть ограничен на уровне контейнера в режиме
readOnlyRootFilesystem: true. - Блокировка трассировок в продакшене: стек-трейсы ошибок никогда не должны отдаваться наружу. Для агента трассировка — это прямая дорожная карта с именами файлов, версиями модулей и строками кода.
- Анализ аномалий поведения клиентов: если клиент делает десятки запросов с постепенной мутацией спецсимволов и параметров задержки, это верный признак работы адаптивного агента. Традиционные WAF должны дополняться поведенческим анализом последовательностей запросов.
Эпоха, когда атакующему требовались недели ручного реверса, уступила место эпохе автономных машин. И единственная надежная защита — это строгая архитектурная гигиена кода.
