リリース日: 2025-02-13
このリリースは17.2に対し、様々な不具合を修正したものです。 17メジャーリリースにおける新機能については、E.6を参照してください。
無効なエンコードがされた入力文字列に対して、PQescapeString
および関連する関数が強化されました。
(Andres Freund, Noah Misch)
§
§
§
§
§
§
libpqが提供するクォートを付加する関数は、入力のエンコーディングの妥当性を完全にチェックするようになりました。 無効な文字が検出された場合、可能であればエラーを報告します。 エラーを返す規則がない関数については、出力文字列が調整され、サーバは無効なエンコーディングを報告し、介在するプロセスがシングルクォートやバックスラッシュなどに偶然一致するバイト列に騙されないようになりました。
この変更の目的は、これらの関数のいずれかが細工された入力にクォートを付加するために使用された場合に発生する可能性のあるSQLインジェクション攻撃から保護することです。 結果の文字列がPostgreSQLサーバ(いずれにしてもエンコーディングをチェックする)に直接送信される場合には危険はありませんが、psqlやその他のクライアント側のコードに渡している場合にはリスクがあります。 歴史的に、このようなコードはエンコーディングを慎重に検証しておらず、多くの場合、このような問題を検出した場合に何をすべきかが明確ではありません。
この修正は、クォート関数、サーバ、および介在する処理で使用される文字エンコーディングが一致する場合にのみ有効です。 信頼できない入力をSQLコマンドに挿入するアプリケーションは、それが正しいことを保証するために特別な注意を払う必要があります。
これらのlibpq関数を使用せずに信頼できない入力にクォートを付加するアプリケーションとドライバは、同様の問題に直面する可能性があります。 そのようなアプリケーションやドライバはまず、データがサーバが期待するエンコーディングで有効であることを確認する必要があります。
PostgreSQLプロジェクトは、本問題を報告してくれたStephen Fewerに感謝します。 (CVE-2025-1094)
接続要求に表示されるデータベース名とユーザ名の自動切り捨てが元に戻されました。 (Nathan Bossart) §
これは、一部のユーザに問題を引き起こしたv17の変更を元に戻すものです。
長すぎる名前は、エンコーディングを意識した方法で切り捨てられるべきですが、現時点ではNAMEDATALEN-1
バイトでの単なる切り捨てをする以前の動作に戻るだけです。
接続権限と接続数上限のチェックからパラレルワーカーが除外されました。 (Tom Lane) §
パラレルワーカーを起動する時にdatallowconn
、rolcanlogin
、ACL_CONNECT
権限をチェックせず、代わりに、リーダープロセスが最初に同様のチェックに合格していれば十分であると想定します。
これにより、例えば、リーダーがログイン権限を持たないロールとして実行されている場合に、パラレル問い合わせでの予期しない失敗が回避されます。
同様に、ReservedConnections
、datconnlimit
、rolconnlimit
制限を
通常のバックエンドに対してのみ適用し、制限にすでに達しているかどうかを確認する際は、通常のバックエンドに対してのみカウントします。
これらの制限は、通常のバックエンドのプロセススロットが過剰な消費を防ぐためのものですが、パラレルワーカーやその他の特殊なプロセスには、独自の制限チェックを備えた独自のプロセススロットプールがあります。
LWLock待機イベント名から「Lock」接尾辞が削除されました。 (Bertrand Drouvot) §
リファクタリングによって、意図せずpg_stat_activity
ビューに「Lock」接尾辞を持つロック関連の待機イベント名が表示されるようになりましたが、特にpg_wait_events
との結合が壊れていました。
ScalarArrayOp(= ANY
)条件でのbtreeインデックススキャンで一致するすべてのタプルを返せない可能性が修正されました。
(Peter Geoghegan)
§
ウィンドウ集約で古い結果が再利用される可能性が修正されました。 (David Rowley) §
「run condition」最適化と参照渡しの結果型を持つウィンドウ集約で、新しい計算を実行する代わりに、前のパーティションの結果を誤って返す可能性がありました。
TransactionXmin
をMyProc->xmin
と同期させるようになりました。
(Heikki Linnakangas)
§
この見落としにより、プロセスがすでにバキュームされていたデータにアクセスしようとする可能性がありました。 結果として、一時的な「could not access status of transaction」エラーが発生することが知られています。
新しく挿入されたカタログエントリをカタログキャッシュリストに追加できない可能性がある競合状態が修正されました。 (Heikki Linnakangas) §
この結果、例えば、既存のセッション内で新たに作成された関数を使用できなくなる可能性がありました。
システムカタログが更新と同時にバキュームされる時にカタログが破損するのが防止されました。 (Noah Misch) § §
リレーションの切り捨てが失敗した場合に発生するデータ破損が修正されました。 (Thomas Munro) § § §
リレーションの切り捨て実行に必要なファイルシステムコールが失敗し、ディスクに不整合な状態が残る可能性があります(例えば、削除されたデータが実質的に復活してしまうなど)。 これを実際に防ぐことはできませんが、そのような失敗をPANICにすることで、WALから切り捨てが試行される直前までをリプレイすることで整合性を回復できます。 これは必ずしも望ましい動作ではありませんが、このような失敗は非常にまれであるため、許容できる解決策であると考えられます。
リレーションの切り捨て中にチェックポイントが開始されないようになりました。 (Robert Haas) §
これにより、チェックポイントが完了する前に変更されたファイルがfsyncされず、直後にオペレーティングシステムがクラッシュした場合にデータ破損の危険性があるという競合状態が回避することができます。
データベースの所有者を変更するREASSIGN OWNED
とVACUUM
が同時に実行された場合に、pg_database
.datfrozenxid
の更新情報を失う可能性が回避されました。
(Kirill Reshke)
§
AFTER UPDATE
トリガに渡される不正なtg_updatedcols
の値が修正されました。
(Tom Lane)
§
場合によっては、tg_updatedcols
ビットマップが、同一トランザクション内の以前のコマンドによって更新された一連の列集合を表すことがあり、トリガが誤った処理を実行する可能性がありました。
また、tg_updatedcols
ビットマップのコピーを過剰に作成することによるメモリの膨張が防止されました。
パーティションテーブルを参照する外部キー制約を持つパーティションのデタッチが修正されました。 (Amul Sul) §
通常、外部キーはパーティションテーブルの最上位レベルで定義されます。
しかし、代わりに外部キーがパーティション上で定義され、別のパーティションテーブルを参照している場合、参照元のパーティションが切り離されると、関連するpg_constraint
エントリが誤って更新されていました。
その結果、「could not find ON INSERT check triggers of foreign key constraint」などのエラーが発生していました。
ドメイン上のNOT NULL
制約に対するpg_get_constraintdef
のサポートが修正されました。
(Álvaro Herrera)
§
to_timestamp
のFF
書式コードの誤った処理が修正されました。
(Tom Lane)
§
n
FF
の直前の整数書式コードは、利用可能な桁数をすべて消費してしまい、n
FF
のための桁数が何も残らない問題が発生していました。
n
SQL/JSONクエリ関数のPASSING
句を逆解析するときは、必要に応じて変数名を二重引用符で囲むようになりました。
(Dean Rasheed)
§
XMLTABLE()
式を逆解析するときは、必要に応じてXML名前空間名を二重引用符で囲むようになりました。
(Dean Rasheed)
§
pg_hba_file_rules()
の出力にldapscheme
オプションが含まれるようになりました。
(Laurenz Albe)
§
§
入力列のデータ型がすべて一致しない場合のソート済UNION
操作のプランニングが修正されました。
(David Rowley)
§
このエラーにより、間違ったソート演算子でデータがソートされる可能性があり、その結果は目に見える問題がない場合からコアダンプが発生する場合まで、さまざまな結果が生じる可能性がありました。
列の照合順序が一貫していない場合は、UNION
操作をマージしないように修正されました。
(Tom Lane)
§
以前は、UNION
ステップを単一のN方向UNION
操作にマージするのが安全かどうかを判断する際に、照合順序を無視していました。
これは、非決定論的照合順序が導入される前はおそらく有効でしたが、現在では使用されている照合順序が一意性の定義に影響を与える可能性があるため、もはや有効ではありません。
外部結合の下にある副問い合わせをプルアップした後の「wrong varnullingrels」プランナエラーが防止されました。 (Tom Lane) § §
統計情報を検索するときに、NULLになるリレーションのマーカービットを無視するようになりました。 (Richard Guo) §
この見落としにより、式に関する適切な統計処理が使用できなかったり、「corrupt MVNDistinct entry」エラーが発生する可能性がありました。
パーティション除去ステップにおける式処理の見落としが修正されました。 (Tom Lane) §
この見落としにより、パーティションテーブルにアクセスする問い合わせで、「unrecognized node type」エラーやその他の問題が発生する可能性がありました。
slotsyncワーカープロセスに独自のプロセススロットを割り当てるようになりました。 (Tom Lane, Hou Zhijie) §
slotsyncワーカーの追加時にこの点が見落とされていたため、その結果、そのプロセススロットが通常のバックエンドプロセス用のプールから実質的に外れてしまいました。
この結果、通常のバックエンドプロセスの数がmax_connections
に近づいた場合に、ワーカーの起動に失敗したり、設定に従って成功するはずだった接続要求が失敗する可能性がありました。
dshashテーブルが1ギガバイトを超えて拡張できるようになりました。 (Matthias van de Meent) §
これにより、「invalid DSA memory alloc request size」などのエラーが回避されます。 これは、例えば数百万の表を処理するトランザクションで発生する可能性がありました。
bringetbitmap()
で発生する可能性のある整数オーバーフローが回避されました。
(James Hunter, Evgeniy Gorbanyov)
§
この結果は統計目的でのみ使用されるため、このエラーの影響は主に見た目に関するものでした。
SLRUバンク数の計算ミスが修正されました。 (Yura Sokolov) §
このエラーにより、意図したバンク数よりも少ないバンク数が使用されたため、より多くの競合が発生しましたが、機能上の不具合はありませんでした。
すでに設定されているプロセスラッチによって、postmasterがソケットイベントを認識できないことは発生しなくなりました。 (Thomas Munro) §
バックエンドによるワーカーの起動と終了のワークロードが非常に重いと、postmasterがクライアントからの接続にタイムリーに応答できなくなる可能性がありました。
ストリーミングスタンバイサーバがページをまたぐWALレコードを読み込む際の無限ループの発生が防止されました。 (Kyotaro Horiguchi, Alexander Kukushkin) §
これは、レコードの継続が別のWALソースから読む必要のあるページにある場合に発生していました。
プロセスの初期起動中にFATALエラーが意図せずPANICに昇格してしまう問題が修正されました。 (Noah Misch) §
これにより、「PANIC: proc_exit() called in child process」というエラーが発生する可能性の低いケースが修正されます。
演算子族メンバの演算子、またはサポートプロシージャが宙に浮いた参照になる可能性があるケースが修正されました。 (Tom Lane) § §
pg_amop
またはpg_amproc
にOIDへの参照が残っている状態でデータ型が削除される場合がありました。
これによって直ちに問題が発生することはありませんが、所有する演算子族を削除しようとすると失敗し、pg_dumpが演算子族をダンプする際に誤った出力を生成することがありました。
この修正により、演算子族クラスの作成と変更に必要な依存関係エントリが追加され、データ型を削除すると依存する演算子族要素も削除されます。
しかし、これは脆弱な既存の演算子族には役立ちませんので、宙に浮いたメンバを持つ演算子族を削除する際の失敗を防ぐための対策がDROP OPERATOR FAMILY
に追加されました。
ロジカルデコーディングの出力における複数のメモリリークが修正されました。 (Vignesh C, Masahiko Sawada, Boyu Yang) § § §
application_name
またはcluster_name
設定を更新するときの小さなメモリリークが修正されました。
(Tofig Aliev)
§
バックグラウンドプロセスがsynchronized_standby_slots
の新しい値をチェックしようとしたときのクラッシュが回避されました。
(Álvaro Herrera)
§
wal_skip_threshold
条件のテスト中の整数オーバーフローが回避されました。
(Tom Lane)
§
非常に大きなリレーションを作成したトランザクションは、fsyncではなくWALにリレーションをコピーすることで永続性を確保しようと誤って判断し、wal_skip_threshold
の効果が無効になる可能性がありました。
(これは、wal_level
がminimal
に設定されている場合にのみ問題となります。それ以外の場合は、いずれにしてもWALコピーが必要です。)
キャッシュ検索時の安全でない操作順序が修正されました。 (Noah Misch) §
知られている唯一の影響は、GRANT TABLESPACE
時に「you don't own a lock of type ExclusiveLock」という通常は無害なWARNINGが表示されることでした。
並列バキュームでのメモリ解放後使用の可能性が回避されました。 (Vallimaharajan G, John Naylor) §
このバグは標準的なビルドでは影響がないように見えますが、理論的には危険です。
古いARMプラットフォームでJITを使用した場合に発生する可能性がある「failed to resolve name」エラーが修正されました。 (Thomas Munro) §
これは、gccとclangとの間で-moutline-atomics
のデフォルト設定に一貫性がないために発生する可能性があります。
少なくともDebianとUbuntuは、armv8-aをターゲットとするgccとclangコンパイラを出荷していることが知られていますが、デフォルトのアウトラインアトミックの使用については異なっています。
WITH RECURSIVE ... UNION
の問い合わせでのアサーションエラーが修正されました。
(David Rowley)
§
集合操作のリーフ問い合わせに集合操作が含まれている場合、ルールの逆解析でのアサーションエラーが回避されました。 (Man Zeng, Tom Lane) §
パラレルクエリ起動時のエッジケースでのアサーションエラーが回避されました。 (Tom Lane) §
シャットダウンで統計ファイルを書き出すときのアサーションエラーが修正されました。 (Michael Paquier) §
文字列ハッシュコードに関するvalgrindの警告が修正されました。 (John Naylor) §
NULLIF()
では、読み書き拡張オブジェクトポインタをデータ型の等価関数に渡さないようになりました。
(Tom Lane)
§
読み書き可能なポインタが渡されると、等価関数はオブジェクトを変更または削除する可能性があります。
そのため、NULLIF()
の結果としてそのポインタを返すことにした場合、問題が発生する可能性があります。
組み込みの等価関数ではおそらく問題はありませんが、PL/pgSQLでコーディングされた等価関数で失敗を示すのは簡単です。
INSERT
のデフォルトのNULL値に式の前処理が適用されるようになりました。
(Tom Lane)
§
対象列がドメイン型の場合、プランナは単なるNULL定数だけでなくcoerce-to-domainステップを挿入する必要があり、この式はいくつかの必要な処理ステップを実行していませんでした。 コアデータ型に基づくドメインでの既知の影響はありませんが、理論的には拡張型に基づくドメインでエラーが発生する可能性がありました。
すでにデータが含まれているリレーションフォークでバルク書き込みを開始するときのデータ損失が回避されました。 (Matthias van de Meent) §
既存のデータはすべてゼロで上書きされました。 これはPostgreSQLコアではこのようなことは決しておこなわれませんので、問題になりません。 ただし、一部の拡張ではそうしたいものもあります。
サーバプロセスが作成していない共有基数木を反復処理しようとした場合のクラッシュが回避されました。 (Masahiko Sawada) §
PostgreSQLコアにはこれを実行するコードはありませんが、拡張では実行を希望するかもしれません。
PL/Pythonのメモリリークが修復されました。 (Mat Arye, Tom Lane) §
PLyPlan.execute
またはplpy.cursor
を繰り返し使用すると、PL/Python関数の呼び出し中にメモリリークが発生していました。
PL/TclがTcl 9でコンパイルできるように修正されました。 (Peter Eisentraut) §
ecpgプリプロセッサで、スコープ外の変数を参照するカーソルの誤った処理の可能性が修正されました。 (Tom Lane) §
ecpgで、サポートされていないCOPY ... FROM STDIN
の使用に関するコンパイル時の警告が修正されました。
(Ryo Kanbayashi)
§
以前は、タイプミスのために意図した警告が発行されませんでした。
psqlが、SJISでエンコードされたファイルパス名を安全に処理できるように修正されました。 (Tom Lane) §
SJISのいくつかの2バイト文字では、2バイト目がASCIIのバックスラッシュ(\
)に相当します。
これらの文字は、パス名の正規化によって破損していたため、ファイル名にそのような文字が含まれるファイルにアクセスできない問題がありました。
psqlでCOPY (MERGE INTO)
タブ補完機能が追加されました。
(Jian He)
§
pgbenchとpsqlにおけるpqsignal()
の間違ったバージョンの使用が修正されました。
(Fujii Masao, Tom Lane)
§
このエラーにより、pgbenchの-T
オプションやpsqlの\watch
コマンドの使用時に、中断されたシステムコールが期待通りに再開されないため、誤動作が発生する可能性がありました。
pgbench内の一部のネストされた\if
構造の誤った実行が修正されました。
(Michail Nikolaev)
§
偽の(実行されていない)\if
分岐内に現れた\if
コマンドが誤って\elif
と同じように扱われていました。
pgbenchで、テーブルの初期化中に進行状況メッセージが誤って表示される可能性が修正されました。 (Yushi Ogiwara, Tatsuo Ishii, Fujii Masao) § §
pg_controldataが破損したpg_control
ファイルに対してより堅牢になりました。
(Ilyasov Ian, Anton Voloshin)
§
pg_controldataはCRCチェックが失敗してもpg_control
の内容を出力しようとするため、無効なフィールド値に対して誤動作しないように注意しなければなりません。
このパッチにより、無効なタイムスタンプと明らかに負のWALセグメントサイズによって引き起こされるいくつかの問題が修正されました。
拡張メンバであるテーブルにIDシーケンスがアタッチされている場合に、pg_dumpで発生する可能性のあるクラッシュが修正されました。 (Tom Lane) §
zstd圧縮データを使用したpg_restoreのメモリリークが修正されました。 (Tom Lane) §
リークは解凍操作ごとに発生していたため、多数のテーブルや大きなオブジェクトを含むダンプで最も顕著になります。
Windowsで2ギガバイトを超えるpg_wal.tar
ファイルを正しく処理できるようにpg_basebackupが修正されました。
(Davinder Singh, Thomas Munro)
§
§
contrib/earthdistance
のSQL言語関数の宣言で、標準SQL関数の本体を使用するようになりました。
(Tom Lane, Ronan Dunklau)
§
この変更により、拡張の作成時にcontrib/cube
への参照が解決され、検索パスに基づく障害や攻撃のリスクが軽減されます。
特に、PostgreSQL v17がセキュリティ上の理由から検索パスを制限している生成列のようなコンテキストでの使いやすさが回復されます。
これにより、データベースをv17にアップグレードできないという報告を受けています。
このパッチは、回避策を提供するためにv16に含まれています。earthdistance
拡張を事前にこのバージョンにアップデートしておけば、アップグレードは成功するはずです。
contrib/pageinspect
のSQL宣言と基礎となる共有ライブラリとの間のバージョン不一致を検出するようになりました。
(Tomas Vondra)
§
以前は、このような不一致によりbrin_page_items()
の呼び出し時にクラッシュが発生する可能性がありました。
代わりに、拡張のアップデートを推奨するエラーが発生するようになりました。
contrib/postgres_fdw
でリモート問い合わせをキャンセルしようとした際に、何もおこなわれなかったように見える場合は、キャンセル要求を数回再発行するようになりました。
(Tom Lane)
§
これにより、リモートサーバが処理を開始する前に送信されたばかりの問い合わせをキャンセルしようとする競合状態が修正され、最初のキャンセルリクエストは無視されるようになります。
ARM CRC命令にアクセスするために必要なコンパイラスイッチを決定する設定プローブが更新されました。 (Tom Lane) §
ベースラインCPUターゲットにCRC命令がないARMプラットフォームでは、コンパイラにそのような命令をコンパイルさせるために-march
スイッチを指定する必要があります。
最近のバージョンのgccは、私たちが試していた値を拒否し、ソフトウェアCRCに自動的にフォールバックします。
Windows上で古いOpenSSLライブラリをサポートするように、mesonビルドシステムが修正されました。 (Darek Slusarczyk) §
従来のライブラリ名ssleay32
とlibeay32
のサポートが追加されました。
mesonを使用したWindowsビルドで、すべてのlibcommon関数とlibpgport関数のエクスポートが確認されるようになりました。 (Vladlen Popolitov, Heikki Linnakangas) § §
これにより、拡張ビルド時の「unresolved external symbol」エラーが修正されます。
MSVCでOSSPのuuid.h
ヘッダファイルを正しく検出するようにmeson設定プロセスが修正されました。
(Andrew Dunstan)
§
mesonでビルドする場合、pgevent
をbindir
ではなくpkglibdir
にインストールするようになりました。
(Peter Eisentraut)
§
これは、makeベースのビルドシステムと古いMSVCビルドシステムの動作と一致しています。
mesonでビルドする場合、sepgsql.sql
をshare/extension/
ではなくshare/contrib/
の下にインストールするようになりました。
(Peter Eisentraut)
§
これは、makeベースのビルドシステムの動作と一致しています。
タイムゾーンデータファイルを、パラグアイのサマータイム法の変更とフィリピンの歴史的修正をしたtzdataリリース2025aに更新しました。 (Tom Lane) §