
إثبات المفهوم والتقرير الفني لـ CVE-2026-73309، وهو تجاوز للمصادقة عبر OAuth2 في XenForo قبل الإصدار 2.3.13. يوضح تجاوز التحقق من سر العميل الفارغ و PKCE باستخدام سكربت Python.
يمكن لـ XenForo قبل الإصدار 2.3.13 تخطي التحقق من سر العميل (client-secret) والتحقق من PKCE في OAuth2 عندما تصل سلسلة فارغة إلى نقطة نهاية الرمز (token endpoint).
تتحقق نقطة النهاية من وجود المفتاحين client_secret وcode_verifier، ثم تُجري المقارنات فقط عندما تكون قيم سلاسل PHP الخاصة بهما صادقة (truthy). لذلك، فإن القيمة الفارغة تفي بفحص الوجود ولكنها تتجاوز المقارنة.
بالنسبة لعميل OAuth عام، لا يزال المهاجم بحاجة إلى رمز تفويض صالح. يزيل الخطأ ضمان PKCE بأن الرمز وحده غير كافٍ: يمكن استبدال الرمز دون الحاجة إلى المُتحقق (verifier)، مما ينتج رموزًا بالصلاحيات التي وافق عليها المستخدم. أثر نفس نمط القيمة الخاطئة (falsey-value) على فحوصات العملاء السريين (confidential clients).
أعدت إنتاج المشكلة على XenForo 2.3.12 (build 2031270) في تثبيت محلي مصرح به. يحتوي XenForo 2.3.13 على الإصلاح.
يقوم البرنامج النصي بإجراء عملية استبدال رمز واحدة مع code_verifier فارغ، ويقوم بتجزئة أي رمز وصول مُعاد، ويتحقق مما إذا كان يوثق الهوية. لا يطبع أبدًا الرمز أو هوية الحساب.
python poc.py https://xenforo.example CLIENT_ID AUTHORIZATION_CODE https://client.example/callback
يُرجع التثبيت الضعيف HTTP 200 من نقطة نهاية الرمز واستجابة موثقة من /api/me. يرفض التثبيت المُصلح عملية الاستبدال.
استخدم فقط رمز تفويض تم إنشاؤه لحساب يمكن التخلص منه على نظام لديك إذن باختباره.
اكتُشف بواسطة Marco Paciaroni (BomboBombone).