
Lab Docker autossuficiente para praticar a exploração da CVE-2026-2005, um estouro de buffer no heap na extensão pgcrypto do PostgreSQL, permitindo escalonamento de privilégios e execução de código no contêiner.
Um laboratório Docker autossuficiente para praticar a exploração da CVE-2026-2005, um estouro de buffer no heap na extensão pgcrypto do PostgreSQL que permite execução remota de código sem privilégios de superusuário.
Versões afetadas: PostgreSQL ≤ 17.7 / 16.11 / 15.15 / 14.20 / 18.1
Corrigido em: 18.2, 17.8, 16.12, 15.16, 14.21 (lançado em 2026-02-12)
Pré-requisitos: Docker, Docker Compose
git clone <this-repo>
cd CVE-2026-2005
docker compose up -d
O PostgreSQL estará escutando em 127.0.0.1:5433.
Você obteve as credenciais do banco de dados a partir de um arquivo de configuração de aplicação:
| Parâmetro | Valor |
|---|
| Host | 127.0.0.1 |
| Porta | 5433 |
| Banco | targetdb |
| Usuário | pentester |
| Senha | pentester123 |
Conecte-se para confirmar o acesso:
psql -h 127.0.0.1 -p 5433 -U pentester -d targetdb
A conta possui privilégio CREATE no schema public. Ela não é um superusuário.
Capture ambas as flags para concluir o laboratório.
Flag 1 — Escalação de privilégio no banco de dados
SELECT * FROM flag_db;
-- Somente legível após escalar para superusuário dentro da sessão do banco
Flag 2 — Execução de código no contêiner
/var/lib/postgresql/flag.txt
-- Somente legível após executar comandos como o usuário postgres do SO dentro do contêiner
Nota de escopo:
COPY TO PROGRAMexecuta dentro do contêiner Docker, não no host. O principal impacto no mundo real é o acesso total de leitura ao banco de dados (todas as tabelas, todos os bancos). Alcançar o host Docker requer uma técnica separada de escape de contêiner.
A falha está em pgp_parse_pubenc_sesskey() dentro de pgcrypto/pgp-pubenc.c.
Ao descriptografar um pacote de chave de sessão criptografado com chave pública, a função deriva
o comprimento da chave de sessão como msglen - 3 a partir de um payload RSA/ElGamal
controlado pelo atacante e o copia para um buffer fixo de 32 bytes (PGP_MAX_KEY) sem
validação de limites. Um atacante pode escrever centenas de bytes além do limite
do buffer.
A exploração ocorre em três etapas:
dst para sobrescrever CurrentUserId em .data com 10 (BOOTSTRAP_SUPERUSERID)COPY (SELECT '') TO PROGRAM '<cmd>' executa comandos do SO como o usuário postgres dentro do contêiner. Em uma implantação real sem Docker, isso significa acesso em nível de SO no host do banco de dados.Como o layout do ASLR é idêntico em todas as conexões ao mesmo processo postmaster, os endereços vazados em uma conexão permanecem válidos na próxima.
pgcrypto/pgp-pubenc.cobjdump -t $(which postgres) | grep CurrentUserIddocker compose down -v
Este laboratório é exclusivamente para pesquisa de segurança autorizada e fins educacionais. Execute-o apenas em sistemas que você possui ou para os quais tenha permissão explícita para testar.