
# تحليل تقني لـ CVE-2026-26717: هجوم توقيت HMAC في مصادقة Webhook الخاصة بـ OpenFUN Richie LMS يتضمن هذا التحليل الكود الضعيف، والأثر المترتب على الثغرة، والإصلاح باستخدام `hmac.compare_digest`.
المؤلف: Elvin Latifli
معرف CVE: CVE-2026-26717
الخطورة: متوسطة (CVSS 3.1: 4.8 — AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N)
المنتج المتأثر: OpenFUN Richie (جميع الإصدارات قبل الالتزام a1b5bbd)
المكوّن المتأثر: src/richie/apps/courses/api.py — sync_course_runs_from_request
التزام الإصلاح: a1b5bbda
Richie هو نظام إدارة محتوى مفتوح المصدر تم تطويره بواسطة France Université Numérique (OpenFUN)، مبني على DjangoCMS. وهو مصمم لمساعدة المؤسسات على بناء بوابات تعليمية عبر الإنترنت كاملة الميزات مع كتالوجات دورات تتم مزامنتها من أنظمة إدارة التعلم (LMS) مثل OpenEdX. يتعامل Richie مع مزامنة بيانات الدورات عبر خطافات الويب المصادق عليها — أحدها يحتوي على الثغرة الموضحة في هذا التقرير.
استخدم نقطة نهاية خطاف الويب sync_course_runs_from_request عامل المقارنة القياسي لمقارنة رأس الوارد مع توقيع HMAC المتوقع:
==Authorization# VULNERABLE
signature_is_valid = any(
authorization_header == get_signature(message, secret)
for secret in getattr(settings, "RICHIE_COURSE_RUN_SYNC_SECRETS", [])
)
يقوم عامل == بإجراء مقارنة غير ثابتة الزمن — فهو يتوقف مبكرًا بمجرد العثور على أول حرف غير متطابق. من خلال إرسال العديد من الطلبات المصممة بعناية وقياس الاختلافات في زمن الاستجابة، يمكن لمهاجم عن بُعد استنتاج التوقيع الصحيح حرفًا بحرف، مما يؤدي في النهاية إلى تزوير رمز مصادقة صالح وتجاوز مصادقة خطاف الويب بالكامل.
يسمح الهجوم الناجح لمهاجم عن بُعد غير مصادق بما يلي:
يستبدل الإصلاح == بدالة hmac.compare_digest() في بايثون، وهي مصممة لمقارنة السلاسل بزمن ثابت وتزيل القناة الجانبية للتوقيت:
# FIXED
signature_is_valid = any(
hmac.compare_digest(authorization_header, get_signature(message, secret))
for secret in getattr(settings, "RICHIE_COURSE_RUN_SYNC_SECRETS", [])
)