MySQL Community Server 26.7.0 - Alta - Esquema cualificado de INSTALL COMPONENT - omisión de plugin_dir
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-install-component-scheme
Clase: RCE Alcance: Remoto
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
El INSTALL COMPONENT file:// por defecto está envuelto por mysql_server_path_filter y forzado bajo plugin_dir. El cargador libminchassis sin filtrar permanece registrado como dynamic_loader_scheme_file.mysql_minimal_chassis. El esquema URN file.mysql_minimal_chassis adquiere esa implementación y hace dlopen de una ruta absoluta con el UID de mysqld. INSTALL PLUGIN / CREATE FUNCTION SONAME siguen rechazando /. Requiere INSERT en mysql.component (PR:H).
El laboratorio copia el component_query_attributes.so original a /tmp/MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS.so. Sin componente personalizado.
| Campo | Valor |
|---|---|
| ID | sin CVE todavía |
| Clase | RCE (componente dlopen como mysqld; PR:H; el laboratorio cargó un .so original) |
| Alcance | Remoto (SQL autenticado; 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 |
| Producto | MySQL Community Server mysqld |
| Afectado | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Autenticación | INSTALL COMPONENT (INSERT en mysql.component) |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | Solo 127.0.0.1. Componente original sin usar copiado fuera de plugin_dir. |
Tener INSTALL COMPONENT. Colocar un componente .so fuera de plugin_dir (FILE DUMPFILE bajo secure_file_priv, o una escritura local). INSTALL COMPONENT 'file.mysql_minimal_chassis:///abs/name' (sin sufijo .so; el cargador lo añade). dlopen con el UID de mysqld. El mismo URN se persiste en mysql.component y se recarga al reiniciar.
file:///abs/name es denegado (3529). INSTALL PLUGIN ... SONAME '/abs/...' es denegado (1124). El esquema cualificado es el remanente.
La misma búsqueda en 26.7.0. set_default("dynamic_loader_scheme_file.mysql_server_path_filter") es el límite documentado. La implementación sin filtrar permanece registrada para que el envoltorio pueda llamarla. get_scheme_service_from_urn toma los bytes antes de :// como el esquema.
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 es un esquema real. component.test nunca lo intenta.
Caminos erróneos: URN de 3 barras (scheme:///tmp/...) cargó; el de 4 barras no fue necesario. El tallo del URN debe omitir .so.
cd lab
./run.sh
Imagen mysql:26.7.0. Publicado 127.0.0.1:18650. plugin_dir=/usr/lib64/mysql/plugin. Copia el component_query_attributes.so original a /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
No adquirir dynamic_loader_scheme_file.mysql_minimal_chassis desde URNs de SQL. Mapear solo file a la implementación del filtro de rutas. Rechazar un esquema que nombre una implementación. Mantener check_valid_path en cada cargador de archivos.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)components/libminchassis/dynamic_loader.cc get_scheme_service_from_urnsql/server_component/dynamic_loader_path_filter.cc