
Exploit de prova de conceito para CVE-2026-14669, um estouro de buffer heap na abreviação de fuso horário do to_char() do PostgreSQL que possibilita RCE por meio de vazamento de informações e cadeia ROP; inclui laboratório Docker e PoC automatizada.
A função to_char() do PostgreSQL possui uma vulnerabilidade de estouro de buffer de heap ao processar a formatação de fuso horário. Um atacante pode, ao definir uma abreviação de fuso horário POSIX excessivamente longa, acionar uma gravação fora dos limites em um buffer fixo de 25 bytes e, combinando com vazamento de informações e uma cadeia ROP, obter execução remota de código.
to_char(timestamptz) do PostgreSQL| Série do PostgreSQL | Versões afetadas |
|---|---|
| 18.x | 18.0 – 18.5 |
| 17.x | 17.0 – 17.10 |
| 16.x | 16.0 – 16.14 |
| 15.x | 15.0 – 15.18 |
| 14.x | 14.0 – 14.23 |
No caminho de processamento DCH_TZ / DCH_tz em formatting.c, é utilizado um buffer fixo de 25 bytes na pilha para armazenar a abreviação do fuso horário, sem qualquer verificação de comprimento da entrada. Quando a abreviação do fuso horário excede 24 bytes, strcpy() grava fora dos limites no heap.
Caminho de acionamento:
SET TIME ZONE '<超长缩写>+00';
SELECT to_char(now()::timestamptz, 'TZ');
↓
DCH_to_char() → DCH_from_char_action()
↓
strcpy(buf, tmtcTzn(...)) ← 堆溢出
O PoC da V12 Security contém três etapas:
Através do estouro de heap, os objetos de heap adjacentes são corrompidos para vazar o endereço base do PIE e ponteiros de heap, a fim de quebrar o ASLR.
Usa objetos grandes (large objects) ou campos bytea para dispor a cadeia de gadgets ROP no heap.
Um segundo estouro sobrescreve o ponteiro de função no heap, saltando para a cadeia ROP e executando comandos arbitrários (com os privilégios do usuário postgres).
poc.py - script de exploração completo (210 linhas, para PostgreSQL 19beta1)requirements.txt - dependências Python (psycopg, pwntools)docker-compose.yml - ambiente de teste da vulnerabilidadedocker-compose up -d
Aguarde a inicialização completa do contêiner (verificação de saúde concluída):
docker logs pg-tzlab
pip install -r requirements.txt
python3 poc.py
Conecta por padrão em 127.0.0.1:55432, com usuário postgres e senha postgres.
Após a exploração bem-sucedida, a saída da execução do comando pode ser vista nos logs do contêiner:
docker logs pg-tzlab | grep PWNED
Edite as constantes em poc.py:
HOST, PORT - endereço do alvoDEFAULT_COMMAND - comando a ser executado⚠️ Importante: Este PoC possui endereços de deslocamento (offsets) codificados para um build específico (imagem Docker postgres:19beta1 sha256:a6bdd01...). Outras versões exigem a relocalização dos gadgets.
SET TIME ZONE excessivamente longas (> 50 caracteres)⚠️ Este PoC é exclusivamente para pesquisa de segurança, validação de vulnerabilidades e testes defensivos.
Ao usar este PoC, você concorda em cumprir as leis e regulamentos locais e os limites de autorização do sistema alvo.