MySQL Community Server 26.7.0 – Hoch – INSTALL COMPONENT qualifiziertes Schema – plugin_dir überspringen
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-install-component-scheme
Klasse: RCE Reichweite: Remote
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
Das standardmäßige file:// INSTALL COMPONENT wird von mysql_server_path_filter umschlossen und unter plugin_dir erzwungen. Der ungefilterte libminchassis-Loader bleibt als dynamic_loader_scheme_file.mysql_minimal_chassis registriert. Das URN-Schema file.mysql_minimal_chassis erlangt diese Implementierung und dlopent einen absoluten Pfad als mysqld-UID. INSTALL PLUGIN / CREATE FUNCTION SONAME lehnen / weiterhin ab. Benötigt INSERT auf mysql.component (PR:H).
Das Lab kopiert das mitgelieferte component_query_attributes.so nach /tmp/MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS.so. Keine benutzerdefinierte Komponente.
| Feld | Wert |
|---|---|
| ID | noch keine CVE |
| Klasse | RCE (Komponente dlopen als mysqld; PR:H; Lab lud eine mitgelieferte .so) |
| Reichweite | Remote (authentifiziertes SQL; INSTALL COMPONENT / PR:H) |
| CWE | CWE-427 |
| CVSS | Hoch: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Produkt | MySQL Community Server mysqld |
| Betroffen | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | INSTALL COMPONENT (INSERT auf mysql.component) |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1. Mitgelieferte ungenutzte Komponente außerhalb von plugin_dir kopiert. |
INSTALL COMPONENT besitzen. Eine Komponenten-.so außerhalb von plugin_dir platzieren (FILE DUMPFILE unter secure_file_priv oder ein lokaler Schreibvorgang). INSTALL COMPONENT 'file.mysql_minimal_chassis:///abs/name' (kein .so-Suffix; der Loader hängt es an). dlopen als mysqld-UID. Dieselbe URN wird in mysql.component persistiert und beim Neustart erneut geladen.
file:///abs/name wird verweigert (3529). INSTALL PLUGIN ... SONAME '/abs/...' wird verweigert (1124). Das qualifizierte Schema ist der Überrest.
Dieselbe 26.7.0-Jagd. set_default("dynamic_loader_scheme_file.mysql_server_path_filter") ist die dokumentierte Grenze. Die ungefilterte Implementierung bleibt registriert, damit der Wrapper sie aufrufen kann. get_scheme_service_from_urn nimmt die Bytes vor :// als Schema.
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 ist ein echtes Schema. component.test versucht es nie.
Irrwege: 3-Schrägstrich-URN (scheme:///tmp/...) lud; 4 Schrägstriche waren nicht nötig. Der URN-Stamm muss .so weglassen.
cd lab
./run.sh
Image mysql:26.7.0. Veröffentlicht 127.0.0.1:18650. plugin_dir=/usr/lib64/mysql/plugin. Kopiert das mitgelieferte component_query_attributes.so nach /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 nicht aus SQL-URNs beziehen. Nur file auf die pfadfilternde Implementierung abbilden. Ein Schema ablehnen, das eine Implementierung benennt. check_valid_path bei jedem Datei-Loader beibehalten.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)components/libminchassis/dynamic_loader.cc get_scheme_service_from_urnsql/server_component/dynamic_loader_path_filter.cc