CVE-2026-32710: من SELECT عادي إلى ALL PRIVILEGES في MariaDB عبر تجاوز سعة الكومة

تم نشر تحليل لـ CVE-2026-32710 في MariaDB 11.4.9. تم الإبلاغ عن الثغرة في البداية على أنها مجرد انهيار بسيط في JSON_SCHEMA_VALID() عند معالجة سلسلة طويلة. ومع ذلك، أظهر الباحث أنه يمكن استغلال العيب لتصعيد صلاحيات مستخدم قاعدة بيانات منخفض الصلاحيات والاحتفاظ بالصلاحيات المرتفعة حتى بعد إعادة تشغيل الخادم.
تكمن الثغرة في json_get_normalized_string() في sql/json_schema_helper.cc. تُنشئ الدالة DYNAMIC_STRING بمخزن مؤقت أولي بحجم 128 بايت، لكنها تستخدم strncpy() لبيانات JSON ذات القيمة النصية دون توسيع المخزن المؤقت أولاً. ونتيجة لذلك، تؤدي قيمة مصممة خصيصًا تتم معالجتها أثناء التحقق من enum إلى تجاوز سعة مخزن الكومة: نسخ سلسلة بطول 194 بايت يكتب فوق 66 بايتًا خارج المخزن المؤقت المخصص.
باستخدام تهيئة الكومة (heap grooming)، يرتب الباحث عدة متغيرات مستخدم في MariaDB متجاورة على الكومة. يعدّل التجاوز البايتين الأدنى من مؤشر value في بنية user_var_entry، مما يعيد توجيهه إلى حقول تنتمي إلى متغير آخر. تحوّل التعيينات اللاحقة داخل SELECT واحد هذا التجاوز المحدود إلى كتابة إلى عنوان يختاره المهاجم. الهدف هو Security_context::master_access. بعد كتابة ثمانية بايتات من 0xFF في هذا الحقل، يعامل الخادم الجلسة الحالية على أنها تمتلك جميع الصلاحيات.
بهذه الصلاحيات، ينفذ المهاجم GRANT ALL PRIVILEGES ON . ... WITH GRANT OPTION، ويحفظ MariaDB تغييرات الصلاحيات في جدول mysql.global_priv. حتى إذا انهارت عملية الخادم لاحقًا بسبب تلف الكومة، فإن الصلاحيات المرتفعة تبقى بعد إعادة التشغيل لأن MariaDB يعيد تحميلها من الجدول.
قيد مهم في PoC: هذا ليس بعد استغلالًا مكتفيًا ذاتيًا بالكامل. لتحديد عنوان master_access وبايتات المؤشر المطلوبة، استخدم الباحث وصولًا مختبريًا إلى /proc/1/mem. سيتطلب الهجوم في العالم الحقيقي بدائية إضافية للكشف عن العناوين. لذلك، لا يثبت العرض أن أي مستخدم لديه صلاحيات SELECT يمكنه الحصول فورًا على وصول إداري إلى خادم MariaDB عشوائي. كما أظهر الباحث مسارًا لتنفيذ أوامر نظام التشغيل عبر دالة يحددها المستخدم (UDF)، لكن هذا يتطلب القدرة على الكتابة إلى plugin_dir. في بيئة Docker الاختبارية، جُعل الدليل قابلًا للكتابة عمدًا، لذا لا يمكن اعتبار RCE نتيجة مضمونة للثغرة.
يستبدل الإصلاح استدعاء strncpy() غير الآمن بـ dynstr_set()، الذي يوسّع المخزن المؤقت قبل النسخ. ومع ذلك، فإن التحديث يصلح التجاوز فقط؛ الصلاحيات الممنوحة بالفعل عبر الاستغلال لا تُلغى تلقائيًا. بعد تثبيت الإصلاح، يجب على المسؤولين تدقيق mysql.global_priv بحثًا عن منح غير متوقعة لـ ALL PRIVILEGES WITH GRANT OPTION، خاصة للحسابات التي مُنحت في الأصل SELECT فقط.
الثغرات
الباحثون
المورّدون
المنتجات