
MySQL Community Server 26.7.0 - Alta - mysqlbinlog --raw Rotate path leftover - escritura de archivo del cliente
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqlbinlog-raw-path
Clase: Escritura de archivos (cliente) Alcance: Remoto (UI:R)
MySQL Community Server mysqlbinlog 26.7.0 (06a5c1c) - Oracle
mysqlbinlog --raw --read-from-remote-server copia un new_log_ident de un evento Rotate en log_file_name sin comprobar el nombre base. El siguiente evento FORMAT_DESCRIPTION hace my_fopen sobre esa ruta y escribe BINLOG_MAGIC más el evento. Un volcado hostil que envía un ident Rotate real con / escribe ese archivo con el UID del cliente.
--raw es la copia remota de archivo binlog documentada. El residuo es tratar el ident como una ruta.
| ID | sin CVE todavía |
| Clase | Escritura de archivos (cliente --raw BINLOG_MAGIC) |
| Alcance | Remoto (la víctima ejecuta mysqlbinlog --raw -R contra un volcado del 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 |
| Producto | MySQL Community Server mysqlbinlog |
| Afectado | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Autenticación | la víctima ejecuta mysqlbinlog --raw -R contra un volcado del atacante |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1. Archivo testigo con BINLOG_MAGIC. Escritura de archivos, no RCE. |
Levantar un servidor con protocolo MySQL. Hablar COM_BINLOG_DUMP. Enviar un Rotate falso coincidente (timestamp 0, ident igual al nombre de log solicitado) para que el volcado no se detenga. Enviar un Rotate real (timestamp != 0) cuyo ident sea /abs/path. Enviar un evento FORMAT_DESCRIPTION.
El operador que ejecutó mysqlbinlog --raw -R ... mysql-bin.000001 escribe /abs/path con el UID del cliente. El contenido son bytes de binlog (\xfebin más el evento FD), no una carga útil arbitraria. Sobrescribe cualquier ruta que el UID pueda crear.
Un mysqld real no emitirá un ident Rotate con /. El residuo es el cliente.
La misma caza de 26.7.0 que mysqldump SHOW TABLES overflow y mysqldump --tab path. El demonio por defecto estaba vacío. Las herramientas cliente seguían confiando en nombres 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);
}
}
Un Rotate falso (when.tv_sec == 0) cuyo ident no coincide con el log solicitado detiene el volcado. Un Rotate falso coincidente se omite (continue) tras la copia. Un Rotate real no detiene. El siguiente 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);
Los temporales de LOAD DATA permanecen como SQL_LOAD_MB bajo tmpdir. Cerrado. La longitud del ident está limitada a FN_REFLEN-1. / no se elimina.
Caminos equivocados ya registrados: enviar un Rotate falso cuyo ident es la ruta (el volcado se detiene); usar --result-file (el ident se convierte en un prefijo, residuo diferente); un mysqld real como oráculo; checksums dejados activados.
cd lab
./run.sh
Imagen mysql:26.7.0. Binario /usr/libexec/mysqlsh/mysqlbinlog Ver 26.7.0 (no está en PATH en esa imagen). Stub de control: Rotate falso mysql-bin.000001 más FD escribe work/mysql-bin.000001. Stub de traversal: Rotate falso coincidente, Rotate real ident /work/oracle/MYSQL-BINLOG-RAW-WITNESS, FD escribe esa ruta (BINLOG_MAGIC). Publicado en 127.0.0.1:18620 / 18621. Enlázalo a loopback. Escritura de archivos de bytes de binlog, no RCE. Sin --result-file.
control-basename=yes
traversal-outside=yes
SUCCESS mysql-mysqlbinlog-raw-path ... MYSQL-BINLOG-RAW-WITNESS
Tomar el basename de new_log_ident antes de my_stpcpy / snprintf en log_file_name. --raw debería escribir bajo el cwd o el prefijo de --result-file, no un ident con /.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)client/mysqlbinlog.cc dump_remote_log_entries