
مرجع CVE-2024–27632
في Savane الإصدار 3.12 وما قبله، يتم استخدام الطابع الزمني ليونكس (Unix timestamp) كبذرة في مولّد الأعداد العشوائية الزائفة (PRNG) المستخدم لتوليد رموز الحماية من تزوير الطلبات عبر المواقع (CSRF) (form_id). ونتيجة لذلك، قد يتمكن المهاجم من توليد نفس رمز CSRF الصالح المُعيّن لمستخدم ضحية بشكل مستقل، وبذلك يتجاوز فحوصات CSRF وينجح في تنفيذ هجوم CSRF. يشمل تأثير هجوم CSRF تصعيد الامتيازات والاستيلاء على الحساب.
تصنيف CWE: CWE-335: الاستخدام غير الصحيح للبذور في مولّد الأعداد العشوائية الزائفة (PRNG)
أُبلغ من قبل: Ally Petitt
المنتج المتأثر: Savane
الإصدارات المتأثرة: 3.12 وما قبله
قبل توليد form_id، يتم استدعاء utils_srand(). بعد ذلك، يتم إنشاء form_id الناتج كقيمة تجزئة MD5 لقيمة يولّدها PRNG الخاص بـ PHP.
frontend/php/include/form.php:61
if (!$form_id)
{
utils_srand ();
$form_id = md5 (mt_rand (0, 1000000));
}
كما هو موضح في كتلة الكود أدناه، يتم تعريف utils_srand() كدالة تُبذر microtime()، وهي دالة تُرجع الطابع الزمني ليونكس، مضروبًا في 1,000,000.
frontend/php/include/utils.php:969
function utils_srand ()
{
mt_srand ((int)((double)microtime () * 1000000));
}
ونتيجة لذلك، يتم استخدام الطابع الزمني ليونكس، وهو قيمة قابلة للتنبؤ، لتوليد رقم عشوائي زائف ذي أهمية أمنية بالغة. يمكن للمهاجم أن يخمّن أو يستحث الوقت الذي تم فيه إنشاء رمز المستخدم للحصول على طابع زمني صالح يمكنه استخدامه لصناعة رمز CSRF صالح.
تهدف هذه الخطوات إلى إظهار أن معرفة الطابع الزمني كافية لتوليد رمز صالح بشكل مستقل. قد تتضمن استراتيجيات الهجوم في العالم الحقيقي إبداعًا إضافيًا لضمان استنتاج الطابع الزمني الصحيح لإنشاء الرمز.
form_id.$RECORDED_UNIX_TIME بالوقت الذي تم تسجيله وشغّل سكربت PHP التالي. لاحظ أن القيمة المولّدة تطابق form_id الذي أعاده الخادم عند زيارتك الأولى لصفحة الويب.<?php
mt_srand ((int)((double)$RECORDED_UNIX_TIME* 1000000));
echo md5 (mt_rand (0, 1000000));
?>
قم بالترقية إلى Savane الإصدار 3.13 أو أحدث. يمكن العثور على التصحيح هنا.