リリース日: 2024-08-08
このリリースは16.3に対し、様々な不具合を修正したものです。 16メジャーリリースにおける新機能については、E.5を参照してください。
pg_dump中の不正なコード実行を防止しました。 (Masahiko Sawada)
非一時的オブジェクトの作成と削除が可能な攻撃者は、pg_dumpを実行しているロール(多くの場合スーパーユーザ)の権限で、並列pg_dumpセッションによって実行されるSQLコードを注入することが出来ました。
この攻撃では、シーケンスや同様のオブジェクトを、悪意のあるコードを実行するビューまたは外部テーブルに置き換えます。
これを防ぐために、組み込み以外のビューの展開や外部テーブルへのアクセスを無効にすることができる新しいサーバパラメータrestrict_nonsystem_relation_kind
を導入し、利用可能な場合にはそれを設定するようpg_dumpに指示します。
この攻撃の防止は、pg_dumpとダンプ元のサーバの両方がこの修正を適用できるほど十分新しい場合に限られます。
PostgreSQLプロジェクトは、本問題を報告してくれたNoah Mischに感謝します。 (CVE-2024-7348)
Merge Right Anti Joinプランから生じる不正確な結果を回避しました。 (Richard Guo)
内側のリレーションに一意の結合キーがあることがわかっている場合、外側リレーションに重複した結合キーがあるとマージが誤動作をする可能性がありました。
VACUUM
の無限ループを防止しました。
(Melanie Plageman)
古い実行中のトランザクションを持つ切断されたスタンバイサーバがプライマリに再接続されると、プライマリのVACUUM
がどのタプルが削除可能であるかについて混乱し、無限ループが発生する可能性がありました。
以前、継承ツリーの子テーブルが存在していたテーブルをパーティションとしてアタッチした後に発生する障害を修正しました。 (Álvaro Herrera)
一貫性がないインデックスベース制約が関連する場合のALTER TABLE DETACH PARTITION
を修正しました。
(Álvaro Herrera, Tender Wang)
パーティションテーブルに、制約と関連付けられていないインデックスがあり、パーティションに同等の制約を持つインデックスがある場合、パーティションをデタッチすると不正な動作となり、元のパーティションの制約に誤ったconinhcount
値が残ります。
これにより、その制約をさらに操作する際に問題が発生していました。
ALTER TABLE DETACH PARTITION CONCURRENTLY
実行中のパーティションプルーニング設定を修正しました。
(Álvaro Herrera)
エグゼキュータは、パーティションテーブルでのクエリの計画と実行の間にパーティションをデタッチできないと想定していました。
DETACH PARTITION
のCONCURRENTLY
オプションが導入されてからこれは成り立たなくなり、このオプションが使用する問い合わせの実行が一時的に失敗する可能性がありました。
パーティションテーブルから最後の子パーティションが削除された後、pg_class
.reltuples
フィールドを正しくゼロに更新するようにしました。
(Noah Misch)
このようなパーティションテーブルの最初のANALYZE
ではrelhassubclass
も更新する必要があり、これによりreltuples
の更新が失われていました。
プロシージャの多様OUT引数の処理を修正しました。 (Tom Lane)
SQLのCALL
文では、このような引数の正しいデータ型を解決できなかったため、「cannot display a value of type anyelement」などのエラーや、クラッシュを引き起こしました(ただし、PL/pgSQLのCALL
は正常に動作しました)。
CALL
文の引数リストから呼び出されるSTABLE関数の動作を修正しました。
(Tom Lane)
CALL
が原子的コンテキスト内にある場合(例えば、外側のトランザクションブロックがある場合)、そのような関数には間違ったスナップショットが渡され、外側トランザクションの開始以降に変更された行の古い値が表示される原因となっていました。
time
型およびtimetz
型に対するISO-8601「拡張」時間書式の入力を修正しました。
(Tom Lane)
T12:34:56
などのケースを再度許可しました。
money
型の計算で整数オーバーフローを検出するようにしました。
(Joseph Koshakow)
これまでmoney
型の算術関数はいずれもオーバーフローをチェックしなかったので、オーバーフローが発生した場合に黙って間違った答えを出していました。
round(numeric)
関数とtrunc(numeric)
関数のスケール引数の過度に積極的な制限を修正しました。
(Dean Rasheed)
これらの関数は、スケール引数を+/-2000に制限しましたが、これより大きい値を使用する有効な使用例があります。
このような場合、関数は誤った結果を返しました。
代わりに、numeric
型の実際の許容範囲に制限するようにしました。
可能な限り最小のbigint
値に適用した場合のpg_size_pretty()
の結果を修正しました。
(Joseph Koshakow)
pg_sequence_last_value()
がスタンバイサーバのログに記録されていないシーケンスや他のセッションの一時シーケンスで失敗しないようにしました。
(Nathan Bossart)
これらの場合、エラーとはせずNULLを返すようにします。
websearch_to_tsquery()
で無視される演算子の解析を修正しました。
(Tom Lane)
マニュアルによると、websearch_to_tsquery()
の入力内の句読点は、ダッシュと引用符の特殊な場合を除いて無視されます。
ただし、or
の直前に括弧や他のいくつかの文字があると、or
が期待されたOR
演算子ではなく、データ単語として扱われる可能性がありました。
新しい配列の次元を計算するときに、別な種類の整数オーバーフローのケースを検出するようにしました。 (Joseph Koshakow)
配列の次元[-2147483648:2147483647]
を空の配列に適用することを拒否します。
これはCVE-2023-5869と密接に関連していますが、配列は依然として空のままなので無害に見えます。
strnxfrm()
の移植性のない使用法を修正しました。
(Jeff Davis)
非決定的な照合順序の一部のコードパスには、「pg_strnxfrm() returned unexpected result」のようなエラーで失敗するものがありました。
新しいカタログキャッシュエントリが、そのフィールドのTOAST展開中に古くなる別のケースを検出するようにしました。 (Noah Misch)
カタログタプルの行外フィールドを展開している間に発生したその場での更新は見逃される可能性があり、その場での変更がないものの古くなったことがわからないカタログキャッシュエントリにつながる可能性があります。
これはpg_database
カタログでのみ可能であるため、影響は限定的ですが、誤動作の可能性があります。
INSERT
... DEFAULT
の対象となるビュー列の更新可能性を正しくチェックするようにしました。
(Tom Lane)
そのような列が更新不可能な場合は、そのことを報告するエラーを返す必要があります。
しかし、そのチェックは見逃され、後のコードで「attribute number N
not found in view targetlist」などの役に立たないエラーが報告されていました。
不正な再帰問い合わせに対して、役に立たない内部エラーを報告しないようにしました。 (Tom Lane)
エラーチェックの順序を変更して、WITH RECURSIVE
問い合わせがUNION
の2番目の枝内に自己参照を持たないが、ORDER BY
などの他の場所に1つの自己参照を持つ場合に、適切なエラーを発生するようにしました。
ALTER TABLE SET LOGGED|UNLOGGED
の実行中に所有シーケンスをロックするようにしました。
(Noah Misch)
これらのコマンドは、テーブルとともにテーブルの所有シーケンスの永続性を変更しますが、その際にシーケンス上のロックを取得してませんでした。
その結果、同時実行中のnextval()
呼び出しの効果が失われる可能性がありました。
キューに入れられたAFTER
トリガーがもはや存在しない場合は、エラーを発生しないようにしました。
(Tom Lane)
トランザクションが、後で実行するために遅延されたAFTER
トリガをキューに入れる操作を実行し、その前にトリガを削除する可能性がありました。
以前は、これにより「could not find trigger NNNN
」などの奇妙なエラーが発生していました。
トリガが実行されるはずの時点でもはや存在しない場合は、黙って何もしない方が良いようです。
テーブルが削除されたときに、列レベル権限のpg_init_privs
エントリを削除できない問題を修正しました。
(Tom Lane)
拡張が作成したテーブルに列レベル権限を付与した場合、拡張が削除された後も関連するカタログエントリが残っていました。 これは、テーブルのOIDが別のリレーションに再利用されるまで/もしくは再利用されない限り無害でしたが、再利用されるとpg_dumpがそのリレーションに対してダンプする内容に干渉する可能性がありました。 ダンプ
望ましいインデックスに式または述語がある場合、ON CONFLICT
に対する調停インデックスの選択を修正しました。
(Tom Lane)
ON CONFLICT
を使用する問い合わせが、更新可能なビューを介してターゲットテーブルにアクセスする場合、適合するインデックスが存在する場合でも、「there is no unique or exclusion constraint matching the ON CONFLICT specification」というエラーで失敗する可能性がありました。
ALTER TABLE
を使用して別のセッションの一時テーブルを変更することを拒否するようにしました。
(Tom Lane)
通常は権限チェックによってこのケースは発生しませんが、別のセッションの一時テーブルを子テーブルとする親テーブルを変更することによって、このケースに到達する可能性がありました。 このような子のテーブルが別のセッションに属していることが判明した場合は、エラーを発生します。
CREATE TABLE LIKE STATISTICS
の式の拡張統計の処理を修正しました。
(Tom Lane)
CREATE
コマンドは、統計式内の列参照を、新しいテーブルの番号付けとは異なる可能性のある列番号に調整できませんでした。
その結果、後で問題を引き起こす無効な統計オブジェクトが生成されました。
列の再番号付けが必要になる典型的なシナリオは、ソーステーブルに削除された列が含まれている場合です。
MIN()
またはMAX()
集約から生成された副問い合わせの再計算の失敗を修正しました。
(Tom Lane)
場合によっては、外部問い合わせの1行で計算された集約結果が、後の行で再利用されるべきではないのに再利用されることがありました。
これは、外部問い合わせがハッシュ集約で実装されたDISTINCT
を使用する場合にのみ発生することが確認されていますが、他のケースも存在する可能性があります。
位置パラメータでアンダースコアを再度禁止しました。 (Erik Wienhold)
v16では、整数リテラルにアンダースコアを含めることができます。
この変更により、$1_234
などの入力が単一のトークンと見なされるようになりましたが、正しく動作しませんでした。
パラメータ記号は$
の後に数字が続くだけの元の定義に戻した方がよさそうです。
JITでインライン化されたバックエンド関数でエラーが発生した時にクラッシュしないようにしました。 (Tom Lane)
エラー状態には、JITコンパイルされたコード(エラー位置の文字列用)を保持する動的にロードされたモジュールへのポインタを含めることができます。 一部のコードパスでは、エラーレポートが処理される前にモジュールがアンロードされ、位置の文字列にアクセスした時にSIGSEGVが発生しました。
libxml2バージョン2.13.xでの振る舞い変更に対処しました。 (Erik Wienhold, Tom Lane)
特に、報告されたエラーがそれだけでない限り、libxml2からの「chunk not well balanced」エラーを抑制するようになりました。 これは、2.13.xと以前のlibxml2バージョンの間でエラー報告の一貫性を保つためです。 以前のバージョンでは、このメッセージはほとんどの場合冗長であったり、完全に間違っていたため、2.13.xでは報告されるケースの数が大幅に減少しました。
ホットスタンバイサーバ起動時の準備されたトランザクションのサブトランザクション処理を修正しました。 (Heikki Linnakangas)
シャットダウンのチェックポイントWALレコードでスタンバイのリプレイを開始する場合、プライマリで準備されたがまだコミットされていないトランザクションは、まだ進行中であると正しく理解されます。 しかし、準備されたトランザクションのサブトランザクション(セーブポイントまたはPL/pgSQL例外ブロックによって作成されたもの)は考慮されず、中止されたものとして扱われました。 このため、準備されたトランザクションが後でコミットされた場合に矛盾が生じました。
論理レプリケーションスロットの誤った初期設定を防止するようにしました。 (Masahiko Sawada)
場合によっては、WALストリーム内のレプリケーションスロットの開始点がトランザクション内のポイントに設定され、アサーションエラーや誤ったデコード結果が発生する可能性がありました。
レプリケーションスロットの作成と削除時に「can only drop stats once」というエラーが発生しないようにしました。 (Floris Van Nee)
論理レプリケーションのWAL senderのリソースリークを修正しました。 (Hou Zhijie)
walsenderプロセスは、パーティションテーブルと物理的に異なる行タイプのパーティションテーブルへの変更をパブリッシュするときに、メモリをリークしました。
notifyまたはsinval割り込みを処理した後のメモリリークを回避しました。 (Tom Lane)
これらのイベントの処理関数は、現在のメモリコンテキストをTopMemoryContextに切り替える可能性があり、その結果、誤った設定が置き換えられる前に割り当てられたデータのセッション存続期間のリークが発生します。 (少なくとも)受信した問い合わせとBindメッセージに付加されたパラメータのエンコーディング変換に関連するリークが観察されました。
統計情報に使用される共有メモリブロックの参照カウントの漏洩を防止しました。 (Anthonin Bonnefoy)
統計情報の共有メモリに接続する新しいバックエンドプロセスは、参照カウントを増加させましたが、終了時にカウントを減じていませんでした。 232セッションが作成された後、参照カウントはゼロにオーバーフローして、その後のすべてのバックエンドプロセスの起動が失敗しました。
マルチトランザクションのSLRUログの切り捨て中のデッドロックとアサーションエラーを防止しました。 (Heikki Linnakangas)
SLRUセグメントを削除しようとするプロセスは、チェックポインタプロセスとデッドロックする可能性がありました。
Windowsソケットでの入力終了イベントが失われる可能性を回避しました。 (Thomas Munro)
Windowsは接続のリモート側が切断された後にFD_CLOSEイベントを1回だけ報告します。 タイミングが悪いと、その報告を見逃して、さらに入力があることを期待して、無期限にまたは少なくともタイムアウトが経過するまで待機する可能性がありました。
JSON解析エラー報告における不完全なバイトシーケンスに対するバッファのオーバーリードを修正しました。 (Jacob Champion)
最後のバイトが不完全なマルチバイト文字で構成している場合、入力バッファの終端から数バイト離れる可能性がありました。 通常は無害ですが、原理的にはクラッシュを引き起こす可能性がありました。 バイト
OpenSSLによるステートフルTLSセッションチケットの作成を無効にしました。 (Daniel Gustafsson)
これにより、セッションチケットの受信はTLSセッション再開サポートを意味すると考えるクライアントで発生する可能性のある障害が回避されます。
PL/pgSQLの「単純な式(simple expression)」を再計画する場合、それがまだ単純であることを確認するようにしました。 (Tom Lane)
参照されている関数を削除して集約として再作成するような、かなり人為的なケースでは、「unexpected plan node type」などの予期せぬ障害が発生する可能性がありました。
PL/pgSQLで、アンダースコアを含む整数範囲の処理を修正しました。 (Erik Wienhold)
v16では整数リテラルにアンダースコアを含めることができますが、PL/pgSQLはFOR i IN 1_001.1_003
のような例を処理できませんでした。
再帰的にRECORD
を返すPL/Python関数を修正しました。
(Tom Lane)
異なる列定義リスト(AS
句)を渡す同じ関数の新しい呼び出しで再帰する場合、内部呼び出しが外側の呼び出しの返す行型を上書きするため、失敗しました。
PL/Pythonで再帰トリガー呼び出し中にTD
辞書を破壊しないよう修正しました。
(Tom Lane)
PL/Python言語のトリガーによって別のトリガーが呼び出された場合、内側のトリガーのために作成されたTD
辞書が外側のトリガーのTD
辞書を上書きしていました。
タプルを返す関数の結果で無効なリスト構文を報告するPL/Tclを修正しました。 (Erik Wienhold, Tom Lane)
このようなケースでは、クラッシュが発生したり、実際には以前のTclエラーを参照する誤解を招くようなコンテキスト情報が出力されたりする可能性がありました。
libpqでのstrerror()
のスレッドセーフではない使用を避けました。
(Peter Eisentraut)
OpenSSLによって返される特定のエラーメッセージが、マルチスレッドアプリケーションで文字化けする可能性がありました。
バイナリアップグレード処理中のpg_dumpでのメモリリークを回避しました。 (Daniel Gustafsson)
pg_restore
-l
が依存しているTOCエントリを正しく報告するようにしました。
(Tom Lane)
-l
が-n
や-N
などの選択的なリストアオプションと一緒に指定された場合、実際のリストアではそれらを選択されていたとしても、コメントなどの依存TOCエントリはリストから省略されていました。
contrib/pg_stat_statements
がSQL言語関数内に現れるユーティリティ文を区別できるようにしました。
(Anthonin Bonnefoy)
SQL言語関数のエグゼキュータは、ユーティリティ文(非SELECT
/INSERT
/UPDATE
/DELETE
/MERGE
)に対して計算された問い合わせ識別子を渡すことに失敗していました。
ユーティリティ
contrib/postgres_fdw
で「cursor can only scan forward」エラーを回避しました。
(Etsuro Fujita)
このエラーは、リモートサーバがv15以降で、外部テーブルが単純ではないリモートビューにマッピングされている場合に発生する可能性がありました。
contrib/postgres_fdw
でFETCH FIRST WITH TIES
句をリモートサーバに送信しないようにしました。
(Japin Li)
リモートサーバはこの句を実装していないか、ローカルとは異なる解釈をする可能性があるため、リモート実行を避けました。
システムが提供する<regex.h>
ヘッダとの衝突を回避しました。
(Thomas Munro)
これにより、macOSバージョン15以降でのコンパイルの失敗が修正されます。
Memoizeのコスト推定における、無害なアサーションエラーを修正しました。 (David Rowley)
SP-GiSTインデックスに対するREINDEX CONCURRENTLY
実行での無害なアサーションエラーを修正しました。
(Tom Lane)