E.9. Выпуск 17.10 #

E.9.1. Миграция на версию 17.10
E.9.2. Изменения

Дата выпуска: 2026-05-14

В этот выпуск вошли различные исправления, внесённые после версии 17.9. За информацией о нововведениях версии 17 обратитесь к Разделу E.19.

E.9.1. Миграция на версию 17.10 #

Если используется версия 17.X, выгрузка/восстановление базы не требуется.

Если вы обновляете сервер с более ранней версии, чем 17.6, обратитесь к Разделу E.13.

E.9.2. Изменения #

  • Предотвращение неограниченной рекурсии при обработке стартовых пакетов подключения (Микаэль Пакье) § §

    Ранее злоумышленник мог вызвать сбой подключённого обслуживающего процесса путём бесконечного чередования отклоняемых запросов на шифрование SSL и GSS.

    Проект PostgreSQL благодарит Calif.io (при сотрудничестве с Claude и Anthropic Research) за сообщение об этой проблеме. (CVE-2026-6479)

  • Устранение различных случаев целочисленного переполнения при вычислении объёма памяти (Том Лейн, Натан Боссарт, Хейкки Линнакангас) § § § § § § § § § §

    В различных местах существовал риск целочисленного переполнения при вычислении необходимого объёма памяти. Переполнение приводило к выделению недостаточного объёма памяти, в результате чего вызывающий код записывал за пределы буфера. Это вызывало сбой сервера, а также потенциально допускало выполнение произвольного кода. Во многих случаях, но не во всех, угроза наблюдалась в 32-разрядных сборках.

    Проект PostgreSQL благодарит команду Xint Code, Брюса Данга, Свена Клемма и Павла Когоута за сообщение об этой проблеме. (CVE-2026-6473)

  • Корректное экранирование имён подписок в утилите pg_createsubscriber (Натан Боссарт) §

    Ранее имя подписки добавлялось в SQL-команды без экранирования, что создавало риск SQL-инъекции в маловероятном сценарии, когда имя подписки было получено из недоверенного источника.

    Проект PostgreSQL благодарит Юй Куньпэна за сообщение об этой проблеме. (CVE-2026-6476)

  • Корректное экранирование имён объектов при проверках источника логической репликации (Павел Когоут) §

    В результате выполнения команды 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)

  • Использование сравнения строк с постоянным временем выполнения при аутентификации (Микаэль Пакье) § §

    Теперь при проверке паролей, хешей и других значений вместо функции memcmp() или 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 указаны разные правила сортировки. Проблем не возникало, если оба правила были детерминированными, поскольку при этом требуется, чтобы равенство двух строк было побитовым. Недетерминированные правила работают по-другому, поэтому если для условия WHERE или индекса было указано недетерминированное правило сортировки, при оптимизации с предположением об уникальных совпадениях могли выдаваться некорректные результаты.

  • Устранение проблемы неполного удаления ссылок на отношения в структурах RestrictInfo в ходе удаления соединений (Том Лейн) § §

    Ранее из-за неполного удаления возникали такие ошибки в работе планировщика, как «FULL JOIN is only supported with merge-joinable or hash-joinable join conditions» (FULL JOIN поддерживается только с условиями, допускающими соединение слиянием или хеш-соединение). В других случаях это также могло приводить к пропуску корректных планов.

  • Исправление обработки генерируемых столбцов NEW в действиях и условиях применения правил (Ричард Гуо, Дин Рашид) §

    Ранее ссылки на такие столбцы выдавали NULL в запросах INSERT или значение OLD в запросах UPDATE.

  • Исправление ложных ошибок «generated columns are not supported in COPY FROM WHERE conditions» (генерируемые столбцы не поддерживаются в условиях COPY FROM WHERE) (Том Лейн) §

    Ранее эта ошибка иногда могла возникать при использовании системного столбца в условии 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 базы данных.

  • Обновление статистики в периоды простаивания параллельного рабочего процесса (Хоу Чжицзе) §

    Ранее статистика по недавно завершённой транзакции могла долго не записываться, особенно при низкой нагрузке.

  • Исправление ошибки «no relation entry for relid 0» (не найден элемент отношения с номером 0) при оценке длин массивов в операциях с множествами (Тендер Ван) §

  • Устранение выхода за границы буфера при получении функцией pglz_decompress() повреждённых входных данных (Эндрю Дунстан) §

    В некоторых случаях могло происходить чтение нескольких байтов за пределами входных данных, что при неблагоприятном стечении обстоятельств могло привести к сбою.

  • Исправление обработки инкрементальным анализатором JSON числовых токенов, выходящих за границы буфера ввода (Эндрю Дунстан) §

    Ранее принимались некорректно форматированные числовые значения, что приводило к ошибкам в дальнейшем.

  • Предотвращение раздувания карт видимости отношений при восстановлении из инкрементальной резервной копии (Роберт Хаас) §

    В ходе восстановления в карту видимости могло добавляться много блоков нулей из-за некорректного вычисления ожидаемой длины файла. Это не повреждало данные, но могло привести к потере значительного объёма дискового пространства.

  • Использование правила сортировки C вместо правила сортировки базы данных по умолчанию при поиске кеша в каталоге по текстовым столбцам (Джефф Девис) §

    Это изменение позволяет избежать ошибок в некоторых особых случаях, таких как запуск физической репликации, когда база данных не определена и поэтому правило сортировки по умолчанию определить невозможно.

  • Предотвращение блокировки повышения резервного сервера из-за зависшего рабочего процесса синхронизации слотов (Ниша Мунд, Аджин Чериан) § § §

    Ранее рабочий процесс, который безрезультатно ожидал ответа от главного сервера, задерживал повышение на чрезмерно длительный промежуток времени.

  • Устранение избыточной записи в журнал от простаивающих рабочих процессов синхронизации слотов (Хоу Чжицзе) §

  • Обеспечение проверки внутренней согласованности структур данных tuplestore даже после возникновения ошибки (Том Лейн) §

    Ранее эта проверка отсутствовала, что как правило, не вызывало проблем кроме случаев, когда объект tuplestore требовался для курсора WITH HOLD. В версии 15 и ниже происходили легко воспроизводимые сбои. В более высоких версиях эта уязвимость не наблюдалась, но изменение было внесено во все версии для поддержания единообразия.

  • Исправление преждевременного вывода NULL в полях задержки репликации в представлении pg_stat_replication (Синъя Като) §

    Часто в столбах задержки значения сбрасывались к NULL, даже если процесс репликации всё ещё был активен.

  • Предотвращение редких случаев ошибок сброса при работе с индексами GiST, не записываемыми в WAL (Томаш Вондра) §

    Несмотря на то, что индекс GiST является нежурналируемым, в некоторых случаях могли возникать ошибки «xlog flush request n/nnnn is not satisfied» (запрос на сброс xlog n/nnnn не выполнен) из-за некорректного выбора «фиктивного LSN» в качестве позиции записи.

  • Исправление недооценки требуемого размера карт страниц DSA для сегментов нестандартного размера (Пол Бунн) §

    Ошибки в вычислениях приводили к выходу за пределы буфера и в результате к сбоям сервера.

  • Исправление индексирования массивов старейших мультитранзакций в общей памяти (Юрий Соколов) § §

    Ошибка приводила к тому, что блокировки строк, установленные подготовленной, но ещё не подтверждённой транзакцией, были невидимы в других сеансах, а также к другим проблемам видимости результатов такой транзакции. При очень низком значении max_connections возникал риск повреждения памяти.

  • Устранение риска сбоя сервера при обработке расширенной статистики по выражениям, использующих типы данных расширений (Микаэль Пакье) §

    Ранее были возможны обращения по нулевому указателю, если функция 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 года там осуществляют переход на летнее время, принятый в Европейском союзе.