
Apache Camel की camel-azure-storage-datalake में पाथ ट्रैवर्सल भेद्यता (CVE-2026-60093) के लिए प्रूफ-ऑफ-कॉन्सेप्ट रिप्रोड्यूसर, जो downloadToFile के माध्यम से मनमानी फ़ाइल लेखन प्रदर्शित करते हैं।
downloadToFile पाथ ट्रैवर्सलइसी Apache Camel भेद्यता के लिए चलाने योग्य प्रूफ-ऑफ-कॉन्सेप्ट रिप्रोड्यूसर, प्रत्येक रनटाइम के लिए एक:
| रनटाइम | निर्देशिका | स्टैक |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-azure-storage-datalake 4.18.2 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (Camel 4.20.0 बंडल करता है) |
दोनों प्रभावित संस्करण हैं (समस्या 4.14.9 / 4.18.4 / 4.22.0 में ठीक की गई है), और दोनों समान दोष प्रदर्शित करते हैं: camel-azure-storage-datalake घटक ADLS Gen2 फ़ाइल को अपने downloadToFile ऑपरेशन के माध्यम से स्थानीय फ़ाइल सिस्टम पर डाउनलोड कर सकता है, जो कि fileDir विकल्प द्वारा नामित निर्देशिका में लिखता है। DataLakeFileOperations.downloadToFile ने स्थानीय लक्ष्य को fileDir को रिमोट पाथ नाम के साथ जोड़कर बनाया, ठीक वैसे ही जैसे Azure SDK ने इसे रिपोर्ट किया (new File(fileDir, fileClientWrapper.getFileName())) — बिना किसी लेक्सिकल नॉर्मलाइज़ेशन के और बिना इस जाँच के कि रिज़ॉल्व किया गया स्थान fileDir के अंदर ही रहा। रिमोट नाम रूट-नियंत्रित नहीं है: कंज़्यूमर फ़ाइल सिस्टम को एन्यूमरेट करता है (DataLakeConsumer.createBatchExchangesFromPath) और हर प्रविष्टि डाउनलोड करता है। इसलिए ../ सेगमेंट वाला पाथ नाम fileDir के बाहर रिज़ॉल्व होता है (CWE-22, पाथ ट्रैवर्सल → मनमाना फ़ाइल लेखन).
टेस्ट हार्नेस पर ध्यान दें। Azure Data Lake Gen2 API किसी भी उपलब्ध स्थानीय एमुलेटर द्वारा लागू नहीं किया गया है — Azurite Gen2
listPathsऔर फ़ाइल ऑपरेशनों के लिए HTTP 400 लौटाता है। इसलिए ये रिप्रोड्यूसर ठीक उसी भेद्य कोड को (DataLakeFileOperations.downloadToFile→new File(fileDir, fileClientWrapper.getFileName())) सीधे चलाते हैं, और एक Data Lake फ़ाइल क्लाइंट रैपर प्रदान करते हैं जिसकाgetFileName()रिमोट नाम लौटाता है — ठीक वैसे ही जैसे कंज़्यूमर वह नाम प्रदान करता है जो उसनेPathItem.getName()से पढ़ा है। सहयोगी घटकcamel-azure-storage-blobसमान फिक्स साझा करता है (CVE-2026-66906) और वहाँ समान दोष को लाइव Azurite एमुलेटर के विरुद्ध एंड-टू-एंड पुन: प्रस्तुत किया गया है।
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
प्रभावित बिल्ड पर अपेक्षित आउटपुट (दोनों वेरिएंट):
2) Download of a file named '../../../../../../tmp/pwned-60093.txt':
resolved local target: /app/downloads/../../../../../../tmp/pwned-60093.txt
File written OUTSIDE it, at /tmp/pwned-60093.txt: true
content: PWNED via path traversal — CVE-2026-60093
>>> PROVEN: DataLakeFileOperations.downloadToFile built the local target as new File(fileDir, fileName) ... : true
| गुण | मान |
|---|---|
| घटक | camel-azure-storage-datalake (Spring Boot: camel-azure-storage-datalake-starter; Quarkus: camel-quarkus-azure-storage-datalake) |
| CWE | CWE-22 (पाथनाम का प्रतिबंधित निर्देशिका तक अनुचित सीमाकरण — पाथ ट्रैवर्सल) |
| हमला वेक्टर | एक Gen2 फ़ाइल जिसके पाथ नाम में ../ सेगमेंट हैं, जिसे कंज़्यूमर द्वारा fileDir सेट करके डाउनलोड किया जाता है |
| प्रभाव | कॉन्फ़िगर किए गए fileDir निर्देशिका के बाहर मनमाना फ़ाइल लेखन |
| प्रभावित संस्करण | 4.0.0 से 4.14.9 से पहले, 4.15.0 से 4.18.4 से पहले, 4.19.0 से 4.22.0 से पहले |
| ठीक किए गए संस्करण | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-23942 |
| श्रेय | n0mi1k; Hiep Nguyen |
कंज़्यूमर अब डाउनलोड लक्ष्य को कॉन्फ़िगर किए गए fileDir निर्देशिका तक हल और सीमित करता है (AzureFileNameHelper.resolveWithinDirectory के माध्यम से), और उन पाथ नामों को अस्वीकार करता है जो इससे बाहर भागने की कोशिश करेंगे — वही फिक्स जो camel-azure-storage-blob को भी कवर करता है (CVE-2026-66906)।
यह रिपॉजिटरी शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित की गई है: Apache Camel उपयोगकर्ताओं को भेद्यता समझने, यह सत्यापित करने में मदद करने के लिए कि क्या वे प्रभावित हैं, और पुष्टि करने के लिए कि अपग्रेड करने से यह हल हो जाती है। लिखी गई फ़ाइल /tmp के अंतर्गत एक हानिरहित मार्कर है। इस सामग्री का उपयोग उन सिस्टमों के विरुद्ध न करें जिनके आप स्वामी या संचालक नहीं हैं।