PostgreSQLに2月3日,セキュリティ・パッチがリリースされた。今回はこの話題と,PostgreSQLの関連オープンソース・ソフトウエアの開発をホスティングするサイトpgfoundry,ログ解析ツールpqaを紹介する。

PostgreSQL 7.2/7.3/7.4/8.0系列に一斉にセキュリティ・パッチ

 PostgreSQLでは,CREATE FUNCTIONというコマンドを使ってC言語レベルでユーザー定義関数を作成し,自由にデータベース・エンジンの機能を拡張できる。反面,この機能を使うと任意のプログラムが実行できるので,セキュリティの観点からはPostgreSQLのスーパーユーザーだけがC言語関数でのCREATE FUNCTIONコマンドの実行を許されていた。

 一方,LOADというコマンドが別に用意されている。CREATE FUNCTIONで定義された関数は,最初の実行の際に自動的にオブジェクトがデータベース・エンジンにロードされる。LOADを使うとあらかじめオブジェクトをロードしておけるので,関数の最初の実行の際にかかるオブジェクトのロード時間を短縮できる。

 従来はLOADコマンドは一般ユーザーでも実行できた。LOADは単にオブジェクトをロードするだけであり,一般ユーザーが実行してもセキュリティ上問題にならないと考えられていたからだ。しかし実はそうではなかった,というのが今回セキュリティ・パッチがリリースされた理由である。

 一部のプラットフォームでは,オブジェクトがロードされた際に,自動的に実行される初期化コードを設定できる。このことを悪用すれば,LOADコマンドを使って一般ユーザーが任意のコードをPostgreSQLのスーパユーザー権限で実行できてしまうことになる( こうしたプラットフォームには,WindowsおよびELFベースのオブジェクト・フォーマットを採用したプラットフォーム,すなわちLinuxとFreeBSDが少くとも含まれている)。

 この問題を解決するには,LOADコマンドをPostgreSQLのスーパーユーザーだけが実行できるようにすれば良い。

 こうした問題提起を受け,PostgreSQL 7.2/7.3/7.4/8.0系列に一斉にセキュリティ・パッチなどの修正が行われ,PostgreSQL 7.2.7,7.3.9,7.4.7,8.0.1が最新安定版としてリリースされるに至った。

 なお,念のために付け加えておくと,PostgreSQL(postmaster)が動いているサーバー・マシンに一般ユーザーがログインできない環境では,そもそも悪意のある初期化コードを仕込むことができない。そういった環境では,今回指摘されたセキュリティ・ホールは実際には問題にならない。

 LOAD以外にもセキュリティ・フィックスが行われた。そのうち重要なものを紹介する。

  • 集約関数のセキュリティ・ホール

     集約関数の内部で実行している関数の実行権限がチェックされていない問題が修正された(7.2.7をのぞく)。

  • PL/pgSQLでバッファ・オーバフロー

     PL/pgSQLで引数が多すぎるカーソルを使ったときにバッファ・オーバーフローが発生するバグが修正された。

    セキュリティ・フィックス以外の修正

    セキュリティ・フィックス以外にも修正が行われている。重要なものを示す。

  • FULL OUTER JOIN, RIGHT OUTER JOINのバグ

     FULL OUTER JOIN, RIGHT OUTER JOINを使った検索結果が正しくないことがあるバグが修正された。メーリングリストで報告された例を一部変更したものを示そう。

    
    DROP TABLE t1;
    CREATE TABLE t1 (
        col1 TEXT,
        col2 TEXT
    );
    
    DROP TABLE t2;
    CREATE TABLE t2 (
        col1 TEXT,
        col2 TEXT
    );
    
    INSERT INTO t1 VALUES('b', 'ac');
    INSERT INTO t1 VALUES('ba', 'a');
    INSERT INTO t1 VALUES('b', 'aac');
    INSERT INTO t1 VALUES('b', 'aab');
    
    INSERT INTO t2 VALUES('b', 'ac');
    INSERT INTO t2 VALUES('b', 'aac');
    INSERT INTO t2 VALUES('ba', 'a');
    INSERT INTO t2 VALUES('b', 'aaa');
    
     このテーブルに対し,以下のような検索を実行する。
    
    SELECT t1.col2 ,t2.col2 FROM t1 FULL OUTER JOIN t2 ON t1.col2=t2.col2
    ORDER BY t2.col2
    
     結果は以下のようになるはずだが,
    
     col2 | col2 
    ------+------
     a    | a
          | aaa
     aac  | aac
     ac   | ac
     aab  | 
    
     実際には以下のようになってしまった。
    
     col2 | col2 
    ------+------
     a    | a
          | aaa
     aab  | 
     aac  | aac
     ac   | ac
    
     このバグはPostgreSQLにOUTER JOINが実装されたPostgreSQL 7.1で既に存在していた。7.1は2001年にリリースされているので,4年もの間その見過ごされていたことになる。

    ホスティング・サイトpgfoundry

     PostgreSQLの関連オープンソース・ソフトウエアの開発をホスティングするサイトがpgfoundry.org(http://pgfoundry.org)である。pgfoundryはボランティアベースで運営されており,プロジェクトの登録や利用には費用がかからない。システムはGForgeというソフトウエアが使われており,ダウンロード用のアーカイブの管理,CVSリポジトリの公開,掲示板やメーリングリストなど,一通りの機能が揃っている。

     2月22日現在pgfoundryには59個のプロジェクトが登録されており,その中には日本発のオープンソースソフトウエアであるPGCluster(http://pgfoundry.org/projects/pgcluster/)やpgpool(http://pgfoundry.org/projects/pgpool/)も含まれている。人気のバロメータであるダウンロード件数ではどちらも10位以内に入るなど,健闘を見せている。

     ところで,ダウンロード・ランキング1位の「PostgreSQL installer」(Win32へのPostgreSQLのインストーラ)は別格として,3位以下を圧倒的に引き離して不動の2位の地位につけているのが「Practical Query Analyzer」(URLはhttp://pgfoundry.org/projects/pqa/,以下"pqa"と呼ぶ)である。今回はpqaを紹介しよう。