
Reprodução de CVE: cve-2026-34486-tomcat_encrypt_bypass_reproduction
| Campo | Valor |
|---|
| CVE | CVE-2026-34486 |
| CVSS | 7.5 HIGH |
| Tipo | Falta de Criptografia de Dados Sensíveis |
| Componente | EncryptInterceptor de Cluster do Apache Tomcat |
| Publicado | 2026 |
O CVE-2026-34486 é uma regressão introduzida pela correção incompleta de CVE-2026-29146. Na replicação de cluster do Apache Tomcat, o EncryptInterceptor é responsável por criptografar e autenticar mensagens de cluster. Uma refatoração na correção do CVE-2026-29146 moveu inadvertidamente a chamada super.messageReceived(msg) para fora do bloco try-catch que trata falhas de descriptografia. Como resultado, quando uma mensagem falha na descriptografia (ou seja, é recebida em texto simples, mas o interceptor espera dados criptografados), a mensagem bruta não criptografada ainda é passada adiante na cadeia de handlers, em vez de ser descartada.
O método EncryptInterceptor.messageReceived() é invocado quando uma mensagem de cluster chega. O fluxo esperado é:
super.messageReceived(msg) para encaminhar a mensagem descriptografadaNas versões vulneráveis, a lógica de descriptografia/validação permanece envolvida em um try-catch, mas a cadeia de chamadas foi reestruturada de modo que super.messageReceived(msg) executa fora do bloco try-catch que protege a descriptografia. A variável msg é declarada antes do try-catch e atribuída dentro dele. Quando a descriptografia lança uma exceção, msg mantém seu valor inicial (bruto/não criptografado), e o bloco catch apenas registra o erro — ele não retorna antecipadamente. A execução continua para super.messageReceived(msg) com os dados brutos não processados.
Isso significa que um atacante que consiga alcançar a porta de cluster do Tomcat pode injetar mensagens arbitrárias não criptografadas que o interceptor aceitará e processará.
public void messageReceived(Message msg) {
// msg arrives raw
try {
// decrypt and populate msg fields
decrypt(msg);
} catch (Exception e) {
log.error("Decryption failed", e);
// BUG: no return statement here
}
// msg is still the original unencrypted object when catch is hit
super.messageReceived(msg); // outside try-catch → passes raw data
}
A correção deve garantir que:
super.messageReceived(msg) seja chamado apenas dentro do bloco try, após a descriptografia bem-sucedida, ou| Produto | Versões |
|---|---|
| Apache Tomcat 11 | 11.0.20 |
| Apache Tomcat 10 | 10.1.53 |
| Apache Tomcat 9 | 9.0.116 |
EncryptInterceptor<Receiver>)EncryptInterceptor configurado no server.xml.O script exploit.py neste diretório demonstra o bypass. Ele constrói uma mensagem mínima de cluster do Tomcat (com base no formato de serialização do ClusterMessage) e a envia diretamente para a porta do receiver, sem qualquer criptografia. Um interceptor vulnerável aceitará e encaminhará a mensagem apesar da criptografia ausente.
Atualize para uma versão corrigida do Apache Tomcat:
| Produto | Versão Corrigida |
|---|---|
| Apache Tomcat 11 | 11.0.21+ |
| Apache Tomcat 10 | 10.1.54+ |
| Apache Tomcat 9 | 9.0.117+ |
Se não for possível atualizar imediatamente, restrinja o acesso de rede à porta de cluster do Tomcat apenas a hosts confiáveis (por exemplo, por meio de regras de firewall ou vinculando o receiver a uma interface de loopback ou privada).