MySQL Community Server 26.7.0 - Alta - mysqldump --tab percorso residuo - scrittura file client
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqldump-tab-path
Classe: Scrittura di file (client) Portata: Remota (UI:R)
MySQL Community Server mysqldump 26.7.0 (06a5c1c) - Oracle
mysqldump --tab=DIR scrive un .sql per tabella usando fn_format senza MY_REPLACE_DIR. Un nome ostile in SHOW TABLES contenente / o .. mantiene quella directory. DIR viene ignorato. L'UID del dump esegue my_fopen sul percorso.
--tab è documentato come modalità stessa-macchina perché il .txt passa attraverso il server INTO OUTFILE. Il .sql è comunque una scrittura client.
| ID | nessuna CVE al momento |
| Classe | Scrittura di file (client --tab .sql) |
| Portata | Remota (la vittima esegue mysqldump --tab contro un MySQL dell'attaccante; 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 |
| Prodotto | MySQL Community Server mysqldump |
| Affetto | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | la vittima esegue mysqldump --tab=DIR contro un MySQL dell'attaccante |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1. Testimone .sql fuori da DIR. |
Mettere in piedi un server con protocollo MySQL. Rispondere a SHOW TABLES con /abs/path o ../outside. L'operatore che ha eseguito mysqldump --tab=/backup testdb scrive /abs/path.sql (o un percorso relativo alla cwd) con l'UID del dump.
Sovrascrivere qualsiasi file che quell'UID può creare. Stessa classe di un client di backup che si fida di un nome file remoto. Il percorso .txt INTO OUTFILE è FILE lato server. Il residuo è il .sql lato client.
Un vero mysqld non emetterà un nome di tabella con /. Il residuo è il client.
Stessa caccia alla 26.7.0 di mysqldump SHOW TABLES overflow. Il daemon predefinito era vuoto. Gli strumenti client si fidavano comunque di SHOW TABLES. L'overflow era un residuo. --tab era il successivo.
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: se dirname_part(name) non è vuoto e MY_REPLACE_DIR è disattivato, la dir fornita non viene usata.
Vicoli ciechi già registrati: trattare un vero mysqld come oracolo; morire a SHOW TABLE STATUS prima di SHOW CREATE TABLE (il .sql si apre solo dopo che CREATE ha successo); chiamare INTO OUTFILE .txt il residuo; un nome da 64KiB che colpisce di nuovo l'overflow G1.
Non è MariaDB CVE-2025-13699 (traversal del nome di vista in mariadb-dump). Stessa classe, copia MySQL Community.
cd lab
./run.sh
Immagine mysql:26.7.0. --tab=/work/tabdir. La tabella stub di controllo t scrive work/tabdir/t.sql. La tabella stub di traversal /work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS scrive work/oracle/MYSQL-DUMP-TAB-TRAVERSAL-WITNESS.sql. Pubblicati 127.0.0.1:18610 / 18611. Associalo al loopback.
control-sql=yes
traversal-outside=yes
SUCCESS mysql-mysqldump-tab-path ... MYSQL-DUMP-TAB-TRAVERSAL-WITNESS
Passare MY_REPLACE_DIR a fn_format per i file client --tab, oppure prendere prima il basename del nome della tabella. --tab=DIR dovrebbe significare DIR.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqldump.cc open_sql_file_for_tablemysys/mf_format.cc