
CVE-2026-95629 के लिए रन करने योग्य प्रूफ-ऑफ-कॉन्सेप्ट रिप्रोड्यूसर, जो Apache Camel camel-docling में एक पाथ-ट्रैवर्सल दोष है, जहाँ output-path हेडर सीधे docling के --output तक पहुँचता है।
--output तक शब्दशः पहुँचाApache Camel की उस भेद्यता के लिए चलाने योग्य प्रमाण-अवधारणा (proof-of-concept) पुनरुत्पादक, जिसमें DoclingProducer, CLI मोड (डिफ़ॉल्ट) में बाहरी docling टूल चलाते समय, CamelDoclingOutputFilePath हेडर का मान docling के --output फ़्लैग को शब्दशः सौंप देता था: सामान्यीकृत नहीं, एक निरपेक्ष (absolute) पथ या .. खंडों वाला पथ जैसा दिया गया वैसा ही स्वीकार किया जाता था, और कोई भी endpoint विकल्प उसे सीमित नहीं कर सकता था।
| रनटाइम | निर्देशिका | स्टैक |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-docling 4.22.1 |
| Camel Quarkus | camel-quarkus/ | Camel Quarkus 3.39.0 (Quarkus 3.39.0, Camel 4.22.0) |
Docling रूपांतरण परिणाम — Markdown, HTML, JSON या टेक्स्ट — को उस निर्देशिका में लिखता है, फ़ाइल का नाम इनपुट फ़ाइल के आधार पर रखता है, और इसके बाद producer केवल अपनी ही अस्थायी निर्देशिका हटाता है, इसलिए फ़ाइल वहीं रह जाती है। अतः जो पक्ष हेडर सेट कर सकता है, वह Camel प्रक्रिया जिस भी निर्देशिका में लिख सकती है, वहाँ रूपांतरण आउटपुट बनवा सकता था।
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
until [ "$(curl -s http://localhost:8080/exploit/ready)" = "Started" ]; do sleep 1; done
curl -s http://localhost:8080/exploit/attack
docker compose down
प्रभावित बिल्ड पर आउटपुट (दोनों रनटाइम पर समान):
1) No header at all - the producer picks its own temporary directory
argv docling received: --to md --ocr-lang en --output /tmp/docling-<uuid> /tmp/docling-<uuid>/docling-<n>.tmp
exchange outcome: ok
2) An ABSOLUTE path of the attacker's choosing
header CamelDoclingOutputFilePath = /tmp/cve-2026-95629-attacker-chosen
argv docling received: ... --output /tmp/cve-2026-95629-attacker-chosen ...
3) A path with .. segments - watch whether they survive into the argv below
header CamelDoclingOutputFilePath = /tmp/cve-2026-95629-attacker-chosen/../cve-2026-95629-escaped
argv docling received: ... --output /tmp/cve-2026-95629-attacker-chosen/../cve-2026-95629-escaped ...
4) CONTROL - asking for the same thing through CamelDoclingCustomArguments instead
REJECTED by Camel: IllegalArgumentException: Custom argument '--output' is not allowed because the
output directory is managed by the producer. Use the CamelDoclingOutputFilePath header or endpoint
configuration instead.
Files now sitting in directories the route never chose:
/tmp/cve-2026-95629-attacker-chosen/document.md : true
/tmp/cve-2026-95629-escaped/document.md : true
>>> PROVEN: ...
प्रोब 4 समस्या की प्रकृति है। CVE-2026-40047 के फ़िक्स द्वारा जोड़ा गया कस्टम-आर्ग्युमेंट वैलिडेशन CamelDoclingCustomArguments में --output और -o को अस्वीकार करता है और कॉलर्स से कहता है कि आउटपुट डायरेक्टरी इसके बजाय इस हेडर से चुनें — इसलिए वही एक मान जो तय करता है कि docling कहाँ लिखेगा, वही एक मान कमांड लाइन तक पहुँचता था जिस पर कस्टम आर्ग्युमेंट्स के लिए लागू किए जाने वाले किसी भी जाँच को लागू नहीं किया गया था।
प्रोब 2 और 3 के बाद एक्सचेंज स्वयं विफल हो जाता है ("failed afterwards"), क्योंकि प्रोड्यूसर तब कन्वर्ट किए गए आउटपुट को अपनी स्वयं की अस्थायी डायरेक्टरी में खोजता है और वहाँ उसे नहीं पाता। यह सतही बात है: राइट पहले ही हो चुका है, जो अंत में दी गई फ़ाइल लिस्टिंग में दिखता है।
किसी docling इंस्टॉलेशन की आवश्यकता नहीं। एंडपॉइंट का doclingCommand विकल्प CLI के लिए एक रिकॉर्डिंग स्टैंड-इन की ओर इंगित करता है, जो उसे दिए गए आर्ग्युमेंट वेक्टर को रिकॉर्ड करता है और साथ ही जिस भी --output का नाम दिया गया हो उसमें एक फ़ाइल लिखता है, ठीक वैसे जैसे docling करता है। वास्तविक DoclingProducer और वास्तविक addOutputDirectoryArguments() चलते हैं।
केवल CLI मोड इस हेडर का उपयोग करता है; docling-serve मोड नहीं करता।
CamelDoclingOutputFilePath Camel हेडर नेमस्पेस का हिस्सा है, जिसे Camel की डिफ़ॉल्ट हेडर फ़िल्टरिंग लागू करने वाले कंज़्यूमर — उदाहरण के लिए JMS और Kafka कंज़्यूमर — आने वाले संदेशों से हटा देते हैं। यह समस्या वहाँ पहुँचती है जहाँ कोई रूट बाहरी रूप से प्रभावित मानों को हेडर में अग्रेषित करता है, या जहाँ कोई कंज़्यूमर आने वाले हेडर को उस फ़िल्टरिंग के बिना मैप करता है।
लिखी गई फ़ाइल की सामग्री संदेश द्वारा ले जाए गए दस्तावेज़ का कन्वर्ज़न है, इसलिए यह उसी के द्वारा आकार दी जाती है जो वह दस्तावेज़ प्रदान करता है, बिना बाइट-दर-बाइट लिखे जाने के; जब दस्तावेज़ संदेश बॉडी में आता है, तो प्रोड्यूसर उसे एक यादृच्छिक अस्थायी नाम के अंतर्गत संग्रहीत करता है, जिसे फिर आउटपुट फ़ाइल वहन करती है।
| गुण | मान |
|---|---|
| घटक | camel-docling (DoclingProducer.addOutputDirectoryArguments()) |
| CWE | CWE-22 (किसी पाथनेम का प्रतिबंधित डायरेक्टरी तक अनुचित सीमन) |
| गंभीरता | मध्यम |
| आक्रमण वेक्टर | CamelDoclingOutputFilePath हेडर में एक निरपेक्ष या ..-युक्त डायरेक्टरी |
| प्रभाव | कन्वर्ज़न आउटपुट किसी भी उस डायरेक्टरी में बनाया जाता है जहाँ Camel प्रक्रिया लिख सकती है |
| प्रभावित संस्करण | 4.15.0 से 4.18.5 से पहले तक, 4.19.0 से 4.22.2 से पहले तक |
| ठीक किए गए संस्करण | 4.18.5, 4.22.2, 4.23.0 |
| JIRA | CAMEL-24894 |
| श्रेय | Zhixi "Jace" Sun, स्वतंत्र सुरक्षा शोधकर्ता |
सलाह: https://camel.apache.org/security/CVE-2026-95629.html
उसी घटक में, उसी रिलीज़ लहर में सहोदर समस्या: CVE-2026-95628 (कस्टम-आर्ग्युमेंट मानों के रूप में निरपेक्ष पाथ स्वीकार किए जाना)।
हेडर को अब इनपुट पाथ के समान ही नॉर्मलाइज़ेशन और वैकल्पिक बेस-डायरेक्टरी कंटेनमेंट मिलता है, resolveWithinOutputBaseDirectory() के माध्यम से। लेकिन फ़िक्स द्वारा जोड़ा गया outputBaseDirectory एंडपॉइंट विकल्प डिफ़ॉल्ट रूप से अनसेट है, और उसका अपना दस्तावेज़ीकरण कहता है कि जब खाली हो, कोई डायरेक्टरी प्रतिबंध लागू नहीं होता और हेडर मान केवल नॉर्मलाइज़ किया जाता है।
4.22.1 → 4.22.2 के विरुद्ध सत्यापित, outputBaseDirectory को अनसेट छोड़कर:
3) A path with .. segments - watch whether they survive into the argv below
argv docling received: ... --output /tmp/cve-2026-95629-escaped ... <- normalized
Files now sitting in directories the route never chose:
/tmp/cve-2026-95629-attacker-chosen/document.md : true <- still written
/tmp/cve-2026-95629-escaped/document.md : true
>>> PARTLY CLOSED: the header was normalized before reaching --output ... It can still name any directory
>>> the Camel process can write to, because the outputBaseDirectory option the fix added is UNSET by
>>> default ... Set outputBaseDirectory on every docling endpoint whose CamelDoclingOutputFilePath header
>>> can carry a value influenced from outside the deployment; upgrading alone is not enough.
ड्राइवर उस स्थिति को अलग से रिपोर्ट करता है, उसे fixed नहीं कहता, क्योंकि अधिकांश डिप्लॉयमेंट अपग्रेड के ठीक बाद इसी स्थिति में पहुँचेंगे। अपग्रेड करने के बाद, हर उस docling endpoint पर outputBaseDirectory सेट करें जिसका header बाहरी रूप से प्रभावित मान ले जा सकता है।
main पर apache/camel#26737 (48485d40) में fixed, camel-4.22.x में #27365 और camel-4.18.x में #27362 में backported।
CamelDoclingOutputFilePath को उन मानों से न बनाएँ जो डिप्लॉयमेंट के बाहर से आते हैं; बाहर से आने वाले संदेशों से उस header को हटा दें, इससे पहले कि वे किसी docling endpoint तक पहुँचें; और सुनिश्चित करें कि आने वाले headers को मैप करने वाले consumers Camel header namespace को छोड़ दें।