Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Ferramentas/GitHubGitHub/dinosn/cve-2026-32710
Escalada de PrivilégiosFrameworks de ExploraçãoAnálise de VulnerabilidadesExploraçãoDesenvolvimento de PayloadsSegurança de Banco de DadosExploração de Binários
GitHubdinosn/cve-2026-32710

CVE-2026-32710

# Escrita fora dos limites (OOB) no heap em MariaDB JSON_SCHEMA_VALID() → escalonamento persistente de privilégios (assistido por laboratório)

Ver Repositório
154há 3 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-32710

Estouro de buffer no heap em JSON_SCHEMA_VALID() do MariaDB → escalonamento persistente de privilégios → RCE via UDF

AfetadoMariaDB 11.4.x (confirmado na 11.4.9)
BugEscrita fora dos limites em json_get_normalized_string() — strncpy em DYNAMIC_STRING de 128 bytes sem verificação de limites
ImpactoUsuário somente com SELECT → ALL PRIVILEGES WITH GRANT OPTION → execução arbitrária de comandos via UDF
Fontesql/json_schema_helper.cc:91

Assistido por laboratório. O script usa Docker/introspecção como root para ler /proc/1/mem e descobrir o layout do heap por conexão. A cadeia de exploração real é SQL puro via TCP. Um exploit armamentizado precisaria de uma primitiva de vazamento de informações para substituir a etapa de introspecção de memória.

Antes

lowpriv só pode executar SELECT no banco test. As tabelas do sistema são negadas.

before

Exploit

Um único script Python realiza o preparo do heap, uma escrita arbitrária em dois saltos através dos metadados de variáveis de usuário, persiste o escalonamento via GRANT ALL, e alcança execução de código através de uma UDF:

root@kitploit:~
python3 exploit.py

exploit

Depois

lowpriv agora tem ALL PRIVILEGES WITH GRANT OPTION, pode ler tabelas do sistema, ler/gravar arquivos arbitrários e executar comandos do SO como o usuário mysql. A concessão sobrevive à reinicialização do servidor.

after

Saída completa do exploit

full run

Etapas

Etapa 1: Escalonamento de privilégios

root@kitploit:~
┌──────────────────────────────────────────────────────────────────┐
│  SELECT  json_schema_valid(overflow),                           │
│          @ccc...c := hop1,                                      │
│          @aaa...a := hop2                                       │
└──────────────────────────────────────────────────────────────────┘
         │                    │                   │
         ▼                    ▼                   ▼
   ┌───────────┐     ┌──────────────┐    ┌──────────────┐
   │ 192-byte  │     │ Write to @c  │    │ Write to @a  │
   │ overflow   │     │ through the  │    │ through the  │
   │ corrupts   │     │ corrupted    │    │ redirected   │
   │ entry_c's  │     │ pointer:     │    │ pointer:     │
   │ value ptr  │     │              │    │              │
   │ (2-byte    │     │ entry_a →    │    │ master_access│
   │  partial   │     │   .value =   │    │   = 0xFFFF.. │
   │  overwrite)│     │   &master_   │    │ (ALL PRIVS)  │
   │            │     │   access     │    │              │
   └───────────┘     │   .length= 9 │    └──────────────┘
                      └──────────────┘
  1. Preparo do heap — mais de 100 variáveis de usuário esgotam o tcache, forçando Entry_a → Value_a → Entry_b → Value_b → Entry_c → Value_c a serem alocados consecutivamente.

  2. Estouro — JSON_SCHEMA_VALID dispara um strncpy de 192 bytes além do buffer de 128 bytes, corrompendo entry_c→value (sobrescrita parcial de ponteiro de 2 bytes dentro da mesma página de 64 KB) para apontar para entry_a + 32.

  3. Salto 1 — Atribuir a @c grava 126 bytes através do ponteiro corrompido nos metadados de entry_a, definindo:

    • entry_a→value = &Security_context::master_access
    • entry_a→length = 9
  4. Salto 2 — Atribuir a @a grava 8 bytes de 0xFF através do ponteiro redirecionado → .

Etapa 2: RCE via UDF

