
MySQL Community Server 26.7.0 - Hoch - mysqldump --tab Pfad-Rest - Client-Dateischreibvorgang
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqldump-tab-path
Klasse: Dateischreiben (Client) Reichweite: Remote (UI:R)
MySQL Community Server mysqldump 26.7.0 (06a5c1c) - Oracle
mysqldump --tab=DIR schreibt eine .sql pro Tabelle unter Verwendung von fn_format ohne MY_REPLACE_DIR. Ein feindseliger SHOW TABLES-Name mit / oder .. behält dieses Verzeichnis bei. DIR wird ignoriert. Die Dump-UID my_fopent den Pfad.
--tab ist als Same-Machine-Modus dokumentiert, weil die .txt über das serverseitige INTO OUTFILE läuft. Die .sql ist dennoch ein Client-Schreibvorgang.
| ID | noch keine CVE |
| Klasse | Dateischreiben (Client --tab .sql) |
| Reichweite | Remote (Opfer führt mysqldump --tab gegen einen Angreifer-MySQL aus; UI:R) |
| CWE | CWE-22 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| Produkt | MySQL Community Server mysqldump |
| Betroffen | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | Opfer führt mysqldump --tab=DIR gegen einen Angreifer-MySQL aus |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1. Witness .sql außerhalb von DIR. |
Einen MySQL-Protokoll-Server aufsetzen. Auf SHOW TABLES mit /abs/path oder ../outside antworten. Der Operator, der mysqldump --tab=/backup testdb ausgeführt hat, schreibt /abs/path.sql (oder einen Pfad relativ zum cwd) als die Dump-UID.
Jede Datei überschreiben, die diese UID erstellen kann. Gleiche Klasse wie ein Backup-Client, der einem entfernten Dateinamen vertraut. Der .txt-INTO-OUTFILE-Pfad ist serverseitiges FILE. Der Überrest ist die Client-.sql.
Ein echtes mysqld wird keinen Tabellennamen mit / ausgeben. Der Überrest ist der Client.
Dieselbe 26.7.0-Jagd wie mysqldump SHOW TABLES overflow. Der Standard-Daemon war leer. Client-Tools vertrauten weiterhin SHOW TABLES. Der Overflow war ein Überrest. --tab war der nächste.
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: Wenn dirname_part(name) nicht leer ist und MY_REPLACE_DIR aus ist, wird das angegebene dir nicht verwendet.
Bereits dokumentierte Irrwege: ein echtes mysqld als Orakel behandeln; bei SHOW TABLE STATUS vor SHOW CREATE TABLE sterben (die .sql wird erst geöffnet, nachdem CREATE erfolgreich war); INTO OUTFILE .txt als Überrest bezeichnen; ein 64KiB-Name, der den G1-Overflow erneut auslöst.
Nicht MariaDB CVE-2025-13699 (mariadb-dump View-Name-Traversal). Gleiche Klasse, MySQL-Community-Kopie.
cd lab
./run.sh
Image mysql:26.7.0. --tab=/work/tabdir. Control-Stub-Tabelle t schreibt work/tabdir/t.sql. Traversal-Stub-Tabelle /work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS schreibt work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS.sql. Veröffentlicht 127.0.0.1:18610 / 18611. Binde es an Loopback.
control-sql=yes
traversal-outside=yes
SUCCESS mysql-mysqldump-tab-path ... MYSQL-DUMP-TAB-TRAVERSAL-WITNESS
MY_REPLACE_DIR in fn_format für --tab-Client-Dateien übergeben, oder zuerst basename des Tabellennamens nehmen. --tab=DIR sollte DIR bedeuten.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqldump.cc open_sql_file_for_tablemysys/mf_format.cc