
Apache Camel camel-knative संरचित CloudEvent हेडर इंजेक्शन (CVE-2026-63621) के लिए प्रूफ-ऑफ-कॉन्सेप्ट रिप्रोड्यूसर, जो Spring Boot और Quarkus रनटाइम में दुर्भावनापूर्ण एक्सटेंशन फ़ील्ड के माध्यम से हेडर इंजेक्शन प्रदर्शित करते हैं।
समान Apache Camel कमज़ोरी के लिए चलाने योग्य proof-of-concept रीप्रोड्यूसर, प्रति रनटाइम एक:
| रनटाइम | निर्देशिका | स्टैक | शैली |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.18.2 | प्रत्यक्ष डिकोड (नोट देखें) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (Camel 4.20.0 बंडल करता है) | पूर्ण HTTP-संचालित knative स्रोत |
दोनों प्रभावित संस्करण हैं (यह समस्या 4.14.9 / 4.18.4 / 4.22.0 में ठीक की गई है), और दोनों एक ही दोष प्रदर्शित करते हैं: camel-knative उपभोक्ता CloudEvents को दो कंटेंट मोड में स्वीकार करता है। बाइनरी मोड में विशेषताएँ HTTP हेडर के रूप में आती हैं और एक HeaderFilterStrategy के माध्यम से मैप की जाती हैं, इसलिए Camel* हेडर हटा दिए जाते हैं। संरचित मोड (Content-Type: application/cloudevents+json) में पूरी घटना एक JSON बॉडी होती है, और प्रभावित बिल्ड उस JSON के प्रत्येक एक्सटेंशन फ़ील्ड को setHeader(key.toLowerCase(Locale.US), value) के साथ मैसेज हेडर पर मैप करता है और कोई HeaderFilterStrategy नहीं होता। एक्सटेंशन नाम भेजने वाले द्वारा चुने जाते हैं, इसलिए एक हमलावर Camel-आंतरिक नियंत्रण हेडर सेट कर सकता है। यहाँ इंजेक्ट किया गया एक्सटेंशन camelsqlquery CamelSqlQuery हेडर बन जाता है (Camel हेडर केस-असंवेदनशील होते हैं) — वह स्टेटमेंट जिसे एक camel-sql प्रोड्यूसर निष्पादित करेगा (हेडर इंजेक्शन → CWE-74)।
Spring Boot वेरिएंट पर नोट। knative HTTP ट्रांसपोर्ट Vert.x-आधारित है और camel-main / Camel Quarkus डिप्लॉयमेंट में उपयोग होता है। एक Spring Boot सर्वलेट ऐप उस ट्रांसपोर्ट को होस्ट नहीं करता, इसलिए Spring Boot रीप्रोड्यूसर सटीक कमज़ोर डिकोड (
CloudEventProcessors.fromSpecVersion("1.0").consumer(...)) को सीधे चलाता है — वही कोड पथ जिसे एक इनबाउंडapplication/cloudevents+jsonअनुरोध knative उपभोक्ता के अंदर चलाता है। Camel Quarkus वेरिएंट पूर्ण HTTP-संचालित रीप्रोड्यूसर है (लाइव स्रोत पर एक CloudEvent POST करें)।
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
प्रभावित बिल्ड पर अपेक्षित आउटपुट (दोनों वेरिएंट):
1) Benign structured CloudEvent (no extension):
CamelSqlQuery ... = [null]
2) Malicious structured CloudEvent (injected extension 'camelsqlquery'):
CamelSqlQuery ... = [SELECT * FROM secrets WHERE 1=1 -- injected-by-attacker]
>>> PROVEN: ... a camel-sql producer downstream would execute this attacker-supplied statement: true
| गुण | मान |
|---|---|
| घटक | camel-knative (Spring Boot: camel-knative; Quarkus: camel-quarkus-knative) |
| CWE | CWE-20 (अनुचित इनपुट सत्यापन) → CWE-74 (इंजेक्शन) |
| हमला वेक्टर | हमलावर द्वारा चुना गया एक्सटेंशन फ़ील्ड वाला एक संरचित-मोड CloudEvent (application/cloudevents+json) |
| प्रभाव | Exchange पर Camel-आंतरिक नियंत्रण हेडर का इंजेक्शन (यहाँ CamelSqlQuery) |
| प्रभावित संस्करण | 3.15.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-24084 |
| श्रेय | Andrea Cosentino (Apache Software Foundation) |
संरचित-मोड एक्सटेंशन मैपिंग अब प्रत्येक फ़ील्ड को सेट करने से पहले एक HeaderFilterStrategy (एक DefaultHeaderFilterStrategy) से गुज़ारती है, जो बाइनरी कंटेंट-मोड पथ के अनुरूप है — इसलिए अविश्वसनीय बॉडी से आने वाले Camel* एक्सटेंशन नाम हटा दिए जाते हैं:
// fixed (AbstractCloudEventProcessor.mapExtensionAsHeader)
final String headerName = key.toLowerCase(Locale.US);
if (!headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange)) {
message.setHeader(headerName, value);
}
यह रिपॉज़िटरी शैक्षिक और सुरक्षात्मक उद्देश्यों के लिए प्रकाशित की गई है: Apache Camel उपयोगकर्ताओं को कमज़ोरी समझने, यह जाँचने कि वे प्रभावित हैं या नहीं, और यह पुष्टि करने में मदद करने के लिए कि अपग्रेड करने से यह हल हो जाती है। इंजेक्ट किया गया मान एक हानिरहित मार्कर है (एक निष्क्रिय SQL स्ट्रिंग जिसे यहाँ कभी निष्पादित नहीं किया जाता)। इस सामग्री का उपयोग उन सिस्टमों के विरुद्ध न करें जिनके स्वामी या संचालक आप नहीं हैं।