★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

E.169. リリース7.4.8

リリース日: 2005-05-09

このリリースは、複数のセキュリティ関連の問題を含む、7.4.7の各種不具合を修正したものです。 7.4メジャーリリースにおける新機能については項E.177を参照してください。

E.169.1. バージョン7.4.8への移行

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';

E.169.2. 変更点