セッション管理の不備とは
利用者のセッションIDを攻撃者が取得、利用することで、攻撃者が利用者になりすますことをセッションハイジャックと呼ぶ。
セッション管理の不備は、セッションハイジャックを許してしまう脆弱性である。
脆弱性の原理
Webサーバは基本的にクライアントを識別しないステートレスな状態だが、SNSやショッピングサイトをはじめ、個人を識別する必要のあるアプリケーションでは、個人の識別子を発行するセッションという動作を行う。
セッションIDはCookieを使用して各ユーザのブラウザに保存される。
本来、ログイン前後でセッションIDは推測困難なものを再発行するべきだが、不十分なセッションIDな管理だと攻撃者に利用される危険性がある。
攻撃者が他の利用者のセッションIDを利用する手段は以下の3種類となる。
セッションIDの漏洩
セッションIDをURLに埋め込んでいる場合、外部にセッションIDが漏洩してしまう可能性がある。
特に、情報を読み取るための罠のリンクを踏み悪意のある外部サイトに飛ばされ、Referer値を読み取られる危険性がある。
URLにセッションIDを格納していること、Cookieを外部から読み取れるようにしていることが原因である。
セッションIDの固定化
セッションIDの再発行が不十分だと、攻撃者が発行していたセッションIDを利用者に利用させることで、利用者のアカウントのハイジャックが発生しうる。
外部から固定化する手段は多岐にわたり、根本的な解決は困難。
セッションIDの推測
セッションIDの発行に、推測が可能なパラメータを使っている場合、攻撃者が生成されるセッションIDを推測し、不正に利用してしまう可能性がある。
セッションIDの発行には以下のものが使われることが多い。
- ユーザID、メールアドレス
- リモートIPアドレス
- 日時
- 乱数
特に乱数以外は推測されやすく、乱数を絡ませてセッションIDの発行を行っていない場合、推測されやすくなる。
脆弱性が悪用された際の影響
セッションハイジャックによる影響は以下のものが挙げられる。
- ログイン後の利用者のみが利用可能なサービスの悪用
- ログイン後の利用者のみが編集可能な情報の改ざん、新規登録
- ログイン後の利用者のみが閲覧可能な情報の閲覧
攻撃者がログインしている利用者と同等の操作を行ってしまう可能性がある。
対策方法
基本的にログインのたびに異なるセッションIDを推測困難な形で発行することで、セッションIDの不正利用のリスクは小さくなる。
新規開発の場合は、開発ツールにはセッション管理機能を持つものが多く、それを利用して開発するのが良い。
既存の脆弱性を持つアプリケーションを修正する場合は、セッションIDの不正取得の手段に注意して対策する必要がある。
すでにサービスが運用されており、セッションIDが存在している場合、不正に取得された際に被害が出ないようにログイン後に再設定するようにする。
セッションIDの漏洩
情報を覗き見るための罠サイトで、情報を抜き取られないようにする仕組みが必要である。
セッションIDをURL中のクエリストリングに格納せず、CookieやPOSTメソッド中のhidden属性に格納する。
HTTPS通信で利用するCookieにはセキュア属性を付与し、Referer値を読み取られないようにする。
セッションIDの固定化
固定化の手段は多岐にわたるので、セッションIDの変更をログイン認証のたびに行う。
セッションIDの固定化ができない場合は、セッションIDに代わる推測困難な秘密情報を作成し、Cookieにセットする必要がある。
セッションIDの推測
開発ツール中のセッション管理機構を利用することで防ぐことができる。
セッション管理のメソッドを自作する場合は暗号論的擬似乱数生成器を使う。