
PoC para CVE-2026-2005
Exploit PoC para um estouro de buffer baseado em heap na extensão pgcrypto do PostgreSQL durante o parsing da chave de sessão PGP, levando a leitura/escrita arbitrária de memória e escalada de privilégios para superusuário.
Para detalhes técnicos completos, consulte o aviso da Zeroday Cloud.

Clone e compile o PostgreSQL a partir do commit vulnerável para que os offsets de símbolos do binário correspondam exatamente. O exploit resolve a base do ASLR comparando ponteiros vazados com offsets de símbolos ELF - builds ou versões diferentes terão offsets diferentes e falharão.
git clone https://github.com/postgres/postgres.git
cd postgres
git checkout 4b324845ba5d24682b9b3708a769f00d160afbd7
./configure \
--prefix="$HOME/projects/pg/pgsql" \
--with-libxml \
--with-libxslt \
--enable-debug \
--with-ssl=openssl
make -j$(nproc)
make install-world-bin
pip install -r requirements.txt
python poc.py \
--binary "$HOME/projects/pg/pgsql/bin/postgres" \
--dbname test-db \
--host 127.0.0.1 \
--port 5432 \
--user test-user \
--password secret \
--cmd id
O exploit prossegue em 7 etapas:
Vazamento de ponteiro de heap - Uma mensagem PGP manipulada corrompe o cabeçalho do chunk malloc do buffer mdst. Quando o PostgreSQL chama pfree() no chunk corrompido, o alocador emite um erro contendo o endereço do ponteiro, vazando a localização no heap de mdst->data.
Leitura arbitrária - Um segundo estouro sobrescreve mdst->data para apontar para (leaked_ptr - 0x10000). Após a descriptografia, mbuf_steal_data() retorna o conteúdo desse endereço como saída descriptografada, despejando memória do heap que pode conter ponteiros de código obsoletos.
Varredura de ponteiros - O dump hexadecimal é varrido em busca de valores little-endian de 8 bytes que pareçam endereços de código (>= 0x500000000000) mas que não estejam na região do heap. Esses são ponteiros PIE (Executável Independente de Posição) candidatos.
Votação da base PIE - Cada endereço candidato é testado contra offsets de símbolos ELF do binário postgres. Para cada par (addr - sym_offset) em que o offset de página corresponde, um voto é lançado. Candidatos com 10+ votos são mantidos; a menor base (o PIE é o segmento ELF mapeado mais baixo), ordenada por votos, é a principal candidata.
Validação da base PIE - Usando a primitiva de leitura arbitrária, o exploit lê em e o compara com o OID conhecido da sessão. Uma correspondência confirma a base PIE.
pip install -r requirements.txt)pgcrypto habilitadoEsta Prova de Conceito destina-se apenas a fins educacionais e de pesquisa defensiva. Use somente contra sistemas que você possui ou para os quais tenha autorização explícita para testar.
| Argumento | Padrão | Descrição |
|---|
--binary | (binário do postgres) | Caminho para o binário postgres para extração de símbolos |
--dbname | postgres | Nome do banco de dados alvo |
--host | localhost | Host do PostgreSQL |
--port | 5432 | Porta do PostgreSQL |
--user | postgres | Usuário do banco de dados |
--password | (vazio) | Senha do banco de dados |
--cmd | whoami | Comando do SO a executar após a escalada de privilégios |
--gdb | (flag) | Anexa o GDB via tmux no ponto do estouro |
CurrentUserId(candidate_base + current_user_offset)Escrita arbitrária - O estouro corrompe os cabeçalhos MBuf de msrc e mdst. msrc->data/read_pos forjados apontam para um pacote sym-encrypted embutido contendo o OID criptografado do superusuário (10). mdst->data forjado aponta para CurrentUserId - 4 (o -4 compensa o SET_VARSIZE em pgp-pgsql.c:533, que grava o comprimento da saída nos primeiros 4 bytes).
Escalada de privilégios - Com CurrentUserId sobrescrito para 10 (superusuário bootstrap), COPY FROM PROGRAM executa o comando do SO especificado como o usuário postgres do sistema.