
CVE-2026-43866 के लिए पुनरुत्पादक — Apache Camel camel-jms जाली DefaultExchangeHolder CVE-2026-40860 डिसीरियलाइज़ेशन फ़िल्टर को बायपास करता है (एक्सचेंज-स्टेट इंजेक्शन)
यह प्रोजेक्ट CVE-2026-43866, Apache Camel के camel-jms (और camel-sjms / JMS-परिवार) घटकों में CVE-2026-40860 सुधार का एक बाईपास प्रदर्शित करता है। CVE-2026-40860 ने आने वाले JMS ObjectMessage पेलोड के लिए एक पोस्ट-डिसीरियलाइज़ेशन क्लास अनुमति-सूची (java.**;javax.**;org.apache.camel.**;!*) जोड़ा। लेकिन org.apache.camel.support.DefaultExchangeHolder अनुमति-सूचीबद्ध org.apache.camel.** नेमस्पेस में रहता है, इसलिए एक ObjectMessage जिसका शीर्ष-स्तरीय ऑब्जेक्ट एक DefaultExchangeHolder है, जाँच पास कर देता है। प्राप्त करने वाला पक्ष फिर की आवश्यकता उस पर कॉल करता है — होल्डर के प्रत्येक गैर-नल फील्ड को रूटेड एक्सचेंज (बॉडी, IN/OUT हेडर, एक्सचेंज प्रॉपर्टीज, वेरिएबल्स, एक्सचेंज आईडी, अपवाद) में लिखता है। इस प्रकार, एक हमलावर जो प्रकाशित कर सकता है, — रूटिंग, हेडर, प्रॉपर्टीज और त्रुटि प्रबंधन में हेरफेर करने के लिए।
transferExchangeDefaultExchangeHolder.unmarshal()ObjectMessagejava.* प्रकारों का उपयोग करके मनमाना एक्सचेंज स्थिति इंजेक्ट कर सकता है — किसी डिसीरियलाइज़ेशन गैजेट श्रृंखला की आवश्यकता नहीं| प्रॉपर्टी | मान |
|---|---|
| घटक | camel-jms (+ camel-sjms, camel-sjms2, camel-amqp, camel-activemq, camel-activemq6) |
| प्रभावित वर्ग | org.apache.camel.component.jms.JmsBinding#extractBodyFromJms → DefaultExchangeHolder.unmarshal |
| CWE | CWE-502 (अविश्वसनीय डेटा का डिसीरियलाइज़ेशन) + CWE-20 (अनुचित इनपुट सत्यापन) |
| प्रभाव | एक्सचेंज-स्थिति इंजेक्शन: हमलावर-नियंत्रित बॉडी, हेडर, प्रॉपर्टीज, वेरिएबल्स, अपवाद |
| प्रकृति | CVE-2026-40860 क्लास-फ़िल्टर सुधार का बाईपास (इसमें कोई दोष नहीं) |
| प्रभावित संस्करण | From 3.0.0 before 4.14.8, from 4.15.0 before 4.18.3, from 4.19.0 before 4.21.0 |
| स्थिर संस्करण | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23373 (jms), CAMEL-23409 (sjms) |
| रिपोर्टर | gaorenyusi |
// JmsBinding.extractBodyFromJms(...) - affected 4.18.2
if (message instanceof ObjectMessage objectMessage) {
Object payload = objectMessage.getObject();
checkDeserializedClass(payload); // CVE-2026-40860 allow-list: java.**;javax.**;org.apache.camel.**;!*
if (payload instanceof DefaultExchangeHolder holder) { // <-- DefaultExchangeHolder is org.apache.camel.** -> passes
DefaultExchangeHolder.unmarshal(exchange, holder); // <-- writes forged state into the Exchange; NO transferExchange gate
Map<String, Object> jmsHeaders = extractHeadersFromJms(message, exchange);
exchange.getIn().getHeaders().putAll(jmsHeaders);
return exchange.getIn().getBody();
} else {
return payload;
}
}
असममिति: भेजने वाला पक्ष ObjectMessage/transferExchange निर्माण को गेट करता है, लेकिन प्राप्त करने वाला पक्ष किसी भी डिसीरियलाइज़ किए गए DefaultExchangeHolder को अनमार्शल करता है। सुधार (4.14.8 / 4.18.3 / 4.21.0) एक नया objectMessageEnabled विकल्प जोड़ता है (security = "insecure:serialization", डिफ़ॉल्ट false) — एक आने वाला ObjectMessage स्पष्ट रूप से सक्षम होने तक बिल्कुल भी डिसीरियलाइज़ नहीं किया जाता है, इसलिए एक नकली होल्डर कभी unmarshal() तक नहीं पहुँच सकता। (यह उन रूट्स के लिए एक ब्रेकिंग चेंज है जो ObjectMessage / transferExchange पर निर्भर हैं।)
JMS-प्रदाता अनुमति-सूची मदद नहीं करती। यह PoC ActiveMQ क्लाइंट को एक यथार्थवादी, लॉक-डाउन
trustedPackages = [java, javax, org.apache.camel]के साथ कॉन्फ़िगर करता है —org.apache.camelप्रविष्टि बिल्कुल वही है जिसे एक असलीtransferExchangeका उपयोग करने वाली डिप्लॉयमेंट को विश्वास करना चाहिए। नकली होल्डर अभी भी पास हो जाता है, क्योंकि यह स्वयं एकDefaultExchangeHolderहै जिसके सभी फील्ड विश्वसनीयjava.*प्रकार हैं, जो एक असली से अप्रभेद्य है।
from("jms:queue:cve") // mapJmsMessage defaults to true; transferExchange NOT set
.process(exchange -> { /* observes the injected body / headers / properties */ });
पीड़ित Camel JMS उपभोक्ता है। हमलावर कोई भी उत्पादक है जो कतार में प्रकाशित कर सकता है। दोनों Docker में एक वास्तविक Apache ActiveMQ Artemis ब्रोकर से बात करते हैं।
CVE-2026-43866/
├── pom.xml # camel-jms 4.18.2 + activemq-client 6.2.4 (NO gadget library)
├── Dockerfile # runs the app (no --add-opens; no gadget)
├── docker-compose.yml # Artemis broker (quay.io) + the reproducer app
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── JmsConfig.java # OpenWire ConnectionFactory (trustedPackages incl. org.apache.camel) + jms component
│ ├── VictimRoute.java # victim: from("jms:queue:cve"); records what the route observed
│ ├── CapturedState.java
│ ├── ForgedHolderFactory.java # builds a DefaultExchangeHolder via the public marshal() API
│ └── ExploitController.java # attacker: publishes the forged holder as an ObjectMessage
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
# -> एक नकली DefaultExchangeHolder को JMS ObjectMessage के रूप में कतार 'cve' पर प्रकाशित किया गया।
# ...
# बॉडी = INJECTED-BODY-... (इंजेक्ट किया गया: true)
# हेडर = pwned-header-... (इंजेक्ट किया गया: true)
# प्रॉपर्टी = pwned-property-... (इंजेक्ट किया गया: true)
#
# >>> एक्सचेंज-स्थिति इंजेक्शन प्रमाण — हमलावर-नियंत्रित बॉडी+हेडर+प्रॉपर्टी: true
रूट एक बॉडी, हेडर और प्रॉपर्टी के साथ चला जो उसने कभी सेट नहीं किए — सभी हमलावर के नकली होल्डर द्वारा प्रदान किए गए।
docker compose down
कोई भी Camel JMS उपभोक्ता (camel-jms, camel-sjms, camel-sjms2, camel-amqp, camel-activemq, camel-activemq6) जिसमें mapJmsMessage=true (डिफ़ॉल्ट) है, उस गंतव्य से पढ़ रहा है जिसमें हमलावर प्रकाशित कर सकता है। उपभोक्ता पर transferExchange को सक्षम करने की आवश्यकता नहीं है।
mapJmsMessage=true (डिफ़ॉल्ट) है, एक प्रभावित संस्करण पर।ObjectMessage को कतारबद्ध कर सकता है जिसका पेलोड एक DefaultExchangeHolder है।transferExchange का उपयोग करने वाली किसी भी डिप्लॉयमेंट के लिए, इसका मतलब है कि प्रदाता पहले से org.apache.camel पर भरोसा करता है। किसी गैजेट लाइब्रेरी की आवश्यकता नहीं है।4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23373 / CAMEL-23409) में अपग्रेड करें। JMS ObjectMessage हैंडलिंग नए objectMessageEnabled विकल्प के माध्यम से डिफ़ॉल्ट रूप से अक्षम है; इसे केवल उन गंतव्यों के लिए सक्षम करें जो विशेष रूप से विश्वसनीय उत्पादकों द्वारा फीड किए जाते हैं।
ObjectMessage बॉडी को अविश्वसनीय नेटवर्क पर मैप करते हैं।DefaultExchangeHolder का उपयोग करता है)।यह पुनरुत्पादक केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और स्थिर कमजोरी के लिए। स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध इसका उपयोग न करें।