
Apache Camel JWT प्रमाणीकरण बाईपास (CVE-2026-66908) के लिए प्रूफ-ऑफ-कॉन्सेप्ट रिप्रोड्यूसर, जो camel-platform-http-main में iss/aud सत्यापन की अनुपस्थिति को प्रदर्शित करता है, साथ ही Docker-आधारित सेटअप और सत्यापन चरणों के साथ।
iss/aud सत्यापित नहींApache Camel भेद्यता के लिए चलाने योग्य proof-of-concept reproducer, जहां camel-main एम्बेडेड HTTP
सर्वर अपने JWT प्रमाणीकरणकर्ता को केवल keystore से बनाता है जब न jwtIssuer न ही jwtAudience
कॉन्फ़िगर किया गया हो, इसलिए आने वाले टोकन की जाँच केवल हस्ताक्षर और समाप्ति के लिए होती है — iss और aud दावे कभी
सत्यापित नहीं होते।
| रनटाइम | निर्देशिका | स्टैक |
|---|
| Camel Main (स्टैंडअलोन) | camel-main/ | camel-main 4.21.0 + camel-platform-http-main |
camel-main ही क्यों, Camel Spring Boot / Camel Quarkus क्यों नहीं? यह भेद्य क्लास,
JWTAuthenticationConfigurer,camel-platform-http-mainमें रहती है — यह camel-main एम्बेडेड HTTP सर्वर (MainHttpServer) है, जो स्टैंडअलोन camel-main अनुप्रयोगों औरcamel-jbangद्वारा उपयोग किया जाता है। यह सर्वर न तो Camel Spring Boot की platform-http इंटीग्रेशन (servlet-आधारित) है, और न ही Camel Quarkus वाला (Quarkus/Vert.x HTTP, जिसमें अपनी स्वयं की सुरक्षा होती है), इसलिए इस विशिष्ट दोष के लिए कोई विश्वसनीय Spring Boot या Quarkus reproducer नहीं है। यह रिपॉजिटरी एक स्टैंडअलोन camel-main reproducer प्रदान करती है, जो इस बग के लिए सटीक होस्ट है।
cd camel-main
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit
docker compose down
प्रभावित बिल्ड पर अपेक्षित आउटपुट:
[1] GET /protected with NO token -> HTTP 401 (auth is enforced)
[2] GET /protected with token iss=https://attacker.example aud=some-unrelated-service -> HTTP 200 (ACCEPTED — iss/aud NOT validated)
[3] GET /protected with the same token but EXPIRED -> HTTP 401 (expiry IS checked)
>>> PROVEN: ... the iss and aud claims were never checked ... : true
| गुण | मान |
|---|---|
| घटक | camel-platform-http-main (camel-main एम्बेडेड HTTP सर्वर) |
| CWE | CWE-287 (अनुचित प्रमाणीकरण) / CWE-1259 (सुरक्षा दावों के सत्यापन का अभाव) |
| हमला वेक्टर | एक JWT जो विश्वसनीय कुंजी द्वारा हस्ताक्षरित है (जैसे साझा JWKS) लेकिन किसी भिन्न issuer/audience के लिए जारी किया गया हो |
| प्रभाव | किसी भी पक्ष का कोई भी बिना समाप्त हुआ टोकन, जो साइनिंग कुंजी साझा करता है, स्वीकार कर लिया जाता है — तैनाती ऑपरेटर की अपेक्षा से कम सुरक्षा लागू करती है |
| प्रभावित संस्करण | 4.8.0 से 4.22.0 से पहले तक |
| सुधारित संस्करण | 4.22.0 |
| JIRA | CAMEL-24281 |
| श्रेय | n0mi1k |
सुरक्षा सलाह: https://camel.apache.org/security/CVE-2026-66908.html
4.22.0 से, सर्वर प्रारंभ होने से इनकार कर देता है जब एक JWT keystore कॉन्फ़िगर किया गया हो लेकिन न jwtIssuer और न
jwtAudience सेट हो, तथा लुप्त गुणों के नाम बताता है। जो ऑपरेटर वास्तव में केवल हस्ताक्षर-और-समाप्ति-आधारित
सत्यापन चाहता है, उसे camel.server.jwtAllowMissingIssuerAndAudience=true के साथ स्पष्ट रूप से ऑप्ट-इन करना होगा (डिफ़ॉल्ट रूप से
fail-closed):
// fixed (JWTAuthenticationConfigurer.assertIssuerOrAudienceConfigured)
if (ObjectHelper.isEmpty(audience) && ObjectHelper.isEmpty(issuer)) {
throw new IllegalArgumentException(
"JWT authentication requires camel.server.jwtIssuer or camel.server.jwtAudience to be configured, ...");
}
यह रिपॉजिटरी शैक्षिक और रक्षात्मक उद्देश्यों के लिए प्रकाशित की गई है: Apache Camel उपयोगकर्ताओं को भेद्यता समझने, यह जाँचने कि वे प्रभावित हैं या नहीं, और यह पुष्टि करने में मदद करने के लिए कि अपग्रेड करने से यह हल हो जाती है। टोकन स्थानीय रूप से परियोजना में शामिल एक अस्थायी डेमो keystore के विरुद्ध मिंट किए जाते हैं। इस सामग्री का उपयोग उन प्रणालियों के विरुद्ध न करें जिनके स्वामी या संचालक आप नहीं हैं।