[トップ]

2002/03/18: Analog のセキュリティホールについて

2002年3月18日に,Analog にクロスサイトスクリプティングの脆弱性が発見されました.クロスサイトスクリプティングにより、悪意のあるサイトへの誘導や Cookie の漏洩などが行われる可能性があります。

以下の条件すべてに該当する方は早急に対処を行なって下さい.

  1. レポート中で「リクエスト不成功レポート」を生成するようにしている
  2. HTML形式でレポートを生成している
  3. 日本語でレポートを生成している
    もしくは,Analog-JP で配布している日本語化パッチを適用している.
  4. 少なくとも,脆弱性が確認された以下のバージョンを利用している ただし,これ以外のバージョンについても同様の脆弱性を有していると推測されます.

この脆弱性は,高橋勇仁 様からの報告により発見されました.ご報告に感謝致します.

対処方法

この脆弱性に該当する場合は,以下のいずれかの対処を行なって下さい.
ただし,以下に示す対処を行なうと,JISコードでの出力がサポートされなくなりますので,注意して下さい.
JISコードでの出力が必要な場合は,一度 EUC-JP など他の文字コードで出力を行なった上,別途文字コードを変換するなどの対処を行う必要があります.

  1. analog-5.22 以上にバージョンアップする
  2. 脆弱性が排除されたパッケージにアップグレードする
    各種OS,ディストリビューション毎の対応状況につきましては,各自でご確認ください.
  3. 以下のパッチを適用の上,再コンパイルを行なう
    上記パッチをダウンロード後,UNIX系OSの場合は
    1. analog-5.21の場合
      $gunzip -c analog-5.21.tar.gz | tar xf -
      $cd analog-5.21/src
      $patch < <パッチをダウンロードしたディレクトリ>/analog-521_css.patch
      
    2. analog-4.16の場合
      $gunzip -c analog-4.16.tar.gz | tar xf -
      $cd analog-4.16
      $patch < <パッチをダウンロードしたディレクトリ>/analog-416_css.patch
      
    のようにして,パッチを適用してから再コンパイルを行なって下さい.
    ここに示した以外のバージョンの場合や,UNIX系OS以外のOSについては,パッチを確認の上同様の対処を行なってください.

なお,どうしてもJISコードでの出力が必要な場合や,バイナリの置換えができない場合などは,「リクエスト不成功レポート」を生成しないようにすることで,暫定的に対処することも可能です.

暫定的な対処法

以下,暫定的な対処法について説明します。

analog.cfg 中に以下の記述を行い、「リクエスト不成功レポート」の出力を 抑制します。

FAILURE OFF
あるいは、コマンドライン上で analog を動かしておられる方は、以下の記述 がありましたら、このオプションを cron 等のシェルスクリプトから省くようにしてください。
$ analog +I
上記の「+I」は、「リクエスト不成功レポート」を出力せよというコマンドラ イン上からの命令です。
上記のオプションには、「+Ir1r」としておられる方 もいるかも知れません。この意味は、『「リクエスト不成功レポート」をリクエ スト数順にソートし、1リクエスト以上のログを一覧にせよ』という命令です。

コマンドライン上で「リクエスト不成功レポート」の出力を抑制するには、

$ analog -I
とすれば良い。

技術的な詳細

以下,技術的な詳細について説明します.

問題は、マルチバイト言語の出力制御に存在します。output2.c 内にある htmlfprintf()関数では、出力がHTML形式でないかマルチバイト言語の場合はエスケープ処理を行わないというロジックが存在します(analog 5.21のoutput2.cでは249行目)。このため、ブラウザが解釈すると危険な文字がそのまま出力されてしまいます。

    analog 5.21 の output2.c

    249   if (od->outstyle != HTML || multibyte)
                                      ~~~~~~~~~
    250     fputs(s, outf);
    251   else {
    252     for (c = s; *c != '\0'; c++) {
    253       if (*c == '<') {
        (以下エスケープ処理)

従って,マルチバイト言語かどうかを if 文の判定条件に含めないことで,現象を回避することが可能です.ただし,この対処を行なった場合,エスケープされるべき文字を文字コードの一部として利用してしまっているJISなどのエンコーディング形式を利用することができなくなってしまいます.


Copyrght (C) 2000-2002 Japan Analog User Group
mailto: webmaster@jp.analog.cx
Last update: