このリリースは 9.3.16 からの修正リリースです。
9.3.x からのアップデートではダンプ、リストアは不要です。
ただし、項目1番、4番、23番に該当する場合、追加の対処が必要です。
また、9.3.16 より前のバージョンからアップデートを行う場合は 9.3.16 に関する技術情報を参照してください。
PostgreSQL 9.3.16 から 9.3.17 への変更点
9.6.3、9.5.7、9.4.12、9.3.17、9.2.21 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。
- ユーザマッピングオプションとして格納されたパスワードを保護するため、pg_user_mappings.umoptions の可視性が厳格化されました。 (Michael Paquier, Feike Steenbergen) (9.6)(9.5)(9.4)(9.3)(9.2)
- 情報を漏らす演算子を介した統計情報の露出を防止するようになりました。 (Peter Eisentraut) (9.6)(9.5)(9.4)(9.3)(9.2)
- libpq で PGREQUIRESSL 環境変数を認識するように復旧されました。 (Daniel Gustafsson) (9.6)(9.5)(9.4)(9.3)
- ロジカルデコーディング中の無効であるかもしれない初期スナップショットについて修正されました。 (Petr Jelinek, Andres Freund) (9.6)(9.5)(9.4)
- UNLOGGED インデックスの初期フォークが破損する可能性があり、修正されました。 (Robert Haas, Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)
- スタンバイサーバが準備されたがコミットされていない 2 相トランザクションをリプレイしたときの pg_subtrans 項目の不正な再構築が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- 文字列バッファの初期化失敗により、wal sender にてクラッシュする可能性が回避されました。 (Stas Kelvich, Fujii Masao) (9.6)(9.5)(9.4)
- GiST インデックスで index-only の最近傍検索を再スキャンする時にクラッシュする可能性があり、修正されました。 (Tom Lane) (9.6)(9.5)
- マスタプロセス (postmaster) による複数パラレルワーカプロセスの起動の遅延を防止するようになりました。 (Tom Lane) (9.6)
- マスタプロセス (postmaster) におけるバックグラウンドワーカプロセスに対する fork() 失敗時の処理が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
- 入れ子の集合演算のプラン作成で「ERROR: no relation entry for relid 0」が生じる可能性があり、修正されました。 (Tom Lane) (9.6)
- パラレル問い合わせのプラン作成の各種の小さな問題が修正されました。 (Robert Haas) (9.6)
- カスタムスキャンに対して物理ターゲットリスト最適化の適用を回避するようになりました。 (Dmitry Ivanov, Tom Lane) (9.6)(9.5)
- CREATE POLICY で「FOR ALL ...」を適用するとき、正しい副式を使うようになりました。 (Stephen Frost) (9.6)(9.5)
- 拡張モジュールのスクリプトでの問い合わせパース処理において、直前の DDL 命令の結果を確実に把握するように修正されました。 (Julien Rouhaud, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- ALTER TABLE ... ALTER COLUMN TYPE で既存インデックスを再構築する場合に、テーブルスペース権限チェックを省略するようになりました。 (Noah Misch) (9.6)(9.5)(9.4)(9.3)(9.2)
- 制約が NO INHERIT であるときには、ALTER TABLE ... VALIDATE CONSTRAINT が子テーブルにまで再帰処理しないように修正されました。 (Amit Langote) (9.6)(9.5)(9.4)(9.3)(9.2)
- ソーステーブルの行単位セキュリティが有効のときに「COPY ... TO ...」でダングリングポインタを回避するように修正されました。 (Tom Lane) (9.6)(9.5)
- CLUSTER および VACUUM FULL で、既に閉じたシステムキャッシュ (relcache) 項目へのアクセスを回避するように修正されました。 (Tom Lane) (9.6)(9.5)
- ページピン (PIN) の競合によりスキャンできないページについて適切に計算するように VACUUM が修正されました。 (Andrew Gierth) (9.6)(9.5)(9.4)(9.3)(9.2)
- ハッシュ結合の中での大量タプル転送のループ処理が問い合わせキャンセル要求で割り込み可能であることが保証されました。 (Tom Lane, Thomas Munro) (9.6)(9.5)(9.4)(9.3)(9.2)
- SP-GiST インデックスで、ある種の box 型への演算子における誤った対応が修正されました。 (Nikita Glukhov) (9.6)
- interval 型の比較における整数オーバーフロー問題が修正されました。 (Kyotaro Horiguchi, Tom Lane) (9.6)(9.5)(9.4)
- tableforest 引数が false のときに妥当な出力をするように cursor_to_xml() 関数が修正されました。 (Thomas Munro, Peter Eisentraut) (9.6)(9.5)(9.4)(9.3)(9.2)
- float8_timestamptz() および make_interval() 関数における端数丸めの問題が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)
- pg_get_object_address() 関数が正しく演算子族のメンバーを処理するように修正されました。 (Álvaro Herrera) (9.6)(9.5)
- 非排他バックアップを停止しようとしたときの pg_stop_backup() 関数のキャンセルについて修正されました。 (Michael Paquier, David Steele) (9.6)
- pg_timezone_names ビューの性能が改善されました。 (Tom Lane, David Rowley) (9.6)(9.5)(9.4)(9.3)(9.2)
- メモリコンテキストに多数の大きいブロックが含まれる場合に、メモリ管理のオーバーヘッドが軽減されました。 (Tom Lane) (9.6)(9.5)(9.4)
- lseek() と close() の稀な場合に生じるエラーに対する処理がより厳格に修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- マスタプロセス (postmaster) が Windows サービスとして実行されているかの検査が誤っており、修正されました。 (Michael Paquier) (9.6)(9.5)(9.4)(9.3)(9.2)
- ecpg が COMMIT PREPARED と ROLLBACK PREPARED に対応するように修正されました。 (Masahiko Sawada) (9.6)(9.5)(9.4)(9.3)(9.2)
- ecpg で $ でクォートされた文字列リテラルを処理する際の二重解放エラーが修正されました。 (Michael Meskes) (9.6)(9.5)(9.4)(9.3)(9.2)
- pgbench が --connect オプションと --rate オプションの組み合わせを正しく処理するように修正されました。 (Fabien Coelho) (9.6)
- pgbench がドキュメント記載されている --builtin という長い形式のオプションを無視しないように修正されました。 (Tom Lane) (9.6)
- pg_dump/pg_restore が --clean オプションを使ったときに public スキーマの権限を正しく処理するように修正されました。 (Stephen Frost) (9.6)
- pg_dump でコメントとセキュリティラベルに対する誤ったラベル付けが修正されました。 (Giuseppe Broccolo, Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- pg_dump の手続き言語の初期権限のための問い合わせのタイプミスが修正されました。 (Peter Eisentraut) (9.6)
- pg_restore -l で SQL オブジェクト名に改行が含まれるときに、無効なリストファイルが出力されるのを回避するように修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- pg_upgrade がラージオブジェクトに付けられたコメントとセキュリティラベルを移行するように修正されました。 (Stephen Frost) (9.6)(9.5)(9.4)(9.3)(9.2)
- contrib/adminpack の pg_file_write() 関数のエラー処理が改善されました。 (Noah Misch) (9.6)(9.5)(9.4)(9.3)(9.2)
- contrib/dblink で、新たな無名接続を確立するときの前の無名接続のリークが回避されました。 (Joe Conway) (9.6)(9.5)(9.4)(9.3)(9.2)
- contrib/pg_trgm の正規表現からのトリグラム展開が修正されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)
- contrib/postgres_fdw で送出可能な拡張モジュールで提供される関数を含む結合条件をリモートサーバ側で実行させる (プッシュする) ことが可能になりました。 (David Rowley, Ashutosh Bapat) (9.6)
- (Windows の) MSVC ビルドで Tcl 8.6 がサポートされました。 (Álvaro Herrera) (9.6)(9.5)(9.4)(9.3)(9.2)
- タイムゾーンライブラリが IANA release tzcode2017b に更新されました。 (Tom Lane) (9.6)(9.5)(9.4)(9.3)(9.2)
- タイムゾーンデータファイルが tzdata release 2017b に更新されました。 (9.6)(9.5)(9.4)(9.3)(9.2)
- (Windows の) MSVC ビルドにおいて、POSIX 形式のタイムゾーン名に対して正しい夏時間規則を使うようになりました。 (David Rowley) (9.6)(9.5)(9.4)(9.3)(9.2)
- GROUPING SET 列のデータ型がハッシュ可能だけれどソート不能であるときのクラッシュまたは誤った応答が修正されました。 (Pavan Deolasee) (9.5)
- contrib/postgres_fdw で、リモートサーバに問い合わせキャンセル要求を送出するようになりました。 (Michael Paquier, Etsuro Fujita) (9.5)(9.4)(9.3)
- OpenSSL 1.1.0 に対応しました。 (Heikki Linnakangas, Andreas Karlsson, Tom Lane) (9.4)(9.3)(9.2)
これまでの実装では、外部サーバオブジェクト所有者やサーバの USAGE 権限を付与されたユーザが、そのサーバに関連する全ユーザマッピングのオプションを見ることができました。これには他ユーザのパスワードもしっかり含まれているかもしれません。
そこで、information_schema.user_mapping_options と振る舞いが一致するように pg_user_mappings ビューの定義が修正されました。すなわち、マップされているユーザであるか、PUBLIC へのマッピングで現在ユーザがサーバの所有者である、あるいは、現在ユーザがスーパーユーザのときに、ユーザマッピングオプションが見えるようになります。(CVE-2017-7486)
本パッチでは、新たに initdb で作成されたデータベースクラスタについてのみ振る舞いを変更します。既存データベースクラスタに対して変更を適用するには、以下の手順を実施する必要があります。
(1)
postgresql.conf に「allow_system_table_mods = true」を加えた後、PostgreSQL サービス (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) 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);
(2)
template0 と template1 に対しても対処が必要です。さもなくば後に新たに作ったデータベースには脆弱性が依然として存在することになります。template0 を修正するには、一時的に template0 を接続可能にする必要があります。
PostgreSQL 9.5 以降では以下のコマンドが利用できます。
template0 を接続可能にする: ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true; template0 を接続不能に戻す: ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
より古いバージョンでは代替に以下コマンドを使います。
template0 を接続可能にする: UPDATE pg_database SET datallowconn = true WHERE datname = 'template0'; template0 を接続不能に戻す: UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
(3)
最後に allow_system_table_mods 設定を除去して、PostgreSQL サービス (postmaster) をもう一度再起動します。
いくつかのプランナの選択率見積り関数は、最頻値やヒストグラムの登録値など、pg_statistic から得られる値に対してユーザ定義演算子を適用します。この動作はテーブル権限が検査される前に生じるので、悪意のユーザが本来参照が許されていないテーブル列の値を取得するために、この振る舞いを悪用するおそれがありました。この対策として、演算子の実装関数が情報を漏らさないことが確実(LEAKPROOF属性が真)でなく、呼び出しているユーザが統計情報を必要とするテーブル列の読み取り権限を持っていない場合には、デフォルトの見積で代用するようになりました。実用上たいていのケースで、これら基準のうち少なくとも一つを満たします。(CVE-2017-7484)
この環境変数の処理が PostgreSQL 9.3 で意図せず欠落していましたが、ドキュメントには残っていました。ユーザが SSL 暗号化接続を強制させるために、機能しなくなっていた本環境変数を頼っているかもしれないため、セキュリティ上の危険が生じます。
PGREQUIRESSL 環境変数の処理が復旧されました。しかし、9.3 以降で正しく動作していた設定を壊さないようにするため、PGSSLMODE よりも低い優先順位で扱われます。(CVE-2017-7485)
ロジカルデコーディングのレプリケーションスロットむけに作られた初期スナップショットは不正なものである可能性がありました。これは、ロジカルデコーディングを使うサードパーティツールが不完全あるいは一貫性に欠ける初期データをコピーする原因となります。スロットを作るときにソースサーバが忙しい場合や、他のロジカルスロットが既に在った場合に発生しやすい動作です。
ロジカルデコーディングに依存したレプリケーションツールを使っていて、それがレプリケーション開始時に空でないデータセットをコピーするのであれば、本アップデート導入後にレプリカを再作成するか、ソースサーバと比較してデータ検証することを推奨します。
クラッシュと再起動の後に、無効な状態にセットされている UNLOGGED インデックスがもたらされる恐れがありました。この問題はインデックスを削除して再作成するまで持続します。
たいていの場合、これは目に見える悪影響を及ぼしませんが、稀な場合に pg_subtrans の循環参照をもたらし、2 相トランザクションにより変更された行を検査する問い合わせで無限ループをひき起こす可能性があります。
2 つ以上のワーカープロセスに向けた問い合わせの要求を満たす前に、あるいは複数問い合わせが同時にワーカーへ要求されたときに、著しい遅延(数十秒)が生じる可能性がありました。本現象は多くのプラットフォームでは不運なタイミングでのみ発生しますが、一部プラットフォームではよくあるケースです。
これまでは、プロセスが正常に起動されたかのようにワーカ状態の一部を更新していて、その後に混乱をひき起こしていました。
(障害が発生する SQL の例) db1=# (SELECT 1,2,3 UNION SELECT 4,5,6 ORDER BY 1,2) INTERSECT SELECT 4,5,6; ERROR: no relation entry for relid 0
プラン選択が不適切になる場合がありえました。
この最適化はタプルの全ての列を取得するのが低コストでできることを想定しています。通常タプルにおいてはこれは真ですが、カスタムスキャンプロバイダーに対してはそうでないかもしれません。
一部ケースで USING 制約がより適切であるときに WITH CHECK 制約が適用されました。
修正前ではポリシーに反する値への更新、および更新後の値の返却が可能でした。以下例は修正後はエラーとなります。
(誤動作例) db1=# CREATE POLICY alice_policy ON t TO alice USING (value > 0) WITH CHECK (true); db1=# SET session authorization alice; db1=# SELECT * FROM t; value ------- 1 (1 rows) db1=# UPDATE t SET value = value * -1 WHERE value = 1 RETURNING *; value ------- -1 (1 row) UPDATE 1
拡張モジュールのスクリプトファイルのコマンド間では、キャッシュを更新する手順が欠けているので、ALTER TABLE ... RENAME ... などの DDLコマンドに続くDMLコマンドは直前の定義変更に気づかないかもしれませんでした。
(例:以下のスクリプトで最後の UPDATE が失敗する可能性がありました) CREATE TABLE xxx_ext_table (col_old INT); ALTER TABLE xxx_ext_table RENAME col_old TO col_new; UPDATE xxx_ext_table SET col_new = 0;
本コマンドは、実行ユーザがその時点でインデックスが置かれているテーブルスペースに CREATE 権限を持っていないと失敗していました。この振る舞いは役に立たないと考えられ、検査を省略し、この場合にはインデックスを再構築できるようにしました。
この修正は、子テーブルに一致する制約が存在しないときに望まれない「ERROR: constraint does not exist」が生じるのを防ぎます。
通常は無害ですが、ときどき予期せぬエラーやクラッシュをひき起こしていました。
運が悪いとき、本障害は対象テーブルのインデックスの誤った永続性設定 (UNLOGGEDか、TEMPORARYか、等) での再構築をひき起こす可能性がありました。
この障害により、テーブルタプル数の過小見積が生じがちでした。競合の多い小さいテーブルという最悪ケースでは、VACUUM がテーブルは0行であると誤って報告する可能性があり、非常に悪いプラン選択をもたらしました。
ハッシュ結合でキャンセルがすぐには効かない挙動が報告されていました。
&<、&>、&<|、および、|&> 演算子を使う SP-GiST インデックススキャンは、誤った応答をもたらしていました。要素が接している場合の判定に影響があります。
およそ 296000 年以上の時間間隔の場合に interval 型の比較演算子が誤った応答を返すおそれがありました。このような大きい値が含むカラムのインデックスは、インデックス内容が不正であるかもしれないので、バージョンアップ後にインデックス再作成すべきです。
64bit 整数の日付時刻を使う方式(デフォルト)でビルドした場合に該当します。
これまでは、<table> 要素で括られず、<row> 要素の並びだけが出力されていました。
(誤った出力例) db1=# DECLARE c CURSOR WITH HOLD FOR SELECT * FROM t1; db1=# SELECT cursor_to_xml('c'::refcursor, 2, true, true, ''); cursor_to_xml ------------------------------------------------------------- <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+ <id>1</id> + <v>c4ca4238a0b923820dcc509a6f75849b</v> + </row> + + <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+ <id>2</id> + <v>c81e728d9d4c2f636f067f89cc14862c</v> + </row> + +
これら関数は、浮動小数点の値から整数のマイクロ秒に変換するときに、丸めでなく、切り捨てを行っていました。これにより予期せぬ境界条件エラーをひき起こすおそれがありました。
切捨てでなく C 言語関数 rint (最も近い整数値への丸め) を使うように実装が修正されました。
非排他バックアップが終了するのを待つ間に pg_stop_backup() 関数がキャンセルされた場合、関連する状態が不整合状態になり、新たな非排他バックアップを開始できない可能性がありました。また、その他の細かな問題もありました。
どちらも通常ではあまり失敗しないシステムコールですが、失敗した場合にはかなり混乱するおそれがありました。
本障害はアクセス不能であるときにイベントログに書き出しを試みて、全くログが書かれない結果をひき起こしました。
起こりうるのは ecpg コマンドのクラッシュです。
他のスキーマは権限が与えられない状態から始まりますが、public スキーマはそうではありません。--clean オプションのために削除とリストアを行うときには特別な対応が必要でした。
単純な使い方の場合には悪影響はありませんが、スキーマを指定したリストアで含まれるべきコメントが無視される可能性がありました。これはダンプ時にそれらが関連するオブジェクトのスキーマに属するという印付けがされなかったためです。
本障害により pg_dump は常に手続き言語は初期権限を持たないとみなしていました。ほとんどの手続き言語は実際のところそうであるため、本障害による悪影響はおそらく稀です。
これまでもラージオブジェクトは新データベースに正しく移行されていましたが、付加されたコメントとセキュリティラベルが失われていました。
特に fclose() で報告されたエラーを検知できていませんでした。
一部のケースで何にもマッチできない壊れたデータ構造が生み出され、トリグラムインデックスを使う GIN または GiST のインデックススキャンが正規表現へのマッチを何も見つけられない結果(誤った応答)になります。
(誤動作例:pg_trgm インデックスを使うと結果が 0 件になってしまう) db1=# CREATE TABLE ttrig (id int primary key, txt text); db1=# INSERT INTO ttrig SELECT g, md5(g::text) FROM generate_series(1, 10000) g; db1=# SELECT count(*) FROM ttrig WHERE txt ~ '[ab]{2}-?[ab]{2}'; count ------- 55 (1 row) db1=# CREATE INDEX trgm_idx ON ttrig USING gist (txt gist_trgm_ops); db1=# SELECT count(*) FROM ttrig WHERE txt ~ '[ab]{2}-?[ab]{2}'; count ------- 0 (1 row)
2038 年 1 月の夏時間の遷移に影響を及ぼすバグが修正されています。
チリ、ハイチ、モンゴルの夏時間法の変更、エクアドル、カザフスタン、リベリア、スペインの歴史的修正が含まれます。南米、太平洋、インド洋、および、一部アジア・中東の国々における多数のタイムゾーンが、数字による省略形に切り替えられました。
IANA タイムゾーンデータベースはこれまで文字による省略形を全てのタイムゾーンに提供していて、ときに地元住民の間でほとんどあるいは全く使われない省略形を作成していました。IANA は英語の省略形が現実に使われている形跡がないゾーンにおいては UTC オフセット数値を使うことを選ぶという方針に転換しようとしてるところです。少なくともしばらくの間、PostgreSQL はタイムスタンプの入力に、このような削除された省略形を引き続き受け入れます。しかし、それらは pg_timezone_names ビューには現れず、出力にも使用されなくなります。
Microsoft の MSVC ビルドスクリプトは posixrules ファイルをタイムゾーンディレクトリツリーにインストールするのを怠っていました。この結果、POSIX 形式のタイムゾーン名に対し想定される夏時間の振る舞いについて、タイムゾーンコードがビルトインの規則に戻ってしまっていました。
歴史的な理由により、その組み込み規則は、米国が2007年より前に使っていた夏時間規則(すなわち、4月最初の日曜日と 10月最終の日曜日の変更)に引き続き対応しています。この修正にともない、POSIX 形式のゾーン名は US/Eastern ゾーンの現在および歴史的夏時間遷移日を使います。そのようにしたくない場合には、posixrules ファイルを削除するか、他のゾーンファイルのコピーで置き換えてください。変更を反映させるにはサーバ (サービス) の再起動が必要です。
たとえば xid 型がハッシュ可能でソート不能です。
これまではローカルでの問い合わせキャンセル要求が、既に送ったリモート問い合わせを早く終わらせることはありませんでした。これは 9.6 で修正された内容のバックポートです。
9.5 以降のバージョン系列で既に対応している内容のバックポートです。多数のプラットフォームが新たな OpenSSL バージョンを取り込みつつあるので、必要となりました。