
MySQL Community Server 26.7.0 - Alto - mysqlbinlog --raw Rotate path leftover - client file write
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqlbinlog-raw-path
Classe: Gravação de arquivo (cliente) Alcance: Remoto (UI:R)
MySQL Community Server mysqlbinlog 26.7.0 (06a5c1c) - Oracle
mysqlbinlog --raw --read-from-remote-server copia um new_log_ident de evento Rotate para log_file_name sem verificação de basename. O próximo evento FORMAT_DESCRIPTION faz my_fopen nesse caminho e grava BINLOG_MAGIC mais o evento. Um dump hostil que envia um ident Rotate real com / grava esse arquivo com o UID do cliente.
--raw é a cópia remota documentada de arquivo binlog. O resquício é tratar o ident como um caminho.
| ID | sem CVE ainda |
| Classe | Gravação de arquivo (cliente --raw BINLOG_MAGIC) |
| Alcance | Remoto (vítima executa mysqlbinlog --raw -R contra um dump do 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 |
| Produto | MySQL Community Server mysqlbinlog |
| Afetado | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Autenticação | vítima executa mysqlbinlog --raw -R contra um dump do atacante |
| Licença | GNU Affero GPL v3.0 |
| Lab | Apenas 127.0.0.1. Arquivo testemunha com BINLOG_MAGIC. Gravação de arquivo, não RCE. |
Suba um servidor de protocolo MySQL. Fale COM_BINLOG_DUMP. Envie um Rotate falso correspondente (timestamp 0, ident igual ao nome do log solicitado) para que o dump não pare. Envie um Rotate real (timestamp != 0) cujo ident seja /abs/path. Envie um evento FORMAT_DESCRIPTION.
O operador que executou mysqlbinlog --raw -R ... mysql-bin.000001 grava /abs/path com o UID do cliente. O conteúdo são bytes de binlog (\xfebin mais o evento FD), não um payload arbitrário. Sobrescreva qualquer caminho que o UID possa criar.
Um mysqld real não emitirá um ident Rotate com /. O resquício é o cliente.
Mesma caçada da 26.7.0 que o mysqldump SHOW TABLES overflow e o mysqldump --tab path. O daemon padrão estava vazio. As ferramentas cliente ainda confiavam em nomes remotos.
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);
}
}
Rotate falso (when.tv_sec == 0) cujo ident não corresponde ao log solicitado para o dump. Rotate falso correspondente é ignorado (continue) após a cópia. Rotate real não para. Próximo 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);
Os temporários de LOAD DATA permanecem SQL_LOAD_MB sob tmpdir. Fechado. O comprimento do ident é limitado a FN_REFLEN-1. / não é removido.
Caminhos errados já registrados: enviar um Rotate falso cujo ident é o caminho (o dump para); usar --result-file (o ident vira um prefixo, resquício diferente); um mysqld real como oráculo; checksums deixados ligados.
cd lab
./run.sh
Imagem mysql:26.7.0. Binário /usr/libexec/mysqlsh/mysqlbinlog Ver 26.7.0 (não está no PATH nessa imagem). Stub de controle: Rotate falso mysql-bin.000001 mais FD grava work/mysql-bin.000001. Stub de travessia: Rotate falso correspondente, Rotate real ident /work/oracle/MYSQL-BINLOG-RAW-WITNESS, FD grava esse caminho (BINLOG_MAGIC). Publicado 127.0.0.1:18620 / 18621. Vincule ao loopback. Gravação de arquivo de bytes de binlog, não RCE. Sem --result-file.
control-basename=yes
traversal-outside=yes
SUCCESS mysql-mysqlbinlog-raw-path ... MYSQL-BINLOG-RAW-WITNESS
Pegue o basename de new_log_ident antes de my_stpcpy / snprintf para log_file_name. --raw deve gravar sob o cwd ou o prefixo de --result-file, não um ident com /.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqlbinlog.cc dump_remote_log_entries