個人的なメモと備忘録 2004年11月

HOME | LastUpdate: 2004-11-29

目次


2004.11.28(Sun)

>>PHP 4.3.10RC1 公開

PHP 4.3.10RC1 が公開されました。CVS の PHP4 NEWS を見たところ、多くのバグ修正が含まれています。

PHP 4.3.10RC1 に含まれている変更点でいくつか気になったものだけ挙げておきます。

>>セキュリティ関係

*Java Plugin

Sun Java Plugin の SDK / JRE 1.4.2_05 以前の 1.4.x 系の全てのバージョンと SDK / JRE 1.3.1_12 以前の全てのバージョンで Javascript を使用することにより、Java のセキュリティマネージャを停止させることができるそうです。これにより、セキュリティ制限を回避されてしまうという問題が報告されています。

この問題は Sun Java SDK / JRE 1.4.2_06 以降、SDK / JRE 1.3.1_13 以降で修正されています。

*PHP

PHP 4.3.7 以前に存在した memory limit のセキュリティ問題に対する Exploit コードが投稿されています。

*Opera

Opera 7.54 以前のバージョンで、JRE (Java Runtime Environment) がインストールされている場合、システムの情報を外部に公開してしまう問題があるそうです。この問題は Opera 7.60 のベータ版で修正されているそうです。

*WinAmp

WinAmp 5.05 以前に含まれる IN_CDDA.dll に Buffer Overflow を引き起こしてしまう問題があり、.m3u という拡張子のプレイリストファイルを開くと、任意のコードを実行させられてしまう可能性があるそうです。

WinAmp 5.06 でこの問題は修正されています。また、.cda.m3u という拡張子のファイルの関連付けを外すことでも問題を回避できるそうです。

>>気になったニュース、ツールなど

▲ 目次へ戻る


2004.11.21(Sun)

>>PHP による日本語の文字コード判定スクリプト

文字列の文字コードを判定する場合、PHP には mb_detect_encoding() 関数が用意されていますが、文字列が短い場合、判定に失敗することが多くなりますので、もう少し判定率の良いスクリプトを作成してみました。

mbstring(マルチバイト文字列関数) と mbregex(マルチバイト正規表現関数) が必要です。文字コード範囲が重なるような場合は、SJIS-win を優先させています。

各文字コードの範囲については、Perl メモ:文字の正規表現を参考にしました。

/**
 * 日本語文字列の文字コード判定(ASCII/JIS/eucJP-win/SJIS-win/UTF-8 のみ)
 */
function detect_encoding_ja( $str )
{
    $enc = @mb_detect_encoding( $str, 'ASCII,JIS,eucJP-win,SJIS-win,UTF-8' );

    switch ( $enc ) {
    case FALSE   :
    case 'ASCII' : 
    case 'JIS'   : 
    case 'UTF-8' : break;
    case 'eucJP-win' :
        // ここで eucJP-win を検出した場合、eucJP-win として判定
        if ( @mb_detect_encoding( $str, 'SJIS-win,UTF-8,eucJP-win' ) === 'eucJP-win' ) {
            break;
        }
        $_hint = "\xbf\xfd" . $str; // "\xbf\xfd" : EUC-JP "雀"

        // EUC-JP -> UTF-8 変換時にマッピングが変更される文字を削除( ≒ ≡ ∫ など)
        mb_regex_encoding( 'EUC-JP' );
        $_hint = mb_ereg_replace( "\xad(?:\xe2|\xf5|\xf6|\xf7|\xfa|\xfb|\xfc|\xf0|\xf1|\xf2)", '', $_hint );

        $_tmp  = mb_convert_encoding( $_hint, 'UTF-8', 'eucJP-win' );
        $_tmp2 = mb_convert_encoding( $_tmp,  'eucJP-win', 'UTF-8' );
        if ( $_tmp2 === $_hint ) {

            // 例外処理( EUC-JP 以外と認識する範囲 )
            if (
                // SJIS と重なる範囲(2バイト|3バイト|iモード絵文字|1バイト文字)
                ! preg_match( '/^(?:'
                    . '[\x8E\xE0-\xE9][\x80-\xFC]|\xEA[\x80-\xA4]|'
                    . '\x8F[\xB0-\xEF][\xE0-\xEF][\x40-\x7F]|'
                    . '\xF8[\x9F-\xFC]|\xF9[\x40-\x49\x50-\x52\x55-\x57\x5B-\x5E\x72-\x7E\x80-\xB0\xB1-\xFC]|'
                    . '[\x00-\x7E]'
                    . ')+$/', $str ) && 

                // UTF-8 と重なる範囲(全角英数字|漢字|1バイト文字)
                ! preg_match( '/^(?:'
                    . '\xEF\xBC[\xA1-\xBA]|[\x00-\x7E]|'
                    . '[\xE4-\xE9][\x8E-\x8F\xA1-\xBF][\x8F\xA0-\xEF]|'
                    . '[\x00-\x7E]'
                    . ')+$/', $str )
            ) {
                // 条件式の範囲に入らなかった場合は、eucJP-win として検出
                break;
            }
            // 例外処理2(一部の頻度の多そうな熟語は eucJP-win として判定)
            // (珈琲|琥珀|瑪瑙|癇癪|碼碯|耄碌|膀胱|蒟蒻|薔薇|蜻蛉)
            if ( mb_ereg( '^(?:'
                . '\xE0\xDD\xE0\xEA|\xE0\xE8\xE0\xE1|\xE0\xF5\xE0\xEF|\xE1\xF2\xE1\xFB|'
                . '\xE2\xFB\xE2\xF5|\xE6\xCE\xE2\xF1|\xE7\xAF\xE6\xF9|\xE8\xE7\xE8\xEA|'
                . '\xE9\xAC\xE9\xAF|\xE9\xF1\xE9\xD9|[\x00-\x7E]'
                . ')+$', $str )
            ) {
                break;
            }
        }

    default :
        // ここで SJIS-win と判断された場合は、文字コードは SJIS-win として判定
        $enc = @mb_detect_encoding( $str, 'UTF-8,SJIS-win' );
        if ( $enc === 'SJIS-win' ) {
            break;
        }
        // デフォルトとして SJIS-win を設定
        $enc   = 'SJIS-win';

        $_hint = "\xe9\x9b\x80" . $str; // "\xe9\x9b\x80" : UTF-8 "雀"

        // 変換時にマッピングが変更される文字を調整
        mb_regex_encoding( 'UTF-8' );
        $_hint = mb_ereg_replace( "\xe3\x80\x9c", "\xef\xbd\x9e", $_hint );
        $_hint = mb_ereg_replace( "\xe2\x88\x92", "\xe3\x83\xbc", $_hint );
        $_hint = mb_ereg_replace( "\xe2\x80\x96", "\xe2\x88\xa5", $_hint );

        $_tmp  = mb_convert_encoding( $_hint, 'SJIS-win', 'UTF-8' );
        $_tmp2 = mb_convert_encoding( $_tmp,  'UTF-8', 'SJIS-win' );

        if ( $_tmp2 === $_hint ) {
            $enc = 'UTF-8';
        }
        // UTF-8 と SJIS 2文字が重なる範囲への対処(SJIS を優先)
        if ( preg_match( '/^(?:[\xE4-\xE9][\x80-\xBF][\x80-\x9F][\x00-\x7F])+/', $str ) ) {
            $enc = 'SJIS-win';
        }
    }
    return $enc;
}

