
CVE-2026-78165 के लिए रन करने योग्य प्रूफ-ऑफ-कॉन्सेप्ट रिप्रोड्यूसर, जो Apache Camel camel-spring-redis में Redis PUBLISH पेलोड के अनफ़िल्टर्ड JDK डीसेरियलाइज़ेशन को प्रदर्शित करता है।
Apache Camel की उस भेद्यता के लिए चलाने योग्य प्रूफ-ऑफ-कॉन्सेप्ट रिप्रोड्यूसर, जिसमें camel-spring-redis, जब कोई
serializer विकल्प कॉन्फ़िगर नहीं होता था, तो एक नंगला JdkSerializationRedisSerializer बनाता था जिसमें कोई java.io.ObjectInputFilter नहीं था
और इसे हर रीड के लिए उपयोग करता था। RedisConsumer.setBody इसे सब्सक्राइब किए गए चैनलों पर प्रकाशित प्रत्येक संदेश के कच्चे बाइट्स पर लागू करता था,
Exchange बनाए जाने से पहले — इसलिए कोई भी अभिनेता जो सब्सक्राइब किए गए चैनल पर PUBLISH जारी कर सकता था, सीधे डीसेरियलाइज़ेशन सिंक तक पहुँच सकता था और किसी मनमाने सीरियलाइज़्ड ऑब्जेक्ट ग्राफ़ के
readObject को निष्पादित कर सकता था (रिमोट कोड एक्ज़ीक्यूशन, CWE-502)। वही डिफ़ॉल्ट सीरियलाइज़र प्रोड्यूसर रीड कमांड्स
(GET/HGET/HGETALL/HVALS) और SpringRedisIdempotentRepository को भी सपोर्ट करता था।
| रनटाइम | डायरेक्टरी | स्टैक |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-redis 4.22.0 (प्रभावित; 4.22.1 में ठीक किया गया) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-spring-redis 3.29.0 (Camel 4.15.0, प्रभावित) |
यह दोष 2.11.0 में कंपोनेंट की शुरुआत से ही मौजूद है, इसलिए हर प्रभावित रिलीज़ और नवीनतम Camel Quarkus में मौजूद Camel 4.15.0 भी भेद्य है। फ़िक्स Camel 4.18.5 / 4.22.1 / 4.23.0 में आता है; Spring Boot मॉड्यूल प्रभावित बिल्ड (4.22.0) और फ़िक्स्ड बिल्ड (4.22.1) दोनों को चलाता है। अभी तक कोई भी रिलीज़ किया गया Camel Quarkus फ़िक्स्ड Camel को बंडल नहीं करता।
ऐप एक Camel रूट चलाता है जो cve-channel को बिना किसी serializer विकल्प के SUBSCRIBE करता है (इसलिए डिफ़ॉल्ट
JdkSerializationRedisSerializer उपयोग होता है)। हमलावर एक साधारण Redis क्लाइंट है जो केवल उस चैनल पर PUBLISH कर सकता है
— इसकी Camel प्रोसेस तक कोई पहुँच नहीं है। यह जानबूझकर बिनाइन com.example.PwnMarker के कच्चे सीरियलाइज़्ड बाइट्स प्रकाशित करता है,
जिसका readObject केवल एक JVM-ग्लोबल फ़्लैग पलटता है (कोई गैजेट नहीं, कोई कमांड नहीं)। प्रभावित
बिल्ड पर कंज़्यूमर इसे डीसेरियलाइज़ करता है और readObject चलता है; फ़िक्स्ड बिल्ड पर डिफ़ॉल्ट अनुमति-सूची (मानक
java./javax. और org.apache.camel. प्रकार) com.example.PwnMarker को
InvalidClassException: filter status: REJECTED के साथ अस्वीकार कर देती है।
cd camel-spring-boot
mvn clean package
docker compose up -d --build # starts Redis + the reproducer
curl -s http://localhost:8080/exploit/attack
docker compose down
प्रभावित बिल्ड पर अपेक्षित आउटपुट:
Attacker connects to Redis redis:6379 and PUBLISHes a serialized com.example.PwnMarker to channel 'cve-channel'.
PUBLISH delivered to 1 subscriber(s).
Result:
>>> PROVEN: the Redis consumer deserialized the attacker-published, non-allow-listed class
>>> (com.example.PwnMarker) with no ObjectInputFilter — its readObject executed.
| गुण | मान |
|---|---|
| घटक | camel-spring-redis (camel-spring-redis-starter / camel-quarkus-spring-redis) |
| CWE | CWE-502 (अविश्वसनीय डेटा का डीसेरियलाइज़ेशन) |
| गंभीरता | उच्च |
| आक्रमण वेक्टर | किसी चैनल पर PUBLISH करना जिसकी सदस्यता कोई Camel spring-redis उपभोक्ता लेता है (या उत्पादक द्वारा पढ़ी जाने वाली Redis कुंजी पर नियंत्रण); डिफ़ॉल्ट सीरियलाइज़र पेलोड को बिना किसी फ़िल्टर के डीसेरियलाइज़ करता है |
| प्रभाव | किसी रूट लॉजिक के चलने से पहले ही गैजेट क्लास के माध्यम से Camel प्रक्रिया के भीतर रिमोट कोड निष्पादन |
| प्रभावित संस्करण | 2.11.0 से 4.18.5 से पहले तक, 4.19.0 से 4.22.1 से पहले तक |
| ठीक किए गए संस्करण | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24421 |
| श्रेय | Leon Zlobecki |
सलाहकारी सूचना: https://camel.apache.org/security/CVE-2026-78165.html
एक नया deserializationFilter एंडपॉइंट विकल्प उस फ़िल्टर को नियंत्रित करता है जो डिफ़ॉल्ट सीरियलाइज़र के पेलोड पढ़ते समय लागू होता है। जब यह सेट न हो, तो यदि मौजूद हो तो JVM-व्यापी jdk.serialFilter का पालन किया जाता है, अन्यथा एक रूढ़िवादी अनुमति-सूची (मानक Java और Apache Camel प्रकार; java.net अस्वीकृत) लागू की जाती है, और 4.23.0/4.22.1 पर JEP-290 ग्राफ़-आकार सीमाएँ अतिरिक्त रूप से लागू की जाती हैं। सीरियलाइज़र को उसके Converter-आधारित कंस्ट्रक्टर के माध्यम से एक डीसेरियलाइज़िंग कन्वर्टर के साथ बनाया जाता है जो ग्राफ़ पढ़े जाने से पहले स्ट्रीम पर फ़िल्टर सेट करता है। serializer को कस्टम RedisSerializer पर सेट करना अभी भी फ़िल्टर को बायपास करता है, क्योंकि तब Camel यह नियंत्रित नहीं करता कि पेलोड कैसे पढ़ा जाता है।
JVM-व्यापी -Djdk.serialFilter=... सेट करें (प्रभावित पथ इसका पालन करता है), या serializer एंडपॉइंट विकल्प को गैर-Java सीरियलाइज़र जैसे StringRedisSerializer पर सेट करें (serializer विकल्प के रूप में, न कि केवल कस्टम redisTemplate पर)। Redis पर प्रमाणीकरण आवश्यक करें और यह प्रतिबंधित करें कि कौन सदस्यता लिए गए चैनलों पर प्रकाशित कर सकता है।
यह रिपॉज़िटरी शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित की गई है: Apache Camel उपयोगकर्ताओं को भेद्यता को समझने, यह सत्यापित करने में मदद करने के लिए कि क्या वे प्रभावित हैं, और यह पुष्टि करने के लिए कि अपग्रेड करने से यह हल हो जाती है। पेलोड एक सौम्य मार्कर है जो कोई कोड निष्पादित नहीं करता। इस सामग्री का उपयोग उन सिस्टमों के विरुद्ध न करें जिनके आप स्वामी या संचालक नहीं हैं।