用語「セッション固定攻撃」について
セッション固定攻撃 (せっしょんこていこうげき)
"Session Fixation" のことで、セッションハイジャックの手法の一つです。
通常のセッションハイジャックは、正規ユーザーに発行されたセッション ID を攻撃者が入手することで成立します。セッション固定攻撃の場合は発想が逆で、正規ユーザーが使用するセッション ID を攻撃者が指定するのです。正規ユーザーがそのセッション ID でログインすると、攻撃が成立します。
しかし普通はこんな攻撃は成立しません。普通の Web アプリケーションでは、ユーザがログインに成功した時に初めてセッション ID が発行されます。このセッション ID はサーバ側が勝手に割り振るもので、ユーザ側が好きなセッション ID を指定する余地などないのです。
ところが何を思ったものか、世の中にはログインする前にセッション ID を発行するというシステムが存在していて、ログイン時には「正しい ID・パスワードと共にセッション ID が送られてきたら、そのセッションをログイン済みとして処理する」という動作をしていることがあります。これにより、以下のような事態が発生します。
- 攻撃者がシステムにアクセスし、セッション ID を取得する。ログインしていないがセッション ID は発行される。
- 攻撃者は、正規ユーザがそのセッション ID を使ってログインするように仕向ける
- 正規ユーザがそのセッション ID でログインすると、そのセッションは「ログイン済み」となる
こうすると、攻撃者の指定したセッション ID がログイン済みとなりますので、攻撃者もアクセス制限された領域にアクセスできるようになってしまいます。
なお、ログイン前にセッション ID が発行されているからといって、ただちに問題になるわけではありません。セッション固定攻撃が成立するためには、以下のような条件が必要です。
- 攻撃者がセッション ID を指定することができる
- ログインしてもセッション ID が変わらない
前者については、特に PHP で注意が必要です。PHP では、クエリに「PHPSESSID=……」という文字列をつけただけで、それをセッション ID として受け入れてしまうことがあります(session adoption)。そうならないように設定しておく事が望ましいでしょう。PHP 以外でも、Cookie Monster と呼ばれる問題によって Cookie をセットされてしまう可能性があります。クライアントが送ってきたセッション ID を無条件に受け入れることがないようにするべきでしょう。
いずれにしても、後者について対策することが望ましいでしょう。そもそもログイン前にセッション ID を発行する必要自体がない場合が多いのですが、トラッキングその他の理由で必要な場合、ログインが成功した時点でセッション ID を変えてしまうという方法が考えられます。こうすると、攻撃者が持っているセッション ID ではログインできませんので、攻撃は成立しなくなります。
- 「セッション固定攻撃」にコメントを書く