
Apache Camel camel-keycloak इश्यूअर सत्यापन बायपास (CWE-287) के लिए रन करने योग्य प्रूफ-ऑफ-कॉन्सेप्ट रिप्रोड्यूसर, जो Spring Boot और Quarkus में प्रभावित और पैच किए गए व्यवहार को प्रदर्शित करता है।
Apache Camel की उस भेद्यता के लिए चलाने योग्य proof-of-concept पुनरुत्पादक, जिसमें camel-keycloak का
KeycloakSecurityProcessor किसी introspect किए गए टोकन के issuer का सत्यापन केवल तब करता था जब introspection प्रतिक्रिया
में वास्तव में iss claim मौजूद होता था। जब यह claim अनुपस्थित होता था तो जाँच को विफलता मानने के बजाय छोड़ दिया जाता था, इसलिए कॉन्फ़िगर किए गए issuer द्वारा जारी न किया गया टोकन भी स्वीकार किया जा सकता था — बशर्ते introspection endpoint ने issuer का नाम लिए बिना active उत्तर दिया हो। जहाँ कोई deployment ऐसे endpoint के विरुद्ध introspection करता है जो iss छोड़ देता है और एक से अधिक issuer को सेवा देता है, वहाँ परिणाम यह होता है कि यह ऐसे कॉलर को प्रमाणित कर देता है जिसे अस्वीकार किया जाना चाहिए था (CWE-287)।
| Runtime | Directory | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-keycloak 4.22.0 (प्रभावित; ठीक किया गया 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-keycloak (Camel 4.22.0, प्रभावित; नियंत्रण ठीक किया गया CQ 3.40.0 / Camel 4.22.1) |
दोनों मॉड्यूल वास्तविक KeycloakSecurityProcessor के विरुद्ध प्रभावित और ठीक किए गए व्यवहार दोनों को प्रदर्शित करते हैं।
driver एक KeycloakSecurityPolicy को validateIssuer=true (अपेक्षित issuer
http://localhost:8080/realms/test-realm) के साथ कॉन्फ़िगर करता है और एक token introspector के साथ जो टोकन को active बताता है परंतु
कोई iss claim नहीं लौटाता — ठीक वही जो एक broker/gateway introspection endpoint उत्पन्न करता है, क्योंकि RFC 7662 iss को
वैकल्पिक बनाता है। फिर यह एक KeycloakSecurityProcessor को Authorization: Bearer <attacker-token> हेडर के साथ चलाता है और
बताता है कि संरक्षित route तक पहुँचा गया या नहीं।
iss के कारण processor issuer जाँच को छोड़ देता है, इसलिए टोकन स्वीकार हो जाता है और
route तक पहुँच जाता है — अनपेक्षित issuer के टोकन को प्रमाणित कर दिया जाता है।iss एक सत्यापन विफलता है; processor CamelAuthorizationException
("Token issuer missing…") फेंकता है और route तक कभी नहीं पहुँचा जाता।# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: route reached, token accepted; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85301-keycloak-issuer-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelAuthorizationException "Token issuer missing"; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): route reached, token accepted
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelAuthorizationException "Token issuer missing"
| गुण | मान |
|---|---|
| घटक | camel-keycloak (KeycloakSecurityProcessor.validateIssuerFromIntrospection) |
| CWE | CWE-287 (अनुचित प्रमाणीकरण) |
| गंभीरता | मध्यम |
| आक्रमण वेक्टर | एक अनपेक्षित issuer से टोकन, जिसे ऐसे endpoint के विरुद्ध introspect किया गया जो iss को छोड़ता है और एक से अधिक issuer को सेवा प्रदान करता है, जबकि validateIssuer=true है |
| प्रभाव | डिप्लॉयमेंट ऐसे कॉलर को प्रमाणित करता है जिसका टोकन कॉन्फ़िगर किए गए issuer ने जारी नहीं किया था |
| प्रभावित संस्करण | 4.15.0 से 4.18.5 से पहले तक, 4.19.0 से 4.22.1 से पहले तक |
| ठीक किए गए संस्करण | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24448 |
| श्रेय | Claude Security Scan Tool |
सलाह: https://camel.apache.org/security/CVE-2026-85301.html
प्रभावित Quarkus मॉड्यूल CQ 3.39.0 (Camel 4.22.0) पर आधारित है, जहाँ
camel-quarkus-keycloakएक प्रभावित Camel संस्करण से मैप होता है। पैच किया गया नियंत्रण CQ 3.40.0 (Camel 4.22.1) है।
KeycloakSecurityProcessor अब अनुपस्थित iss दावे को
सत्यापन विफलता के रूप में मानता है: जब issuer सत्यापन सक्षम हो और introspection परिणाम में कोई issuer न हो, तो यह
जल्दी लौटने और अनुरोध को गुजरने देने के बजाय CamelAuthorizationException फेंकता है। पहले का कोड तुलना को
छोड़ देता था जब भी दावा अनुपस्थित होता था, जिससे ठीक उन्हीं टोकनों के लिए issuer असत्यापित रह जाता था जिनमें कोई
issuer नामित नहीं था।
सुनिश्चित करें कि introspection endpoint iss दावा लौटाता है और ठीक एक issuer को सेवा प्रदान करता है, ताकि किसी अन्य
issuer से आने वाला टोकन या तो नामित (और अस्वीकृत) हो या सक्रिय के रूप में कभी introspect न हो।
यह रिपॉज़िटरी शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित की गई है: Apache Camel उपयोगकर्ताओं को भेद्यता को समझने, यह सत्यापित करने में मदद करने के लिए कि क्या वे प्रभावित हैं, और पुष्टि करने के लिए कि अपग्रेड करने से यह हल हो जाती है। टोकन introspector एक इन-प्रोसेस स्टब है और इसमें कोई वास्तविक Keycloak सर्वर या नेटवर्क कॉल शामिल नहीं है; "आक्रमणकर्ता टोकन" एक अपारदर्शी प्लेसहोल्डर स्ट्रिंग है। इस सामग्री का उपयोग उन सिस्टमों के विरुद्ध न करें जिनके आप स्वामी या संचालक नहीं हैं।