
Bancada de exploração e teste para CVE-2025-2945
Esta é a minha pesquisa sobre o CVE-2025-2945. Este repositório inclui um ambiente de teste com PostgreSQL e pgAdmin vulnerável, e o exploit.
Links úteis:
No backend do pgAdmin, escrito em Python, existem dois endpoints sem sanitização adequada. Os endpoints são:
/sqleditor/query_tool/download - parâmetro query_commited/cloud/deploy - parâmetro high_availabilityVejamos o código do sqleditor:
for key, value in data.items():
if key == 'query':
sql = value
if key == 'query_commited':
query_commited = (
eval(value) if isinstance(value, str) else value
)
O que vemos aqui é que o valor de query_commited está sendo passado diretamente para a função eval(). Você pode ver a documentação do eval.
Veja também o código do pgacloud:
def _create_google_postgresql_instance(self, args):
credentials = self._get_credentials(self._scopes)
service = discovery.build('sqladmin', 'v1beta4',
credentials=credentials)
high_availability = \
'REGIONAL' if eval(args.high_availability) else 'ZONAL'
O mesmo problema aqui.
Ainda assim, é necessário ter credenciais válidas e acesso ao pgAdmin para alcançar esses endpoints. Mas qualquer atacante que consiga acessá-lo também pode passar qualquer valor para o eval. O que equivale a executar qualquer one-liner em Python.
A exploração é bastante direta. Veja o exploit/src/main.py. Não se esqueça de atualizar a configuração para obter um reverse shell.
Para configurar o stand, execute:
cd stand
docker compose up -d
E pronto. O pgAdmin agora está acessível em http://localhost:8080. As credenciais padrão são:
[email protected]
admin
Sinta-se à vontade para editar o arquivo .env e o stand/init-db/01-init.sql.
produzido por I3r1h0n.