セッションハイジャック
セッションハイジャックとは
セッションハイジャックとは名前の通り、なんらかの方法を用いて正規利用者ではないものが他人のセッションIDを乗っ取る攻撃手法。
セッションハイジャックが行われた場合、アプリケーション内で正規の利用者ができることはほとんど実行が可能なので、正規利用者の個人情報閲覧、送金や物品購入、なりすましメールの送信やSNSへの犯罪予告など正規利用者への被害はとても大きくなる。
セッションハイジャックの攻撃手法・対策
実際にセッションハイジャックはどのように行われているのか。
具体的な攻撃手法としては以下の3つが挙げられる。
- セッションIDの推測
- セッションIDの盗み出し
- セッションIDの強制
3つの攻撃手法に合わせて対策方法も以下に挙げる。
セッションIDの推測
Webアプリケーションに用いられるセッションIDの生成規則に問題があると、第三者にセッションIDが予測され、悪用されてしまう可能性がある。
生成規則に問題があるセッションIDは以下のようなものを元に生成されているものが多い。
- ユーザIDやメールアドレス
- リモートIPアドレス
- 日時
- 乱数
上記のものをそのまま使う場合や、エンコードやハッシュ計算というものと合わせて利用される場合がある。
このうちユーザIDや日時は外部から参照可能なためセッションIDを推測することが可能になる。
このような推測可能なセッションIDの生成を回避するためには、Webアプリケーション開発ツールが持つセッション管理機構を利用することが安全とされている。
主要なアプリケーション開発ツールのセッション管理機構に脆弱性が発見された場合、セキュリティ研究者によって指摘されすぐに改善されることが見込まれる。
そのため、セッションIDの生成は独自の機構で行うのではなく、開発ツールによるものにするとセッションIDを推測されることはほとんどなくなる。
セッションIDの盗み出し
セキュリティに不備のあるネットワークではセッションIDとして利用されるcookieを盗聴されてしまう可能性がある。暗号化されていない無線LANは、まさにそのようなネットワークの一例。SSLというネットワークを暗号化するプロトコルがある。
セッションIDの盗聴を防ぐには、このように通信経路を意識することも重要になる。
SSL
SSLとはSecure Socket Layerの略で、インターネット上の通信を暗号化してくれる技術。これにより、第三者からの情報の盗聴や改ざんを防ぐことができる。
したがって、セッションIDのような重要な情報をやりとりする際はSSLを使うと機密性・完全性を保つことができる。
セッションIDの強制
ここまでは正規利用者に設定されたセッションIDを推測したり、盗み出して利用する手法だったが、セッションIDを悪意のある第三者が外部から強制させる方法があり、これをセッションIDの固定化という。
セッションIDの固定化は以下の手順で行われる。
- 悪意のある第三者は普通の利用者としてセッションID(abc123)を取得
- 被害者に対して1.で取得したセッションIDを強制
- 被害者は標的アプリケーションにログイン
- 悪意のある第三者は、被害者に強制したセッションID(abc123)を使って標的アプリケーションにアクセスする
セッションIDとは利用者の状態を保持するために使われていたので、
被害者は悪意のある第三者が強制したセッションIDで認証が完了している。そのため、そのセッションIDを用いてアクセスした悪意のある第三者はすでに認証済みのページにアクセスすることができる。
セッションIDを固定する方法は多種多様である。Webアプリケーション側でセッションIDの固定化攻撃に対策する方法として、認証が完了した時点でセッションIDを変更するという方法がある。
そうすることにより、認証前にセッションIDが固定されたとしても、認証後にセッションIDが変わるため固定されたセッションIDでアクセスしようと試みる悪意のある第三者は認証されておらず攻撃は成功しない。
Railsでのセッションハイジャック対策方法について
Railsでのセッションハイジャックの対策も非常に簡単に行うことができる。
まず、セッションの盗聴についてだが
/pictweet/config/environments/production.rbの
1 |
config.force_ssl = true
|
上記記述のコメントアウトを外してあげる。これにより、本番環境で環境アプリケーションを公開する際に、SSLを使い通信経路を暗号化してくれるため、セッションIDの盗聴を防ぐことが可能になる。
Rails側のHTTPSの設定は完了するが、Nginx等の設定を、HTTPへのアクセスからHTTPSへリダイレクトする設定へ変更する必要がある。今後、サービスをローンチする機会がある場合はNginx等の設定を変更し対策をしていく。
セッション固定化攻撃に関してもRailsでは1行のコードで対策することが可能である。
対策として、ログイン成功後に古いセッションを無効にし新しいセッションIDを発行するという方法がある。
1 |
reset_session
|
上の1行をセッションを再発行したいアクション内に指定することにより、セッションは再発行されセッション固定化攻撃を防ぐことができるようになる。
まとめ
- セッションハイジャックによる被害は正規利用者として実行できるすべてのことが想定される
- セッションIDを生成する際は開発ツールの機構を使用する
- 認証成功後セッションを再発行する