PostgreSQL 8.0.3 に関する技術情報

このリリースは PostgreSQL 8.0.3 (2005/05/09リリース)に関する技術情報をお届けします。本ドキュメントは PostgreSQL のリリースノートを元に弊社で解説を加えたものです。

PostgreSQL 8.0.2 から 8.0.3 への変更点

8.0.2からの累積的な修正バージョンです。セキュリティに関係した修正を含みます。これらセキュリティ上のエラーにより、少なくとも、権限を持たないデータベースユーザがサーバプロセスをクラッシュさせることができます。また、権限を持たないユーザがデータベーススーパーユーザ権限を手に入れることができる可能性もあります。速やかなバージョンアップを推奨します。

8.0.xからの移行ではダンプ/リストアは不要です。しかし、8.0.xのシステムカタログで見つかった2つの重大なセキュリティ問題を突かれる可能性があります。ダンプ、8.0.3のinitdbを使用したinitdb、リロードを行うことで、自動的にこれらの問題を修正します。また、バージョン8.0.0もしくは8.0.1からアップグレードする場合は、共有ライブラリ変更の影響を受ける可能性があります(詳しくは8.0.2の変更点の文書を参照してください。

セキュリティ関係の修正

    1. 組み込みの文字セット符号化変換関数により、権限を持たないユーザがSQLコマンドを呼び出すことができるというセキュリティホールが修正されました。これまでは悪意のある引数の設定に対する安全性がありませんでした。この修正により、これらの関数の宣言されたパラメータリストがSQLコマンドから呼び出されないように変更されました。(通常の符号化変換機構の使用には影響はありません)
    2. contrib/tsearch2モジュールが、internal型の引数を取らない場合に間違ってinternalを返すものと宣言された関数を複数作成することです。これによりinternal型の引数を使用するすべての関数について、型の安全性が損なわれます。INTERNAL結果の関数の危険な使用を防止するように、contrib/tsearch2を変更しました。

上記のセキュリティ修正を適用するには実行ファイルを差し替えるだけでなく、データベースクラスタを修正する必要があります。データベースクラスタを修正するには、ダンプ/リストアをするか、以下の手動修正手順を実行する必要があります

手動修正手順

スーパーユーザ権限で以下の手続きを行ってください。

BEGIN;
UPDATE pg_proc SET proargtypes[3] = 'internal'::regtype
WHERE pronamespace = 11 AND pronargs = 5
      AND proargtypes[2] = 'cstring'::regtype;
-- このコマンドは90行を更新したと報告するはずです。
-- 異なる場合は、コミットせずにロールバックして調査を行ってください。
COMMIT;

contrib/tsearch2をインストールしている場合、次に以下を実行してください。

BEGIN;
UPDATE pg_proc SET proargtypes[0] = 'internal'::regtype
WHERE oid IN (
    'dex_init(text)'::regprocedure,
    'snb_en_init(text)'::regprocedure,
    'snb_ru_init(text)'::regprocedure,
    'spell_init(text)'::regprocedure,
    'syn_init(text)'::regprocedure
);
-- このコマンドは5行を更新したと報告するはずです。
-- 異なる場合は、コミットせずにロールバックして調査を行ってください。
COMMIT;

このコマンドが「”dex_init(text)”関数は存在しません」といったメッセージで失敗したら、データベースにtsearch2がインストールされていないか、すでに更新済みであるかのどちらかです。

上の手続きを、template1を含むインストレーション内のすべてのデータベースで行わなければなりません。理想を言えば、template0に対しても実施してください。テンプレートデータベースで修正を行わなかった場合、この後に作成されるデータベースにこのエラーが含まれてしまいます。 template1は他のデータベースと同じ方法で修正できますが、template0では更に行わなければならないことがあります。まず、任意のデータベースから以下を実行してください。

UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';

次に、template0に接続し、上記修正手続きを実施してください。最後に以下を実行してください。

-- 再度template0を凍結させます
VACUUM FREEZE;
-- そして、今後の変更に対し保護します。
UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';

重大な修正

    1. ある目的(例えばSELECT FOR UPDATE)用にコミットされるように見えるトランザクションが直後に別の目的用にコミットされるという従来から存在した競合状況が修正されました。本修正前では一貫性が明らかにないデータが短期間アプリケーションから参照できてしまいます。
    2. リレーションの拡張とVACUUMとの間の競合状態が修正されました。理論上(修正前の状態では)新たに挿入されたページの価値が失われます。しかしこうした状況が発生する頻度はきわめてまれで、アサートエラー以外に発生した事例はありません。

その他の修正

    1. TIME WITH TIME ZONE型の値の比較が修正されました。
    2. –enable-integer-datetimes設定スイッチが使用されている場合、この比較コードに間違いがありました。注意: この修正により列値のソート順が正しくなるように変更されましたので、TIME WITH TIME ZONE型の列に対するインデックスを持つ場合、この更新をインストールした後にREINDEXを行う必要があります。
    3. TIME WITH TIME ZONE型の値に対するEXTRACT(EPOCH)を修正しました。
    4. INTERVAL型の値の秒の小数部分において、負の値が間違って表示される点が修正されました。このエラーは、–enable-integer-datetimes設定スイッチが使用された場合にのみ発生します。
    5. %を名前含むトリガを正しくダンプできるようにpg_dumpが修正されました。
    6. contrib/intaggに対する更なる64ビット向けの修正が行われました。
    7. COALESCE(NULL,NULL)でのクラッシュを防止するように修正されました。
    8. RECORD型を返す関数の最適化の間違いが修正されました。
    9. libpq用のBorland向けmakefileが修正されました。
    10. timetz型に対するcontrib/btree_gistが修正されました。
    11. プロセスがまだ稼動しているかどうかを確認するために、pg_ctlでpostmaster.pid内のPIDがあるかどうかを検査するようになりました。
    12. ダンプのタイムスタンプ追加により起こるpg_dump/pg_restoreの問題が修正されました。
    13. 保持可能なカーソルの実現とトランザクションコミット時の遅延されたトリガの発行との間の相互作用が修正されました。
    14. 参照渡しのデータ型を返すSQL関数におけるメモリリークを修正されました。

 

本ページは、オンラインマニュアルのリリースノート(およびその邦訳)ならびにソースに付属の HISTORY ファイルをもとに作成しています。