
أداة إثبات مفهوم قابلة للتشغيل لإعادة إنتاج CVE-2026-84178، وهو هجوم CSRF على تسجيل الدخول في رد نداء رمز التفويض الخاص بـ camel-oauth في Apache Camel، والذي يستبدل الرموز دون التحقق من الحالة.
state)مُعيد إنتاج قابل للتشغيل لإثبات المفهوم لثغرة Apache Camel حيث لم يكن استدعاء رمز التفويض في OAuth
يحمل معامل state يربطه بطلب التفويض الذي بدأ التدفق، ولم يكن يتحقق
منه. لذلك يمكن استبدال رمز تفويض تم الحصول عليه في أي متصفح عند نقطة الاستدعاء وربطه
بالجلسة التي قدّمته — تزوير طلب عبر المواقع لتسجيل الدخول: يتم تسجيل دخول الضحية بصمت بهوية
يتحكم بها المهاجم، فتقع إجراءات الضحية اللاحقة وبياناتها في حساب المهاجم. (كما أن نقطة الاستدعاء
غير المُتحقَّق منها نفسها كانت تسمح بالتأثير على هدف إعادة التوجيه بعد المصادقة — إعادة توجيه مفتوحة.)
وكما تشير النشرة الأمنية، فإن فحص state يُنفَّذ قبل استبدال الرمز، لذا فإن الفرق قابل للوصول دون
أي تفاعل مع مزوّد الهوية.
| بيئة التشغيل | الدليل | المكدّس التقني |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-oauth 4.22.0 (متأثر؛ مُصلَح في 4.22.1)، الاستدعاء عبر camel-undertow |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-oauth 3.39.0 (Camel 4.22.0، متأثر؛ ضابط مُصلَح 3.40.0 / Camel 4.22.1)، الاستدعاء عبر camel-quarkus-platform-http |
يُظهر كلا الوحدتين السلوك المتأثر و السلوك المُصلَح.
يعالج المعالج الحقيقي غير المعدَّل OAuthCodeFlowCallback نقطة نهاية الاستدعاء. يتم تسجيل OAuth وهمي
في سجل Camel حتى يعمل الاستدعاء دون مزوّد هوية حقيقي — فهو يمثّل مزوّد الهوية فقط، ويسجّل عند استبدال
رمز التفويض (والذي يربط، في التدفق الحقيقي، الهوية الناتجة بالجلسة
التي قدّمته). يضرب المهاجم ببساطة نقطة الاستدعاء بـ code ودون state مطابق:
state
مطابقًا لطلب التفويض الذي بدأته هذه الجلسة) — ولا يتم استبدال الرمز أبدًا.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
الناتج المتوقع على البناء المتأثر:
Request: GET /callback?code=ATTACKER-SUPPLIED-AUTH-CODE (no 'state' parameter)
Callback HTTP status: 302
>>> PROVEN: the callback redeemed the authorization code ... WITHOUT verifying a state parameter ... login CSRF.
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-oauth (استدعاء رمز التفويض، OAuthCodeFlowCallback) |
| CWE | CWE-352 (تزوير الطلب عبر المواقع) |
| الخطورة | متوسطة |
| ناقل الهجوم | طلب استدعاء يحمل رمز تفويض دون state مرتبط بطلب التفويض الخاص بالجلسة |
| التأثير | CSRF في تسجيل الدخول (تسجيل دخول الضحية بهوية يتحكم بها المهاجم)؛ إعادة توجيه مفتوحة من أصل موثوق |
| الإصدارات المتأثرة | من 4.11.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24437 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-84178.html
أصبح الاستدعاء الآن يحمل ويتحقق من معامل state أحادي الاستخدام مرتبط بطلب التفويض الذي بدأته الجلسة:
expectedState = session.removeValue(OAUTH_STATE)، ويُقارَن (بزمن ثابت) بمعامل الاستعلام state. إذا لم تكن هناك
عملية جارية، أو لم يتطابق الـ state، فإن الاستدعاء يرفض الطلب قبل استبدال الرمز.
ضع الاستدعاء خلف مكوّن يفرض ربط CSRF عبر state، أو لا تعتمد على استدعاء تدفق رمز OAuth لإنشاء الجلسة، حتى تتمكن من
الترقية.
نُشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. مزوّد الهوية التجريبي و"رمز المهاجم" هما عناصر محلية خاملة. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.