
أداة إعادة إنتاج لإثبات المفهوم لتجاوز مصادقة JWT في Apache Camel (CVE-2026-66908)، توضح غياب التحقق من iss/aud في camel-platform-http-main، مع إعداد قائم على Docker وخطوات تحقق.
iss/audمُعاد إنتاج (reproducer) لإثبات المفهوم (PoC) قابل للتشغيل للثغرة في Apache Camel، حيث يبني خادم HTTP المضمّن في camel-main موثِّق 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؟ يقع الصنف (class) المُعرَّض للثغرة،
JWTAuthenticationConfigurer، فيcamel-platform-http-main— أي خادم HTTP المضمّن في camel-main (MainHttpServer)، المُستخدَم في تطبيقات camel-main المستقلة وcamel-jbang. هذا الخادم ليس تكامل platform-http في Camel Spring Boot (القائم على servlet) ولا نظيره في Camel Quarkus (HTTP عبر Quarkus/Vert.x مع نظام أمان خاص به)، لذلك لا يوجد مُعاد إنتاج أمين لـ Spring Boot أو Quarkus لهذا العيب تحديدًا. ومن ثَمَّ يوفّر هذا المستودع مُعاد إنتاج مستقلًا لـ camel-main، وهو المضيف الدقيق لهذه الثغرة.
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
النشرة الأمنية: https://camel.apache.org/security/CVE-2026-66908.html
ابتداءً من الإصدار 4.22.0، يرفض الخادم بدء التشغيل عندما يكون keystore خاص بـJWT مضبوطًا دون تعيين jwtIssuer ولا
jwtAudience، مع ذكر الخصائص المفقودة. المشغِّل الذي يريد فعلًا تحقّقًا يقتصر على التوقيع وانتهاء الصلاحية فقط
عليه أن يفعّله صراحةً عبر camel.server.jwtAllowMissingIssuerAndAudience=true (الإغلاق عند الفشل هو الوضع الافتراضي):
// 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 على فهم الثغرة، والتحقق ممّا إذا كانوا متأثرين بها، والتأكد من أن الترقية تحلّها. تُنشأ الرموز (tokens) محليًا مقابل keystore تجريبي مؤقت مضمّن في المشروع. لا تستخدم هذه المادة ضد أنظمة لا تملكها أو لا تديرها.
| الخاصية | القيمة |
|---|
| المكوّن | camel-platform-http-main (خادم HTTP المضمّن في camel-main) |
| CWE | CWE-287 (مصادقة غير سليمة) / CWE-1259 (نقص التحقق من ادّعاءات الأمان) |
| متجه الهجوم | JWT موقَّع بالمفتاح الموثوق (مثل JWKS مشترك) لكنه صادر لكيان/جمهور مختلف (issuer/audience) |
| الأثر | يُقبل أي رمز غير منتهي الصلاحية من أي طرف يشارك مفتاح التوقيع — أي أن النشر يفرض حماية أقل مما يظنه المشغِّل |
| الإصدارات المتأثرة | من 4.8.0 حتى ما قبل 4.22.0 |
| الإصدارات المُصحَّحة | 4.22.0 |
| JIRA | CAMEL-24281 |
| الإبلاغ | n0mi1k |