Команда pgAdmin выпустила версию 4 v9.19. Обновление закрывает 15 уязвимостей и приносит 136 исправлений и новых функций. Самая опасная ошибка позволяет выполнить произвольную команду на хосте с pgAdmin через инструмент Import/Export Data. Уязвимы сборки до 9.19, которые работают в серверном режиме и доступны другим пользователям.
Что именно исправили
Все описанные ниже проблемы затрагивают серверный режим, где один экземпляр pgAdmin обслуживает нескольких пользователей. Настольная версия большинства из них не касается. Уязвимости набраны в диапазоне CVE-2026-116238 - CVE-2026-116252, плюс отдельно стоит упомянуть CVE-2026-17566, исправленную ещё в 9.18.
Выполнение команд в Import/Export Data
Ключевая проблема - CVE-2026-116241 с оценкой CVSS 3.1 9.9 (CWE-78). Инструмент оборачивает пользовательский запрос в конструкцию "\copy (...) TO" и передаёт её psql. Защита проверяла баланс скобок, но не учитывала обратную косую черту внутри идентификатора в двойных кавычках.
Если роль в базе отключает "standard_conforming_strings", psql и проверка pgAdmin по-разному понимают кавычки. Проверка считает, что идентификатор продолжается, а psql его уже закрыл. В результате закрывающая скобка обёртки оказывается видимой, и следом выполняется предложение "TO PROGRAM", то есть команда на хосте pgAdmin от имени служебной учётной записи.
Права "tools_import_export_data" по умолчанию выданы непривилегированным пользователям. Атакующему достаточно обычной роли в PostgreSQL и доступа к интерфейсу pgAdmin. Это обход исправления CVE-2026-17566, где та же логика ломалась через строку в одинарных кавычках. Теперь патч отклоняет обратную косую черту в обоих видах кавычек.
Обход лимита попыток входа
CVE-2026-116238 (CVSS 3.1 8.1, CVSS 4.0 9.2, CWE-307 и CWE-863) снимает ограничение на число неудачных входов. По умолчанию внутренняя учётная запись блокируется после трёх попыток. Обойти лимит помогали несколько путей.
Flask-Security регистрирует собственные представления рядом с pgAdmin. Вход через её "/login" не увеличивал счётчик и не проверял блокировку. Через "/verify" можно было бесконечно проверять пароль вошедшего пользователя. "/change" менял пароль без соответствующего разрешения и без перешифровки сохранённых паролей серверов. "/reset" рассылал и применял сброс для заблокированных и не внутренних учётных записей.
Помогал и регистр: учётная запись искалась по точному имени, а форма входа сопоставляла email без учёта регистра. При включённых LDAP, Kerberos или внешней аутентификации неверный внутренний пароль вообще не считался.
Вход в чужую учётную запись через LDAP и Kerberos
CVE-2026-116239 (CVSS 3.1 8.5, CWE-287 и CWE-639) позволяет войти в чужую учётную запись с тем же именем пользователя. pgAdmin хранит отдельную запись на каждый источник аутентификации, поэтому одинаковые имена у внутренней и LDAP-записи - обычное дело.
После успешной проверки в LDAP или Kerberos pgAdmin выбирал учётную запись только по имени, не сверяя источник. В результате пользователь каталога попадал в сессию внутренней записи с её ролью, серверами и сохранёнными паролями баз. Под удар попадала и учётная запись администратора, созданная при первой настройке.
Для эксплуатации нужны действительные учётные данные в LDAP-каталоге или Kerberos-области, которые pgAdmin уже использует. Теперь запись ищется по имени и по источнику, который прошёл проверку.
Утечки служебных данных серверного режима
Сразу несколько ошибок вели к тому, что чужая сессия получала доступ к файлам и билетам служебной учётной записи.
CVE-2026-116247 (CVSS 8.2): если у сервера не было задано своё хранилище паролей или клиентский сертификат, libpq брал файлы учётной записи pgAdmin. Достаточно было прислать копию открытого сертификата, чтобы libpq подобрал к нему закрытый ключ службы.
CVE-2026-116244 (CVSS 8.2): при отключении делегированных билетов pgAdmin убирал переменную кэша, и Kerberos-библиотека возвращалась к кэшу службы. Любой сервер, запросивший GSSAPI, получал билет службы, независимо от указанного имени пользователя.
CVE-2026-116242 (CVSS 8.2): туннели SSH всегда загружали ключи и конфигурацию из домашнего каталога службы. Пользователь мог настроить туннель к хосту, который принимает ключ службы, без собственных учётных данных.
CVE-2026-116245 (CVSS 8.2): сервисы подключения из файла службы службы были доступны всем. Появилась настройка "SERVER_MODE_ALLOWED_SERVICES", пустая по умолчанию, а переменные "PGPASSWORD" и "PGSERVICE" теперь удаляются при старте.
CVE-2026-116246 (CVSS 6.5): пароль сервера записывался в окружение процесса pgAdmin и не удалялся. Следующая сессия другого пользователя наследовала его.
Обход каталога и работа с файлами
CVE-2026-116249 (CVSS 8.4, CWE-22 и CWE-73) позволяет выйти за пределы каталога пользователя через путь вида "../<другой пользователь>/.pgpass". Так можно было подключиться с чужими паролями, сертификатом или ключом SSH. Параметр "sslkeylogfile" вообще передавался в libpq без проверки, поэтому файл создавался в произвольном месте от имени службы.
CVE-2026-116240 (CVSS 6.5, CWE-22 и CWE-367) описывает расхождение между проверенным и используемым путём. На POSIX снятие ведущих слешей превращало имя внутри хранилища в абсолютный путь. На Windows имя диска отбрасывало каталог хранилища. Отдельно ломался листинг каталога с именем вроде закодированного "..".
CVE-2026-116250 (CVSS 6.5) требует локального условия: записать символическую или жёсткую ссылку либо FIFO в хранилище пользователя. Каталоги принадлежат учётной записи pgAdmin, поэтому нужен доступ на запись к сетевому или общему хранилищу от другого пользователя ОС и выигранная гонка. Патч открывает файлы покомпонентно с "O_NOFOLLOW" и передаёт утилитам уже открытый дескриптор.
Путь к утилитам и подмена исполняемого файла
CVE-2026-116243 (CVSS 7.5, CWE-426 и CWE-427) позволяет указать путь к pg_dump, pg_restore, pg_dumpall или psql внутри общего хранилища. Туда обычные пользователи могут загружать файлы. Проверка исключала только личный каталог, поэтому загруженный исполняемый файл запускался от имени службы. На POSIX файлы через pgAdmin не получают бит выполнения, так что практически это касается серверного режима на Windows.
Перенаправление соединения через имя базы
CVE-2026-116252 (CVSS 6.5, CWE-88, CWE-522 и CWE-918) затрагивает обновление материализованного представления. Имя базы передавалось в psql как есть. Если оно содержало "=" или начиналось с URI, libpq трактовал его как полную строку подключения и переопределял хост и порт.
Создать базу с таким именем может любая роль с правом CREATEDB. В итоге psql подключался к выбранному атакующим адресу, а сохранённый пароль пользователя предъявлялся этому узлу. Тот же класс ошибки закрыли раньше для Backup, Restore, Maintenance и Import/Export Data в CVE-2026-86862.
Общие серверы и сессии
CVE-2026-116248 (CVSS 6.8, CWE-862) позволяла неадминистратору поделиться сервером со всеми. Кнопку «Shared» в интерфейсе видят только администраторы, но API сохранял флаг из запроса. Похожий обход был в импорте servers.json: чужие общие записи удалялись уже после проверки файла. Прямого доступа это не даёт, но позволяет подсунуть всем пользователям сервер с доверенным именем и собрать их пароли к базе.
CVE-2026-116251 (CVSS 4.2, CWE-613): смена или сброс пароля не завершали остальные сессии. Сессия, захваченная до смены пароля, продолжала работать до истечения срока. Теперь при смене пароля меняется идентификатор сессии, а сохранённые пароли серверов перешифровываются.
Затронутые версии
Уязвимы pgAdmin 4 до 9.19. CVE-2026-17566, которую обходит CVE-2026-116241, закрыта в 9.18, поэтому сборки 9.18 тоже нужно обновлять. Исправления для CVE-2026-116244 опираются на параметр "require_auth", которому нужен libpq 16 или новее. На более старом libpq часть защиты Kerberos не включится.
Если обновиться нельзя
Ограничьте круг пользователей, которым доступен серверный режим pgAdmin. Уберите права "tools_import_export_data" у всех, кому они не нужны, и проверьте роли с правом CREATEDB. Не размещайте общие каталоги хранилища на сетевых ФС, куда пишут другие пользователи ОС. Проверьте настройки LDAP и Kerberos: совпадение имён с внутренними учётными записями опасно, пока патч не установлен. Задайте "SERVER_MODE_ALLOWED_SERVICES" явно и просмотрите серверы, помеченные как общие, на предмет посторонних записей.
Ссылки
- https://www.cve.org/CVERecord?id=CVE-2026-116241
- https://www.cve.org/CVERecord?id=CVE-2026-116238
- https://www.cve.org/CVERecord?id=CVE-2026-116239
- https://www.cve.org/CVERecord?id=CVE-2026-116249
- https://www.cve.org/CVERecord?id=CVE-2026-116247
- https://www.cve.org/CVERecord?id=CVE-2026-17566
- https://www.postgresql.org/about/news/pgadmin-4-v919-released-3426/