MySQL Community Server 26.7.0 - عالي - مخطط مؤهل INSTALL COMPONENT - تخطي plugin_dir
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-install-component-scheme
المقال التقني: https://abraxaslabs.tech/research/mysql-install-component-scheme
التصنيف: RCE الوصول: عن بُعد
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
يُغلَّف الأمر الافتراضي file:// الخاص بـ INSTALL COMPONENT بواسطة mysql_server_path_filter ويُجبَر على العمل ضمن plugin_dir. يبقى محمّل libminchassis غير المُفلتر مسجَّلاً باسم dynamic_loader_scheme_file.mysql_minimal_chassis. يستحوذ مخطط URN باسم file.mysql_minimal_chassis على ذلك التنفيذ ويقوم بـ dlopen لمسار مطلق بصلاحيات UID الخاص بـ mysqld. لا يزال INSTALL PLUGIN / CREATE FUNCTION SONAME يرفضان /. يتطلب صلاحية INSERT على mysql.component (PR:H).
ينسخ المختبر نسخة أصلية من component_query_attributes.so إلى /tmp/MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS.so. دون أي مكوّن مخصص.
| الحقل | القيمة |
|---|---|
| المعرّف | لا يوجد CVE بعد |
| التصنيف | RCE (dlopen للمكوّن بصلاحيات mysqld؛ PR:H؛ حمّل المختبر ملف .so أصلياً) |
| الوصول | عن بُعد (SQL موثّق؛ INSTALL COMPONENT / PR:H) |
| CWE | CWE-427 |
| CVSS | مرتفع: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| المنتج | MySQL Community Server mysqld |
| المتأثر | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| المصادقة | INSTALL COMPONENT (INSERT على mysql.component) |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط. نُسخ مكوّن أصلي غير مستخدم إلى خارج plugin_dir. |
امتلاك صلاحية INSTALL COMPONENT. وضع مكوّن .so خارج plugin_dir (عبر FILE DUMPFILE ضمن secure_file_priv، أو كتابة محلية). INSTALL COMPONENT 'file.mysql_minimal_chassis:///abs/name' (دون لاحقة .so؛ يضيفها المحمّل). ثم dlopen بصلاحيات UID الخاص بـ mysqld. يُحفظ نفس URN في mysql.component ويُعاد تحميله عند إعادة التشغيل.
يُرفض file:///abs/name (3529). ويُرفض INSTALL PLUGIN ... SONAME '/abs/...' (1124). المخطط المؤهَّل هو ما تبقّى.
نفس عملية البحث في 26.7.0. set_default("dynamic_loader_scheme_file.mysql_server_path_filter") هو الحد الموثّق. يبقى التنفيذ غير المُفلتر مسجَّلاً كي يتمكن الغلاف من استدعائه. يأخذ get_scheme_service_from_urn البايتات قبل :// كمخطط.
my_service<SERVICE_TYPE(dynamic_loader_scheme)> service(
(my_string("dynamic_loader_scheme_") + scheme).c_str(),
&imp_mysql_minimal_chassis_registry);
file.mysql_minimal_chassis مخطط حقيقي. component.test لا يجرّبه أبدًا.
المنعطفات الخاطئة: تم تحميل URN بثلاث شرطات مائلة (scheme:///tmp/...)؛ لم تكن هناك حاجة إلى أربع شرطات مائلة. يجب أن يحذف جذر URN الامتداد .so.
cd lab
./run.sh
Image mysql:26.7.0. منشور 127.0.0.1:18650. plugin_dir=/usr/lib64/mysql/plugin. ينسخ component_query_attributes.so الأصلي إلى /tmp/MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS.so.
SUCCESS mysql-install-component-scheme file-slash-denied=yes qualified-load=yes component-urn=yes dump=26.7.0 image=mysql:26.7.0 MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS
لا تقم بجلب dynamic_loader_scheme_file.mysql_minimal_chassis من عناوين SQL URNs. اربط file فقط بتطبيق مرشح المسار. ارفض أي مخطط يسمّي تطبيقًا. أبقِ check_valid_path على كل محمّل ملفات.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)components/libminchassis/dynamic_loader.cc get_scheme_service_from_urnsql/server_component/dynamic_loader_path_filter.cc