
MySQL Community Server 26.7.0 - عالي - SET ROLE ALL EXCEPT leftover FILE - كتابة mysqld UID
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-set-role-leftover
المقال: https://abraxaslabs.tech/research/mysql-set-role-leftover
الفئة: صلاحية متبقية (FILE بصلاحية UID الخاص بـ mysqld؛ وليس تصعيد صلاحيات على مستوى نظام التشغيل) الوصول: عن بُعد
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
يقوم SET ROLE ALL EXCEPT rfile (أو SET ROLE DEFAULT دون أي أدوار افتراضية) بمسح قائمة الأدوار النشطة، ثم يعود checkout_access_maps() دون تنفيذ set_master_access(user->access). تكون CURRENT_ROLE() هي NONE. تبقى البتات العامة الثابتة التي جمعها الدور (FILE، PROCESS، SUPER، ...) في m_master_access. يقرأ check_access تلك القيمة المتبقية. في المختبر: الصلاحية المتبقية FILE تكتب عبر INTO OUTFILE بصلاحية UID الخاص بـ mysqld.
المسار الذي يعيد ACL_USER::access هو SET ROLE NONE. أما الصلاحيات الديناميكية (SYSTEM_USER) فتُسقَط. وقد أُغلقت بالفعل الثغرة المتعلقة بالصلاحيات المتبقية على مستوى قاعدة البيانات (Bug#35386565). الحسابات الافتراضية لا تملك أدوارًا.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية (FILE بصلاحية UID الخاص بـ mysqld؛ وليس تصعيد صلاحيات على مستوى نظام التشغيل) |
| الوصول | عن بُعد (SQL موثّق) |
| CWE | CWE-269 |
| CVSS | عالٍ: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| المنتج | MySQL Community Server mysqld |
| المتأثر | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| المصادقة | موثّق؛ يُمنح الضحية دورًا يحمل قوائم ACL عامة ثابتة (FILE في المختبر) |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط. ملف إثبات. كتابة FILE متبقية. |
امتلاك حساب مُنح دورًا يحمل FILE (أو بتًا عامًا ثابتًا آخر). نفّذ SET ROLE لذلك الدور، ثم SET ROLE ALL EXCEPT له. تُبلّغ CURRENT_ROLE() عن NONE. ومع ذلك، لا يزال SELECT 'witness' INTO OUTFILE يكتب بصلاحية UID الخاص بـ mysqld ضمن secure_file_priv.
التطبيق الذي يعزل الصلاحيات باستخدام SET ROLE ALL EXCEPT dangerous_role أو SET ROLE DEFAULT ثم يثق بـ CURRENT_ROLE() لا يزال يمتلك تلك البتات الثابتة. أما SET ROLE NONE فتُسقطها فعليًا.
لا تمنح الصلاحية المتبقية FILE لحساب لم يحمله قط عبر دور. إنها تفشل في إسقاط FILE بعد إلغاء التنشيط.
نفس عملية البحث في 26.7.0 الخاصة بالثغرات الثلاث المتبقية في العميل. كانت قائمة الثغرات الحرجة/العالية غير المنشورة للخادم الافتراضي فارغة. ولا يزال ACL / الأدوار يحتوي على هذا الإرجاع المبكر للدور الفارغ.
void Security_context::checkout_access_maps(void) {
if (m_acl_map != nullptr) {
get_global_acl_cache()->return_acl_map(m_acl_map);
m_acl_map = nullptr;
}
if (m_active_roles.size() == 0) return;
// ...
}
activate_role_all (ALL EXCEPT) وactivate_role_default الفارغ يستدعيان عملية checkout تلك. ثم يقوم activate_role_none بتنفيذ set_master_access(user->access).
خطأ مسجّل مسبقًا: أول SELECT note FROM lab.t INTO OUTFILE متبقٍ أعاد 1142 (ذاكرة db_acl() المؤقتة 0). الثابت SELECT 'witness' INTO OUTFILE هو أداة كشف FILE.
cd lab
./run.sh
صورة mysql:26.7.0. منشورة على 127.0.0.1:18630. الدور rfile يمتلك FILE. الضحية لديها GRANT SELECT ON lab.* وGRANT rfile، وfile_priv=N، ولا دور افتراضي. تسجيل الدخول outfile 1227. SET ROLE rfile outfile ناجح. SET ROLE ALL EXCEPT rfile يجعل CURRENT_ROLE() NONE؛ الكتابة المتبقية outfile تكتب /var/lib/mysql-files/MYSQL-SET-ROLE-LEFTOVER-WITNESS. SET ROLE NONE يعيد 1227 مرة أخرى.
SUCCESS mysql-set-role-leftover before-file=denied with-role=yes leftover-role=NONE leftover-file=yes after-none=denied dump=26.7.0 image=mysql:26.7.0 MYSQL-SET-ROLE-LEFTOVER-WITNESS
عندما تكون m_active_roles فارغة، ينبغي أن يستدعي checkout_access_maps() الدالة set_master_access(user->access) بالطريقة التي تفعلها SET ROLE NONE بالفعل. لا ينبغي أن يحتفظ Empty ALL EXCEPT / DEFAULT بالخريطة المجمّعة السابقة.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)sql/auth/sql_security_ctx.cc checkout_access_mapssql/auth/roles.cc activate_role_all / activate_role_none