文字コード判定の考え方としては、以下のようになっています。

  1. EUC-JP -> UTF-8 への変換してから、UTF-8 -> EUC-JP を行った場合、逆変換に成功することは少ない
  2. まず、文字コードがあいまいな文字列を EUC-JP として検出させ、1. より、EUC-JP で無いことを確認した場合は SJIS か UTF-8 を判定
  3. EUC-JP での逆変換に成功した場合、SJIS と文字コードが重なる部分は SJIS を優先
  4. EUC-JP でない場合、UTF-8 と仮定して逆変換に成功した場合のみ UTF-8 として検出
  5. 例外は個別対応

この文字コード判定スクリプトには以下の問題があります。

使用方法としては、以下のように文字コードが分からない日本語文字列を UTF-8 に変換するような関数を作成する場合に便利です。

function convert_utf8( $str )
{
    $encoding = detect_encoding_ja( $str );
    return mb_convert_encoding( $str, 'UTF-8', $encoding );
}

>>セキュリティ関係

*Samba

Samba 3.0.7 以前のバージョンの smbd に含まれる QFILEPATHINFO リクエストの取扱いに問題があり、buffer overflow を引き起こすことが可能という問題が報告されています。

この問題は Samba 3.0.8 で修正されています。Samba 3.0.8 にはバグがあったため、既に Samba 3.0.9 が公開されています。

*sudo

sudo 1.6.8p1 以下のバージョンに、Bash スクリプトを通して、任意の権限で任意のシェルスクリプトが実行されてしまうという問題が報告されています。Linux ディストリビューションの多くは /bin/sh/bin/bash のシンボリックリンクになっていることが多いため、#!/bin/sh が行の最初に書かれているシェルスクリプトもBash スクリプトを実行するのと同じことになってしまいますので注意が必要です。

sudo 1.6.8p2 で修正されていますが、回避方法として、設定ファイルである sudoers に以下の行を追加する方法が挙げられています。

Defaults  env_reset

sudo 1.6.8p2 では不十分だったため、sudo 1.6.8p3 でさらに修正され、現在、その他のバグが修正された sudo 1.6.8p4 が公開されています。

*X Window System

X.Org 6.8.1 以前に含まれる libXpm で DoS 攻撃を引き起こすことが可能な問題が報告されています。X.Org 6.8.0 と X.Org 6.8.1 用の patch が公開されています。

*Gentoo Linux
*その他

>>気になったニュース、ツールなど

▲ 目次へ戻る


2004.11.14(Sun)

>>PHP で gd を外部モジュールとして作成する