Após a persistência, o servidor é reiniciado (recuperação de crash), e os privilégios escalonados são usados para instalar uma biblioteca compartilhada de UDF:

  1. LOAD_FILE('/tmp/raptor_udf.so') INTO DUMPFILE '/usr/lib/mysql/plugin/raptor.so'
  2. CREATE FUNCTION sys_exec RETURNS INTEGER SONAME 'raptor.so'
  3. SELECT sys_exec('id > /tmp/pwned')

Principais restrições resolvidas

Configuração do laboratório

root@kitploit:~
# 1. Compilar e iniciar o contêiner
./setup.sh

# 2. Desabilitar ASLR no host Docker
sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

# 3. Executar o exploit (autocalibra a cada tentativa)
python3 exploit.py

# 4. Comando personalizado
python3 exploit.py --cmd 'cat /etc/passwd > /tmp/out'

Requisitos

  • Docker (x86_64)
  • Python 3
  • ASLR desabilitado no host Docker (/proc/sys/kernel/randomize_va_space = 0)
  • Contêiner executado com --cap-add SYS_PTRACE (para acesso a /proc/1/mem)

Opções

root@kitploit:~
--calibrate      Medir as constantes do layout do heap e sair
--cmd CMD        Comando para execução de UDF na Etapa 2 (padrão: id > /tmp/pwned)
--stage1-only    Executar apenas o escalonamento de privilégios, pular RCE via UDF
--attempts N     Máximo de tentativas da Etapa 1 (padrão: 5)
--host HOST      Host do MariaDB (padrão: 127.0.0.1)
--port PORT      Porta do MariaDB (padrão: 3306)

O que a assistência do laboratório fornece

O script do exploit acessa o contêiner como root para ler /proc/1/mem. Isso é usado para duas coisas:

  1. Descoberta do layout do heap — localizar as três structs sentinela user_var_entry e verificar se são adjacentes (entry_a+32 dentro da mesma página de 64 KB que entry_c→value para a sobrescrita parcial de 2 bytes).
  2. Endereço de Security_context — encontrar o campo master_access para ser o alvo da escrita em dois saltos.

A varredura é executada inline para cada tentativa porque o layout do heap varia entre conexões (mesmo com ASLR=0) devido ao pool de threads do MariaDB atribuir arenas diferentes. A cadeia de exploração real — estouro + salto 1 + salto 2 — é SQL puro executado por uma conexão TCP.

Em um cenário do mundo real, um atacante precisaria de uma vulnerabilidade separada de vazamento de informações (ou um canal lateral) para obter esses endereços.

Arquivos

Baixar ferramenta
entry_a→value
master_access = ALL PRIVILEGES
  • Persistir — A sessão agora detém todos os privilégios. GRANT ALL confirma o escalonamento na tabela mysql.global_priv com suporte a Aria. A sessão eventualmente trava durante a limpeza (corrupção residual do heap), mas o GRANT já foi registrado em checkpoint e sobrevive à reinicialização.

  • RestriçãoSolução
    STRING_RESULT faz length++ antes da verificação de realocaçãoO payload tem N−1 bytes, então N−1+1 = N corresponde ao comprimento armazenado → sem realocação no ponteiro corrompido
    O salto 2 de 126 bytes corrompe campos de THD além de Security_contextDefinir entry_a→length = 9 no salto 1 para que o salto 2 grave apenas 8 bytes (master_access) + 1 NUL
    Offset de master_access em Security_context1712 bytes a partir da base da struct (priv_user[384] + proxy_user[645] + priv_host[256] + priv_role[384] + padding + ponteiros)
    A recuperação de crash do Aria reverte gravações não confirmadasGRANT ALL + SLEEP de 10 s permite o checkpoint do Aria antes do crash de limpeza da sessão
    O layout do heap varia entre conexões (mesmo com ASLR=0)A varredura inline de /proc/1/mem por tentativa descobre entry_a e master_access para cada conexão
    plugin_dir pertence ao rootO Dockerfile pré-configura chmod 777 (conveniência de laboratório)
    ArquivoDescrição
    exploit.pyExploit em duas etapas: escalonamento de privilégios (SQL via TCP) + RCE via UDF
    raptor_udf.cCódigo-fonte da UDF — sys_exec() chama system()
    DockerfileImagem do contêiner do laboratório (compila a UDF, abre plugin_dir)
    init.sqlCria o usuário lowpriv
    setup.shCompila e inicia o laboratório
    screenshots/Capturas de tela do terminal