なぜPHPアプリにセキュリティホールが多いのか?

第25回 PHPのアキレス腱 ── セッション管理

この記事を読むのに必要な時間:およそ 5 分

セッションアダプション攻撃からの防御

本来,セッションモジュール自体がセッションアダプションに脆弱であってはなりません。セッションモジュールへのパッチは筆者が把握しているだけで2回,PHPセキュリティレスポンスチームに提案されています。

少なくとも2005年の時点で,PHPプロジェクトに対してStefan Esser氏がsessionモジュールのセッションアダプション脆弱性を修正する提案をパッチ付きで行っています。パッチなしの改善提案はそれより数年前に行われています。筆者自身も2008年8月のPHP4セキュリティパッチ配布停止を機会に,Stefan Esser氏のパッチをベースとしたセッションアダプション脆弱性修正の提案をパッチ付きで行っています。

しかし,残念ながらPHPプロジェクトのセキュリティレスポンスチームの理解不足により,この脆弱性の危険性は正しく理解されていません※2⁠。

※2

PHPセキュリティレスポンスチームの,セキュリティ脆弱性に対する理解不足はこれだけではないのですが...

パッチで対処する方法

筆者のWikiにてセッションモジュールのセッションアダプション脆弱性を修正するパッチを公開しています。

PHP5.2.x用のパッチは筆者が修正/機能追加したもの,PHP 4.4.9用のパッチは枡形氏が修正したものを公開しています。

執筆時点(4/22)でPHPのCVSの開発版にも,セッションアダプションを修正するパッチは適用されていません。当然ですがPHP 5.3にもセッションアダプション脆弱性は残ったままになっています。

筆者も開発に参加しているMomonga ProjectのMomonga Linux 5のPHPパッケージにはセッションアダプションを修正するパッチを適用済みですが,筆者の知る限りこの種のパッチを適用しているディストリビューションはありません。

PHPスクリプトで対処する方法

幸いなことに,最後の読み取り専用のクッキーファイルを利用した攻撃以外であれば,PHPスクリプトで対処可能です。しかし,筆者の作ったアプリケーション以外でこの対処を行っているアプリケーションはまだ見たことがありません。オープンソースのPHPアプリケーションはほぼ間違いなく,セッションアダプション脆弱性を利用した攻撃に脆弱です。session_regenerate_id関数でさえ,ログイン処理時に呼び出していないアプリケーションも多数あります。

クッキーベースのセッション管理でsession_regenerate_id関数を呼び出しても,セッションアダプション脆弱性が問題となる原因は,ブラウザが複数のクッキーを設定できてしまうことにあります。

つまり,セッションIDを再生成する際に,設定可能なクッキーすべてを予め削除しておけば,ほとんどのセッションアダプション脆弱性を利用した攻撃を防げます。

セッションアダプション対策の副作用

パッチによるセッションアダプション対策を行うと,DoSが可能になる副作用が発生します。ログイン処理時に初期化済みのセッションID用のクッキーをサーバが送信しても,そのクッキーよりも攻撃者が設定したクッキーが優先され,何度ログインを試みてもログインできない状態になります。

このDoS攻撃を防ぐためには,すべてのURLでセッション管理用のクッキードメインとパス以外の,すべてのセッション管理用のクッキー名を持つクッキーを削除しなけばなりません。

「PHPスクリプトで対処する方法」で解説した方法を利用しただけでは,ログイン処理を行っているURLしか,対処できません。

完全にこのDoSを防ぐためには,面倒でもすべてのURLで不要なセッション管理用クッキーの削除を行わなければなりません。

まとめ

本来,セッション管理機構はセッションアダプションに脆弱であってはなりません。筆者も機会があるごとにPHPセキュリティレスポンスチームに,セッションアダプション脆弱性を修正するように勧めますが,当面この問題が修正されることは無いと考えてください。

修正されるまでは,ログイン処理時にsession_regenerate_idを呼び出す前に,ログインスクリプトが実行されているURLで設定可能なすべてのセッションID用のクッキーを削除するようにしてください。

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書