やっとPHPのセッションアダプション脆弱性を修正するパッチとプルリクエストを作りました。議論は済んでいるのでパッチを検証、調整してマージするだけです。
PHPに限らず、未初期化のセッションIDを正規のセッションIDとして受け入れてしまうセッション管理機構があります。(Javaとか)
サイトで稼働している全てのアプリが正しいセッション管理(ログイン後にセッションID作り直す。ログオフで廃棄。一定時間経過後、セッションIDを再生成)を実行していれば良いのですが、共有環境や複数のアプリが使われる事が多いPHPでは特にリスクが高くなっています。
未初期化のセッションIDを受け入れてしまうセッション管理機構は脆弱だと言って良いと考えています。セキュリティのベストプラクティスには確立されたセキュリティ手法(ベストプラクティス)はそのまま使うべき、というプラクティスがあります。つまり、信頼できるフレームワークのセッション管理機構をそのまま使いなさい、がベストプラクティスという事です。しかし、フレームワークとしてURLへのセッションID埋め込みをサポートしているのに、簡単に直せるセッションアダプションを修正しないフレームワークは到底「ベストプラクティスを実装している」と言える状態ではないと考えています。
セッションアダプション脆弱性についてはPHPのWiki(英語のみ)に書いています。詳しくは以下のWikiを参照してください。
https://wiki.php.net/rfc/strict_sessions
このRFCも私が書いたもので、かなり前にCVE IDもアサインされています。
-
CVE-2011-4718
https://github.com/php/php-src/pull/366
https://github.com/php/php-src/pull/367
https://github.com/php/php-src/pull/368
上から順にPHP 5.3/5.4/5.5になっています。十分テストしてあるので大丈夫なはずですが、時間のある方はテストして頂けると助かります。
このパッチを適用すると
- session.use_strict_mode
というphp.ini設定が追加されます。これを1に設定すると、未初期化のセッションIDを受け入れなくなり、同時に生成したセッションIDが衝突(コリージョン)を起こしていないかチェックします。デフォルトでは無効になっています。
セッションIDが初期化されているか、衝突が発生してないか、これらのチェックが追加のオーバーヘッドとして必要になりますが、セッション管理はセキュリティの要です。この程度のオーバーヘッドでセッションID漏洩のリスクを軽減できるのであれば利用すべきだと思います。セキュリティ対策のベストプラクティスである多重のセキュリティ、フェイルセーフにも対応します。
もしパッチを試して問題を見つけた場合はご連絡ください。