リリース日: 2005-05-09
このリリースは、複数のセキュリティ関連の問題を含む、7.4.7の各種不具合を修正したものです。
7.4.Xからの移行ではダンプ/リストアは不要です。 しかし、7.4.Xのシステムカタログで見つかった2つの重大なセキュリティ問題を突かれる可能性があります。 ダンプ、7.4.8のinitdbを使用したinitdb、リロードを行うことで、自動的にこれらの問題を修正します。
より重大なセキュリティ問題は、組み込みの文字セット符号化変換関数により、権限を持たないユーザがSQLコマンドを呼び出すことができるという点です。 このような用途のためにこれらの関数を設計していませんでしたが、悪意のある引数の設定に対する安全性がありませんでした。 この修正により、これらの関数の宣言されたパラメータリストがSQLコマンドから呼び出されないように変更されました。 (通常の符号化変換機構の使用には影響はありません。)
もうひとつの問題は、contrib/tsearch2モジュールが、internal型の引数を取らない場合に間違ってinternalを返すものと宣言された関数を複数作成することです。 これによりinternal型の引数を使用するすべての関数について、型の安全性が損なわれます。
initdb、もしくは、後述の手作業による修正手順に従って、すべてのインストレーションにおいてこれらのエラーを修正することを強く勧めます。 これらのエラーにより、少なくとも、権限を持たないデータベースユーザがサーバプロセスをクラッシュさせることができます。 また、権限を持たないユーザがデータベーススーパーユーザ権限を手に入れることができる可能性もあります。
initdbを行いたくないのであれば、スーパーユーザ権限で以下の手続きを行ってください。
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';
誤使用を防ぐために符号化関数のシグネチャを変更しました。
INTERNAL結果の関数の危険な使用を防止するように、contrib/tsearch2を変更しました。
ある目的(例えばSELECT FOR UPDATE)用にコミットされるように見えるトランザクションが直後に別の目的用にコミットされるという従来から存在した競合状況を修正しました。
一貫性が明らかにないデータが短期間アプリケーションから参照できてしまうため、これはきわめて重大な不具合です。
リレーションの拡張とVACUUMとの間の競合状態を修正しました。
理論上、これにより新たに挿入されたページの価値が失われます。 しかしこうした状況が発生する頻度はきわめてまれで、アサートエラー以外に発生した事例はありません。
TIME WITH TIME ZONE型の値の比較を修正しました。
--enable-integer-datetimes設定スイッチが使用されている場合、この比較コードに間違いがありました。 注意: この修正により列値のソート順が正しくなるように変更されましたので、TIME WITH TIME ZONE型の列に対するインデックスを持つ場合、この更新をインストールした後にREINDEXを行う必要があります。
TIME WITH TIME ZONE型の値に対するEXTRACT(EPOCH)
を修正しました。
INTERVAL型の値の秒の小数部分において、負の値が間違って表示される点を修正しました。
このエラーは、--enable-integer-datetimes設定スイッチが使用された場合にのみ発生します。
バックエンドのシャットダウン中に行われた操作が統計情報コレクタで確実に集計されるようにしました。
これは、システムカタログのバキューム処理が十分な間隔で行われていないというpg_autovacuumの報告を解消するためのものです。 バックエンド終了時の一時テーブル削除が原因のカタログの削除に関するものではありません。
plpgsqlにおいて更にバッファオーバーランの検査を追加しました。(Neil)
%を名前含むトリガを正しくダンプできるようにpg_dumpを修正しました。
より最近のOpenSSLによる構築のためにcontrib/pgcryptoを修正しました。(Marko Kreen)
contrib/intaggに対する更なる64ビット向けの修正を行いました。
RECORD型を返す関数の最適化の間違いを修正しました。
月に関連した書式のためにto_char(interval)
がコアダンプすることを防止しました。
COALESCE(NULL,NULL)でのクラッシュを防止しました。
PL関数を正しく呼び出すようにarray_map
を修正しました。
ALTER DATABASE RENAMEにおける権限検査を修正しました。
ALTER LANGUAGE RENAMEを修正しました。
RemoveFromWaitQueue
がその終了時に整理するようにしました。
これは、トランザクションがロック待ち状態(問い合わせのキャンセルによりよく発生します)に陥り、ロック獲得側が非常に短期間でロックを解放する場合にのみ発生する、ロック管理エラーを修正します。
INSERT ... SELECT内の型付けされていないパラメータがある場合の問題を修正しました。
ALTER TABLE SET WITHOUT OIDS後のCLUSTERの失敗を修正しました。