CVE-2026-32710: De um SELECT simples a ALL PRIVILEGES no MariaDB por meio de um heap overflow

Uma análise do CVE-2026-32710 no MariaDB 11.4.9 foi publicada. A vulnerabilidade foi inicialmente relatada como um simples crash em JSON_SCHEMA_VALID() ao processar uma string longa. No entanto, o pesquisador demonstrou que a falha poderia ser explorada para escalar as permissões de um usuário de banco de dados com baixos privilégios e manter os privilégios elevados mesmo após uma reinicialização do servidor.
A vulnerabilidade está em json_get_normalized_string() em sql/json_schema_helper.cc. A função cria um DYNAMIC_STRING com um buffer inicial de 128 bytes, mas usa strncpy() para dados JSON com valor de string sem primeiro expandir o buffer. Como resultado, um valor especialmente criado processado durante a validação de enum aciona um heap-buffer overflow: copiar uma string de 194 bytes sobrescreve 66 bytes além do buffer alocado.
Usando heap grooming, o pesquisador organiza várias variáveis de usuário do MariaDB adjacentes umas às outras no heap. O overflow modifica os dois bytes inferiores do ponteiro value em uma estrutura user_var_entry, redirecionando-o para campos pertencentes a outra variável. Atribuições subsequentes dentro de um único SELECT transformam esse overflow limitado em uma escrita para um endereço escolhido pelo atacante. O alvo é Security_context::master_access. Depois que oito bytes de 0xFF são escritos nesse campo, o servidor trata a sessão atual como tendo todos os privilégios.
Com essas permissões, o atacante executa GRANT ALL PRIVILEGES ON . ... WITH GRANT OPTION, e o MariaDB persiste as alterações de privilégios na tabela mysql.global_priv. Mesmo que o processo do servidor posteriormente falhe devido à corrupção do heap, os privilégios elevados sobrevivem a uma reinicialização porque o MariaDB os recarrega da tabela.
Limitação importante do PoC: este ainda não é um exploit totalmente autossuficiente. Para determinar o endereço de master_access e os bytes de ponteiro necessários, o pesquisador usou acesso de laboratório a /proc/1/mem. Um ataque do mundo real exigiria uma primitiva adicional de divulgação de endereço. Portanto, a demonstração não estabelece que qualquer usuário com privilégios SELECT possa obter imediatamente acesso administrativo a um servidor MariaDB arbitrário. O pesquisador também demonstrou um caminho para execução de comandos no SO via uma função definida pelo usuário (UDF), mas isso requer a capacidade de escrever em plugin_dir. No ambiente Docker de teste, o diretório foi deliberadamente tornado gravável, então RCE não pode ser considerado um resultado garantido da vulnerabilidade.
A correção substitui a chamada insegura strncpy() por dynstr_set(), que expande o buffer antes de copiar. No entanto, a atualização apenas corrige o overflow; privilégios já concedidos por meio da exploração não são revogados automaticamente. Após instalar a correção, os administradores devem auditar mysql.global_priv em busca de concessões inesperadas de ALL PRIVILEGES WITH GRANT OPTION, especialmente para contas que originalmente receberam apenas SELECT.
Vulnerabilidades
Pesquisadores
Fornecedor
Produto