PostgreSQL выпустила внеочередное обновление безопасности: 18.7, 17.12, 16.16, 15.20 и 14.25, а также второй релиз-кандидат 19. В релизе закрыты 52 уязвимости и более 140 ошибок. Многие CVE дают выполнение кода и имеют оценку CVSS 3.1 - 8.8. Ветка PostgreSQL 14 получила последнее обновление и больше не поддерживается. После установки патча администраторам может понадобиться перестроить индексы и сделать новую полную резервную копию.
Что исправлено
PostgreSQL - одна из самых распространённых СУБД, и такое количество security-исправлений за один выпуск случается редко. Большая часть ошибок относится к классам type confusion и use-after-free: СУБД неверно интерпретирует тип данных или обращается к освобождённой памяти, и в ряде случаев это приводит к выполнению произвольного кода. Другая группа - SQL-инъекции в служебных утилитах и обходы проверок прав.
Из критичных по оценке стоит выделить несколько. CVE-2026-6460 (CVSS 3.1 8.8) - type confusion после ALTER ... SET DATA TYPE, который позволяет выполнить произвольный код. CVE-2026-116304 (8.8) - use-after-free при параллельном использовании RECORD с модификатором типа, тоже приводит к выполнению кода. CVE-2026-116314 (8.8) - pg_restore выполняет произвольный код из-за отсутствия проверки non-plain архива. CVE-2026-116318 (8.8) - SQL-инъекция через имя not-null ограничения в pg_dump. CVE-2026-120139 (8.8) - целочисленное переполнение при вычислении размера кортежа, ведущее к выполнению кода. CVE-2026-116315 (8.8) - переполнение буфера в tsvector_delete(), которое также может привести к выполнению кода.
Остальные исправления того же уровня разбросаны по plperl, pltcl, статистике, логической репликации, dblink, расширениям и планировщику. Есть и ошибки с меньшими оценками: SQL-инъекции в reindexdb и pg_dump, обход row security, раскрытие памяти сервера, проблемы с правами в REASSIGN OWNED и CREATE TYPE в pg_temp. Полный перечень из 52 CVE с оценками приведён в анонсе релиза и заметках к выпуску.
Чем это грозит
Выполнение кода в процессе СУБД - это доступ к базе и, в зависимости от прав процесса, к файлам сервера. Для компании это означает риск утечки данных, изменения или удаления записей, а также компрометацию приложений, которые ходят в эту базу. Если СУБД обслуживает несколько клиентов или внутренних команд, одна уязвимая база может стать точкой входа для соседних систем.
SQL-инъекции в pg_dump и pg_restore опасны в конвейерах резервного копирования и восстановления. Если дампы или архивы приходят из недоверенного источника, вредоносный объект в дампе может выполниться на стороне, которая восстанавливает базу. Поэтому обновлять нужно не только серверы, но и машины, где запускаются утилиты.
Условия эксплуатации
Для большинства CVE нужна учётная запись в PostgreSQL и возможность выполнять SQL. Это не удалённая атака без аутентификации: оценка 8.8 отражает высокое влияние, но требует низких привилегий. На практике это значит, что риск выше там, где к базе подключено много пользователей, приложений и расширений и где не ограничены права.
Для ошибок в pg_dump, pg_restore, vacuumdb и reindexdb нужен запуск утилиты или обработка подготовленного архива. Для части проблем с правами достаточно роли владельца объекта. Поэтому в аудит стоит включить не только суперпользователей, но и сервисные учётные записи приложений. Отдельная категория риска - расширения и недоверенные SQL-функции: они выполняются в процессе сервера, поэтому ошибка типа в них опаснее, чем в обычном запросе.
Затронутые версии
Уязвимы версии ниже 18.7, ниже 17.12, ниже 16.16, ниже 15.20 и ниже 14.25. Ветка 19 затронута до 19 RC 2. PostgreSQL 14 - последний выпуск: вендор прямо рекомендует планировать миграцию на поддерживаемую версию, потому что новых исправлений для 14 больше не будет.
Обновление минорной версии не требует pg_upgrade или выгрузки-загрузки: достаточно остановить сервер и заменить бинарники. Но это не значит, что можно просто поставить пакет и забыть: часть исправлений требует последующих действий с индексами и ограничениями.
Что делать после обновления
Проверьте индексы. В релизе исправлены ошибки, которые могли повредить GIN-индексы и GiST-индексы pg_trgm. Если есть подозрение на повреждение, нужно выполнить REINDEX; для pg_trgm стоит перестроить GiST-индексы с классом операторов gist_trgm_ops. Для индексов B-tree на колонках bpchar без длины тоже рекомендован reindex.
Проверьте ограничения. На партиционированных таблицах могли остаться NOT NULL NO INHERIT, из-за которых в партиции попадали NULL. В релизе приведён запрос для поиска таких ограничений и описано, как их удалить или исправить.
Если используются инкрементальные бэкапы, после обновления стоит сделать новую полную копию и строить инкременты от неё: в релизе исправлены ошибки, которые могли приводить к повреждённым инкрементальным копиям. Для обычных base backup тоже есть исправления, поэтому старые копии лучше проверить.
Что делать
Обновить все узлы PostgreSQL до исправленных версий своей ветки, включая реплики и серверы, где запускаются утилиты. После обновления выполнить рекомендованные reindex и проверки ограничений, затем сделать свежие резервные копии. Для PostgreSQL 14 - запланировать миграцию на поддерживаемую ветку.
До обновления стоит проверить, у кого есть доступ к базе, какие расширения установлены и не выполняются ли дампы и восстановления из недоверенных источников. После обновления полезно посмотреть журналы на ошибки индексов и необычные обращения к служебным функциям. Полный список CVE и порядок действий приведены в анонсе релиза PostgreSQL.