
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
الفئة: صلاحية متبقية (FILE بهوية mysqld UID؛ ليس تصعيد صلاحيات على مستوى نظام التشغيل) الوصول: عن بُعد
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 بهوية mysqld UID.
SET ROLE NONE هو المسار الذي يعيد ACL_USER::access. تُسقَط الصلاحيات الديناميكية (SYSTEM_USER). المتبقي على مستوى قاعدة البيانات مُغلق بالفعل (Bug#35386565). الحسابات الافتراضية ليس لها أدوار.
| المعرّف | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية (FILE بهوية mysqld UID؛ ليس تصعيد صلاحيات على مستوى نظام التشغيل) |
| الوصول | عن بُعد (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 يكتب بهوية mysqld UID ضمن secure_file_priv.
التطبيق الذي يعزل باستخدام SET ROLE ALL EXCEPT dangerous_role أو SET ROLE DEFAULT ثم يثق بـ CURRENT_ROLE() لا يزال يمتلك تلك البتات الثابتة. أما SET ROLE NONE فيُسقطها فعليًا.
لا يمنح المتبقي صلاحية FILE لحساب لم يحصل عليها أبدًا عبر دور. إنه يفشل في إسقاط FILE بعد إلغاء التنشيط.
نفس عملية البحث في 26.7.0 كالمتبقيات الثلاث في العميل. كان المنشور غير المنشور للخادم الافتراضي من فئة Crit/High فارغًا. لا تزال 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 بالفعل. لا ينبغي لـ ALL EXCEPT / DEFAULT الفارغ الاحتفاظ بالخريطة المجمّعة السابقة.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)sql/auth/sql_security_ctx.cc checkout_access_mapssql/auth/roles.cc activate_role_all / activate_role_none