MySQL Community Server 26.7.0 - High - schema qualificato INSTALL COMPONENT - plugin_dir skip
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-install-component-scheme
Classe: RCE Portata: Remota
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
Il file:// INSTALL COMPONENT predefinito è incapsulato da mysql_server_path_filter e forzato sotto plugin_dir. Il loader libminchassis non filtrato rimane registrato come dynamic_loader_scheme_file.mysql_minimal_chassis. Lo schema URN file.mysql_minimal_chassis acquisisce quell'implementazione ed esegue dlopen su un percorso assoluto con l'UID di mysqld. INSTALL PLUGIN / CREATE FUNCTION SONAME rifiutano ancora /. Richiede INSERT su mysql.component (PR:H).
Il laboratorio copia il component_query_attributes.so originale in /tmp/MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS.so. Nessun componente personalizzato.
| Campo | Valore |
|---|---|
| ID | nessuna CVE al momento |
| Classe | RCE (componente dlopen come mysqld; PR:H; il laboratorio ha caricato un .so originale) |
| Portata | Remota (SQL autenticato; INSTALL COMPONENT / PR:H) |
| CWE | CWE-427 |
| CVSS | Alto: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Prodotto | MySQL Community Server mysqld |
| Affetto | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | INSTALL COMPONENT (INSERT su mysql.component) |
| Licenza | GNU Affero GPL v3.0 |
| Laboratorio | Solo 127.0.0.1. Componente originale inutilizzato copiato fuori da plugin_dir. |
Possiede INSTALL COMPONENT. Posiziona un componente .so fuori da plugin_dir (FILE DUMPFILE sotto secure_file_priv, o una scrittura locale). INSTALL COMPONENT 'file.mysql_minimal_chassis:///abs/name' (senza suffisso .so; il loader lo aggiunge). dlopen con l'UID di mysqld. Lo stesso URN viene persistito in mysql.component e ricaricato al riavvio.
file:///abs/name viene negato (3529). INSTALL PLUGIN ... SONAME '/abs/...' viene negato (1124). Lo schema qualificato è ciò che rimane.
Stessa ricerca sulla 26.7.0. set_default("dynamic_loader_scheme_file.mysql_server_path_filter") è il confine documentato. L'implementazione non filtrata rimane registrata così che il wrapper possa richiamarla. get_scheme_service_from_urn prende i byte prima di :// come 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 è uno schema reale. component.test non lo prova mai.
Vicoli ciechi: URN con 3 slash (scheme:///tmp/...) caricato; 4 slash non erano necessari. Il nome base dell'URN deve omettere .so.
cd lab
./run.sh
Immagine mysql:26.7.0. Pubblicato 127.0.0.1:18650. plugin_dir=/usr/lib64/mysql/plugin. Copia il component_query_attributes.so originale in /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
Non acquisire dynamic_loader_scheme_file.mysql_minimal_chassis dagli URN SQL. Mappare solo file all'implementazione del filtro di percorso. Rifiutare uno schema che nomina un'implementazione. Mantenere check_valid_path su ogni loader di file.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)components/libminchassis/dynamic_loader.cc get_scheme_service_from_urnsql/server_component/dynamic_loader_path_filter.cc