
Reproducer for CVE-2026-40047: Apache Camel camel-docling CLI argument injection / path traversal
यह प्रोजेक्ट Apache Camel के camel-docling घटक में CLI आर्गुमेंट इंजेक्शन और पथ ट्रैवर्सल भेद्यता को प्रदर्शित करता है, जिसे CVE-2026-40047 के रूप में ट्रैक किया गया है। DoclingProducer बाहरी docling कमांड-लाइन टूल के आह्वान को संदेश हेडर से बनाता है; CamelDoclingCustomArguments हेडर के माध्यम से आपूर्ति किए गए कस्टम तर्क अपर्याप्त सत्यापन (एक डिनीलिस्ट प्लस एक शाब्दिक ../ जांच) के साथ जोड़े गए थे, इसलिए एक हमलावर जो उन हेडर को प्रभावित करता है, वह सबप्रोसेस में मनमाना docling CLI फ्लैग और ट्रैवर्सल-असर वाले पथ मान इंजेक्ट कर सकता है।
परामर्श: https://camel.apache.org/security/CVE-2026-40047.html
DoclingProducer docling आह्वान को इकट्ठा करता है और इसे java.lang.ProcessBuilder (लिस्ट फॉर्म — कोई शेल नहीं) के माध्यम से चलाता है। CamelDoclingCustomArguments हेडर से कस्टम CLI तर्क कमांड में जोड़े जाते हैं:
// DoclingProducer.addCustomArguments(...) - प्रभावित संस्करण
List<String> customArgs = exchange.getIn().getHeader(DoclingHeaders.CUSTOM_ARGUMENTS, List.class);
if (customArgs != null && !customArgs.isEmpty()) {
validateCustomArguments(customArgs); // डिनीलिस्ट + शाब्दिक "../" जांच (कमजोर)
command.addAll(customArgs);
}
प्रभावित संस्करणों में validateCustomArguments ने अवांछित फ्लैग की डिनीलिस्ट पर भरोसा किया और केवल शाब्दिक ../ वाले पथ मानों को अस्वीकार किया। परिणामस्वरूप:
docling को भेजे जाते हैं।../ के बिना ट्रैवर्स करते हैं (पूर्ण पथ, या सामान्यीकृत अनुक्रम) पकड़े नहीं जाते।चूंकि Camel docling आह्वान बनाता है, घटक इन मानों को प्रतिबंधित करने के लिए जिम्मेदार है। फिक्स (CAMEL-23212) डिनीलिस्ट को मान्यता प्राप्त फ्लैग की एक सख्त एलाउलिस्ट से बदल देता है, उत्पादक-प्रबंधित फ्लैग (--output/-o) और शेल मेटाकैरेक्टर (गहराई में रक्षा) को अस्वीकार करता है, और सत्यापन से पहले Path.normalize() के साथ पथ-जैसे मानों को सामान्यीकृत करता है।
आह्वान
ProcessBuilderके लिस्ट फॉर्म का उपयोग करता है, इसलिए एक शेल मानों की व्याख्या नहीं करता — शेल मेटाकैरेक्टर के माध्यम से OS कमांड इंजेक्शन संभव नहीं है; फिक्स में मेटाकैरेक्टर अस्वीकृति गहराई में रक्षा है।
from("direct:convert")
.to("docling:convert?operation=CONVERT_TO_MARKDOWN&contentInBody=true");
docling एक बाहरी उपकरण है। यह रिप्रोड्यूसर एक स्टब docling (कंटेनर के अंदर PATH पर) शिप करता है जो इसे प्राप्त argv को लॉग करता है और एक मार्कडाउन फ़ाइल वापस लिखता है, ताकि इंजेक्ट किए गए तर्क HTTP प्रतिक्रिया और /tmp/docling-invocations.log में दिखाई दे। सब कुछ एक Docker इमेज (ऐप + स्टब) के अंदर चलता है — इसलिए किसी वास्तविक docling इंस्टॉल की आवश्यकता नहीं है।
docling चलाता है)mvn clean package -DskipTests
docker compose up -d --build
curl http://localhost:8080/exploit/normal
# स्टब docling प्राप्त करता है: docling --to md --ocr-lang en --output <tmp> /tmp/input.txt
curl "http://localhost:8080/exploit/attack"
# CamelDoclingCustomArguments इंजेक्ट करता है = [--injected-by-attacker, arbitrary-value]
# -> स्टब docling प्राप्त करता है:
# docling --injected-by-attacker arbitrary-value --to md --ocr-lang en --output <tmp> /tmp/input.txt
# एक पथ मान जिसमें शाब्दिक "../" नहीं है (पूर्ण पथ) भी पास होता है:
curl "http://localhost:8080/exploit/attack?flag=--artifacts-path&value=/etc/attacker-controlled"
प्रभावित संस्करण पर (यह रिप्रोड्यूसर 4.18.2 पिन करता है) रूट सफल होता है और इंजेक्ट किए गए तर्क सबप्रोसेस तक पहुंचते हैं। एक निश्चित संस्करण (4.18.3 / 4.19.0) पर एलाउलिस्ट --injected-by-attacker को IllegalArgumentException के साथ अस्वीकार कर देती है और रूट विफल हो जाता है।
docker compose down
docling: प्रोड्यूसर के CamelDoclingCustomArguments (या पथ-असर वाले हेडर) में अग्रेषित करता है।4.18.3 / 4.19.0 में अपग्रेड करें। फिक्स मान्यता प्राप्त docling फ्लैग की एक सख्त एलाउलिस्ट का उपयोग करता है, प्रोड्यूसर-प्रबंधित फ्लैग और शेल मेटाकैरेक्टर को अस्वीकार करता है, और सत्यापन से पहले Path.normalize() के साथ पथ मानों को सामान्यीकृत करता है।
अपग्रेड करने तक:
CamelDoclingCustomArguments या पथ-असर वाले हेडर में मैप न करें।removeHeaders("Camel*")) को अविश्वसनीय प्रोड्यूसरों से आने वाले संदेशों से हटाएं, docling: प्रोड्यूसर से पहले।CVE-2026-40047/
├── pom.xml
├── Dockerfile # ऐप + PATH पर स्टब 'docling'
├── docker-compose.yml
├── docling-stub.sh # स्टब 'docling' (argv लॉग करता है, मार्कडाउन लिखता है)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── DoclingRoute.java # from(direct:convert).to(docling:convert)
│ └── ExploitController.java # CamelDoclingCustomArguments इंजेक्ट करता है
└── resources/
└── application.properties
यह रिप्रोड्यूसर सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और निश्चित भेद्यता के लिए। स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध इसका उपयोग न करें।
| संपत्ति | मान |
|---|
| घटक | camel-docling |
| प्रभावित वर्ग | org.apache.camel.component.docling.DoclingProducer (addCustomArguments / validateCustomArguments) |
| मूल कारण | CamelDoclingCustomArguments (एक List<String>) को docling CLI तर्कों में एक कमजोर डिनीलिस्ट + शाब्दिक ../ जांच के साथ जोड़ा गया |
| CWE | CWE-88 (आर्गुमेंट इंजेक्शन) / CWE-22 (पथ ट्रैवर्सल) |
| प्रभाव | बाहरी टूल में मनमाना/अनपेक्षित docling CLI फ्लैग और निर्देशिका-बाहर पथ मानों का इंजेक्शन। OS कमांड इंजेक्शन नहीं (लिस्ट-आधारित ProcessBuilder, कोई शेल नहीं)। |
| प्रभावित संस्करण | 4.15.0 से 4.18.3 से पहले |
| निश्चित संस्करण | 4.18.3, 4.19.0 |
| JIRA | CAMEL-23212 |
| रिपोर्टर | Andrea Cosentino (Apache Software Foundation) |