リリース日: 2017-08-10
このリリースは9.6.3に対し、各種不具合を修正したものです。 9.6メジャーリリースにおける新機能については、E.6. リリース9.6 を参照してください。
9.6.Xからの移行ではダンプ/リストアは不要です。
しかしながら、認証にユーザパスワードを利用する外部データサーバを使っている場合には、以下の変更点の1番目の項目を参照してください。
また、9.6.3よりも前のバージョンからアップグレードする場合は、E.3. Release 9.6.3を参照して下さい。
ユーザマッピングオプションとして格納されたパスワードを保護するため、pg_user_mappings
.umoptions
の可視性をさらに限定しました。
(Noah Misch)
CVE-2017-7486に対する修正は正しくありませんでした。
その修正では、ユーザが関連する外部サーバに対するUSAGE
権限を持っていなくとも、自身のユーザマッピングのオプションを見ることを許していました。
このようなオプションはユーザ自身でなくサーバ所有者が用意したパスワードを含むかもしれません。
このような場合にinformation_schema.user_mapping_options
はオプションを見せませんので、pg_user_mappings
も見せるべきではありません。
(CVE-2017-7547)
このパッチのみでは新たにinitdbされたデータベースでの動作しか修正しません。 この変更を既存のデータベースに適用するには、以下を行う必要があります。
allow_system_table_mods = true
をpostgresql.conf
に加えた後、postmasterを再起動します。
(ALTER SYSTEM
に対応したバージョンでは設定変更にそれを使うことができますが、それでも再起動は必要です。)
クラスタ内の各データベースでスーパーユーザとして以下のコマンドを実行します。
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);
template0
、template1
データベースを含めることを忘れないでください。
そうでないと、後に作ったデータベースに引き続き脆弱性が存在することになります。
template0
を修正するには、これを一時的に接続を受け付けるようにする必要があります。
PostgreSQL 9.5以降では、以下が使えます。
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
そして、template0
を修正した後、以下で戻すことができます。
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
9.5より前のバージョンにおいては代わりに以下を使います。
UPDATE pg_database SET datallowconn = true WHERE datname = 'template0'; UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
最後に、allow_system_table_mods
設定を除去して、再度postmasterを再起動します。
全てのパスワードに基づく認証方式で空パスワードを禁止しました。 (Heikki Linnakangas)
libpqは空に指定されたパスワードを無視し、それをサーバに送りません。
よって、ユーザのパスワードが空文字列に設定されていた場合、psqlや他のlibpqベースのクライアントを通して、そのパスワードでログインすることはできません。
このことから管理者はパスワードを空に設定することはパスワードログインをできなくすることに等しいと思うかもしれません。
しかしながら、改変されたクライアントやlibpqベースでないクライアントで、設定されている認証方式次第ではログインできる可能性があります。
特に最も一般的なmd5
は空パスワードを受け付けていました。
全ての場合で空パスワードを拒絶するようにサーバを変更しました。
(CVE-2017-7546)
lo_put()
が対象ラージオブジェクトのUPDATE
権限を検査するようにしました。
(Tom Lane, Michael Paquier)
lo_put()
は確実にlowrite()
と同じ権限を必要とすべきでしたが、この検査が欠落していて、どのユーザにもラージオブジェクトのデータの変更を許していました。
(CVE-2017-7548)
pg_upgradeでスタンバイサーバをアップグレードする手順についてドキュメントを修正しました。 (Bruce Momjian)
これまでのドキュメントでは、pg_upgrade実行後であるけれどスタンバイサーバを同期するより前に、ユーザにプライマリサーバを起動/停止するように教えていました。 この手順は安全ではありません。
タプル更新連鎖の同時ロックを修正しました。 (Álvaro Herrera)
いくつかのセッションが競合しないロックモードで旧スナップショットを使ってタプル更新連鎖を同時にロックして、それらが全て成功した場合、それらの一部が競合状態のために失敗している(そして有効なタプルバージョンが無くなって終わる)可能性がありました。 これは外部キー検査が実際には存在するけれども同時に更新されているタプルを参照するのに失敗するといった結果を招きました。
XMAXが未だ関心のあるメンバーをちょうど1つ持つマルチトランザクションであるタプルを凍結するときの、潜在的なデータ破損を修正しました。 (Teodor Sigaev)
10億を超えるタプルをメモリ内でソートをするときの、整数オーバーフローと続いて起きるクラッシュを回避しました。 (Sergey Koposov)
Windowsで新しいプロセスで共有メモリに対するアドレス範囲を確保できない場合、プロセス生成を再試行するようにしました。 (Tom Lane, Amit Kapila)
おそらくはアンチウイルス製品の干渉によりたまに起きていた子プロセスの起動失敗が、これで修正されると考えられます。
Windowsビルドにおける低い発生確率で生じる共有述語ロックハッシュテーブルの破損を修正しました。 (Thomas Munro, Tom Lane)
SSL接続の正常終了に対する、接続リセットであったかのようなログ出力を回避しました。
SSLセッションチケットをクライアントに送るのを防止しました。 (Tom Lane)
この修正はチケットを認識するクライアント側SSLコードによる再接続の失敗を防ぎます。
Solaris上の設定tcp_keepalives_idleに対するコードを修正しました。 (Tom Lane)
postmasterの停止と即座の再起動のすぐ後に発行された問い合わせメッセージを受け取るように、統計情報コレクタを修正しました。 (Tom Lane)
前のpostmaster停止から0.5秒以内に発行された統計情報の問い合わせは事実上無視されていました。
統計情報コレクタの受信バッファサイズが少なくとも100KBであることを保証しました。 (Tom Lane)
これはデフォルトの受信バッファサイズがこれよりも小さい古いプラットフォーム上で統計情報データを取りこぼすリスクを軽減します。
スタンバイがXLOG_SWITCH
WALレコードを処理した直後に昇格したときに、不正なWALセグメントが作られる可能性があり、修正しました。
(Andres Freund)
walsenderをクライアントが停止を要求したとき即座に終了するように修正しました。 (Tom Lane)
walsenderプロセスでSIGHUPとSIGUSR1の処理を修正しました。 (Petr Jelinek, Andres Freund)
シャットダウンのチェックポイント中にwalsenderがひき起こすパニックを防止しました。 (Andres Freund, Michael Paquier)
postmasterでの競合状態によるwalreceiverプロセスの不必要な遅い再起動を修正しました。 (Tom Lane)
ロジカルデコーディング中のディスクにあふれ出る小さいサブトランザクションのリークを修正しました。 (Andres Freund)
結果としてディスク領域を過度に消費する一時ファイルが生じました。
ロジカルデコーディングスロットの作成中にスナップショットを作るために必要な作業を削減しました。 (Andres Freund, Petr Jelinek)
以前のアルゴリズムは、継続中のトランザクションが多いサーバ上では実行不能なほど高コストでした。
ロジカルデコーディングスロット作成を無期限に遅延させるかもしれない競合状態を修正しました。 (Andres Freund, Petr Jelinek)
システムキャッシュ無効化イベントの処理でのオーバーヘッドを軽減しました。 (Tom Lane)
これは頻繁にキャッシュ無効化を起こすロジカルデコーディングに特に有益です。
結合の選択率の見積に一部の場合に使われていた外部キー制約の存在に基づく誤ったヒューリスティックを取り除きました。 (David Rowley)
複数列の外部キー制約が在るけれども問い合わせの結合構造と完全には一致しない場合に、プランナは少しも役に立たない見積ヒューリスティックを用いていました。 このような場合について、9.6より前の見積方法に戻しました。
INSERT
またはUPDATE
が、配列のドメイン型の列の複数要素に値を与える場合について修正しました。
(Tom Lane)
ウィンドウ関数を集約関数の引数内の副SELECT
で使えるようにしました。
(Tom Lane)
元になっているテーブルが外部テーブルであるとき、ビューのCHECK OPTIONS
句が適切に実行されることを保証しました。
(Etsuro Fujita)
これまで、更新が外部サーバに完全にプッシュされるかもしれないにも拘らず、必要なビュー制約の検証を実行しそこなっていました。
ALTER ... RENAME
のときに自動生成された配列型を退避するようにしました。
(Vik Fearing)
これまではCREATE
のときに衝突する自動生成された配列型の名前をぶつからないように変えていました。
本修正はこの振る舞いを名前変更操作に拡張したものです。
テーブルに属する制約にコメントがあるときのALTER TABLE
でのダングリングポインタを修正しました。
(David Rowley)
再構築された制約にコメントを再適用することに、奇妙なエラーメッセージを伴って失敗するおそれがありました。
ALTER USER ... SET
がALTER ROLE ... SET
で対応している全ての構文の異形を確実に受け入れるようにしました。
(Peter Eisentraut)
外部テーブルのCHECK
制約を初期状態でNOT VALID
にできるようにしました。
(Amit Langote)
CREATE TABLE
はCHECK
制約に対するNOT VALID
指定を暗黙に外していました。
テーブルは空であるはずなので制約は直ちに検証できるという理由からです。
しかし、元になっているテーブルが空であると見込む理由のないCREATE FOREIGN TABLE
に対しては、これは正しくありません。
また、たとえそうであるとしても、今後、制約が有効であるものとして処理できるか判断することは、私たちの仕事ではありません。
外部テーブルに対してこの「最適化」を外しました。
データ型の入出力関数の引数や戻り値の型をopaque
から正確な型に変えるときに、依存性情報を適切に更新するようにしました。
(Heikki Linnakangas)
CREATE TYPE
は長らく使われていない形式で宣言された入出力関数を更新しますが、型の依存を記録するのを忘れていて、続くDROP TYPE
が壊れた関数定義を残すのを可能としていました。
COPY
が問い合わせ結果をコピーするときの問い合わせプランで並列処理を可能にしました。
(Andres Freund)
ANALYZE
がtsvector
列を処理するときのメモリ使用を減らしました。
(Heikki Linnakangas)
money
値に対する整数または浮動小数点による乗算または除算のときに不必要な精度劣化といい加減な丸め計算があり、これを修正しました。
(Tom Lane)
regprocedurein()
などの識別子を解析する関数で空白のチェックを厳格化しました。
(Tom Lane)
有力なロケールによっては、これら関数がマルチバイト文字の一部を空白と誤認するおそれがありました。
PL/Perlをコンパイルするときに、Perlに由来する適切な#define
シンボルを使うようにしました。
(Ashutosh Sharma, Tom Lane)
これにより移植性の問題を回避します。 典型的には、最近のPerlバージョンで作業するときライブラリ読み込み中に「ハンドシェイク」不一致が示されます。
libpqにて、接続失敗した後にGSS/SASLおよびSSPI認証の状態を適切にリセットするようにしました。 (Michael Paquier)
このリセットを怠ることで、SSL接続から非SSL接続に退行するときに、SSLでの試行でGSS/SASLに失敗すると常に非SSLの試行も失敗する結果をもたらしました。 SSPIは失敗しませんがメモリリークが生じました。
psqlで、COPY FROM STDIN
がキーボードからのEOF信号で中断されて、続いて他のCOPY FROM STDIN
が試みられたときに生じるエラーを修正しました。
(Thomas Munro)
この誤動作はBSDから派生した(macOSを含む)プラットフォームで見られましたが、他のほとんどのプラットフォームでは見られません。
REFRESH MATERIALIZED VIEW
コマンドを最後に出力するようにpg_dumpとpg_restoreを修正しました。
(Tom Lane)
これにより、マテリアライズドビューが異なるユーザが所有者のテーブルを参照するときのダンプ/リストアのエラーを防ぎます。
pg_dump/pg_restoreのzlibに由来するエラー状態の報告を改善しました。 (Vladimir Kunschikov, Álvaro Herrera)
--clean
オプションを伴うpg_dumpが期待どおりにイベントトリガを削除するように修正しました。
(Tom Lane)
また、イベントトリガの所有者を正しく割り当てるようになりました。 これまではリストアスクリプトを実行したスーパーユーザが所有者になるようにリストアされていました。
--clean
オプションを伴うpg_dumpをpublic
スキーマが無いときに失敗しないように修正しました。
(Stephen Frost)
pg_dumpを空の演算子クラスに対して無効なSQLを出力しないように修正しました。 (Daniel Gustafsson)
Windows上でpg_dumpの標準出力への出力を修正しました。 (Kuntal Ghosh)
ファイルディスクリプタをバイナリモードに設定しそこなっていたため、標準出力に書き出された圧縮されたプレーンテキストダンプに破損したデータが含まれていました。
列名が変更されているビューのON SELECT
ルールに対してpg_get_ruledef()
が正しい出力を表示するように修正しました。
(Tom Lane)
一部の稀な場合にpg_dumpがビューをダンプするのにpg_get_ruledef()
に依存していて、この誤りがダンプ/リストアの失敗をもたらす可能性がありました。
共通列を持たないNATURAL LEFT JOIN
結果のような、空の制約を伴う外部結合のダンプを修正しました。
(Tom Lane)
式が関数呼び出しに見える形に逆解析されない場合のFROM
句内の関数式のダンプを修正しました。
(Tom Lane)
Windows上でpg_basebackupの標準出力への出力を修正しました。 (Haribabu Kommi)
ファイルディスクリプタをバイナリモードに設定しそこなっていたため、標準出力に書き出されたバックアップに破損したデータが含まれていました。
2GBを超えるファイルを正しく扱うようにpg_rewindを修正しました。 (Kuntal Ghosh, Michael Paquier)
通常はPostgreSQLデータディレクトリにこのようなファイルは現れないでしょうが、一部の場合に存在する可能性があります。
末尾のWALレコードがwal_level = minimum
でないことを保証するようにpg_upgradeを修正しました。
wal_level = minimum
(Bruce Momjian)
この状態はアップグレードされたスタンバイサーバの再接続を妨げるおそれがありました。
pg_xlogdumpのWALレコード長の計算を修正しました。 (Andres Freund)
postgres_fdw
で、ALTER SERVER
またはALTER USER MAPPING
コマンドの後にリモートサーバへの接続を再確立するようにしました。
(Kyotaro Horiguchi)
これにより接続パラメータに影響するオプションの変更が即座に適用されることを保証します。
postgres_fdw
で、リモートのトランザクション制御コマンドのキャンセルを可能にしました。
(Robert Haas, Rafia Sabih)
この変更で以前よりも多くの場合に応答しないリモートサーバの待機から素早く免れることができます。
より多くの空間を拡張に提供するためMAX_SYSCACHE_CALLBACKS
を増やしました。
(Tom Lane)
gccで共有ライブラリをビルドするときに、-fpic
でなく常に-fPIC
を使うようにしました。
(Tom Lane)
一部のこの設定で違いが現れるプラットフォームで、より大きい拡張ライブラリに役立ちます。
MSVCビルドでopensslライブラリがVC
サブディレクトリ内に無い場合を処理するようにしました。
(Andrew Dunstan)
MSVCビルドで、libxml2ヘッダファイルの適切なインクルードパスを追加しました。 (Andrew Dunstan)
これはlibxml2の標準Windowsインストールで以前に在るものを移動する必要があったものを修正します。
MSVCビルドで、tcl86.lib
という名前のTclライブラリを認識するようにしました。
(Noah Misch)
MSVCビルドで、vcregress.pl
のコマンドライン上のPROVE_FLAGS
設定を無視しないようにしました。
(Andrew Dunstan)