MySQL Community Server 26.7.0 - Alta - ruta residual de mysqldump --tab - escritura de archivo del cliente
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqldump-tab-path
Clase: Escritura de archivo (cliente) Alcance: Remoto (UI:R)
MySQL Community Server mysqldump 26.7.0 (06a5c1c) - Oracle
mysqldump --tab=DIR escribe un .sql por tabla usando fn_format sin MY_REPLACE_DIR. Un nombre hostil de SHOW TABLES con / o .. conserva ese directorio. DIR se ignora. El UID del dump hace my_fopen sobre la ruta.
--tab está documentado como modo en la misma máquina porque el .txt pasa por el INTO OUTFILE del servidor. El .sql sigue siendo una escritura del cliente.
| ID | sin CVE todavía |
| Clase | Escritura de archivo (cliente --tab .sql) |
| Alcance | Remoto (la víctima ejecuta mysqldump --tab contra un MySQL atacante; UI:R) |
| CWE | CWE-22 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| Producto | MySQL Community Server mysqldump |
| Afectado | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | la víctima ejecuta mysqldump --tab=DIR contra un MySQL atacante |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1. Testigo .sql fuera de DIR. |
Levanta un servidor con protocolo MySQL. Responde a SHOW TABLES con /abs/path o ../outside. El operador que ejecutó mysqldump --tab=/backup testdb escribe /abs/path.sql (o una ruta relativa al cwd) como el UID del dump.
Sobrescribe cualquier archivo que ese UID pueda crear. Misma clase que un cliente de backup que confía en un nombre de archivo remoto. La ruta .txt de INTO OUTFILE es FILE del lado del servidor. El residuo es el .sql del cliente.
Un mysqld real no emitirá un nombre de tabla con /. El residuo es el cliente.
La misma caza de 26.7.0 que mysqldump SHOW TABLES overflow. El daemon por defecto estaba vacío. Las herramientas cliente seguían confiando en SHOW TABLES. El overflow fue un residuo. --tab fue el siguiente.
static FILE *open_sql_file_for_table(const char *table, int flags) {
FILE *res;
char filename[FN_REFLEN], tmp_path[FN_REFLEN];
convert_dirname(tmp_path, path, NullS);
res = my_fopen(fn_format(filename, table, tmp_path, ".sql",
MYF(MY_UNPACK_FILENAME | MY_APPEND_EXT)),
flags, MYF(MY_WME));
return res;
}
mysys/mf_format.cc: si dirname_part(name) no está vacío y MY_REPLACE_DIR está desactivado, el dir dado no se usa.
Caminos equivocados ya registrados: tratar un mysqld real como el oráculo; morir en SHOW TABLE STATUS antes de SHOW CREATE TABLE (el .sql se abre solo después de que CREATE tiene éxito); llamar al .txt de INTO OUTFILE el residuo; un nombre de 64KiB que vuelve a golpear el overflow G1.
No es MariaDB CVE-2025-13699 (traversal de nombre de vista en mariadb-dump). Misma clase, copia de MySQL Community.
cd lab
./run.sh
Imagen mysql:26.7.0. --tab=/work/tabdir. La tabla stub de control t escribe work/tabdir/t.sql. La tabla stub de traversal /work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS escribe work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS.sql. Publicado en 127.0.0.1:18610 / 18611. Enlázalo a loopback.
control-sql=yes
traversal-outside=yes
SUCCESS mysql-mysqldump-tab-path ... MYSQL-DUMP-TAB-TRAVERSAL-WITNESS
Pasar MY_REPLACE_DIR a fn_format para los archivos del cliente --tab, o tomar primero el basename del nombre de la tabla. --tab=DIR debería significar DIR.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqldump.cc open_sql_file_for_tablemysys/mf_format.cc