HOME | LastUpdate: 2004-11-29
PHP 4.3.10RC1 が公開されました。CVS の PHP4 NEWS を見たところ、多くのバグ修正が含まれています。
PHP 4.3.10RC1 に含まれている変更点でいくつか気になったものだけ挙げておきます。
*printf()
関数に %F
の追加
小数点のマークは通常は .(ピリオド)が使用されることが多いのですが、ロケールによって ,(カンマ)に変わることがあります。printf()
や sprintf()
で %F
を使用した場合は、かならず小数点はピリオドになります。
addslashes()
の NULL バイトの扱いについてのバグ修正
PHP 4.3.9 で addslashes()
の引数に \0
を与えると、以下のようになります。
<?php $s = addslashes( "\0" ); echo $s . ":" . bin2hex( $s ); ?>
\:5c00
他のバージョンの PHP では以下のようになります。
\0:5c30
foreach()
の高速化
PHP 5.x から foreach()
の高速化パッチが適用されたそうです。
以下のスクリプトを foreach_bench.php として保存して、CLI 版の PHP でどの程度速くなったかを調べてみました。PEAR の Benchmark を使用しています。Benchmark をインストールしていない場合は、pear install Benchmark
でインストールしてください。
<?php require( 'Benchmark/Timer.php' ); $a = range( 0, 100000 ); $timer =& new Benchmark_Timer(); $timer->start(); foreach ( $a as $b ) { ; } $timer->stop(); $timer->display(); ?>
結果は以下の通りです。PHP 4.3.9 に比べて、foreach()
の処理が 2.5 倍くらい速くなっているようです。
$ php-4.3.9 foreach_bench.php ------------------------------------------------------------- marker time index ex time perct ------------------------------------------------------------- Start 1101651609.66742500 - 0.00% ------------------------------------------------------------- Stop 1101651610.02197700 0.35455203056335 100.00% ------------------------------------------------------------- total - 0.35455203056335 100.00% -------------------------------------------------------------
$ php-4.3.10RC1 foreach_bench.php ------------------------------------------------------------- marker time index ex time perct ------------------------------------------------------------- Start 1101651640.55456100 - 0.00% ------------------------------------------------------------- Stop 1101651640.69426200 0.13970112800598 100.00% ------------------------------------------------------------- total - 0.13970112800598 100.00% -------------------------------------------------------------
serialize()
や unserialize()
で
不正なクラスを扱ってしまう問題の修正などが行われています。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 4.3.7 以前に存在した memory limit のセキュリティ問題に対する Exploit コードが投稿されています。
Opera 7.54 以前のバージョンで、JRE (Java Runtime Environment) がインストールされている場合、システムの情報を外部に公開してしまう問題があるそうです。この問題は Opera 7.60 のベータ版で修正されているそうです。
WinAmp 5.05 以前に含まれる IN_CDDA.dll に Buffer Overflow を引き起こしてしまう問題があり、.m3u
という拡張子のプレイリストファイルを開くと、任意のコードを実行させられてしまう可能性があるそうです。
WinAmp 5.06 でこの問題は修正されています。また、.cda
や .m3u
という拡張子のファイルの関連付けを外すことでも問題を回避できるそうです。
Gentoo Linux のインストールから使いこなすまでの詳細なドキュメント集。
ssh-agent の使い方について。
日本語対応が充実している Linux ディストリビューション。Intel 版と PPC 版が公開されています。Vine Linux 3.0 から多くのセキュリティ修正とバグ修正が行われているそうです。
リモートから他の OS を制御するサーバ、クライアントソフトウェア。1.3 系のリリース候補版になっています。
文字列の文字コードを判定する場合、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; }
文字コード判定の考え方としては、以下のようになっています。
この文字コード判定スクリプトには以下の問題があります。
使用方法としては、以下のように文字コードが分からない日本語文字列を UTF-8 に変換するような関数を作成する場合に便利です。
function convert_utf8( $str ) { $encoding = detect_encoding_ja( $str ); return mb_convert_encoding( $str, 'UTF-8', $encoding ); }
Samba 3.0.7 以前のバージョンの smbd
に含まれる QFILEPATHINFO リクエストの取扱いに問題があり、buffer overflow を引き起こすことが可能という問題が報告されています。
この問題は Samba 3.0.8 で修正されています。Samba 3.0.8 にはバグがあったため、既に Samba 3.0.9 が公開されています。
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.Org 6.8.1 以前に含まれる libXpm で DoS 攻撃を引き起こすことが可能な問題が報告されています。X.Org 6.8.0 と X.Org 6.8.1 用の patch が公開されています。
Snort の誤検知を減らす方法について。
OS コマンドインジェクションとそれを防ぐための mod_security のルール。
GTK+ を使用するメールクライアント、ニュースリーダ。細かいインターフェースの調整などが行われています。
バージョン管理システム。
オープンソースのネットワーク侵入検知システム(NIDS)。
Unix 系の OS で動作するオープンソースの Windows NT / 2000 互換のファイル、プリントサーバ。バグ修正が行われています。
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
を指定することになると思います。
ここでは、/opt/libgd にインストールしました。/usr/local 以下にインストールする場合は、--prefix=/opt/libgd
は不要です。
$ tar zxvf gd-2.0.33.tar.gz $ cd gd-2.0.33 $ ./configure --prefix=/opt/libgd $ make $ sudo make install
PHP のソースから GD モジュールを作成します。
GD を /opt/libgd にインストールしたため、--with-gd=/opt/libgd
になっています。GD を /usr/local にインストールした場合は、--with-gd=/usr/local
にしてください。その他のオプションのディレクトリ指定も必要に応じて変更してください。
$ tar jxvf php-4.3.9.tar.bz2 $ cd php-4.3.9/ext/gd $ phpize $ ./configure \ --with-gd=/opt/libgd \ --with-freetype-dir=/usr/lib \ --with-jpeg-dir=/usr/lib \ --with-png-dir=/usr/lib \ --with-tiff-dir=/usr/lib \ --with-xpm-dir=/usr/lib \ --with-zlib-dir=/usr/lib $ make $ sudo make install
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 モジュールが読み込めませんでした。' ); } ?>
Mozilla Firefox 1.0 Preview 版以前のバージョンで、ローカルにあるファイルの存在を確認される、DoS 攻撃を受ける、ファイルダウンロードダイアログを偽装されるなどの問題が報告されています。また、Mac OS X では、潜在的にローカルユーザが権限を上位の権限を取得できるという問題があるそうです。
Mozilla Firefox 1.0 で修正されていますので、バージョンアップすることが推奨されています。
mod_delay という、ProFTPD User Enumeration Weakness(Secunia) で指摘されていた外部から任意のユーザ名が確認することができてしまうという問題を解消するための ProFTPD 用のモジュールが開発されています。次の ProFTPD のバージョンからデフォルトで組み込まれるそうです。
ISC DHCP 2.0pl5 以前、3.0b1-pl17 以前のバージョンに、ログ処理を行う部分に Format String バグが見つかっています。ISC DHCP 2.x はもうメンテナンスされていないため、3.x の最新のバージョンにアップデートすることが推奨されています。
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 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 1.8.0 以前のバージョンに含まれる cgi.rb に入力の妥当性チェックに問題があり、DoS 攻撃を引き起こすことが可能になってしまうという問題が報告されています。
この問題は Ruby 1.8.1 で修正されているそうです。
Mozilla 系のブラウザ。セキュリティ修正が行われています。
RedHat 系の Linux。
GTK+ を使用するメールクライアント、ニュースリーダ。バグ修正や細かいインターフェースの修正などが行われています。
Unix 系の OS で動作するオープンソースの Windows NT / 2000 互換のファイル、プリントサーバ。セキュリティ問題の修正が含まれています。
ドキュメントが古い、含まれているファイルの多くが group/other に読み込み権限がないなどの問題が報告されているようです。
バージョン管理システム。バグ修正が行われています。
Java Servilet/JSP 環境。
Apache 2.0.52 以前のバージョンで、リクエストヘッダに大量のスペースが含まれていると、DoS 攻撃を引き起こすことが可能であるという問題が報告されています。
Apache 2.0.53 で修正される予定です。
Unix 系のオペレーティングシステム。
Windows 用のパケットキャプチャ、ネットワーク分析に使用できるライブラリ。
オープンソースのメール環境。
モジュールとして動作する、オープンソースの Web アプリケーションに対する侵入検知、防止エンジン。バグ修正が行われています。
Windows 用の SCP クライアント。セキュリティ問題の修正が含まれています。
11月28日分を追加。
11月21日分を追加。
11月14日分を追加。
このページを作成。11月 7日分を追加。
LastUpdate: 2004-11-29 | HOME