
MySQL Community Server 26.7.0 - Élevé - mysqldump --tab chemin résiduel - écriture de fichier client
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqldump-tab-path
Classe : Écriture de fichier (client) Portée : Distante (UI:R)
MySQL Community Server mysqldump 26.7.0 (06a5c1c) - Oracle
mysqldump --tab=DIR écrit un .sql par table en utilisant fn_format sans MY_REPLACE_DIR. Un nom hostile dans SHOW TABLES contenant / ou .. conserve ce répertoire. DIR est ignoré. L'UID du dump my_fopen le chemin.
--tab est documenté comme un mode local car le .txt passe par le serveur INTO OUTFILE. Le .sql reste une écriture côté client.
| ID | pas encore de CVE |
| Classe | Écriture de fichier (client --tab .sql) |
| Portée | Distante (la victime exécute mysqldump --tab contre un MySQL attaquant ; UI:R) |
| CWE | CWE-22 |
| CVSS | Élevé : 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| Produit | MySQL Community Server mysqldump |
| Affecté | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | la victime exécute mysqldump --tab=DIR contre un MySQL attaquant |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement. Témoin .sql en dehors de DIR. |
Monter un serveur au protocole MySQL. Répondre à SHOW TABLES avec /abs/path ou ../outside. L'opérateur qui a lancé mysqldump --tab=/backup testdb écrit /abs/path.sql (ou un chemin relatif au cwd) en tant qu'UID du dump.
Écraser tout fichier que cet UID peut créer. Même classe qu'un client de sauvegarde qui fait confiance à un nom de fichier distant. Le chemin .txt INTO OUTFILE est côté serveur FILE. Le résidu est le .sql côté client.
Un vrai mysqld n'émettra pas un nom de table contenant /. Le résidu est le client.
Même chasse sur la 26.7.0 que mysqldump SHOW TABLES overflow. Le démon par défaut était vide. Les outils clients faisaient toujours confiance à SHOW TABLES. L'overflow était un résidu. --tab était le suivant.
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) est non vide et que MY_REPLACE_DIR est désactivé, le dir fourni n'est pas utilisé.
Fausses pistes déjà consignées : traiter un vrai mysqld comme oracle ; mourir à SHOW TABLE STATUS avant SHOW CREATE TABLE (le .sql ne s'ouvre qu'après la réussite de CREATE) ; appeler INTO OUTFILE .txt le résidu ; un nom de 64 Kio qui re-déclenche l'overflow G1.
Ce n'est pas MariaDB CVE-2025-13699 (traversée de nom de vue mariadb-dump). Même classe, copie MySQL Community.
cd lab
./run.sh
Image mysql:26.7.0. --tab=/work/tabdir. La table témoin de contrôle t écrit work/tabdir/t.sql. La table témoin de traversée /work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS écrit work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS.sql. Publié sur 127.0.0.1:18610 / 18611. Le lier à la loopback.
control-sql=yes
traversal-outside=yes
SUCCESS mysql-mysqldump-tab-path ... MYSQL-DUMP-TAB-TRAVERSAL-WITNESS
Passer MY_REPLACE_DIR à fn_format pour les fichiers clients --tab, ou prendre d'abord le basename du nom de table. --tab=DIR devrait signifier DIR.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqldump.cc open_sql_file_for_tablemysys/mf_format.cc