كل المقالات

ثغرة تجاوز المصادقة في ⁨TokenGuard⁩: هل تطبيقك معرّض، وماذا تشغّل اليوم

الأمان · 4 دقيقة قراءة ·

افتح ملف ⁨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، أي أن الترقية نفسها تغطي الثغرتين.

ابحث في ⁨config/auth.php⁩ عن كلمة ⁨token⁩. إن لم يستخدمها أي حارس فهذه الثغرة لا تصلك، لكن حدّث على أي حال: ثغرة ⁨JSON:API⁩ قد تصلك.

ماذا تشغّل

composer update laravel/framework
composer audit

أضف ⁨composer audit⁩ إلى خط التكامل المستمر أيضًا، حتى يظهر التنبيه القادم كبناء فاشل لا كمقال تصادفه. في هذا الموقع راجعت الأمرين: ملف ⁨composer.lock⁩ يثبّت ⁨laravel/framework v13.35.0⁩ وهي بعد 13.29.0، وملف ⁨config/auth.php⁩ لا يعرّف إلا حارس ⁨session⁩، فلا يوجد حارس ⁨token⁩ هنا من الأساس. وإن كنت تبني واجهة برمجية جديدة فـ⁨Sanctum⁩ خيار افتراضي أكثر أمانًا من حارس الرموز المجرد، ومهما استخدمت، تأكد أن كل بيانات اعتماد نصٌّ قبل أن تصل إلى استعلام.

المصدر: مقال ⁨Laravel News⁩ عن ثغرة حارس الرموز.

ملاحظات القراء

  1. لا توجد ملاحظات بعد. الأولى دائمًا الأجرأ.
باغي تبني شي حاجة بحال هادي؟ نقدر نعاونك. راسلني على واتساب