
MySQL Community Server 26.7.0 - Alto - mysqldump SHOW TABLES estouro de pilha - despejo de falha UID
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-mysqldump-show-tables-overflow
Classe: Crash Alcance: Remoto
MySQL Community Server mysqldump 26.7.0 (06a5c1c) - Oracle
O mysqldump padrão copia nomes de SHOW TABLES sem limite de NAME_LEN. getTableName retorna um mysql_fetch_row bruto. dump_all_tables_in_db faz my_stpcpy dessa string em hash_key[2*NAME_LEN+2] e quote_name a escreve em um buffer de pilha de 387 bytes sem limite. Um servidor hostil que responde com um nome de tabela maior que 192 bytes derruba o UID do dump.
Um mysqld real não emitirá identificadores tão longos. O que sobra é o cliente confiando no protocolo.
| ID | sem CVE ainda |
| Classe | Crash (SIGSEGV no cliente; RCE não demonstrado) |
| Alcance | Remoto (vítima executa mysqldump contra um MySQL do atacante; UI:R) |
| CWE | CWE-120, CWE-121 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Produto | MySQL Community Server mysqldump |
| Afetado | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Autenticação | vítima executa o mysqldump padrão contra um MySQL do atacante |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1. Testemunha de crash. Sem payload de RIP. |
Suba um servidor de protocolo MySQL. Complete o handshake. Responda aos SETs da sessão. Quando o cliente enviar show tables, retorne uma linha cujo nome tenha dezenas de kilobytes.
O operador que apontou mysqldump testdb para aquele host estoura um buffer de pilha no processo de dump. O lab em mysqldump Ver 26.7.0 é SIGSEGV. Controle confiável do ponteiro de instrução não faz parte deste pacote. O crash faz.
Mesmo modelo de vítima que um cliente de backup apontado para um servidor malicioso. lock_tables é o padrão via --opt. O overflow está naquele primeiro laço de SHOW TABLES.
Executei trinta e uma buscas no código-fonte de https://github.com/mysql/mysql-server tag https://github.com/mysql/mysql-server/tree/mysql-26.7.0. Crit/High não publicados do mysqld padrão voltaram vazios. As linhas de CPU High Server de julho de 2026 estão fechadas neste pin. As ferramentas cliente eram a classe restante, mesma forma do pg_basebackup do PostgreSQL seguindo um caminho hostil.
static char *getTableName(int reset) {
static MYSQL_RES *res = nullptr;
MYSQL_ROW row;
if (!res) {
if (!(res = mysql_list_tables(mysql, NullS))) return (nullptr);
}
if ((row = mysql_fetch_row(res))) return ((char *)row[0]);
static char *quote_name(char *name, char *buff, bool force) {
char *to = buff;
const char qtype = ansi_quotes_mode ? '"' : '`';
if (!force && !opt_quoted && !test_if_special_chars(name)) return name;
*to++ = qtype;
while (*name) {
if (*name == qtype) *to++ = qtype;
*to++ = *name++;
}
NAME_LEN é 64 * 3 = 192. hash_key tem 386 bytes. quote_name em dump_table escreve em table_buff[NAME_LEN+3].
Caminhos errados já registrados: tratar um mysqld real como oráculo (ele não emitirá um identificador de 193 bytes); um nome de 4KiB absorvido por real_columns[MAX_FIELDS] no mesmo frame que hash_key; compilar ASan a partir da árvore completa do servidor; chamar o crash de controle do ponteiro de instrução.
cd lab
./run.sh
Imagem mysql:26.7.0. Stub hostil no compose stub:3306 (controle, tabela t) e stub:3307 (overflow, nome de 64KiB mais testemunha). Publicado em 127.0.0.1:18600 / 18601. Vincule ao loopback.
control-rc=2 control-signal=0
overflow-rc=139 overflow-signal=SIGSEGV
SUCCESS mysql-mysqldump-show-tables-overflow ... MYSQL-DUMP-SHOW-TABLES-OVERFLOW-WITNESS
O controle imprime um cabeçalho de dump 26.7.0 e sai com 2 em SQL 1146. O overflow morre logo após show tables. Sem LOCK TABLES naquela conexão.
Limite getTableName a NAME_LEN. Dê a quote_name um comprimento de buffer e recuse escrever além dele. O my_stpcpy em hash_key deveria ser uma cópia limitada. Um nome hostil de SHOW TABLES não é uma tabela.
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)getTableName, quote_name, dump_all_tables_in_dbNAME_LENmysql_list_tables