CookieStoreセッションに対する攻撃
CookieStoreによるセッション管理
- RailsはデフォルトのセッションストレージとしてCookieStoreを用いる。
- CookieStoreはセッション情報をsecret_key_baseで暗号化し、クライアント側のcookieに保存する。
再生攻撃
最初にブラウザに保存されていたcookieをコピーしておき、現在のブラウザのcookieと差し替える。これにより、セッション情報を以前の状態に戻されてしまう。
対応策
戻されてまずいデータはセッション情報に含めずデータベースで管理する
セッション固定攻撃
ブラウザ上のユーザーのセッションIDを攻撃者の知っているセッションIDに固定しておき、ユーザーが気づかないうちにそのセッションIDを使わせる。
- 攻撃者はレスポンスに含まれるcookieから自分のセッションIDを取り出す
- XSSによってJavascriptコードのインジェクションを行い、標的ユーザーのブラウザで自分のセッションIDを読み込ませる
- 標的ユーザーがブラウザでページを開くと、そのユーザーのセッションIDが攻撃者の仕込んだものと差し替えられる
- 標的ユーザーのブラウザでは仕込まれたセッションIDでのログインはまだ行われていないので、アプリは認証を要求する。
- 認証が完了すると、標的ユーザーは攻撃者と同じセッションIDを共有した状態になる。
対応策
- ログイン成功後に古いセッションを無効にし、新しいセッションIDを発行する。
reset_session
# このメソッドを実行するとセッションにある全ての値が削除されるので、それらを新しいセッションに転送しておく必要がある
- ユーザー管理用にsorceryやDeviceを導入していればログイン/ログアウト時に自動的にセッションが切れるようになる
invalidate_active_sessions! # Invalidate all sessions with a login_time or last_action_time before the current time. # Must Opt-in # from sorcery
- セッションに有効期限を設けることで攻撃される機会を減らす
# config/initializer/sorcery.rb # # -- session timeout -- # How long in seconds to keep the session alive. # Default: `3600` # config.session_timeout = xxx