
CVE-2026-85312 के लिए रन करने योग्य प्रूफ-ऑफ-कॉन्सेप्ट रिप्रोड्यूसर, जो Spring Boot और Quarkus में Long-Running-Action हेडर के माध्यम से Apache Camel saga हाईजैकिंग को प्रदर्शित करता है।
Long-Running-Action हेडर के माध्यम से saga हाइजैकिंगApache Camel की उस भेद्यता के लिए रन करने योग्य प्रूफ-ऑफ-कॉन्सेप्ट रिप्रोड्यूसर, जिसमें camel-core का SagaProcessor प्रत्येक exchange पर Long-Running-Action संदेश हेडर से saga कोऑर्डिनेटर का चयन करता था। उस हेडर नाम में कोई Camel प्रीफ़िक्स नहीं है, इसलिए यह उस नेमस्पेस से बाहर रहता है जिसे consumer हेडर फ़िल्टर हटा देते हैं — कोई बाहरी प्रेषक इसे किसी इनबाउंड संदेश पर प्रदान कर सकता था और इस प्रकार यह निर्धारित कर सकता था कि उसका exchange किस saga में शामिल होगा, अपने अनुरोध को किसी अन्य व्यक्ति द्वारा शुरू किए गए long-running action से जोड़ सकता था (या मुआवज़े को ऐसे action से संबद्ध कर सकता था जिसे उसने शुरू नहीं किया)। यह जोखिम saga चलाने वाले डिप्लॉयमेंट तक सीमित है, लेकिन जहाँ यह लागू होता है वहाँ प्रेषक यह नियंत्रित करता है कि कोई exchange किस saga से संबंधित है (CWE-20)।
| रनटाइम | निर्देशिका | स्टैक |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-boot 4.22.0 (प्रभावित; 4.22.1 में ठीक किया गया) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-saga (Camel 4.22.0, प्रभावित; नियंत्रण ठीक किया गया CQ 3.40.0 / Camel 4.22.1) |
दोनों मॉड्यूल वास्तविक camel-core SagaProcessor के विरुद्ध प्रभावित और ठीक किए गए व्यवहार दोनों को प्रदर्शित करते हैं।
ड्राइवर फ़िक्स के अपने ही रिग्रेशन टेस्ट (SagaHeaderCannotSelectCoordinatorTest) को प्रतिबिंबित करता है। यह एक saga रूट बनाता है
from("direct:…").saga().propagation(MANDATORY) जिसे एक इन-मेमोरी saga सेवा द्वारा समर्थित किया जाता है जो प्रत्येक id को रिकॉर्ड करती है जिसे हल करने के लिए कहा जाता है, फिर एक exchange भेजता है जिसमें इनबाउंड हेडर Long-Running-Action = a-saga-id-from-the-wire होता है
— वही id जो कोई बाहरी प्रेषक वायर पर रखेगा। ऑरेकल बस यह है कि कौन से saga id सेवा तक पहुँचते हैं:
a-saga-id-from-the-wire खोजा जाता है
— संदेश ने कोऑर्डिनेटर का चयन किया।दोनों बिल्ड्स में MANDATORY exchange अंततः विफल हो जाता है (शामिल होने के लिए कोई वास्तविक saga नहीं है) — भेद्यता विफलता नहीं है बल्कि यह है कि किसी हमलावर द्वारा चुने गए id का उपयोग कोऑर्डिनेटर का चयन करने के लिए किया गया था, यही कारण है कि ऑरेकल परिणाम के बजाय लुकअप पर नज़र रखता है।
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: wire id looked up = true; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85312-saga-header-hijack-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wire id looked up = false; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): wire id looked up = true
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wire id looked up = false
| गुण | मान |
|---|---|
| घटक | camel-core (SagaProcessor.getCurrentSagaCoordinator) |
| CWE | CWE-20 (अनुचित इनपुट सत्यापन) |
| गंभीरता | मध्यम |
| आक्रमण वेक्टर | एक बाहरी प्रेषक saga EIP चलाने वाले मार्ग पर आने वाले संदेश पर बिना उपसर्ग वाला Long-Running-Action हेडर प्रदान करता है |
| प्रभाव | प्रेषक उस saga का नाम निर्धारित करता है जिसमें एक्सचेंज शामिल होता है — किसी अन्य पक्ष की लंबे समय तक चलने वाली क्रिया से जुड़ना, या मुआवज़े को गलत तरीके से संबद्ध करना |
| प्रभावित संस्करण | 4.0.0 से 4.18.5 से पहले तक, 4.19.0 से 4.22.1 से पहले तक |
| ठीक किए गए संस्करण | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24449 |
| श्रेय | Claude Security Scan Tool |
सलाह: https://camel.apache.org/security/CVE-2026-85312.html
प्रभावित Quarkus मॉड्यूल CQ 3.39.0 (Camel 4.22.0) पर आधारित है। पैच किया गया नियंत्रण CQ 3.40.0 (Camel 4.22.1) है।
SagaProcessor अब Long-Running-Action हेडर का परामर्श केवल तब करता है जब
saga सेवा यह घोषित करती है कि वह ऐसे प्रोटोकॉल में भाग लेती है, नए
CamelSagaService.isLongRunningActionHeaderSupported() के माध्यम से (डिफ़ॉल्ट false; LRA सेवा इसे true में ओवरराइड करती है)। आंतरिक
एक्सचेंज स्थिति — जो removeHeaders("*") के बाद भी बनी रहती है — saga आईडी का सामान्य वाहक बनी रहती है, इसलिए एक संदेश
अब उस सेवा के लिए समन्वयक नहीं चुन सकता जो कोई बाहरी समन्वयक नहीं चलाती।
विश्वास सीमा पर हेडर को हटा दें, प्रत्येक उपभोक्ता पर removeHeaders("Long-Running-Action") के साथ जो अविश्वसनीय
प्रेषक से संदेश स्वीकार करता है।
यह रिपॉज़िटरी शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित की गई है: Apache Camel उपयोगकर्ताओं को भेद्यता को समझने में मदद करने, यह सत्यापित करने कि क्या वे प्रभावित हैं, और पुष्टि करने के लिए कि अपग्रेड करने से यह हल हो जाती है। प्रदर्शन एक इन-मेमोरी saga सेवा के साथ इन-प्रोसेस एक saga मार्ग चलाता है; "आक्रमणकारी" saga आईडी एक सौम्य प्लेसहोल्डर स्ट्रिंग है। इस सामग्री का उपयोग उन सिस्टमों के विरुद्ध न करें जिनके आप स्वामी या संचालक नहीं हैं।