T

PHP-5.2.3で修正されていないセッションの脆弱性

まだまだ続くMOPBによれば、PHP-5.2.3には未修整のセッションの不具合があり、場合によっては攻撃を受ける可能性がある。大垣靖男氏がMOPBの翻訳作業を停止されているのもあり、原著者の許可を得てここに情報を載せておく。原文はHTMLのコメントに残した。

原文はこちら

注:以下の文章を閲覧したことにより発生するいかなる事態にも翻訳者は責任を負うものではありません。以下の翻訳について原著者は無料での公開を許可しただけであり、内容については一切関知していません。


PMOPB-46-2007:PHP ext/session Session Cookie Parameter Injection Vulnerability

■概要

PHPのext/sessionはセッションIDをsession cookieに挿入する前にURLエンコードしない。そのため、セミコロンのような特殊な意味のある文字がcookieの値からさらにはsession cookieまでにも挿入する目的で利用されてしまう。

PHP-5.2.3ではこの脆弱性は修正されていない。PHPの開発者たちは我々が送ったこの問題を修正方法を出し抜こうとしたせいだ。

■影響するバージョン
影響するPHPのバージョンはPHP4.4.7以下、PHP5.2.3以下

■詳細情報
session_start()関数が呼ばれると、PHPのext/sessionはある条件下では新しいsession cookieを発行しようとする。この条件は例えば

– セッションIDがPATH_INFOに埋め込まれていた
– セッションIDが再作成された
– セッションIDがsession_id()関数でセットされた
– session_start()が二度以上呼ばれた

これら4つのケースの内、3つでセッションIDが完全にユーザ側から送信されたもののままになっている。セッションIDはcookieに何のエンコーディングもされずに保存されるので、session cookieのHTTPヘッダに任意のcookieの値の挿入が可能になる。この脆弱性は挿入された改行文字がPHPに導入されたHTTPレスポンス分割攻撃を防ぐ機能にキャッチされる点を除けば、2006年に我々が公開したext/sessionのHTTP応答分割攻撃の脆弱性と実質的に同じものだ。

PHP 5.2.3ではセッションIDがPATH_INFOに登録された場合にはsession cookieを送信しないという方法でこの古い問題を修正しようとしている。しかし、これでは複数のパスの内、1つだけしかクローズされない。

実証、exploit、再現の手順
この脆弱性は自明なので実証は不要だ。http://www.server.de/session.phpのようなURLがあればこのような任意のcookieのパラメータを挿入することが出来る。(以下の例はPHP4の全てのセッションモジュールとPHP5 < 5.2.3の”files”以外の全てのセッションモジュールで動作する)

http://www.server.de/session.php/PHPSESSID=ID;INJECTED=ATTRIBUTE;/
PHPコアのセッション管理に対して動作するこの例の他にも、session_id()関数を利用しているアプリケーションに大してもこの攻撃を仕掛けることが出来る。

<?php
$_GET_VARIABLE = “ID;INJECTED=ATTRIBUTE;”;
session_id($_GET_VARIABLE);
session_start();

?>

注意
この脆弱性は2007年5月17日にPHP開発者たちに公開されている。彼らにはセッションIDをcookieに入れる前にURLエンコードしなければならないとはっきりと伝えてある。

彼らは明らかな副作用があるこれとは別の修正方法を選んだが、この脆弱性は直っていない。攻撃手順の1つを塞いだだけだ。

この脆弱性は2006年に我々が公開した別の脆弱性と関連している。つまり、2006年にエンコーディング問題そのものではなくたった1つの攻撃手法が防がれただけだったので、脆弱性があるままになっていたということだ。PHP開発者たちが対処療法的なハックを繰り返すのではなく正しい修正をするということを学ばない限り、歴史は繰り返す。

そして、彼らはまたもや仕出かしている。「彼らの修正」は傍目にも明らかに混乱の内に忘れられ、この脆弱性についてはPHP 5.2.3のリリースアナウンスのどこにも触れられていない。


邦訳がなく未修整のMOPBがあれば他にも随時掲載していきます。

Posted by on 6月 7, 2007 in PHP, Security

コメントを残す