PHP で gd モジュールを作成した時のメモです。GD 2.0.28 以前では PNG 画像を扱う関数にセキュリティ問題が報告されていましたので、PHP のソースに含まれている GD は使用せず、GD Graphics Library から GD 2.0.33 をダウンロード、インストールから行っています。

gd を外部モジュールにせずに、PHP に組み込む場合は PHP の configure 時のオプションで --with-gd=/usr/local など、外部にインストールされた GD のディレクトリを指定すれば問題ありません。

PHP に含まれている GD は PHP 4.3.9 では 2.0.28 互換です。PHP 4.3.8 以前ではそれよりも古いバージョン互換の GD が含まれています。PHP のソースに含まれている GD をそのまま使用して PNG 画像を扱う必要がある場合、問題の影響を受ける可能性が高いと思いますので、GD の最新版(2004.11.14 時点では GD 2.0.33)を組み込んでおいた方が安全です。

既に GD のセキュリティ問題が修正されているパッケージなどをインストールした場合は、新規に GD をインストールする必要はありません。GD のインストールを飛ばして、PHP の gd モジュールのインストールを行ってください。この場合、gd モジュール作成の configure オプションに --with-gd=/usr を指定することになると思います。

PHP 4.3.9 では、/usr/local/lib/php/extensions/no-debug-non-zts-20020429/gd.so にインストールされました。gd ライブラリを使用する場合は、dl() 関数を使用してモジュールを読み込みます。以下のように gd モジュールがまだ読み込まれていない場合のみ gd モジュールを読み込むようにすれば良いと思います。

<?php
if ( ! extension_loaded( 'gd' ) && ! dl( 'gd.so' ) ) {
    die( 'gd モジュールが読み込めませんでした。' );
}
?>

>>セキュリティ関係

*Windows
*Mozilla Firefox

Mozilla Firefox 1.0 Preview 版以前のバージョンで、ローカルにあるファイルの存在を確認される、DoS 攻撃を受ける、ファイルダウンロードダイアログを偽装されるなどの問題が報告されています。また、Mac OS X では、潜在的にローカルユーザが権限を上位の権限を取得できるという問題があるそうです。

Mozilla Firefox 1.0 で修正されていますので、バージョンアップすることが推奨されています。

*ProFTPD

mod_delay という、ProFTPD User Enumeration Weakness(Secunia) で指摘されていた外部から任意のユーザ名が確認することができてしまうという問題を解消するための ProFTPD 用のモジュールが開発されています。次の ProFTPD のバージョンからデフォルトで組み込まれるそうです。

*DHCP

ISC DHCP 2.0pl5 以前、3.0b1-pl17 以前のバージョンに、ログ処理を行う部分に Format String バグが見つかっています。ISC DHCP 2.x はもうメンテナンスされていないため、3.x の最新のバージョンにアップデートすることが推奨されています。

*Samba

Samba 3.0.7 以前のバージョンにファイル名にワイルドカード文字を含めることで、DoS 攻撃を引き起こすことが可能という問題が報告されています。

Samba 3.0.8 で修正されています。また、http://us1.samba.org/samba/ftp/patches/security/ で、Samba 3.0.7 に対する Patch(samba-3.0.7-CAN-2004-0930.patch) も公開されています。

*GD

GD 2.0.28 以前のバージョンで悪意のある PNG 画像により、任意のコードを実行させることが可能な問題が見つかっています。

GD 2.0.29 以降で修正されています。現在は、GD 2.0.33 が公開されています。

PHP 4.3.9 や PHP 5.0.2 のソースに含まれている GD のバージョンは 2.0.28 互換となっており、この問題の影響を受けると思われます。PHP で PNG ファイルを扱う必要がある場合は、GD Graphics Library のページから GD の最新版をダウンロードしてインストールした後、以下のように、configure オプションに GD をインストールした場所を指定してコンパイルを行うと良いと思います。

./configure --with-gd=/usr/local <その他のオプション>
*Ruby

Ruby 1.8.0 以前のバージョンに含まれる cgi.rb に入力の妥当性チェックに問題があり、DoS 攻撃を引き起こすことが可能になってしまうという問題が報告されています。

この問題は Ruby 1.8.1 で修正されているそうです。

*Gentoo Linux
*その他

>>気になったニュース、ツールなど

▲ 目次へ戻る


2004.11.07(Sun)

>>セキュリティ関係

*Windows
*Apache 2

Apache 2.0.52 以前のバージョンで、リクエストヘッダに大量のスペースが含まれていると、DoS 攻撃を引き起こすことが可能であるという問題が報告されています。

Apache 2.0.53 で修正される予定です。

*その他

>>気になったニュース、ツールなど

▲ 目次へ戻る


更新履歴

2004.11.28

11月28日分を追加。

2004.11.21

11月21日分を追加。

2004.11.14

11月14日分を追加。

2004.11.07

このページを作成。11月 7日分を追加。

▲ 目次へ戻る

LastUpdate: 2004-11-29 | HOME