
CVE-2026-43865 के लिए पुनरुत्पादक — Apache Camel camel-hazelcast डिफ़ॉल्ट-कॉन्फ़िगर्ड इंस्टेंस असुरक्षित Java डिसीरियलाइज़ेशन (RCE)
यह प्रोजेक्ट Apache Camel के camel-hazelcast घटक में Java डीसीरियलाइज़ेशन भेद्यता प्रदर्शित करता है, जिसे CVE-2026-43865 के रूप में ट्रैक किया जाता है। जब Camel स्वयं Hazelcast Config बनाता है — अर्थात जब कोई उपयोगकर्ता-आपूर्ति HazelcastInstance, hazelcastConfigUri, या संदर्भित Config बीन प्रदान नहीं की जाती — तो यह कोई Java डीसीरियलाइज़ेशन फ़िल्टर लागू नहीं करता (न तो Hazelcast का JavaSerializationFilterConfig और न ही Camel-पक्षीय ObjectInputFilter)। Hazelcast क्लस्टर प्रोटोकॉल पर आने वाली वस्तुएँ इसलिए Hazelcast की सीरियलाइज़ेशन परत (ObjectInputStream.readObject) के अंदर बिना किसी क्लास प्रतिबंध के डीसीरियलाइज़ की जाती हैं। एक हमलावर जो क्लस्टर में शामिल हो सकता है या उस तक पहुँच सकता है, एक निर्मित सीरियलाइज़्ड ऑब्जेक्ट प्रकाशित कर सकता है जो हर Camel नोड पर डीसीरियलाइज़ होता है — रिमोट कोड एक्ज़ीक्यूशन, जो डिफ़ॉल्ट रूप से मौजूद है और किसी ऑप्ट-इन एंडपॉइंट कॉन्फ़िगरेशन की आवश्यकता नहीं रखता।
परामर्श: https://camel.apache.org/security/CVE-2026-43865.html
यह Hazelcast-लाइब्रेरी परामर्श CVE-2016-10750 / CVE-2022-36418 (जो Hazelcast के अपने कोड से संबंधित हैं) से भिन्न है। यहाँ दोष Camel का है जो Hazelcast द्वारा प्रदान की गई डीसीरियलाइज़ेशन सुरक्षा को लागू नहीं करता।
जब कोई इंस्टेंस/कॉन्फ़िग आपूर्ति नहीं की जाती, HazelcastDefaultComponent स्टॉक कॉन्फ़िग से इंस्टेंस बनाता है और कोई सीरियलाइज़ेशन फ़िल्टर सेट नहीं करता:
// HazelcastDefaultComponent - प्रभावित 4.18.2
if (hazelcastInstance == null && config == null) {
config = new XmlConfigBuilder().build();
config.getProperties().setProperty("hazelcast.version.check.enabled", "false");
config.getProperties().setProperty("hazelcast.phone.home.enabled", "false");
hzInstance = Hazelcast.newHazelcastInstance(config); // कोई JavaSerializationFilterConfig नहीं
}
सुधार Camel द्वारा स्वयं बनाए गए इंस्टेंस पर एक डिफ़ॉल्ट फ़िल्टर (व्हाइटलिस्ट java./javax./org.apache.camel., ब्लैकलिस्ट java.net.) डालता है, जबकि उपयोगकर्ता-आपूर्ति Config/HazelcastInstance को अछूता छोड़ देता है:
// सुधारित 4.18.3 / 4.21.0
config.getProperties().setProperty("hazelcast.phone.home.enabled", "false");
HazelcastSerializationFilterHelper.applyDefault(config); // <-- जोड़ा गया
hzInstance = Hazelcast.newHazelcastInstance(config);
कोई भी संरचना जो डीसीरियलाइज़ की गई वस्तु को Camel को सौंपती है, इसे ट्रिगर करती है। यह PoC एक queue कंज़्यूमर का उपयोग Poll मोड में करता है, जहाँ IQueue.poll() Camel द्वारा रूट करने से पहले हेड तत्व को डीसीरियलाइज़ करता है:
// HazelcastQueueConsumer (Poll मोड) - प्रभावित
final Object body = queue.poll(config.getPollingTimeout(), TimeUnit.MILLISECONDS); // readObject, कोई फ़िल्टर नहीं
exchange.getIn().setBody(body);
from("hazelcast-queue:cve?queueConsumerMode=Poll") // Camel डिफ़ॉल्ट (अनफ़िल्टर्ड) इंस्टेंस बनाता है
.log("Consumed: ${body.class.name}");
पीड़ित Camel नोड (एक Hazelcast सदस्य) है। हमलावर कोई भी पक्ष है जो क्लस्टर तक पहुँच सकता है। यह स्व-निहित PoC एक Hazelcast क्लाइंट (हमलावर) चलाता है जो उसी सिंगल-सदस्य क्लस्टर (127.0.0.1:5701 पर dev) में शामिल होता है और पीड़ित द्वारा उपभोग की जाने वाली कतार में एक गैजेट प्रस्तुत करता है।
CVE-2026-43865/
├── pom.xml # camel-hazelcast 4.18.2 + commons-collections 3.2.1 (गैजेट)
├── Dockerfile # ऐप चलाता है (गैजेट निर्माण के लिए --add-opens; लूपबैक क्लस्टर पता)
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # पीड़ित: hazelcast-queue कंज़्यूमर (डिफ़ॉल्ट इंस्टेंस)
│ ├── Gadget.java # CommonsCollections6 गैजेट, Hazelcast डीसीरियलाइज़ेशन के दौरान चालू होता है
│ └── ExploitController.java # हमलावर: Hazelcast क्लाइंट कतार को गैजेट प्रस्तुत करता है
└── resources/
└── application.properties
वास्तविक हमले में सीरियलाइज़्ड बाइट्स हमलावर के अपने Hazelcast क्लाइंट/सदस्य द्वारा उत्पन्न होते हैं; केवल पीड़ित को अपने क्लासपाथ पर गैजेट चेन की आवश्यकता होती है। यह PoC गैजेट को इन-प्रोसेस बनाता है, यही कारण है कि JVM
--add-opens java.base/java.util=ALL-UNNAMEDके साथ चलता है — यह गैजेट-निर्माण का विवरण है, भेद्यता से असंबंधित।
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
# -> क्लस्टर क्लाइंट के रूप में hazelcast कतार 'cve' को गैजेट प्रस्तुत किया गया।
# Camel नोड का queue.poll() इसे Hazelcast के माध्यम से डीसीरियलाइज़ करता है (कोई फ़िल्टर नहीं)।
#
# >>> RCE प्रमाण — /tmp/pwned मौजूद है: true
docker exec cve-2026-43865 ls -la /tmp/pwned
docker compose down
कोई भी Camel रूट जो hazelcast कंज़्यूमर (hazelcast-topic, hazelcast-queue, hazelcast-seda,
hazelcast-map, hazelcast-multimap, hazelcast-replicatedmap, hazelcast-list, hazelcast-set), या
HazelcastAggregationRepository / HazelcastIdempotentRepository का उपयोग करता है, जब भी प्रबंधित इंस्टेंस
Camel के डिफ़ॉल्ट कॉन्फ़िगरेशन से बनाया जाता है और एक हमलावर क्लस्टर तक पहुँच सकता है।
HazelcastInstance / hazelcastConfigUri / Config बीन नहीं)।commons-collections:3.2.1)।4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23414) में अपग्रेड करें, जो Camel द्वारा अपने स्वयं के डिफ़ॉल्ट कॉन्फ़िगरेशन से बनाए गए इंस्टेंस पर एक डिफ़ॉल्ट Hazelcast JavaSerializationFilterConfig लागू करता है।
अपग्रेड करने तक:
JavaSerializationFilterConfig, या JVM-व्यापी -Djdk.serialFilter=!java.net.**;java.**;javax.**;org.apache.camel.**;!*)।यह रिप्रोड्यूसर केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और सुधारित भेद्यता के लिए। स्पष्ट अनुमति के बिना इसे सिस्टम के विरुद्ध उपयोग न करें।
| गुण | मान |
|---|
| घटक | camel-hazelcast (कोई भी कंज़्यूमर + HazelcastAggregationRepository / HazelcastIdempotentRepository) |
| प्रभावित क्लास | org.apache.camel.component.hazelcast.HazelcastDefaultComponent (डिफ़ॉल्ट-कॉन्फ़िग इंस्टेंस निर्माण) |
| CWE | CWE-502: अविश्वसनीय डेटा का डीसीरियलाइज़ेशन |
| प्रभाव | क्लस्टर में हर Camel नोड पर रिमोट कोड एक्ज़ीक्यूशन (RCE) |
| ट्रिगर | एक हेज़लकास्ट कंज़्यूमर/रिपॉज़िटरी जिसका प्रबंधित इंस्टेंस Camel के डिफ़ॉल्ट कॉन्फ़िगरेशन से बनाया गया है |
| प्रभावित संस्करण | 4.0.0 से पहले 4.14.8 तक, 4.15.0 से पहले 4.18.3 तक, 4.19.0 से पहले 4.21.0 तक |
| सुधारित संस्करण | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23414 |
| रिपोर्टर | gaorenyusi |