
MariaDB v11.1 RCE عبر UDF — PoC معدل مبني على Ant1sec-ops/CVE-2024-27766.
| المتأثر | MariaDB v11.1 |
| الإصلاح في | 10.5.25 / 10.6.18 / 10.11.8 / 11.0.6 / 11.1.5 / 11.2.4 / 11.4.2+ |
| النوع | RCE عبر دالة معرفة من المستخدم (UDF) |
تتيح MariaDB v11.1 للمهاجم الذي يمتلك صلاحيات قاعدة بيانات كافية (صلاحية FILE + صلاحية الكتابة في مجلد الإضافات) تسجيل دالة UDF خبيثة وتنفيذ أوامر نظام تشغيل تعسفية من خلالها.
ملاحظة: تعترض مؤسسة MariaDB على هذا CVE بحجة عدم تجاوز حدّ صلاحيات. يتطلب الاستغلال وصولاً على مستوى مسؤول قاعدة البيانات أو ما يعادله.
يستخدم الـ PoC الأصلي نوع إرجاع longlong، لذلك تقوم do_system() فقط بإرجاع ما إذا نجح الأمر أم لا — لا يمكنك رؤية المخرجات مباشرة من SQL.
هذه النسخة تغيّر نوع الإرجاع إلى char *، مما يعيد توجيه stdout كنتيجة للاستعلام. لا حاجة لقناة خارج النطاق؛ فقط نفّذ SELECT do_system('whoami') وستظهر المخرجات مباشرة.
جدير بالملاحظة: إرجاع char * من UDF يتطلب أن تعرف MariaDB حجم المخزن المؤقت مسبقًا. يقوم do_system_init بتعيين initid->max_length = 65536، بما يطابق مخزن الإخراج المخصّص في الدالة الرئيسية.
نظرًا لأن نوع الإرجاع تغيّر، يجب استخدام RETURNS STRING عند تسجيل الدالة — وليس RETURNS INTEGER كما في الأصل.
CREATE FUNCTION do_system RETURNS STRING SONAME 'do_system.dll';
_popen / _pclose)FILE وصلاحية كتابة في مجلد الإضافاتلأغراض تعليمية وبحثية فقط. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.
| الأصل | هذا الـ PoC |
|---|
| نوع الإرجاع | longlong | char * |
| التنفيذ | system() | _popen() + حلقة fgets() |
| نتيجة SQL | رمز الخروج | مخرجات الأمر stdout |
| الذاكرة | لا شيء | مخصّصة في الكومة، تُحرَّر في deinit |