2014-02-20
このリリースは9.3.2に対し、各種不具合を修正したものです。 9.3メジャーリリースにおける新機能については、E.30. リリース9.3を参照してください。
9.3.Xからの移行ではダンプ/リストアは不要です。
しかしながら、このリリースでは現在参照している行が参照先テーブルの行と一致しないかもしれないという、外部キー制約の破損を引き起こす問題が修正されています。 このアップデートをインストール後、そのような制約の影響を再チェックをすることは価値のあることかもしれません。 その為のもっとも簡単な方法は、疑いのある制約を削除し、再作成することです。 しかしながら、両方のテーブルには排他ロックを必要とするでしょう。そのため、本番データベースでは受け入れがたいかもしれません。 その代りとして、一致しない行を探す為に2つのテーブルを結合するクエリーを手動で実行することも可能です。
また、レプリケーションを使ってい場合はマスタサーバよりも先にスタンバイサーバのアップグレードを行う必要があることに注意してください。
また、9.3.2以前のリリースからアップグレードする場合は、E.28. リリース9.3.2を参照して下さい。
GRANT ... WITH ADMIN OPTION
制限を強化しました。(Noah Misch)
ADMIN OPTION
無しのロール権限では、メンバーの追加や削除が出来ないことになっていますが、
先にSET ROLE
することにより、この制限は簡単にバイパス出来ていました。
セキュリティのインパクトは大体、ロールのメンバーが、権限を譲り受けた他のメンバーの意図に反し、アクセスを取り消すことができることです。
未承認のロールメンバー追加はあまり重要ではありません。
非協力的なロールのメンバーは、いずれにせよ、ビューを作ったりSECURITY DEFINER
機能によって、
他者に多くの権限を提供することができるからです。(CVE-2014-0060)
PLバリデータ関数を手動呼び出し経由の権限昇格を防止しました。(Andres Freund)
PLバリデータ関数の主な役割はCREATE FUNCTION
の中で黙示的に呼び出されますが、
明示的に呼び出すことができる通常のSQL関数でもあります。
実際に幾つか他の言語で書かれた機能で呼び出されているバリデータはチェックされておらず、
プロセスの権限昇格に悪用される可能性がありました。
もし同様の可能性があれば、必須ではない手続き言語でも独自のバリデーション機能にこの変更を加える必要があります。(CVE-2014-0061)
テーブルとインデックスDDLでの名前の多重検索を防止しました。(Robert Haas、Andres Freund)
が実行中の名前検索で異なる結果が出た場合、DDLのある部分をその他の部分とは違ったテーブルで実施することがありました。
少なくともCREATE INDEX
では、権限チェックがインデックス作成とは異なるテーブルに対して実施されることにより、権限昇格攻撃を許す可能性があります。(CVE-2014-0062)
長い日付時刻文字列によるバッファオーバーランを防止しました。(Noah Misch)
MAXDATELEN
定数はinterval
型の取りえる最長の値に対して小さ過ぎたため、interval_out()
関数内でバッファオーバーランを許していました。
日付時刻の入力関数はバッファオーバーラン防止に対して慎重でしたが、非常に長いタイムゾーン名を含むような、有効な入力値を拒否するほど、制限は短いものでした。
ecpgライブラリには、これらを含む幾つか固有の脆弱性を含んでいました。
サイズ算出での整数オーバーフローによるバッファオーバーランを防止しました。(Noah Misch、Heikki Linnakangas)
幾つかの関数、多くはデータ入力関数で、オーバフローをチェックせずにメモリの割り当てサイズを計算していました。 オーバーフローが発生した場合、小さすぎるバッファが割り当てられ、それを越えて書かれていました。(CVE-2014-0064)
固定サイズのバッファのオーバーランを防止しました。(Peter Eisentraut、Jozef Mlich)
固定サイズのバッファがオーバランしない明確な保証を提供するために、strlcpy()
や関連する関数を使いました。
前項とは違い、これらのケースが実際に問題を引き起こすかどうかは不明です。というのは、ほとんどの場合、入力文字列のサイズは事前に制限されている様に思われるからです。
とはいえ、コベリティ(Coverity)のこのタイプの警告はすべて黙らせた方が賢明と思えます。(CVE-2014-0065)
crypt()
がNULLを返した場合、クラッシュしないようにしました。(Honza Horak, Bruce Momjian)
crypt()
がNULLを返すのは比較的まれなシナリオですが、もし起こった場合、contrib/chkpass
はクラッシュしていました。
これが問題になる現実的なケースの一つは、libcが承認されていないハッシュアルゴリズムの実行を拒否するよう設定されている場合です
(例えば「FIPS モード」)。(CVE-2014-0066)
再帰テスト(regression testing)命令におけるmake check
のリスクを文書化しました。(Noah Misch, Tom Lane)
make check
によって起動した一時サーバは「trust」認証を使うため、
同一マシン上の他のユーザがデータベースのスーパーユーザとして接続でき、
そして、テストを起動したオペレーティングシステムのユーザ特権を悪用できる可能性があります。
将来のリリースでは、おそらくこのリスクを防ぐためにテスト手順の変更が盛り込む予定ですが、その前に公開議論が必要です。
そこで差し当たりは、同一マシン上に信頼されていないユーザが居る場合、make check
を使っている人に対して、警告を発するに留めています。(CVE-2014-0067)
タプル凍結のプロトコルを修正しました。(Álvaro Herrera, Andres Freund)
タプル凍結のロジックは、古すぎる共有行レベルロックを忘れてしまう場合があり、 multixactIDsに関するいくつかのケースで扱うことが出来ませんでした。
タプル凍結のためにはWALレコード形式の変更が必要で、修正しました。 これはスタントアロン・サーバでは問題ではないものの、レプリケーションを使用した場合、スタンバイサーバはマスタサーバより先に9.3.3かそれ以上にアップグレードしなければならないことを意味します。 古いスタンバイサーバは新しいマスタサーバで生成される凍結レコードを解釈できず、パニックメッセージを吐いて失敗します。 (このような場合、スタンバイサーバの再起動はアップグレードをする良い機会かもしれません)
multixact凍結を制御するために単独のGUCパラメータを新設しました。(Álvaro Herrera)
9.3では、通常のトランザクションIDが古くなりすぎる前に凍結しなければならないのと同様に、マルチトランザクション(multixact)タプルも古くなりすぎる前に凍結しなければなりません。 以前のバージョンでは、トランザクションID凍結のパラメータはマルチトランザクションID(multixact ID)のためにも使われていました。 しかし、トランザクションIDとマルチトランザクションIDでは消費率が極めて異なっているため、あまりうまく機能していませんでした。 マルチトランザクションを凍結する場合、制御用の新しい設定として、 vacuum_multixact_freeze_min_ageと vacuum_multixact_freeze_table_age、 autovacuum_multixact_freeze_max_age を導入しました。
ローカルのアップデートによるリモートの行ロックの伝搬を修正しました。(Álvaro Herrera)
ある行がトランザクションAでロックされ、トランザクションBで更新された場合、新しいバージョンでは、Bからだけ見え、Aからロックされた行がBによって作成されます。 トランザクションBでその行を再度更新した場合、Aのロックはチェックされないため、ロックされるべき場合でも、Bによる更新が完了してしまいます。 以前のバージョンでは、他のトランザクションで行の更新が許可されてしまうのをブロックする、いかなるタイプの行ロックも持っていなかったため、9.3では新しくこのケースを追加しました。
この見落としは参照整合性チェックで誤った「肯定」(例えば、拒否すべきところで削除を許可するような)を与える可能性があります。
SELECT FOR KEY SHARE
やSELECT FOR NO KEY UPDATE
という新しいコマンドを使っているアプリケーションでも、
この種のロックの失敗の影響を受けている可能性があります。
行ロックのホルダーのいずれかが異常終了した場合、有効な行ロックを「忘れる」のを防ぎます。(Álvaro Herrera)
これは上記とは違ったメカニズムで共有行ロックが失われる可能性がありました。 そのため、外部キー制約によって保護されるべき個所の更新が許可されていた可能性がありました。
更新の連鎖ロック中の正しくないロジックを修正しました。(Álvaro Herrera)
この間違いは トランザクション分離モードのREPEATABLE READ
やSERIALIZABLE
で、誤った「could not serialize access due to concurrent update」エラーを引き起こす可能性がありました。
pg_multixact/members
が延長または切断中に、正しく周回処理されるよう修正しました。(Andres Freund, Álvaro Herrera)
pg_multixact/members
の5桁のファイル名の取り扱いを修正しました。(Álvaro Herrera)
9.3では4桁以上のファイル名がありましたが、ディレクトリのクリーンアップ処理のコードで、それらのファイルを無視していました。
マルチトランザクション(multixact)のキャッシュ処理のパフォーマンスを改善しました。(Álvaro Herrera)
同一トランザクションにおけるロック済行の更新処理を最適化しました。(Andres Freund, Álvaro Herrera)
これは、SELECT FOR UPDATE
に続いてUPDATE/DELETE
を行った場合、9.3以前のバージョンよりパフォーマンスが劣化している事に対する修正です。
アーカイブリカバリにおいて、同一IDのWALセグメントがアーカイブとpg_xlog/
の両方に存在する場合、
タイムライン番号の新しい方を選択するようにしました。(Kyotaro Horiguchi)
以前のバージョンでは、リカバリ時にまだアーカイブされていないセグメントは無視される事がありました。 これは9.3.0で行った、不適切な動作の変更を取消し、9.3以前の動作に逆戻りしていました。
リレーションのセグメントが一杯でない時に、WALレコードが誤再生する場合があったのを修復しました。(Greg Stark、Tom Lane)
WAL更新は、本来あるべき場所から多くのページを通り過ぎて、間違ったページに適用されることがありました。 データ破壊とは別に、ファイル終端であるべき場所をずっと越えてアップデートが適用されてしまうため、 このエラーはマスタサーバと比べてスタンバイサーバで著しい「肥大化(bloat)」をもたらすことが報告されています。 この故障モードはクラッシュリカバリ中の重大なリスクとは思われません。 更新が頻発するマスタから得たベースバックアップで作られたスタンバイサーバの初期同期の時にのみリスクが発生します。
リカバリによって整合性がとれたか判定する箇所の不具合を修正しました。(Tomonari Katsumata、Heikki Linnakangas)
WALのリプレイ開始時にデータベースの整合性が既に取れていると誤った結論を得てしまう場合があり、 そのためにデータベースが実際に整合性が取れる前にホットスタンバイのクエリを許可している可能性がありました。 その他の症状として、「PANIC: WAL contains references to invalid pages」が発生する可能性もありました。
可視性マップの変更によるWALの出力を修正しました。(Heikki Linnakangas)
ホットスタンバイモードのVACUUM
操作によるWALリプレイで、Btreeインデックスページの不適切なロック処理を修正しました。 (Andres Freund、Heikki Linnakangas、Tom Lane)
このエラーは「PANIC: WAL contains references to invalid pages」障害をもたらす可能性がありました。
非リーフのGINインデックスページへの挿入によって、ページ全体のWALレコードに適宜書き込むことを保証します。(Heikki Linnakangas)
これまでのコードでは、部分ページ書き込みのイベント中にシステムがクラッシュした場合、インデックスが破損する恐れがありました。
pause_at_recovery_target
とrecovery_target_inclusive
が両方セットされた場合、リカバリターゲットのレコードは停止後ではなく停止前に適用される事を保証します。(Heikki Linnakangas)
連続したストリームデータがある場合でも、スタンバイサーバはホットスタンバイのフィードバックメッセージを予定通り送信することを保証します。(Andres Freund, Amit Kapila)
ImmediateInterruptOK
が設定されていない限り、主処理に対するタイムアウト割り込みをしないようにしました。(Andres Freund, Tom Lane)
これはタイムアウト発生後、奇妙な障害を引き起こす場合があり、命令文のタイムアウトを利用しているどのアプリケーションにとって深刻な問題です。 我々はスピンロックが「スタック」したり、エラーが止めてはならないバックエンドプロセスに予想外のパニックやその他の不正動作を引き起こすという報告を得ていました。
サーバプロセス終了中の競合状態を修正しました。(Robert Haas)
シグナルハンドラが、既に無効となったプロセスのMyProc
ポインタを利用しないことを保証します。
walsenderの終了ロジックとwalreceiverのSIGHUPシグナルハンドラの競合状態を修正しました。(Tom Lane)
エラー出力ロジックの中で、errno
の安全でない参照方法を修正しました。(Christian Kruse)
これは、主にHINT
フィールドが欠如或いは不適切であるという奇妙な現象を引き起こしていました。
サーバ起動時に早すぎるereport()
関数使用によって、クラッシュする可能性があったのを修正しました。(Tom Lane)
クラッシュが観察された主なケースは、読み取り権限を持たないディレクトリでサーバが起動された場合です。
OpenSSLのソケット書き込み関数で、リトライフラグを適切に消去しました。(Alexander Kukushkin)
この消去が省かれると、SSLで暗号化された接続が突然切れた場合、サーバのロックアップを引き起こす可能性がありました。
エスケープを含むユニコードの識別子(U&"..."
構文)の長さチェックを修正しました。(Tom Lane)
識別子がエスケープされたフォームが長すぎた場合、誤った切り捨て警告が出力されていました。 しかし実際には、エスケープをデコードした後、識別子に切り捨ては不要でした。
コマンド末尾または関数本体末尾におけるUnicodeリテラルと識別子の構文解析を修正しました。(Tom Lane)
ロールのリストで、型名をキーワードに使うことができるようにしました。(Stephen Frost)
以前のパッチで使えるようになった型名キーワードは、定位置のクォート無しでロール識別子として使うことができるものですが、
DROP ROLE
のように、許されたロール識別子のリストから漏れていたケースがありました。
EXISTS(SELECT * FROM zero_column_table)
でパーサがクラッシュする障害を修正しました。(Tom Lane)
WHERE (... x IN (SELECT ...) ...) IN (SELECT ...)
のような、入れ子になったサブセレクトの誤ったプランによって、クラッシュする可能性があるのを修正しました。(Tom Lane)
LATERAL
を使ったサブクエリから引き上げられたWHERE
条件の処理ミスを修正しました。
これは可能に見えるプランの中の気づきにくいロジックエラーですが、 このバグの典型的な症状は 「JOIN qualification cannot refer to other relations」エラーが出ることです。
LATERAL
によるUPDATE/DELETE
の対象テーブルの参照を許可しないようにしました。(Tom Lane)
これは将来のリリースでは許可されるようになるかもしれませんが、9.3では想定外であり、動作しないのは正しい動きです。
サブクエリにUNION ALL
を含む、継承テーブルへのUPDATE/DELETE
を修正しました。(Tom Lane)
この修正なしでは、UNION ALL
サブクエリは最初の処理の後、継承された子テーブの更新プランに処理が正しく挿入されませんでした。典型的な結果として、それらの子テーブルには更新が起こりません。
範囲型のドメインカラムに対してANALYZE
が失敗しないよう修正しました。
テーブル列の全ての値の分布が「広すぎる」場合であっても、ANALYZE
コマンドが統計情報を作る事を保証しました。(Tom Lane)
ANALYZE
コマンドはヒストグラムと算出した中央値より大幅に離れた値は意図的に除外していますが、
全てのサンプリングされたエントリが広すぎる場合、極端な値を排除するのは正常なことです。
ALTER TABLE ... SET TABLESPACE
内で権限チェック無しにデータベースのデフォルトテーブルスペース使用を許可するようにしました。(Stephen Frost)
CREATE TABLE
は常に使用を許可していましたが、ALTER TABLE
ではそれをしていませんでした。
イベントトリガーを含む拡張機能のサポート機能を修正しました。(Tom Lane)
CASE
の戻り値が複数行のものと、そうではないものが混ざっている場合に、「cannot accept a set」エラーが発生してしたのを修正しました。(Tom Lane)
JSON関数のメモリリークを修正しました。(Craig Ringer)
JSON出力で生成した場合の非数値を数値として適切に識別するようにしました。(Andrew Dunstan)
pgstat関数の中でクライアントアドレスが全てゼロの場合のチェックを修正しました。(Kevin Grittner)
テキストサーチのパーサでマルチバイト文字を誤判別する可能性を修正しました。(Tom Lane)
マルチバイトエンコーディングでロケールにCを使用している場合、非ASCII文字は誤判別される可能性がありました。 Cygwinでは非Cロケールでも同様に誤判別する可能性がありました。
plainto_tsquery()
関数が誤作動する可能性があったのを修正しました。(Heikki Linnakangas)
メモリ領域が重なっている場合のコピーでmemcpy()
関数ではなくmemmove()
関数を使うようにしました。
これによる具体的な障害報告はありませんが、これは確かに危険性がありました。
pg_start_backup()
とpg_stop_backup()
の権限チェックの配置を修正しました。(Andres Freund、Magnus Hagander)
以前のコーディングではカタログアにクセスにすべきではない時に、アクセスしようとすることがありました。
ロケールチェック用のエンコーディング名として、SHIFT_JIS
を受け付けるようにしました。(Tatsuo Ishii)
SQL言語関数における名前付きパラメータの*
修飾子を修正しました。(Tom Lane)
コンポジットタイプの名前付きパラメータfoo
に$1.*
を与えた場合正しく動作しますが、foo.*
では動作しませんでした。
Windows上のPQhost()
関数の誤作動を修正しました。(Fujii Masao)
ホストが定義されていない場合、localhost
を返すべきでした。
COPY TO STDOUT/FROM STDIN
中の障害用にlibpqとpsqlのエラーハンドリングを改善しました。(Tom Lane)
この修正を具体的にいうと、COPY FROM STDIN
中にサーバとの接続が切れた場合、9.2以上のサーバでは無限ループに陥る可能性がありました。
これより古いバージョンのサーバや、他のクライアントアプリケーションでも、これに類する状況が起こるかもしれませんでした。
psqlの\d
コマンドにおいて、誤った翻訳ハンドリングを修正しました。(Peter Eisentraut, Tom Lane)
フォアグラウンドプロセスが終了した場合、pg_basebackupのバックグラウンドプロセスが停止させられることを保証しました。(Magnus Hagander)
pg_basebackupの冗長モードで、正しくないファイル名が出力される可能性があるのを修正しました。(Magnus Hagander)
ベースバックアップ内に2重に含ないように、PGDATA内のテーブルスペースに含まれることを避けました。(Dimitri Fontaine、Magnus Hagander)
ecpgの記述子の並びが間違っているのを修正しました。(MauMau)
ecpgで、接続パラメータにホスト名が欠如している場合の処理を適切に修正しました。(Michael Meskes)
contrib/dblink
の接続開始時におけるパフォーマンス退行を修正しました。(Joe Conway)
クライアントとサーバのエンコーディングが一致する場合、不必要な二重設定を止めました。
contrib/isn
で、ISMN値のチェックディジットの間違った演算を修正しました。(Fabien Coelho)
スケールファクターがラージの場合、contrib/pgbench
の進捗出力がオーバーフローするのを修正しました。(Tatsuo Ishii)
contrib/pg_stat_statement
のCURRENT_DATE
や関連する構造の処理を修正しました。
contrib/postgres_fdw
で接続が切れた場合のエラー処理を改善しました。(Tom Lane)
ドキュメント通りの手順でクライアントのみのコードをインストールできることを保証しました。(Peter Eisentraut)
MingwとCygwin環境でビルドする場合、libpq DLLをbin
ディレクトリにインストールするようにしました。(Andrew Dunstan)
MSVCビルドに於いて、このコピーは長らく行われてきました。 psqlのようなプログラムが、DLLを見つける事が出来ずに起動に失敗する問題は修正すべきです。
Cygwin環境で廃止予定のdllwrap
ツールの使用を止めました。(Marco Atzeri)
Visual Studio 2013でビルドできるようにしました。(Brar Piening)
プレインテキストのHISTORY
ファイルとsrc/test/regress/README
ファイルは今後、生成されません。(Tom Lane)
これらのテキストファイルは、メインHTMLとPDFドキュメントフォーマットで重複していました。
それらの保守に関する問題は、読者が好むプレインテキストフォーマットより大幅に上回ります。
配布用tarボールにはまた、これらの名前でファイルが含まれていますが、メインドキュメントを参照してもらうための指標となるスタブにすぎません。
プレインテキストのINSTALL
ファイルは、そのためのユースケースとして、まだ保守されています。
タイムゾーンデータファイルをtzdataリリース2013iに更新しました。 ヨルダンでの夏時間の変更およびキューバの歴史的な地域データの修正が含まれます。
それに加え、Asia/Riyadh87
、Asia/Riyadh88
とAsia/Riyadh89
は、
もはやIANAによって保守されず、実際の常用時計として表示されることが無いため、削除されました。