E.21. Выпуск 9.6.4

Дата выпуска: 2017-08-10

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

E.21.1. Миграция на версию 9.6.4

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

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

Также, если вы обновляете сервер с версии, более ранней, чем 9.6.3, см. Раздел E.22.

E.21.2. Изменения

  • Дальнейшее ограничение видимости pg_user_mappings.umoptions для защиты паролей, сохранённых в свойствах сопоставлений пользователей (Ной Миш)

    Исправление дефекта CVE-2017-7486 оказалось некорректным: в результате пользователь мог видеть свойства своего собственного сопоставления, даже когда он не имел права USAGE для соответствующего стороннего сервера. В таких свойствах мог содержаться пароль, который должен задавать владелец сервера, а не сам пользователь. Так как представление information_schema.user_mapping_options не показывает свойства в таких случаях, и pg_user_mappings не должно. (CVE-2017-7547)

    Само по себе это исправление корректирует поведение только в новых базах данных, создаваемых initdb. Если вы хотите применить это исправление к существующей базе данных, вам нужно будет проделать следующие действия:

    1. Добавьте allow_system_table_mods = true в postgresql.conf и перезапустите сервер. (В версиях, поддерживающих ALTER SYSTEM, вы можете воспользоваться этой командой для изменения конфигурации, но перезапустить сервер потребуется всё равно.)

    2. В каждой базе данных кластера выполните от имени суперпользователя следующие команды:

      SET search_path = pg_catalog;
      CREATE OR REPLACE VIEW pg_user_mappings AS
          SELECT
              U.oid       AS umid,
              S.oid       AS srvid,
              S.srvname   AS srvname,
              U.umuser    AS umuser,
              CASE WHEN U.umuser = 0 THEN
                  'public'
              ELSE
                  A.rolname
              END AS usename,
              CASE WHEN (U.umuser <> 0 AND A.rolname = current_user
                           AND (pg_has_role(S.srvowner, 'USAGE')
                                OR has_server_privilege(S.oid, 'USAGE')))
                          OR (U.umuser = 0 AND pg_has_role(S.srvowner, 'USAGE'))
                          OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user)
                          THEN U.umoptions
                       ELSE NULL END AS umoptions
          FROM pg_user_mapping U
               LEFT JOIN pg_authid A ON (A.oid = U.umuser) JOIN
              pg_foreign_server S ON (U.umserver = S.oid);
    3. Не забудьте внести коррективы в базах данных template0 и template1, в противном случае уязвимость сохранится в базах, которые будут создаваться впоследствии. Чтобы поправить template0, вам потребуется временно разрешить подключения к ней. В PostgreSQL 9.5 и новее вы можете выполнить

      ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;

      , а внеся поправку в template0, восстановить прежнее состояние командой

      ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;

      В более ранних версиях вместо этого используйте пару команд

      UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';
      UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
    4. В заключение удалите параметр конфигурации allow_system_table_mods и ещё раз перезапустите postmaster.

  • Запрет пустых паролей для всех методов аутентификации по паролю (Хейкки Линнакангас)

    Библиотека libpq игнорирует пустое указание пароля и не передаёт его на сервер. Поэтому, если пароль пользователя пустой, psql и другие клиенты на базе libpq не позволяют подключиться с таким паролем. Как следствие, администратор может решить, что установка пустого пароля равнозначна запрету входа по паролю. Однако с изменённым клиентом или клиентом не на базе libpq подключение оказывается возможным, в зависимости от настроенного метода аутентификации. В частности, самый распространённый метод, md5, принимает пустые пароли. В результате этого изменения сервер не будет принимать пустые пароли во всех случаях. (CVE-2017-7546)

  • Добавление в lo_put() проверки права UPDATE для целевых больших объектов (Том Лейн, Микаэль Пакье)

    Функция lo_put(), несомненно, должна требовать наличия тех же прав, что и lowrite(), но такая проверка отсутствовала, что позволяло пользователю менять данные в большом объекте. (CVE-2017-7548)

  • Исправление в документации описания процесса обновления резервных серверов с использованием pg_upgrade (Брюс Момджян)

    Ранее в документации говорилось, что нужно запустить/остановить ведущий сервер после запуска pg_upgrade, но до синхронизации резервных серверов. Однако эта последовательность небезопасна.

  • Исправление одновременной блокировки цепочки изменённых кортежей (Альваро Эррера)

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

  • Устранение риска повреждения данных при замораживании кортежа, в котором XMAX равен идентификатору мультитранзакции с ровно одним ещё востребованным членом (Фёдор Сигаев)

  • Предупреждение целочисленного переполнения и краха при сортировке в памяти более чем одного миллиарда кортежей (Сергей Копосов)

  • В Windows необходимо повторять попытки создания процесса в случае ошибки при резервировании диапазона адресов разделяемой памяти в новом процессе (Том Лейн, Амит Капила)

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

  • Устранение маловероятной возможности повреждения разделяемой хеш-таблицы предикатных блокировок в сборках для Windows (Томас Манро, Том Лейн)

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

  • Запрещение передачи сеансовых билетов SSL клиентам (Том Лейн)

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

  • Исправление кода, устанавливающего tcp_keepalives_idle в Solaris (Том Лейн)

  • Исправление дефекта в сборщике статистики, приводящего к потере запросных сообщений, выдаваемых сразу после перезапуска главного процесса (Том Лейн)

    Запросы статистики, выдаваемые в течение полсекунды после предыдущего отключения главного процесса, по сути терялись.

  • Размер приёмного буфера в сборщике статистики должен быть не меньше 100 Кбайт (Том Лейн)

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

  • Устранение возможности создания некорректного сегмента WAL при повышении резервного сервера сразу после того, как он обрабатывает запись XLOG_SWITCH (Андрес Фройнд)

  • Процесс walsender должен завершаться своевременно, когда клиент инициирует выключение (Том Лейн)

  • Исправление обработки сигналов SIGHUP и SIGUSR1 в процессах walsender (Петр Желинек, Андрес Фройнд)

  • Предотвращение панического состояния, которое могут вызвать процессы walsender во время контрольной точки при выключении (Андрес Фройнд, Микаэль Пакье)

  • Устранение неоправданной паузы при перезапуске процессов walreceiver, возникающей вследствие условий гонки в главном процессе (Том Лейн)

  • Устранение утечки маленьких подтранзакций, оказывающихся на диске при логическом декодировании (Андрес Фройнд)

    В результате образовывались временные файлы, занимающие лишнее место на диске.

  • Оптимизация операций, необходимых для получения снимков при создании слотов логического декодирования (Андрес Фройнд, Петр Желинек)

    Предыдущий алгоритм оказывался очень неэффективным на сервере со множеством открытых транзакций.

  • Устранение условий гонки, при которых создание слотов логического декодирования могло откладываться на неопределённое время (Андрес Фройнд, Петр Желинек)

  • Уменьшение издержек при обработке событий сброса системного кеша (Том Лейн)

    Это особенно полезно для логического декодирования, когда сброс кеша происходит часто.

  • Ликвидация некорректной эвристики, применяемой в некоторых случаях для оценки избирательности соединения при наличии ограничений внешнего ключа (Дэвид Роули)

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

  • Исправление поведения в ситуациях, когда INSERT или UPDATE присваивает более одного элемента столбцу с типом домена на базе массива (Том Лейн)

  • Разрешение использования оконных функций во вложенных SELECT в аргументах агрегатной функции (Том Лейн)

  • Обеспечение корректного применения предложения CHECK OPTIONS для представления, когда нижележащая таблица является сторонней (Эцуро Фудзита)

    Ранее операция изменения полностью передавалась на сторонний сервер, и если для представления задавалось ограничение, оно не проверялось.

  • Предупреждение конфликта имён с автоматически генерируемыми типами массивов при выполнении ALTER ... RENAME (Вик Фиринг)

    Ранее автоматически сгенерированный тип массива во избежание конфликта переименовывался при выполнении CREATE; данное исправление распространяет это поведение и на операции переименования.

  • Устранение потери указателя в ALTER TABLE когда для ограничения, принадлежащего таблице, добавлен комментарий (Дэвид Роули)

    При повторном применении комментария к воссозданному ограничению мог произойти сбой со странным сообщением или даже с аварийным завершением.

  • Добавление для команды ALTER USER ... SET всех вариантов синтаксиса, что принимает ALTER ROLE ... SET (Питер Эйзентраут)

  • Допущение для сторонней таблицы создания ограничений CHECK в изначально непроверенном состоянии (NOT VALID) (Амит Ланготе)

    CREATE TABLE просто игнорирует указания NOT VALID для ограничений CHECK, исходя из того, что таблица должна быть пустой, и поэтому ограничение может сразу считаться проверенным. Но это неверно для команды CREATE FOREIGN TABLE — нет причин полагать, что нижележащая таблица пуста, и даже если это так, не мы должны решать, что ограничение проверенное. Поэтому такую «оптимизацию» для сторонних таблиц нужно исключить.

  • Обновление информации о зависимости при смене типа аргумента или возврата для функции ввода/вывода с opaque на целевой тип (Хейкки Линнакангас)

    CREATE TYPE изменяет функции ввода/вывода, объявленные в давно устаревшем стиле, но информация о зависимости от этого типа не записывалась, в результате чего после команд DROP TYPE могли оставаться дефектные определения функций.

  • Допущение распараллеливания в плане запроса, когда COPY копирует данные из его результата (Андрес Фройнд)

  • Сокращение использования памяти при обработке командой ANALYZE столбцов tsvector (Хейкки Линнакангас)

  • Устранение ненужной потери точности и небрежного округления при умножении и делении значений money на целые числа или числа с плавающей точкой (Том Лейн)

  • Уточнение проверок пробельных символов в функциях, разбирающих идентификаторы, например regprocedurein() (Том Лейн)

    В зависимости от используемой локали эти функции могли неправильно воспринимать фрагменты многобайтных символов как пробелы.

  • Использование уместных символов #define из Perl при сборке PL/Perl (Ашутош Шарма, Том Лейн)

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

  • Обеспечение в libpq корректного сброса состояния аутентификации GSS/SASL и SSPI после неудачной попытки подключения (Микаэль Пакье)

    Ранее этот сброс не выполнялся и при переходе с SSL-соединения на не SSL ошибка GSS/SASL при попытке SSL-подключения мешала затем установить обычное подключение, без SSL. С SSPI этого не происходило, но имела место утечка памяти.

  • В psql устранён сбой, возникающий, когда команда COPY FROM STDIN завершалась вводом сигнала EOF с клавиатуры, а затем следовала ещё одна попытка выполнить COPY FROM STDIN (Томас Манро)

    Это некорректное поведение наблюдалось в системах, основанных на BSD, (включая macOS), но не в других.

  • Исправление программ pg_dump и pg_restore, чтобы команды REFRESH MATERIALIZED VIEW выдавались в конце (Том Лейн)

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

  • Улучшение вывода в pg_dump/pg_restore сообщений об ошибках, возникающих в zlib (Владимир Кунщиков, Альваро Эррера)

  • Исправление поведения pg_dump с ключом --clean, чтобы событийные триггеры удалялись должным образом (Том Лейн)

    Теперь также правильно назначаются владельцы событийных триггеров; ранее после запуска скрипта восстановления такие триггеры оказывались принадлежащими суперпользователю.

  • Исправление поведения pg_dump с ключом --clean, чтобы существование схемы public не требовалось (Стивен Фрост)

  • Исправление дефекта в pg_dump, когда для пустого класса операторов выдавался некорректный SQL (Даниэль Густафссон)

  • Исправление вывода pg_dump в stdout на платформе Windows (Кунтал Гхош)

    Сжатые данные выгрузки в текстовом виде при выводе в stdout оказывались испорченными из-за того, что дескриптор файла не переводился в двоичный режим.

  • Исправление вывода pg_get_ruledef() для правила ON SELECT, связанного с представлением, в котором переименовывались столбцы (Том Лейн)

    В некоторых особых случаях pg_dump использует pg_get_ruledef() для выгрузки представлений, так что эта ошибка могла приводить к сбоям при выгрузке/загрузке.

  • Исправление выгрузки внешних соединений с пустыми ограничениями, получающихся, например, в результате NATURAL LEFT JOIN без общих столбцов (Том Лейн)

  • Исправление выгрузки выражений с функциями в предложении FROM в случаях, когда эти выражения не преобразуются в нечто, напоминающее вызов функции (Том Лейн)

  • Исправление вывода pg_basebackup в stdout на платформе Windows (Харибабу Комми)

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

  • Исправление pg_rewind для корректной работы с файлами больше 2 ГБ (Кунтал Гхош, Микаэль Пакье)

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

  • Исправление pg_upgrade, чтобы в конечной записи в WAL не оказалось wal_level = minimum (Брюс Момджян)

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

  • Исправление в pg_xlogdump вычисления длины записи WAL (Андрес Фройнд)

  • В postgres_fdw соединения к удалённым серверам должны устанавливаться заново после команд ALTER SERVER и ALTER USER MAPPING (Кётаро Хоригути)

    Благодаря этому изменения параметров, затрагивающие свойства соединения, вступят в силу своевременно.

  • В postgres_fdw реализована отмена команд управления удалёнными транзакциями (Роберт Хаас, Рафия Сабих)

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

  • Увеличение MAX_SYSCACHE_CALLBACKS для выделения дополнительного места расширениям (Том Лейн)

  • При сборке разделяемых библиотек с gcc всегда должен передаваться ключ -fPIC, а не -fpic (Том Лейн)

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

  • Для сборок MSVC реализована обработка ситуации, когда библиотека openssl находится не в подкаталоге VC (Эндрю Дунстан)

  • Для сборок MSVC добавлен нужный путь для заголовочных файлов libxml2 (Эндрю Дунстан)

    Это устраняет прежнюю необходимость перемещения файлов в стандартной инсталляции libxml2 в Windows.

  • Сборки MSVC должны распознавать библиотеку Tcl с именем tcl86.lib (Ной Миш)

  • В сборках MSVC должны учитываться флаги в параметре PROVE_FLAGS, заданном в командной строке vcregress.pl (Эндрю Дунстан)