
MySQL Community Server 26.7.0 - Alta - mysqlbinlog --raw Rotate path leftover - scrittura file lato client
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqlbinlog-raw-path
Classe: Scrittura di file (client) Reach: Remoto (UI:R)
MySQL Community Server mysqlbinlog 26.7.0 (06a5c1c) - Oracle
mysqlbinlog --raw --read-from-remote-server copia un new_log_ident di un evento Rotate in log_file_name senza alcun controllo sul basename. Il successivo evento FORMAT_DESCRIPTION esegue my_fopen su quel percorso e scrive BINLOG_MAGIC più l'evento. Un dump ostile che invia un ident Rotate reale con / scrive quel file con l'UID del client.
--raw è la copia documentata del file binlog remoto. Il residuo è il fatto che l'ident venga trattato come un percorso.
| ID | nessuna CVE al momento |
| Classe | Scrittura di file (client --raw BINLOG_MAGIC) |
| Reach | Remoto (la vittima esegue mysqlbinlog --raw -R contro un dump dell'attaccante; 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 |
| Prodotto | MySQL Community Server mysqlbinlog |
| Affetto | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | la vittima esegue mysqlbinlog --raw -R contro un dump dell'attaccante |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1. File testimone con BINLOG_MAGIC. Scrittura di file, non RCE. |
Mettere in piedi un server con protocollo MySQL. Parlare COM_BINLOG_DUMP. Inviare un finto Rotate corrispondente (timestamp 0, ident uguale al nome del log richiesto) in modo che il dump non si fermi. Inviare un Rotate reale (timestamp != 0) il cui ident è /abs/path. Inviare un evento FORMAT_DESCRIPTION.
L'operatore che ha eseguito mysqlbinlog --raw -R ... mysql-bin.000001 scrive /abs/path con l'UID del client. Il contenuto è costituito da byte di binlog (\xfebin più l'evento FD), non da un payload arbitrario. Sovrascrive qualsiasi percorso che quell'UID può creare.
Un mysqld reale non emetterà un ident Rotate con /. Il residuo è il client.
Stessa caccia alla 26.7.0 di mysqldump SHOW TABLES overflow e mysqldump --tab path. Il daemon predefinito era vuoto. Gli strumenti client si fidavano ancora dei nomi remoti.
if (raw_mode) {
if (output_file != nullptr) {
snprintf(log_file_name, sizeof(log_file_name), "%s%s", output_file,
rev->new_log_ident);
} else {
my_stpcpy(log_file_name, rev->new_log_ident);
}
}
Un finto Rotate (when.tv_sec == 0) il cui ident non corrisponde al log richiesto ferma il dump. Un finto Rotate corrispondente viene saltato (continue) dopo la copia. Un Rotate reale non ferma. Il successivo FD:
if (!(result_file = my_fopen(
log_file_name, O_WRONLY | MY_FOPEN_BINARY, MYF(MY_WME)))) {
error("Could not create log file '%s'", log_file_name);
I file temporanei di LOAD DATA restano SQL_LOAD_MB sotto tmpdir. Chiuso. La lunghezza dell'ident è limitata a FN_REFLEN-1. / non viene rimosso.
Vicoli ciechi già registrati: inviare un finto Rotate il cui ident è il percorso (il dump si ferma); usare --result-file (l'ident diventa un prefisso, residuo diverso); un mysqld reale come oracolo; checksum lasciati attivi.
cd lab
./run.sh
Immagine mysql:26.7.0. Binario /usr/libexec/mysqlsh/mysqlbinlog Ver 26.7.0 (non nel PATH in quell'immagine). Stub di controllo: finto Rotate mysql-bin.000001 più FD scrive work/mysql-bin.000001. Stub di traversal: finto Rotate corrispondente, Rotate reale ident /work/oracle/MYSQL-BINLOG-RAW-WITNESS, FD scrive quel percorso (BINLOG_MAGIC). Pubblicati 127.0.0.1:18620 / 18621. Associalo al loopback. Scrittura di file di byte di binlog, non RCE. Nessun --result-file.
control-basename=yes
traversal-outside=yes
SUCCESS mysql-mysqlbinlog-raw-path ... MYSQL-BINLOG-RAW-WITNESS
Prendere il basename di new_log_ident prima di my_stpcpy / snprintf in log_file_name. --raw dovrebbe scrivere sotto la cwd o il prefisso di --result-file, non un ident con /.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqlbinlog.cc dump_remote_log_entries