[PHP-users 35325] Re: セッションハイジャックと session_regenerate_id() について
komura
komura.db2r1e @ gmail.com
2010年 8月 9日 (月) 00:57:32 JST
komura です。
On Sun, 8 Aug 2010 13:21:04 +0900
shinichiro mori <shinichiro.mori.1983 @ gmail.com> wrote:
> 被害に会う状況としては、以下のようなものを想定しています。
> (1)攻撃者にブラウザのクッキーの内容を直接見られた。
> (2)攻撃者がネットワークをモニターしてクッキーの情報を入手した。
> など。
攻撃者が、有効なセッション ID を入手している時点で、Web サーバや
Web アプリケーション側で完全な対策はできないように思います。
このため、本当に重要な処理をする Web アプリケーションでは、
SSL を導入するなど、簡単にセッション ID が漏洩しないように
対策しているのではないでしょうか?
> ■質問内容
> 上のような状況が起こるのは、(2)で会員がしばらくの間ページ遷移等をしなかったためセッションIDが
> 再セットされないままとなり、その間に攻撃者の被害に会ってしまった、というようなケースかと思われますが、
> session_regenerate_id() は menu.php では使用すべきではないということでしょうか?
この場合は、session_regenerate_id() を使用すべきです。
これは、質問にあるセッションハイジャックというよりは、
セッション固定攻撃の対策になります。
# 今回は考慮していないとのことですが、セッション固定攻撃も
# セッションハイジャックの一種です。
ログインなどは、ユーザによる重要な操作を実行した場合となり
ますので、セッション ID は変更すべきです。
詳細は、以下のページなどを参照してください。
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/305.html
> もしくは、セッション変数をチェックして、内容が不正と判断される時のみ session_regenerate_id() を
> 使用する等、至るところで不用意に使用しない方が良いということでしょうか?
ここが良く分からないのですが、内容が不正かどうかをどのようにして
判断するのでしょうか?
確かに、セッション変数に攻撃者が変更できない情報(IP アドレスなど)を
保持して、毎回チェックするという手段はあります。ただ、アクセスごとに
こうした情報が変化する場合もあり、限定された環境でないと、この方法は
使用できません。
このため、内容が不正かどうかをチェックする万能な方法は無いように
思います。
> session_regenerate_id() を使用しない限り、セッションIDが盗まれても、
> 会員がログアウトするなり、session.gc_maxlifetime だけ時間が経過するなりして、
> セッションが破棄された時点で攻撃者も会員専用メニューにアクセスできなくなると思います。
セッション ID を変更しない場合、それだけ、漏洩する危険性が
増大します。毎回変更する必要はないと思いますが、定期的に
変更する方が安全ではないでしょうか。
また、session.gc_maxlifetime の設定による時間経過よりも前に
攻撃者がアクセスすると、セッションを継続させることができます。
このため、セッションハイジャックされた場合のタイムアウトに
よるセッション破棄は期待しない方が良いと思います。
この問題に対処したいのであれば、セッション ID を変更しない
よりは、ログイン時または、ログアウト時に、対象ユーザの
セッション情報が残っていた場合、それらを全て削除するような
処理を入れておくと良いと思います。
仮に、攻撃者がセッションハイジャックをしてサイトにアクセスして
いた場合でも、正規ユーザがログインまたは、ログアウトした場合、
自動的に攻撃者もログアウトされることになります。
# 攻撃者がログアウトした場合、正規ユーザもログアウトするという
# 問題はあります。
個人的には、セッションハイジャックによる被害を可能な限り防止
したい場合、アクセスを SSL のみに限定し、重要な処理を実行する時は
パスワードなどの正規ユーザしか知りえない情報を要求するくらい
しか思いつきません。
--
komura <komura.db2r1e @ gmail.com>
PHP-users メーリングリストの案内