
CVE-2026-40860 के लिए रिप्रोड्यूसर — Apache Camel camel-jms/sjms/amqp JMS ObjectMessage असुरक्षित डिसीरियलाइज़ेशन (RCE)
यह प्रोजेक्ट Apache Camel के camel-jms घटक (और इसके साथ camel-sjms, camel-sjms2, camel-amqp, camel-activemq, camel-activemq6) में Java डिसीरियलाइज़ेशन कमज़ोरी को प्रदर्शित करता है, जिसे CVE-2026-40860 के रूप में ट्रैक किया गया है। JmsBinding.extractBodyFromJms() इनकमिंग JMS ObjectMessage के पेलोड को ObjectMessage.getObject() के माध्यम से , क्लास अनुमति-सूची या निषेध-सूची के डिसीरियलाइज़ करता है। चूंकि यह तब होता है जब (डिफ़ॉल्ट) होता है और Camel एक JMS है, एक हमलावर जो उपभोग की जा रही कतार/विषय पर एक क्राफ्टेड प्रकाशित कर सकता है, वह प्राप्त कर सकता है जब गैजेट चेन क्लासपाथ पर हो।
ObjectInputFiltermapJmsMessage=trueObjectMessage| गुण | मान |
|---|---|
| घटक | camel-jms (+ camel-sjms, camel-sjms2, camel-amqp, camel-activemq, camel-activemq6) |
| प्रभावित क्लास | org.apache.camel.component.jms.JmsBinding#extractBodyFromJms → jakarta.jms.ObjectMessage#getObject() |
| CWE | CWE-502: अविश्वसनीय डेटा का डिसीरियलाइज़ेशन |
| प्रभाव | रिमोट कोड निष्पादन (RCE) |
| ट्रिगर | Camel JMS उपभोक्ता + mapJmsMessage=true (डिफ़ॉल्ट) + एक ObjectMessage जिसे हमलावर एन्क्यू कर सकता है |
| प्रभावित संस्करण | 3.0.0 से 4.14.7 से पहले, 4.15.0 से 4.18.2 से पहले, 4.19.0 से 4.20.0 से पहले |
| निर्धारित संस्करण | 4.14.7, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23321 |
| रिपोर्टर | वेंकटरमन कुमार (Securin) |
// JmsBinding.extractBodyFromJms(Exchange, Message) - प्रभावित संस्करण
if (message instanceof ObjectMessage objectMessage) {
Object payload = objectMessage.getObject(); // <-- बिना ObjectInputFilter के डिसीरियलाइज़ करता है
if (payload instanceof DefaultExchangeHolder holder) {
...
}
return payload;
}
getObject() JMS प्रदाता के ObjectInputStream.readObject() को संदेश बॉडी पर चलाता है। Camel कोई क्लास फ़िल्टरिंग नहीं जोड़ता, इसलिए क्लासपाथ पर एक गैजेट चेन डिसीरियलाइज़ेशन के दौरान निष्पादित होती है।
फ़िक्स (4.14.7 / 4.18.2 / 4.20.0) एक डिफ़ॉल्ट ObjectInputFilter अनुमति-सूची (java.**;javax.**;org.apache.camel.**;!*) जोड़ता है, जिसे नए deserializationFilter एंडपॉइंट विकल्प या JVM-व्यापी -Djdk.serialFilter के माध्यम से अनुकूलित किया जा सकता है। फ़िक्स के लिए Camel के अपने कमिट संदेश पर ध्यान दें:
यह जाँच JMS प्रदाता द्वारा पेलोड को पहले ही डिसीरियलाइज़ करने के बाद चलती है। यह अप्रत्याशित क्लासों को रूट तक फैलने से रोकता है, लेकिन यह अपने आप उन गैजेट चेन को नहीं रोक सकता जिनका
readObject()प्रदाता केObjectInputStreamके अंदर फ़ायर होता है। पूर्ण सुरक्षा के लिए JMS प्रदाता के अपने डिसीरियलाइज़ेशन फ़िल्टर और/या JVM-व्यापी-Djdk.serialFilterको कॉन्फ़िगर करना आवश्यक है।
इसलिए पूर्ण सुरक्षा = Camel को अपग्रेड करें + प्रदाता / JVM फ़िल्टर को प्रतिबंधित करें। यह PoC trustAllPackages=true (एक सामान्य वास्तविक-दुनिया सेटिंग) के साथ ActiveMQ क्लाइंट का उपयोग करता है ताकि प्रदाता पेलोड को डिसीरियलाइज़ करे; प्रभावित Camel संस्करण पर कोई और चीज़ बाधा नहीं डालती।
from("jms:queue:evil") // mapJmsMessage डिफ़ॉल्ट रूप से true है
.log("Consumed: ${body.class.name}");
बस ObjectMessage प्राप्त करना डिसीरियलाइज़ेशन को ट्रिगर करता है — रूट बॉडी अप्रासंगिक है।
पीड़ित Camel JMS उपभोक्ता है। हमलावर कोई भी उत्पादक है जो कतार पर प्रकाशित कर सकता है। दोनों एक वास्तविक Apache ActiveMQ Artemis ब्रोकर से बात करते हैं जो Docker में चल रहा है।
CVE-2026-40860/
├── pom.xml # camel-jms 4.18.1 + activemq-client 6.2.4 + commons-collections 3.2.1 (गैजेट)
├── Dockerfile # ऐप चलाता है (--add-opens केवल गैजेट बनाने के लिए)
├── docker-compose.yml # Artemis ब्रोकर (quay.io) + रिप्रोड्यूसर ऐप
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── JmsConfig.java # OpenWire ConnectionFactory (trustAllPackages=true) + jms घटक
│ ├── VictimRoute.java # पीड़ित: from("jms:queue:evil")
│ ├── Gadget.java # CommonsCollections6 गैजेट, getObject() के दौरान फ़ायर होता है
│ └── ExploitController.java # हमलावर: कतार पर ObjectMessage(gadget) प्रकाशित करता है
└── resources/
└── application.properties
वास्तविक हमले में सीरियलाइज़्ड बाइट्स हमलावर द्वारा ऑफ़लाइन उत्पन्न की जाती हैं (उदा. ysoserial के साथ); केवल पीड़ित को अपने क्लासपाथ पर गैजेट चेन की आवश्यकता होती है। यह PoC सुविधा के लिए गैजेट को प्रक्रिया में बनाता है, यही कारण है कि JVM
--add-opens java.base/java.util=ALL-UNNAMEDके साथ चलता है — यह एक गैजेट-निर्माण विवरण है, कमज़ोरी से संबंधित नहीं।
mvn clean package -DskipTests
docker compose up -d --build
यह एक Artemis ब्रोकर (quay.io/artemiscloud/activemq-artemis-broker) और रिप्रोड्यूसर ऐप प्रारंभ करता है, जो OpenWire के माध्यम से इससे जुड़ता है।
curl -s http://localhost:8080/exploit/attack
# -> कतार 'evil' पर ObjectMessage प्रकाशित हुआ।
# camel-jms उपभोक्ता ने ObjectMessage.getObject() को कॉल किया -> डिसीरियलाइज़ेशन।
#
# >>> RCE प्रमाण — /tmp/pwned मौजूद है: true
docker exec cve-2026-40860 ls -la /tmp/pwned
docker compose down
कोई भी Camel JMS उपभोक्ता (camel-jms, camel-sjms, camel-sjms2, camel-amqp, camel-activemq, camel-activemq6) जो किसी ऐसे गंतव्य से पढ़ रहा है जिस पर हमलावर प्रकाशित कर सकता है — एक साझा ब्रोकर, खुले उत्पादकों वाला विषय, अविश्वसनीय अपस्ट्रीम द्वारा फ़ीड की जाने वाली कतार — mapJmsMessage=true (डिफ़ॉल्ट) के साथ।
mapJmsMessage=true (डिफ़ॉल्ट) वाला एक Camel JMS उपभोक्ता।ObjectMessage एन्क्यू कर सकता है।trustAllPackages=true, या बिना प्रतिबंधात्मक फ़िल्टर वाला प्रदाता)।commons-collections:3.2.1)।4.14.7 / 4.18.2 / 4.20.0 पर अपग्रेड करें, और डिसीरियलाइज़ेशन को अंत से अंत तक प्रतिबंधित करें:
-Djdk.serialFilter=java.**;org.apache.camel.**;!* (या एंडपॉइंट के नए deserializationFilter विकल्प का उपयोग करें)।trustedPackages, trustAllPackages=true का उपयोग न करें)।अपग्रेड करने तक:
ObjectMessage पेलोड को प्राथमिकता दें; जहाँ कच्चा संदेश स्वीकार्य हो वहाँ mapJmsMessage=false सेट करें।trustAllPackages=true न करें।-Djdk.serialFilter लागू करें।यह रिप्रोड्यूसर केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से खुलासा और ठीक की गई कमज़ोरी के लिए। इसका उपयोग सिस्टम के विरुद्ध स्पष्ट अनुमति के बिना न करें।