第4章 セッション対策
セッション乗っ取り:#5 兆候の警戒と被害の不拡大
乗っ取り機会の低減(予防策)
決定的な対策とは行かないが、攻撃者がセッション乗っ取りを行う機会をなるべく少なくするためには次のような補助的な予防策も併せて行う。
(1) セッションタイムアウト
Webアプリケーションにはセッションタイムアウト機能を設ける。ユーザはログアウト操作をすることを忘れてしまうことがある。
- 前回のアクセス時刻から一定の時間が経過したら、クライアントから送られてくるセッションの続きのリクエストを受け付けないようにする
- より親切なユーザインタフェースを設けるなら、ログインフォームを表示し、ユーザ認証に合格したら、ユーザがアクセスしようとしていた本来のページに再びナビゲートする等の仕組みを設ける
Webアプリケーションエンジンによってはセッションタイムアウト機能を備えているので、それを利用できる。
(2) 明示的なログアウトの機能
Webアプリケーションには明示的なログアウトの機能を設ける。できれば、各ページでログアウト操作が行えると良い。
ユーザがログアウトの意思表示をした際、プログラムは次を行う。
- Webサーバ側でセッションIDを確実に無効にする。その後同じセッションIDがクライアントから送られてきても受け付けない
- Webブラウザ側のセッションIDを消去する
- Cookieの場合──Cookieを消去するSet-Cookieレスポンスヘッダを送る
- URLリライティング、hiddenフィールドの場合──特別な処理は不要
これは、セッションをユーザが必要とする以上継続させないことで、攻撃者がセッション乗っ取りを行う機会を減らすものである。
乗っ取り兆候の警戒(検知策)
クライアントから送られてくるリクエストの内容等について、正規ユーザと攻撃者の差異を見いだし、乗っ取りの兆候を検知できる場合がある。

(1) クライアントIPアドレスの変化
セッションの途中でクライアントIPアドレスに変化が生じたらセッション乗っ取りを警戒する。
過剰検知: 次の場合は過剰検知である
- ふたつあるいは3つのIPアドレスを交互に使用するようになっているゲートウェイを通じてアクセスしてくるクライアント
検知の限界: 次の場合は攻撃者と正規ユーザの見分けがつかない
- 攻撃者と正規ユーザが同一のプロキシを通じてアクセスしてきている場合
- 攻撃者が正規ユーザのネットワークアクセスを妨害し、IPアドレスを乗っ取っている場合
(2) User-Agentリクエストヘッダの変化
セッションの途中でUser-Agentリクエストヘッダの値に変化が生じたらセッション乗っ取りを警戒する。
検知の限界: 次の場合は攻撃者と正規ユーザの見分けがつかない
- 攻撃者はスクリプト注入等を用いて正規ユーザのセッションIDのみならず、ブラウザのバージョン文字列も取得し、それをリクエストとともに送って来ている場合
乗っ取り被害を拡大しない工夫(事後策)
たとえ、セッション乗っ取りが生じたとしても、すべてのWebページのアクセスをユーザに許すのではないなんらかの歯止め策があれば、被害をある程度食い止めることができる。

(1) パスワード変更画面の旧パスワード入力
パスワード変更画面においては、新しいパスワードのみならず、現在のパスワードの入力も求める。セッションを乗っ取ったものの、現在のパスワードを知らない攻撃者がパスワードを変更できないようにする。
パスワードの変更を許した場合、そのアカウントそのものが攻撃者に占有されかねない。
(2) 重要な画面の直前のパスワード入力
重要な会話処理を開始する際、まずパスワードの入力を求め、正しいパスワードが提示されなければ情報表示や処理を行わないようにする。例えば、次のような場面においてである。:
- 個人情報・クレジットカード番号等、重要な情報を表示させて編集する場面
- 代金支払いの最終的な意思表示等、重要な意思決定を行う場面
- サイトの中における身分の変更、退会 等
(3) 重要な操作が行われたことをメール通知
重要な処理を行った際、その旨をあらかじめ登録されているユーザ本人のメールアドレスにメールで通知するようにする。例えば、次のような場面においてである。:
- 登録しているパスワード、個人情報、クレジットカード番号等の変更
- 購入や振込み等の金銭が関係する手続きの完了
- サイトの中における身分の変更、退会 等