PostgreSQL 7.4.13 に関する技術情報

このリリースは 7.4.12 からの修正リリース(2006/5/23リリース)です。

以下に変更点をまとめます。各項目の末尾に適用されるバージョンを記載しております。本ドキュメントは PostgreSQL のリリースノート/HISTORY ファイルを元に作成しています。

PostgreSQL 7.4.12 から 7.4.13 への変更点

8.1.4、8.0.8、7.4.13、7.3.15 の各バージョンが同時にリリースされており、本ページでは共通の記載としています。各修正項目が適用されるバージョン系列番号を項目末尾に括弧書きで記載しています。


    セキュリティに関する修正

  1. 常にサーバ側で無効なコードのマルチバイト文字を拒否するように修正されました (8.1系〜7.3系)

    これにより、一律にすべての文字エンコーディングのすべてのテキスト入力に対して検査が行われ、単に警告が出るのではなく常にエラーが出るようになりました。この変更は CVE-2006-2313 に記述されているような SQL インジェクション攻撃に対抗するものです。

  2. 文字列リテラル中の安全でない「¥'」を拒否する機能が追加されました (8.1系〜7.3系)

    CVE-2006-2314 に記述されている類の SQL インジェクション攻撃をサーバ側で防ぐため、SQL 文字列リテラルとして '' だけを受け付け、 ¥' を受け付けないように変更されました。デフォルトでは client_encoding が SQL インジェクション可能であるようなクライアント側専用のエンコーディング(SJIS、BIG5、GBK、GB18030、UHC など)に設定されている場合のみ、 ¥' が拒否されます。

    この振る舞いを調整するため、新たな設定パラメータ backslash_quote が追加されました。なお、CVE-2006-2314 を完全に防ぐには、おそらくクライアント側の修正も必要です。backslash_quote は、安全でないクライアントが「安全でない」ことを明らかにするのを目的としています。

  3. libpq の文字列エスケープ処理がエンコーディングと SQL 標準文字列構文を考慮するよう修正されました (8.1系〜7.3系)

    これは libpq を使ったアプリケーションのセキュリティ問題(CVE-2006-2313、CVE-2006-2314) を修正し、SQL 標準の文字列リテラル構文への書き換えを計画するときの"将来の検証"を提供するものです。PostgreSQL へ同時に複数の接続を使うアプリケーションは、各データベース接続で確実に正しくエスケープが行われるように、接続関数を PQescapeStringConn() と PQescapeByteaConn() に移植するべきです。文字列のエスケープ処理を手作業で行っているアプリケーションはライブラリのルーチンを変わりに使うように修正すべきです。

  4. ※CVE(Common Vulnerabilities and Exposures)は非営利団体 MITRE Corporation による脆弱性のリストに付けられる識別番号。http://cve.mitre.org/ で検索できます。(今回の番号は現時点ではまだ under review の扱いです)

    不具合の修正

  5. いくつかの不正なエンコーディング変換関数が修正されました(8.1系〜7.3系)

    win1251_to_iso, win866_to_iso, euc_tw_to_big5, euc_tw_to_mic, mic_to_euc_tw が該当します。

  6. contrib やリグレッションテストなどに残っていた文字列中の ¥' がすべて修正されました (8.1系〜7.3系)

  7. 自動 Vacuum が pg_stat_activity ビューから見えるように修正されました (8.1系)

  8. 設定パラメータ full_page_writes が利用できなくなりました (8.1系)

    full_page_writes を off にすると、ある場合にクラッシュリカバリーで失敗します。適切な修正はバージョン 8.2 で登場する予定で、現在は単に指定不可とします。

  9. 特にビットマップインデックススキャンと MIN、MAX 関数の最適化にかかわる部分でプランナにさまざまな修正がされました (8.1系)

  10. Merge Join の不適切な最適化が修正されました (8.1系)

    外部結合がマッチしていない行を複数コピーしてしまう問題を修正しています。

  11. plgpsql 関数の使用と修正を同一トランザクション内で行うとクラッシュする問題が修正されました (8.1系)

  12. B-Tree インデックスが TRUNCATE された場合におけるWAL再生(リカバリ時の動作)が修正されました (8.1系)

  13. SIMILAR TO で「|」を含むパターンの処理が修正されました (8.1系〜7.4系)

  14. SELECT INTO および CREATE TABLE AS でテーブル作成するとき、ベースディレクトリでなく、デフォルトテーブルスペースに作成するように修正されました。(8.1系、8.0系)

  15. カスタム DH SSL パラメータを正しく扱えるように修正されました (8.0系、7.4系)

  16. インテル Mac 上の Bonjour 対応が修正されました (8.1系〜7.4系)

  17. さまざまな軽微なメモリーリークが修正されました。(8.1系〜7.3系)

  18. Windows におけるパスワードプロンプトの問題が修正されました (8.1系、8.0系)

  19. pg_restore -n がドキュメント通り動作するように修正されました (8.1系)

  20. OR を伴うインデックススキャンでときに返すべき行を見逃す障害が修正されました (8.0系、7.4系)

  21. contribツールの修正

  22. pgcrypto で脆弱なキー選択が修正されました (8.1系)

    一部のケースで、Fortuna PRNG 再シーディングロジックで予想可能なセッションキーが pgp_sym_encrypt() で選択されてしまう障害に対応。この修正は OpenSSL 以外を使ってビルドした場合のみ影響をうけます。

  23. その他の変更

  24. qsort のパフォーマンスが改善されました (8.1系)

    ただし、現在このコードは Solaris 上だけで使われています。

  25. pg_dump でドメインのデフォルト値の扱いが改善されました (8.1系)

  26. pg_dumpall で同一名のユーザ、グループを合理的に扱うように修正されました (8.1系)

    8.1 よりも前のバージョンのサーバからダンプする場合に、同一名のユーザ・グループはひとつのログイン可能なロールに統合されます。以前は統合されたロールにログイン許可がなく、使いにくくなっていました。

  27. 8.1.4 で追加された設定パラメータ

    backslash_quote (string)

    この設定は、文字列リテラルの中のクオート(')が「¥'」によって表されることができるかどうかを制御する。

    記述方法としては、SQL標準のクオートを2つ重ねる('')方法が好ましいが、PostgreSQL では歴史的に「¥'」も受け入れてきた。しかしながら、「¥'」を使うと、マルチバイト文字の終端バイトが ASCII の「¥」と同じ値であるような一部のクライアントエンコーディングでセキュリティーリスクが生じる。クライアント側で正しくエスケープできていない場合、SQL インジェクション攻撃が可能になる。この危険性はサーバでバックスラッシュ(¥)でエスケープされたクオート(')を含むクエリーを拒否することで防ぐことができる。

    backslash_quote を on にすると「¥'」を常に許可し、off にすると「¥'」を常に拒否する。また、safe_encoding と指定するとクライアントエンコーディングがマルチバイト文字の中にASCIIの「¥」を含めることを許さない場合のみ「¥'」によるエスケープを許可する。safe_encoding はデフォルトの設定である。