ディレクトリトラバーサルの脆弱性への対応

掲載日時:2005年3月8日21時00分

 
 ディレクトリトラバーサルの脆弱性の概要
 ホームページ内全文検索エンジンmsearchは,WindowsおよびLinuxのサーバにおいて, ディレクトリトラバーサルの脆弱性が確認されました.

影響を受けるバージョン
msearch 1.50およびmsearch 1.51
対応方法
msearch 1.52にバージョンアップして下さい.
JVNナンバー

 想定される影響
 msearch 1.50以降に採用しているインデックス切り替え機能を用いることで, msearchが設置されているサーバの特定のファイルにアクセスすることが可能に なっています.

アクセスが可能なファイル
Webサーバの実行ユーザまたは実行グループでアクセス可能な任意のファイル. ただし,下の「情報漏えいの可能性のあるファイル」以外のファイルの場合, ファイルの内容が表示されることはありません.
情報漏えいの可能性のあるファイル
msearchの設定ファイル(default.cfg等)またはインデックス(default.idx等) と書式が同じテキストファイル.少しでも書式が異なるとファイルの内容が表 示されることはありません.Linuxで現在該当するファイルは確認されていません.
影響度
小さい

 対応方法の詳細
 対処方法には2通りあります.現在利用中のmsearchのバージョンが1.50または 1.51の場合に以下のいずれかの対応が必要となります.
  1. msearch 1.52にアップデートする
     msearchのトップページからmsearch 1.52をダウンロード し,解凍後に出来るmsearch.cgiを現在のmsearch.cgiに上書きして下さい.
    以上でアップデートが完了し,脆弱性がなくなります.

  2. msearch.cgiを直接書き換える
     現在のmsearch.cgiのソースコードを書き換えます. 書き換える場所は1箇所で,追加のサブルーチンも1つあります. 結局2箇所に手を加えることになります. 以下,msearch 1.51のmsearch.cgiを例に説明します.
    msearch.cgiの201行目(「### 設定ファイルの確定」という行)から,225行目 (「### 設定ファイルの読み込み」の直前の行)までを削除します.
    そしてこの削除したところに以下のコードを追加します.
      ### インデックスと設定ファイルを確定する
      identifyindex();
    
    そして次にmsearch.cgiの最後の行以降に以下のコードを追加します.
    msearch 1.52のmsearch.cgiでは,normalizeというサブルーチンの前にあります.
      ###
      ### インデックスと設定ファイルの確定
      ###
      sub identifyindex {
        ### インデックスの確定
        if($qarg->{'index'} eq "") {
          $g_indexfile = "./default.idx";
        } else {
          if($qarg->{'index'} =~ tr/a-zA-Z0-9//dc) {
            printerror("index入力が不正です");
          }
          $g_indexfile = "./" . $qarg->{'index'} . ".idx";
          $v_index = $qarg->{'index'};
        }
    
        ### 設定ファイルの確定
        if($qarg->{'config'} ne "") {
          if($qarg->{'config'} =~ tr/a-zA-Z0-9//dc) {
    	    printerror("config入力が不正です");
          }
          $g_config = "./" . $qarg->{'config'} . ".cfg";
          $v_config = $qarg->{'config'};
        } else {
          if($qarg->{'index'} ne "") {
            my $tmp_config = "./" . $qarg->{'index'} . ".cfg";
            if(-e $tmp_config) {
              $g_config = $tmp_config;
            } else {
              $g_config = "./default.cfg";
            }
          } else {
            $g_config = "./default.cfg";
          }
        }
      }
    
    以上の書き換えでmsearch 1.52同等になり,脆弱性がなくなります.
 なお,今回のこの修正によって,インデックスファイルおよび設定ファイルが置け るディレクトリがmsearch.cgiと同じディレクトリに制限されます. インデックスファイルや設定ファイルをmsearch.cgiと違うディレクトリに置いて, それらを使いたい場合には,msearch 1.52に含まれるallow.plというファイルを使う 必要があります. この方法の詳細は高度な設定をご覧下さい.

 脆弱性の詳細
 今回発見された脆弱性は,msearchの引数パラメータに特定の値を入れてCGI呼び出し をすることで,msearchが設置されたサーバの任意のファイルにアクセスが可能である というディレクトリトラバーサルと呼ばれる脆弱性です. 具体的には,indexとconfigの引数にmsearchの設置パスからの相対パスとヌル文字 を与えることで任意のファイルにアクセスできてしまいます.
 この脆弱性の原因は,indexとconfig引数パラメータのサニタライズを行っていなかっ たためです. ただし,msearchはindexで指定されたインデックスファイルとconfigで指定された 設定ファイルを読み込む時に書式のチェックを行っているため,アクセスできたと してもその内容がmsearchを通じてWeb上に表示される訳ではありません. 特にconfigで指定された設定ファイルと同じ書式のファイルはサーバの種類に関わらず, まず存在しません. 一方,indexで指定されたインデックスファイルに関しては書式が簡単なため,同じ 書式を用いたファイルならばWeb上に表示されてしまう可能性があります. その形式とは,タブによって5つのフィールドに分けられて,1行1レコードになって いるファイルです. 2番目,4番目,5番目のフィールドに含まれている内容はmsearchの検索によって 検索結果に表示される場合があります.

本件に関するお問い合わせは,security(a)kiteya.netまで. (a)を@に変換して下さい.

Copyright (c) 1999-2005, Katsushi Matsuda. All Right Reserved.