リリース日: 2024-05-09
このリリースは16.2に対し、様々な不具合を修正したものです。 16メジャーリリースにおける新機能については、E.5を参照してください。
16.Xからの移行ではダンプ/リストアは不要です。
しかしながら、システムビューpg_stats_ext
とpg_stats_ext_exprs
にセキュリティ上の脆弱性が見つかり、認証されたデータベースユーザが、本来見るべきでないデータを見ることができる可能性があります。
これがインストール環境で問題となる場合は、次の最初の変更ログの項目に従って修正してください。
また、16.2より前のバージョンからアップグレードする場合は、E.3を参照してください。
pg_stats_ext
およびpg_stats_ext_exprs
エントリの可視性をテーブル所有者へ制限しました。
(Nathan Bossart)
これらのビューは、アクセスするユーザに読み取る権限のない列を含む式の統計情報を隠すことができませんでした。
most_common_vals
などのビュー列で、セキュリティ関連データが公開される可能性がありました。
ここでの潜在的な相互作用は完全には明らかではないため、安全を優先するために、これらのビューの行を、関連するテーブルの所有者のみに表示するようにしました。
PostgreSQLプロジェクトは、本問題を報告してくれたLukas Fittlに感謝します。 (CVE-2024-4317)
この修正では、新しくinitdbされたデータベースクラスタの動作のみが修正されます。 既存のクラスタにこの変更を適用したい場合は、次の手順を実行する必要があります。
PostgreSQLがインストールされたshare
ディレクトリ(通常は/usr/share/postgresql/
のような場所)にあるSQLスクリプトfix-CVE-2024-4317.sql
を見つけてください。
必ず、PostgreSQLのメジャーバージョンに適したスクリプトを使用してください。
このファイルが見つからない場合は、あなたのバージョンが脆弱ではない(v14–v16だけが影響を受ける)か、マイナーバージョンが古すぎて修正されていません。
クラスタの各データベースで、スーパーユーザとしてfix-CVE-2024-4317.sql
スクリプトを実行します。
psqlでは以下のようになります。
\i /usr/share/postgresql/fix-CVE-2024-4317.sql
(ファイルパスは適宜調整してください)。 エラーが出た場合は、おそらく間違ったスクリプトバージョンを使用したことを示しています。 スクリプトを複数回実行しても問題ありません。
template0
とtemplate1
データベースを含めることを忘れないでください。
そうしないと、後で作成するデータベースに脆弱性が残ったままになります。
template0
を修正するには、一時的に接続を受け付けるようにする必要があります。
これは、下記のコマンドで行います。
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
そしてtemplate0
を修正した後、接続受け付けを元に戻します。
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
複数のVALUES
行から、配列または複合型を元にしたドメイン型である対象列へのINSERT
を修正しました。
(Tom Lane)
このようなケースでは、データ型の不一致に関する予期せぬエラーで失敗するか、予期しない強制が挿入されて奇妙な結果が生じる可能性がありました。
DO NOTHING
句を持つMERGE
では、対象テーブルに対するSELECT
権限が必要です。
(Álvaro Herrera)
SELECT
権限は、すべての実用的なケースで必要になりますが、対象テーブルの列を読み取らない問い合わせの場合でも必要です。
これにより、MERGE
がDO NOTHINGコマンドであっても望ましくないと思われる、何の権限も必要としないというエッジケースを回避しました。
MERGE
における自己修正タプルの処理を修正しました。
(Dean Rasheed)
標準SQLの要件に従って、ターゲット行が複数のソース行と結合される場合はエラーが発生します。
(以前のコーディングでは、同時更新が含まれる場合、この条件を黙って無視することができました。)
また、BEFORE
トリガまたは問い合わせで使用される揮発性関数によって、対象行が現在のトランザクション内の後のコマンドによってすでに更新されている場合は、誤解を招かないようにエラーが発生します。
テーブルがboolean型の列でパーティション化され、問い合わせにboolean型のIS NOT
句がある場合の誤ったNULLパーティション除去を修正しました。
(David Rowley)
NULL値は
のような句を満たすので、NULLを含むパーティションを除去すると誤った結果が生じていました。
boolcol
IS NOT FALSE
ALTER FOREIGN TABLE SET SCHEMA
の実行で、所有するシーケンスを新しいスキーマに移動するようにしました。
(Tom Lane)
通常のテーブルを新しいスキーマに移動すると、テーブルが所有するシーケンスも(インデックスや制約も一緒に)そのスキーマに移動されます。 しかし、外部テーブルではこれが見落とされていました。
ALTER TABLE ... ADD COLUMN
で、所有するテーブルと同じ永続性を持つIDENTITY/シリアルシーケンスを作成できるようにしました。
(Peter Eisentraut)
CREATE UNLOGGED TABLE
を使用すると、所有するシーケンスもWAL出力されなくなります。
ALTER TABLE
はこの点を考慮しなかったので、追加されたIDENTITY列はWAL出力のあるシーケンスが含まれることになり、これは無意味なことでした。
依存する関数またはパブリケーションがある場合のALTER TABLE ... ALTER COLUMN TYPE
のエラーメッセージを改善しました。
(Tom Lane)
CREATE DATABASE
コマンドで、他のオプションとの整合性を保つために、strategyキーワードを大文字と小文字を区別せずに認識するようにしました。
(Tomas Vondra)
ビットマップヒープスキャンによってアクセスされたヒープページのEXPLAIN
のカウントを修正しました。
(Melanie Plageman)
以前は、可視タプルを含まないヒープページはカウントされませんでしたが、ビットマップインデックススキャンによって返されるすべてのページをカウントする方がより一貫性があります。
MERGE
におけるサブプランのEXPLAIN
の出力を修正しました。
(Dean Rasheed)
EXPLAIN
は、プランツリーの他の部分にある変数を参照するサブプランパラメータを正しく表示できないことがありました。
孤立した一時テーブルの削除中のデッドロックを回避しました。 (Mikhail Zhilin)
一時テーブルを作成したセッションがテーブルを削除せずにクラッシュした場合、自動バキュームは最終的に孤立したテーブルを削除しようとします。 しかし、同じ一時的な名前空間を割り当てられた受信セッションも同様に削除しようとします。 一時テーブルに依存関係(所有されたシーケンスなど)がある場合、これら2つのクリーンアップ試行の間にデッドロックが発生する可能性がありました。
DISABLE_PAGE_SKIPPING
オプションを使用したVACUUM
での可視性マップ状態の更新を修正しました。
(Heikki Linnakangas)
見落としにより、このモードではすべてのヒープページがダーティになり、過剰なI/Oが発生しました。 また、誤って設定された可視性マップビットはクリアされませんでした。
リレーションごとの凍結されたXID値を調べる際の競合状態を回避します。 (Noah Misch)
VACUUM
によるリレーション単位の値からのデータベース単位の凍結されたXID値の計算が、別のVACUUM
によるそれらの値の同時更新によって混乱する可能性がありました。
並列バキューム処理のバッファ使用レポートを修正しました。 (Antonin Bonnefoy)
並列ワーカーによって実行されたバッファアクセスは、VERBOSE
モードで報告される統計にカウントされませんでした。
同値クラスから生成された結合条件が正しい計画レベルで適用されるようにしました。 (Tom Lane)
PostgreSQL16より前のバージョンでは、生成された条件が外部結合の上(後)で評価されるべきところを下で評価される可能性があり、不正な問い合わせ結果をもたらしていました。
一部のSELECT
アームの結合列に定数出力を持つUNION ALL
ツリーへの結合を検討する場合、すべてのバージョンで同様の危険性がありました。
ORDER BY
またはDISTINCT
オプションを指定した集約関数の計画中に発生する「could not find pathkey item to sort」エラーを修正しました。
(David Rowley)
これは、16.1で適用された修正と同様ですが、並列計画の問題を解決します。
一部のウィンドウ関数の誤った最適化の可能性を防止しました。 (David Rowley)
非定数引数を使用するntile()
とcount()
の「実行条件」最適化を無効にします。
これにより、典型的には「WindowFunc not found in subplan target lists」のようなエラーを引き起こす副SELECTで誤動作する可能性を防ぎます。
移動しないウィンドウフレームでの移動集約モードを不必要に使用しないようにしました。 (Vallimaharajan G)
通常の集約関数をウィンドウ関数として使用し、ウィンドウフレームの開始がUNBOUNDED PRECEDING
に指定されている場合、フレームの先頭は移動できないため、特別な(より高価な)移動集約モードを使用する必要はありません。
この最適化は当初から意図されていましたが、コーディングエラーのためにトリガーされていませんでした。
GEQOの下でパーティションごとの結合を計画する際に、解放済みデータの使用を避けるようにしました。 (Tom Lane)
これは通常、クラッシュまたは予期しないエラーメッセージで終了していました。
Memoizeで使用中のデータを解放しないようにしました。 (Tender Wang, Andrei Lepikhov)
製品ビルドでは、解放されたデータは使用される前に上書きされる可能性は低いため、このエラーによって問題が起きることはほとんどありませんでした。
「requested statistics kind X
is not yet built」というエラーメッセージで誤ってレポートされていた統計の種類コードを修正しました。
(David Rowley)
「catcache list」オブジェクトに対して、線形検索ではなくハッシュテーブルを使用するようにしました。 (Tom Lane)
この変更により、数千のロールを持つインストールで特定の操作に関して報告されていたパフォーマンスの問題が解決されます。
FROM
でRECORD
を返す関数に対して、より注意を払うようにしました。
(Tom Lane)
このような関数呼び出しの出力列は、列名とデータ型を指定するAS
句で定義する必要があります。
実際の関数の出力値がこれに一致しない場合、実行時にエラーが発生することになっています。
しかし、一部のコードパスでは、実際の値を早期に調べてしまい、期待と一致しない場合に奇妙なエラーを発生させたり、アサーションエラーを引き起こしたりする可能性がありました。
行型を返すSQL言語プロシージャに関する混乱を修正しました。 (Tom Lane)
単一の複合型列を返すSQL言語で実装されたプロシージャでは、アサーションエラーまたはコアダンプを引き起こしていました。
いくつかの再帰関数に保護的なスタック深さ検査を追加しました。 (Egor Chindyaskin)
date_bin()
の丸め間違いとオーバーフローの危険性を修正しました。
(Moaaz Assali)
sourceのタイムスタンプがoriginタイムスタンプより前で、その差がすでにstrideの正確な倍数である場合、コードは誤ってstrideを減算していました。 また、不正な結果を生じる可能性のある整数オーバーフローのケースもいくつか検出しました。
timestamp
にinterval
を加算または減算する際に、整数オーバーフローを検出するようにしました。
(Joseph Koshakow)
範囲外エラーを発生すべき一部のケースでは、代わりに誤った結果が生成されていました。
pg_get_expr()
における競合状態を回避しました。
(Tom Lane)
引数が参照するリレーションが同時に削除された場合、関数はNULLを返すべきところですが、エラーになっていました。
XIDステータス関数での古いトランザクションIDの検出を修正しました。 (Karina Litskevich)
231を超えるトランザクションIDが最近のものとして誤って識別され、pg_xact_status()
またはtxid_status()
の誤動作につながる可能性がありました。
テーブルの空き領域マップがテーブルの終端を越えたページを返さないようにしました。 (Ronan Dunklau)
空き領域マップはWALに記録されないため、OSのクラッシュ、レプリカの昇格、PITRリストアなどの場合に発生する可能性がありました。 その結果「could not read block」エラーになります。
WaitEventSetWait
で待機中にエラーが発生した場合のファイル記述子のリークを修正しました。
(Etsuro Fujita)
FDWが非同期Appendを実装しているが、Append計画ノードが待機する待機条件を設定していない場合の例外スタック破損を回避します。 (Alexander Pyhalov)
インデックスの再作成中にインデックスにアクセスされた場合、エラーが発生するようにしました。 (Tom Lane)
以前は単なるアサーションチェックでしたが、通常のランタイムエラーに昇格しました。 これにより、ユーザ定義のインデックス式のインデックスを再作成する際に、より適切なエラーメッセージが提供されるようになります。
name
型列のインデックスオンリースキャンが完全に埋め込まれた値を返すようにしました。
(David Rowley)
インデックスに物理的に格納された値は切り捨てられ、以前はその値へのポインタが呼び出し元に返されていました。 これにより、valgrindでテストしたときに苦情が発生しました。 理論的にはクラッシュを引き起こす可能性がありますが、報告はありませんでした。
レプリケーションスロットの無効化時に誤った競合原因を報告する可能性がある競合状態を修正しました。 (Bertrand Drouvot)
論理レプリケーションでテーブル同期操作が必要かどうかを判断する際の競合状態を修正しました。 (Vignesh C)
サブスクライバが同期化が必要なテーブルを識別している間に到着した無効化イベントが忘れ去られるため、新たに同期化が必要なテーブルがタイムリーに処理されない可能性がありました。
4GBを超えるDSMの割り当てによるクラッシュを修正しました。 (Heikki Linnakangas)
新しいサーバセッションのクライアントソケットが非ブロッキングモードにできない場合は切断します。 (Heikki Linnakangas)
以前は、理論的にはブロッキングモードのソケットで動作することが可能でしたが、長い間完全には機能していなかったため、後で誤動作するのではなく接続開始時に失敗するようにしました。
OpenSSL3.0.0以降での不適切なエラー報告を修正しました。 (Heikki Linnakangas, Tom Lane)
OpenSSLによってシステムから報告されたエラーは、読み取り可能なものではなく、数値のエラーコードで報告されていました。
Windowsのgetaddrinfo()
関数のエラー報告のスレッド安全性を修正しました。
(Thomas Munro)
マルチスレッドのlibpqクライアントプログラムは、ネットワーク検索が失敗した後に、誤ったエラーメッセージや破損したエラーメッセージを受け取る可能性がありました。
libpqとecpglibのbindtextdomain()
への同時呼び出しを避けました。
(Tom Lane)
GNU gettextの実装では同時呼び出しは問題がないようですが、Windowsで利用可能なバージョンはそうではありませんでした。
ecpgのプリプロセッサで、プログラムがプリプロセッサのコマンドラインで定義されたマクロを再定義しようとした場合のクラッシュを修正しました。 (Tom Lane)
ecpgで誤った「unsupported feature will be passed to server」警告を出さないようにしました。 (Tom Lane)
ecpgのintoasc()
関数の文字列結果が正しくゼロで終了するようにしました。
(Oleg Tselebrovskiy)
initdbの-c
オプションで、大文字小文字を区別せずにパラメータ名を照合するようにしました。
(Tom Lane)
サーバはパラメータ名を大文字小文字を区別せずに処理するので、このコードも同様に処理する必要があります。
これにより、生成されたpostgresql.conf
ファイルに冗長なエントリの挿入が避けられます。
psqlで、問い合わせがキャンセルされた後に問い合わせ結果を漏らさないようにしました。 (Tom Lane)
これは、\;
区切り文字を使用して作成された問い合わせ文字列内で最後でない問い合わせをキャンセルした場合にのみ発生しました。
ロールコメントが存在する場合、--no-role-passwords
の設定に関係なくロールコメントがダンプされるようpg_dumpallを修正しました。
(Daniel Gustafsson, Álvaro Herrera)
pg_basebackup、pg_checksums、pg_rewindで.DS_Store
という名前のファイルをスキップするようにしました。
(Daniel Gustafsson)
これにより、Finderがそのようなファイルを作成する可能性があるmacOSでの問題を回避できます。
PL/pgSQLの式の後に続く単一行コメント(--
形式のコメント)の解析を修正しました。
(Erik Wienhold, Tom Lane)
この間違いにより、PL/pgSQL CASE
ステートメントのWHEN
式の後にこのようなコメントが続くと、解析エラーが発生していました。
contrib/amcheck
で、短いヘッダ値と長いヘッダ値による誤った一致失敗を報告しないようにしました。
(Andrey Borodin, Michael Zhilin)
ヒープタプルまたはインデックスタプル内の可変長データは、作成時に適用された圧縮パラメータに応じて、短いヘッダまたは長いヘッダのいずれかを持つことができます。 違いがあると文句を言うのではなく、これらのケースを同等として扱うようにしました。
BRIN出力関数のバグを修正しました。 (Tomas Vondra)
これらの出力関数はcontrib/pageinspect
内のインデックスエントリを表示するためにのみ使用されるため、エラーは実用上の問題にはなりませんでした。
contrib/postgres_fdw
では、定数によるソート要求を発行しないようにしました。
(David Rowley)
これは、定数を発行する副問い合わせとUNION ALL
を含む場合に発生する可能性がありました。
定数によるソートはもちろん無意味ですが、リモートサーバが誤って解釈して「ORDER BY position N
is not in select list」エラーを出す危険性もありました。
contrib/postgres_fdw
がリモートセッションのタイムゾーンをUTC
ではなくGMT
に設定するようにしました。
(Tom Lane)
これは、実用上は同じ結果になるはずです。
しかし、GMT
はサーバのハードコードされたコードによって認識され、UTC
はタイムゾーンデータベースで検索されます。
したがって、リモートサーバのタイムゾーンデータベースにエントリがないというまれなケースでは、古いコードが失敗する可能性がありました。
contrib/xml2
において、libxml2の最近のバージョンで非推奨となったライブラリ関数の使用を避けるようにしました。
(Dmitry Koval)
LLVM 18との非互換性を修正しました。 (Thomas Munro, Dmitry Dolgov)
make check
がmuslCライブラリで動作するようにしました。
(Thomas Munro, Bruce Momjian, Tom Lane)