| « Apache MyFaces Tomahawk JSF Framework Cross-Site Scripting | PHPMailerコマンドインジェクション - WordPress, Mantis, WebCalendar, Group-Office, Joomla, etc » |
PHPセッションの問題修正
Stefanさんのブログに書いてあったので気がついたのですが
http://cvs.php.net/viewvc.cgi/php-src/ext/session/session.c?r1=1.417.2.8.2.35&r2=1.417.2.8.2.36
に結構面白いコミットがされています。CVS版なので正式リリースになるかは不明です。成り行きはがどうなるかは興味深いです。
MOPBで解説されていたセッションIDにインジェクションができる問題を修正しようとブラックリスティングで対応させようとしたようです。ブラックリスティングより暗号化した方が安全性と互換性を確保するのが簡単なのですがZend社の社員によるコミットだったのですがZend Platformとの互換性も維持できないパッチになっているようです。Stefanさんのブログを見るとかなり皮肉な書き方であることが分かります。このような文面になった背景にはZend社の社員により「PHP開発者に知らせず脆弱性を公開した」とあらぬ言いがかりを付けられためだと思います。
非常に古いPHPの場合、セッションIDには好みの文字列が設定できたのですが最近のPHPは
\r\n\t <>'\"\\
が不正な文字として登録されています。\r\nはヘッダスプリティング、<>'"\はXSSに明らかに利用できるので不正としても仕方ない文字ですが、
()@,;:[]?={}&%
も新たに不正な文字に加えられたました。:はZend Platformでも使っている文字だそうです。
備考: セッションIDに管理用の文字列を付け加えるのは珍しいことではありません。負荷分散や分散されたサーバ間でのデータ共有など様々な用途に管理用の文字列を付け加える場合があります。
暗号化による対処の方がシンプルかつ安全な対策だと思います...
ところで、単純にクッキーだけでセッションIDを使っている場合には問題は発生しません。つまりsession.use_trans_sid=0, session.use_only_cookies=1でPHPを使っていれば現在のPHPを使っていてもここで問題としている不具合には影響されません。
2 comments
セキュリティとは関係無いと思いますが、、、
順次、様々な制限が付け加えられたのですが、私はPHPセッションモジュールは正しい場所で制限を行っていないと考えています。
セッションモジュールはサブモジュールを持つ構造になっているので、基本的には各サブモジュール(セーブハンドラ)で制限するべきと思います。シリアライザやセッションモジュール本体で制限すると、全てのセーブハンドラ用に制限しなければならないですし、本体やシリアライザの制限でセッションセーブハンドラの拡張性が損なわれてしまいます。
私は気にしている一人ですが、あまり気にされていないのでしょうね...