ثغرة تجاوز المصادقة في TokenGuard: هل تطبيقك معرّض، وماذا تشغّل اليوم
افتح ملف config/auth.php في مشروعك قبل أن تكمل القراءة، فهو وحده يحدد إن كانت هذه الثغرة تخصّك. نشر موقع Laravel News يوم 2026-10-20 خبر ثغرة حرجة رقمها GHSA-f9x3-7vq9-cph6 بدرجة CVSS تبلغ 9.2، في الصنف Illuminate\Auth\TokenGuard الذي يقف خلف مشغّل الحارس token. على قواعد MySQL وMariaDB كان بإمكان مهاجم بلا حساب أن يُصادَق كمستخدم موجود دون أن يعرف رمز الواجهة البرمجية الخاص به.
ما الذي حدث
بحسب ما ينقله Laravel News عن نص التنبيه، كان الحارس يتأكد فقط من أن الرمز القادم من الطلب ليس فارغًا قبل أن يمرّره إلى مزوّد المستخدمين. قيمة مصاغة بعناية وليست نصًا عبرت هذا الفحص، فطابق الاستعلام الذي تلاه سجلّ مستخدم لم يكن يجب أن يطابقه، بدل أن يفشل. يُنسب الإبلاغ إلى Hristijan Manasijev. الإصلاح أضاف فحصًا للنوع في الدالتين user() وvalidate()، فتُرفض أي قيمة ليست نصًا قبل تنفيذ أي استعلام.
// before (simplified): only emptiness was checked
if (! empty($token)) { ... }
// after (as quoted in the report): the type is checked first
if (is_string($token) && ! empty($token)) { ... }
لماذا تُعد القيمة غير النصية خطرة عند البحث عن مستخدم
ما يلي شرح عام لهذا الصنف من الأخطاء، وليس الآلية المؤكدة لهذه الثغرة بعينها. مدخلات الطلب في PHP ليست نصًا دائمًا: سلسلة الاستعلام في الرابط أو جسم JSON قد يحملان مصفوفة حيث ينتظر كودك قيمة واحدة. وكثير من بانيات الاستعلامات تفهم المصفوفة على أنها عدة قيم أو عدة شروط، لا رمزًا واحدًا للمقارنة. الكود الذي يسأل فقط "هل هي فارغة؟" يمرّر هذه المصفوفة، فيصبح الاستعلام يجيب عن سؤال غير الذي قصدته. الدفاع ممل وموثوق: افحص نوع كل مدخل يشبه بيانات الاعتماد عند حدود التطبيق، قبل أن يلمس أي استعلام.
هل أنت معرّض؟ الجواب في ملف واحد
وفق التنبيه، لا تتأثر إلا إذا كان أحد الحراس في config/auth.php يستخدم المشغّل token، كأن تجد سطرًا مثل 'api' => ['driver' => 'token', 'provider' => 'users']. أما Sanctum وPassport فيسجّلان مشغّلات حراسة خاصة بهما، ولم يرد ذكرهما في التنبيه. النسختان المُصلَحتان هما Laravel 12.68.0 و13.29.0، وتاريخهما 2026-08-25 بحسب مقال Laravel News. كل نسخة أقدم منهما مدرجة كمتأثرة، والإصلاحات صدرت لفرعي 12.x و13.x فقط، فإن كنت على إصدار رئيسي أقدم وتستخدم المشغّل token فالترقية إلى إصدار رئيسي أحدث هي الحل.
في اليوم نفسه صدر تنبيه ثانٍ متوسط الخطورة، رقمه GHSA-5wcm-3v2w-8362 بدرجة 6.5، يخص موارد JSON:API التي أُضيفت في الإصدار 12.45: طلب قراءة فقط كان يمكن صياغته ليطلق عملية حذف أو تعديل في جدول مرتبط. يذكر Laravel News أن الإصلاح في 12.68.0 و13.27.0، أي أن الترقية نفسها تغطي الثغرتين.
ماذا تشغّل
composer update laravel/framework
composer audit
أضف composer audit إلى خط التكامل المستمر أيضًا، حتى يظهر التنبيه القادم كبناء فاشل لا كمقال تصادفه. في هذا الموقع راجعت الأمرين: ملف composer.lock يثبّت laravel/framework v13.35.0 وهي بعد 13.29.0، وملف config/auth.php لا يعرّف إلا حارس session، فلا يوجد حارس token هنا من الأساس. وإن كنت تبني واجهة برمجية جديدة فـSanctum خيار افتراضي أكثر أمانًا من حارس الرموز المجرد، ومهما استخدمت، تأكد أن كل بيانات اعتماد نصٌّ قبل أن تصل إلى استعلام.
ملاحظات القراء