E.13. Выпуск 16.14#
E.13. Выпуск 16.14 #
Дата выпуска: 2026-05-14
Этот выпуск содержит различные исправления по сравнению с 16.13. Информация о новых возможностях в основном выпуске 16 приведена в Раздел E.27.
E.13.1. Миграция на версию 16.14 #
Снятие дампа/восстановление не требуется для тех, кто использует 16.X.
Однако при обновлении с версии ниже 16.10 см. Раздел E.17.
E.13.2. Изменения #
Предотвращена неограниченная рекурсия при обработке стартовых пакетов (Микаэль Пакье) § §
Ранее злоумышленник мог вызвать сбой подключённого серверного процесса, бесконечно чередуя отклонённые запросы на шифрование SSL и GSS.
Проект PostgreSQL благодарит Calif.io (при сотрудничестве с Claude и Anthropic Research) за сообщение об этой проблеме. (CVE-2026-6479)
Исправлены различные случаи целочисленного переполнения при вычислении объёма памяти (Том Лейн, Натан Боссарт, Хейкки Линнакангас) § § § § § § § § § §
В различных местах существовал риск целочисленного переполнения при вычислении необходимого объёма памяти. Переполнение приводило к выделению недостаточного объёма памяти, в результате чего вызывающий код записывал за пределы буфера. Это, по меньшей мере, вызывало бы сбои сервера и, вероятно, могло бы быть использовано для выполнения произвольного кода. Во многих, но не во всех случаях, эта опасность существовала только в 32-битных сборках.
Проект PostgreSQL благодарит команду Xint Code, Брюса Данга, Свена Клемма и Павла Когоута за сообщение об этой проблеме. (CVE-2026-6473)
Корректное экранирование имён объектов при проверках источника логической репликации (Павел Когоут) §
В результате выполнения команды
ALTER SUBSCRIPTION ... REFRESH PUBLICATIONимена схем и отношений подставлялись в SQL-команды без их экранирования, что позволяло выполнять произвольные SQL-запросы на публикующем сервере.Проект PostgreSQL благодарит Павла Когоута за сообщение об этой проблеме. (CVE-2026-6638)
Запрещены слишком длинные значения параметров функции
ts_headline()(Микаэль Пакье) §Длина строк
StartSel,StopSelиFragmentDelimiterне должна превышать 32 Кб, но ранее это не проверялось. Значение, превышающее допустимую длину, обычно приводили к сбою сервера.Проект PostgreSQL благодарит команду Xint Code за сообщение об этой проблеме. (CVE-2026-6473)
Предотвращена передача вредоносных названий часовых поясов в функциях
timeofday()иpg_strftime()(Том Лейн) § §Через сконструированное название часового пояса функции
snprintf()можно было передать последовательность с%, что потенциально приводило к сбоям или раскрытию памяти сервера. Аналогичные риски возникали при переполнении буфера вывода, ограниченного по размеру, при использовании функцииpg_strftime().Проект PostgreSQL благодарит команду Xint Code за сообщение об этой проблеме. (CVE-2026-6474)
Добавлена проверка права
CREATEу пользователя в схеме, указанной при создании мультидиапазонного типа (Йелте Феннема-Нио) §Мультидиапазонный тип может быть создан в схеме, отличной от схемы родительского диапазонного типа. Ранее проверки необходимых прав отсутствовали.
Проект PostgreSQL благодарит Йелта Феннема-Нио за сообщение об этой проблеме. (CVE-2026-6472)
Реализовано использование сравнения строк с постоянным временем выполнения при аутентификации (Микаэль Пакье) § §
Теперь при проверке паролей, хешей и других значений вместо функций
memcpy()илиstrcmp()используется функцияtimingsafe_bcmp(). Неизвестно, можно ли было практически использовать зависимость времени выполнения указанных функций от данных, но в интересах безопасности они были заменены.Проект PostgreSQL благодарит Джо Конвея за сообщение об этой проблеме. (CVE-2026-6478)
Функция
PQfn()отмечена как небезопасная, а её использования в библиотеке libpq запрещено (Натан Боссарт) §Для результата нецелочисленного типа функция
PQfn()не получает информации о размере буфера вывода, поэтому она не может проверить, что для данных, возвращаемых с сервера, хватит памяти. Таким образом злоумышленник мог перезаписать память клиента. Это нельзя исправить без изменения API, поэтому функция помечена как устаревшая. Внутри libpq теперь используется вариант функции, который обеспечивает недостающую проверку.Проект PostgreSQL благодарит Юй Куньпэна и Мартина Хайстермана за сообщение об этой проблеме. (CVE-2026-6477)
Предотвращен проход по пути при использовании утилит pg_basebackup и pg_rewind (Микаэль Пакье) §
В этих утилитах отсутствовали проверки путей выходных файлов, читаемых из ввода, поэтому злоумышленник мог заменить любой файл, доступный утилитам для записи. Теперь добавлено ограничение для записи данных — не принимаются абсолютные пути или пути, содержащие ссылки на родительские каталоги.
Проект PostgreSQL благодарит команду XlabAI из Tencent Xuanwu Lab и Валерия Губанова за сообщение об этой проблеме. (CVE-2026-6475)
Предотвращено переполнение полей в рамках типа
query_intмодуляcontrib/intarrayи типаltxtqueryмодуляcontrib/ltree(Том Лейн) § §Анализ этих структур запроса не проверялось переполнение 16-битных полей, что могло привести к созданию некорректного дерева запроса. Выполнение такого запроса могло вызвать сбой сервера.
Проект PostgreSQL благодарит команду Xint Code за сообщение об этой проблеме. (CVE-2026-6473)
Запрещены слишком длинные значения типа
lqueryмодуляcontrib/ltree(Микаэль Пакье) §Значения с более чем 64 000 элементов вызывали внутренние переполнения, которое могло привести к повреждению стека или неправильным результатам.
Проект PostgreSQL благодарит пользователей с ником Vergissmeinnicht и A1ex и Цзихе Вана за сообщение об этой проблеме. (CVE-2026-6473)
Предотвращены SQL-инъекции и переполнения буфера при работе модуля
contrib/spi(Натан Боссарт) §В функции
check_foreign_key()значения ключей не экранировались, а при построении запросов использовались буферы постоянного размера. Хотя этот модуль представляет собой лишь пример кода, в нём всё равно не должно быть таких серьёзных ошибок.Проект PostgreSQL благодарит Николая Самохвалова за сообщение об этой проблеме. (CVE-2026-6637)
Добавлена проверка на наличие недетерминированных правил сортировки перед заключением, что условие на равенство для типа, поддерживающего сортировку, предполагает уникальность (Ричард Гуо) § §
Многочисленные оптимизации планировщика были основаны на предположении, что, например, не более одной строки таблицы может удовлетворять условию
WHERE x = 'abc', если наxесть уникальный индекс. Однако этот вывод в общем случае был небезопасен, если у индекса и у условияWHEREбыли заданы разные правила сортировки (collations). Это было безопасно, когда оба правила были детерминированными, попоскольку при этом требуется, чтобы равенство двух строк было побитовым. Но недетерминированные правила работают по-другому, поэтому оптимизация на основе предположения о единственности совпадений могла привести к неправильным результатам запроса, если либо в условииWHERE, либо в индексе использовалась недетерминированное правило.Исправлено неполное удаление ссылок на отношения в структурах
RestrictInfoпри удалении соединений (Том Лейн) § §Ранее из-за неполного удаления возникали такие ошибки в работе планировщика, как “FULL JOIN is only supported with merge-joinable or hash-joinable join conditions”. Также это могло привести к пропуску корректных планов.
Исправлена некорректная обработка сгенерированных столбцов
NEWв действиях и условиях применения правил (Ричард Гуо, Дин Рашид) §Ранее такие ссылки на столбцы выдавали NULL в запросах
INSERTили значениеOLDв запросахUPDATE.Исправлены ложные ошибки “generated columns are not supported in COPY FROM WHERE conditions” (Том Лейн) §
Ранее эта ошибка иногда могла возникать при использовании системного столбца в условии
COPY FROM WHERE.Исправлено сообщение об ошибке сериализации, когда в ходе выполнения команды
MERGEв режиме повторяемого чтения или сериализуемом режиме встречаются параллельно изменяемые кортежи (Тендер Ван) §Ранее поведение в таких случаях совпадало с поведением на более низких уровнях изоляции.
Исправлено поведение команды
CREATE TABLE ... LIKE ... INCLUDING STATISTICSдля случаев, когда в исходной таблице есть один или несколько удалённых столбцов (Джулиен Ташуар) §Ранее в таких случаях объекты расширенной статистики могли быть скопированы некорректно, или команда могла выдать некорректную ошибку.
Обеспечена возможность для команды
ALTER INDEX ... ATTACH PARTITIONпомечать родительский индекс как рабочий, когда это необходимо (Сами Имсейх) §В некоторых крайних случаях секционированный индекс мог остаться помеченным нерабочим, даже если все его дочерние индексы были рабочими. Это изменение предоставило механизм, с помощью которого пользователь может исправить такую ситуацию без необходимости вручную обновлять каталог.
Исправлено ошибочное удаление зависимости оборачиваемого объекта от функции-обработчика командой
ALTER FOREIGN DATA WRAPPER(Джефф Дэвис) §Запрещено создание составного типа, который содержит сам себя через мультидиапазон (Хейкки Линнакангас) §
Такие случаи уже были запрещеныдля промежуточных доменов, массивов, составных или диапазонных типов, однако мультдиапазоны были упущены.
Исправлено сравнение образов datum, чтобы оно не зависело от расширения знака (Дэвид Роули) §
Это исправило некоторые ситуации, которые ранее приводили к ошибкам “could not find memoization table entry” или к неправильным результатам запросов.
Исправлена некорректная логика обработки хешированных элементов
IN/NOT INс нестрогим оператором равенства (Ченпэн Ян) §Ранее могли происходить сбои или выдаваться неверные ответы. Все встроенные типы данных имеют строгие операторы равенства, поэтому эта проблема могла возникнуть только с типами данных расширений.
Усечены слишком длинные числовые символы, зависящие от локали, функцией
to_char()(Том Лейн) §Ранее если в локали был указан символ валюты, разделитель тысяч, десятичный разделитель или знак длиннее 8 байтов, буфер мог переполниться. На практике такие локали не существовали, и для злоумышленника без прав установка вредоносное определение локали под сервером Postgres была невозможна. Однако в целях безопасности была добавлена проверка на превышение длины символов и возможность их усечения при необходимости.
Предотвращено переполнение буфера при разборе файла аффиксов для словаря
Ispell(Том Лейн) § §Повреждённый или вредоносный файл аффиксов мог привести к сбою сервера. Это не считалось проблемой безопасности, поскольку файлы конфигурации текстового поиска считаются доверенными, но поведение всё же было исправлено.
Добавлена защита от целочисленного переполнения при вычислении начальной и конечной позиций для оконных агрегатных функций (Ричард Гуо) §
Слишком большие смещения, заданные пользователем (близкие к INT64_MAX), могли привести к ошибкам или некорректным результатам запроса.
Исправлено поведение функции
array_agg_array_combine()для корректного объединения битовых карт NULL для массивов (Дмитро Астапов) §Эта ошибка иногда приводила к некорректному выводу при параллельных вычислениях
array_agg(anyarray).Реализован повторный запуск функции
sync_file_range()при возникновении ошибкиEINTR(Тэмён Кан) §Исправлено некорректное поведение функции
pg_stat_reset_single_table_counters()в общем каталоге (Чао Ли) §Ранее наблюдался нежелательный побочный эффект сброса текущего значения
stat_reset_timestamp.Реализовано обновление статистики в периоды простаивания параллельного рабочего процесса (Хоу Чжицзе) §
Ранее статистика из недавно завершённой транзакции могла долго не записываться, особенно при низкой нагрузке.
Исправлен выход за границы буфера при получении функцией
pglz_decompress()повреждённых входных данных (Эндрю Дунстан) §В некоторых случаях могло происходить чтение нескольких байтов за пределами входных данных, что при неблагоприятном стечении обстоятельств могло привести к сбою.
Обеспечена проверка внутренней согласованности структур данных tuplestore даже после возникновения ошибки (Том Лейн) §
Ранее эта проверка отсутствовала, что обычно не вызывало проблем кроме случаев, когда объект
tuplestoreтребовался для курсораWITH HOLD. В версиях 15 и ниже это приводило к легко воспроизводимым сбоям. Для более высоких версиях эта уязвимость не наблюдалась, но изменение было внесено во все версии для поддержания единообразия.Исправлен преждевременный вывода NULL в полях задержки репликации в представлении
pg_stat_replication(Синъя Като) §Часто в столбах задержки значения сбрасывались к NULL, даже когда происходила репликационная активность.
Предотвращена редкая ошибка сброса при работе с индексами GiST, не записываемыми в WAL (Томаш Вондра) §
Несмотря на то, что индекс GiST является нежурналируемым, иногда могли возникать ошибки “xlog flush request
n/nnnnis not satisfied” из-за некорректного выбора “fake LSN” в качестве позиции записи.Исправлена недооценка требуемого размера карт страниц DSA для сегментов нестандартного размера (Пол Бунн) §
Ошибочное вычисление приводили к выходу за пределы буфера и в результате к сбоям сервера.
Устранён риск сбоя сервера при обработке расширенной статистики ппо выражениям, использующих типы данных расширений (Микаэль Пакье) §
Ранее были возможны обращения по нулевому указателю, если функция typanalyze типа данных не выводила никакой полезной статистики. Ни одна встроенная функция typanalyze так себя не вела, но это могли делать расширения.
Устранены незначительные утечки памяти при обработке строк на основе ICU (Джефф Дэвис) §
Реализована Корректная остановка дочерних процессов перед завершением работы postmaster при сбое стартового процесса (Аюш Тивари) §
Ранее отключение строилось на давно устаревшем предположении, что во время работы процесса запуска других дочерних процессов postmaster нет, поэтому немедленное завершение postmaster было допустимо. Потерянные дочерние процессы в конечном итоге замечали отключение postmaster и завершали свою работу самостоятельно, однако теперь используется более аккуратная процедура остановки.
Устранено условие гонки между воспроизведением записей WAL о контрольных точках и создании идентификаторов мультитранзакций (Хейкки Линнакангас) §
Ранее при воспроизведении WAL с главного сервера на более старом корректирующем выпуске могло происходить зацикливание резервного сервера: бесконечное чередование состояний сбоя и перезапуска с ошибкой “could not access status of transaction”.
Предотвращено бесконечное ожидание при завершении работы процесса walsender (Антонин Боннефой) § §
Ранее при завершении работы кластера, публикующего данные логической репликации, процесс walsender ожидал записи всех WAL в очереди на обработку. Однако корректного запроса на такую запись не было, из-за чего в некоторых случаях ожидание могло стать бесконечным.
Обеспечено сохранение изменений в картах свободного пространства таблиц при восстановлении (Алексей Махмутов) §
Ранее, хотя при воспроизведении WAL карта свободного пространства обновлялась при воспроизведении операций, которые должны были её изменить, буфер страницы карты не помечался как изменённый, если были включены контрольные суммы, поэтому изменения могли быть не записаны. На резервном сервере со временем это приводило к тому, что карта сильно расходилась с фактическим содержимым таблицы. Хотя карта используется только в качестве подсказки, после повышения резервного сервера это могло привести к значительному снижению производительности, которое сохранялось до обновления карты.
Исправлены сбои в некоторых функциях ecpg при их вызове без установленного соединения (Шрути Говда) §
Исправлены различные ошибки при распаковке резервных копий и разборе tar-архивов (Эндрю Дунстан, Том Лейн, Чао Ли) § § §
При распаковке и чтении tar-файлов pg_basebackup и pg_verifybackup неправильно обрабатывали данные для выравнивания tar-файлов, мв некоторых случаях повреждали данные, сжатые методом LZ4, пропускали проверки ряда нетипичных ошибок, а также не завершали работу после ошибок сжатия/декомпрессии (что приводило к каскадным сообщениям об ошибках), что приводило к утечке памяти.
Запрещён пропуск предоставлений прав
GRANTот праводателей с недействительными значениями OID в pg_dumpall (Том Лейн) §Теперь
GRANTбез какого-либо предложенияGRANTED BYвыгружается, как это происходило до версии 16. Это позволяет избежать потери предоставления прав в предсказуемых случаях, поскольку серверы до версии 16 не препятствовали удалению роли праводателя. Предупреждение об отсутствующем праводателе теперь выводится, только если версия исходного сервера 16 или выше.Обеспечено использование корректной версии протокола при подключении к исходным серверам более старых версий в pg_upgrade (Джейкоб Чемпион) §
Ошибки могли возникать при попытке обновления сервера с версии до 2018 года.
Модулю
contrib/basic_archiveразрешено продолжать работу при отсутствии каталога архива в начале процесса архивирования (Натан Боссарт) §Ранее, если параметр
basic_archive.archive_directoryне указывал на существующий каталог, он отклонялся. Это считалось нежелательным, поскольку архивирование могло быть заблокировано на неопределённое время, даже если каталог появлялся позже.Исправлена обработка изменения байтовой длины строки при смене регистра модулем
contrib/ltree(Джефф Дэвис) §Ранее шаблоны
lquery, указывающие на нечувствительное к регистру сопоставление, упускали совпадения в метках, которые совпадали.Устранена утечка памяти при возникновении ошибки в ходе разбора файла
pgss_query_texts.statв модулеcontrib/pg_stat_statements(Хейкки Линнакангас) §Устранён риска сбоя модуля
contrib/postgres_fdwпри преждевременной очистке неудачного подключения (Эцуро Фудзита) §Ранее, если удалённое соединение не удалось завершить при очистке, его нельзя было использовать дальше. Теперь подключение не закрывается до окончания транзакции на случай, если на него ещё есть ссылки в структурах данных, такие как открытые курсоры.
Обновлены данные часовых поясов до версии tzdata 2026b (Том Лейн) §
С ноября 2026 года в Британский Колумбии (Америка/Ванкувер) время весь год будет определяться часовым поясом UTC-07 (постоянный переход на летнее время). В этом выпуске предполагается, что их аббревиатура часового пояса будет
MST. Вероятно сокращение изменится, но пока неясно, какая новая аббревиатура будет использована. Также была внесена корректировка исторических данных для Молдавии: с 2022 там осуществляют переход на летнее время, принятый в Европейском союзе.