どうも、すなです。
セキリュティについて学ぼうシリーズ、色々やってきたけれども今回でいったん最終回の予定。
最終回はセッションハイジャックについて。
これで主要なセキュリティ関連についてはある程度まとめられたから満足。
たまに見返すけどとても役に立つから過去の自分GJってなってる。
本当まとめてよかった。
今回は分量も多くないのでさくっとまとめていく。
じゃあさっそくセッションハイジャックの概要について。
セッションハイジャックとは
第三者がセッションIDを悪用して成りすますこと。
うん、簡潔でよろしい。
セッションIDは主に認証結果などを記憶する手段として使用される。
セッションIDが第三者に漏れてしまうことが根本的な原因なのだけれども、そのルートは主に3種類ある。
1. セッションIDの推測
2. セッションIDの盗み出し
3. セッションIDの強制
これらについて全て対策する必要がある。
原因と対策
今回は分量も多くなさそうなのでこれらについて一つずつ原因と対策をまとめて見ていく
1. セッションIDの推測
これはもう簡単、そのまま。
推測可能なセッションID、たとえば連番だったり日時とユーザーIDの組み合わせだったり。
外部から推測可能なデータを元にしたセッションIDの作成はリスクがある。
基本的にはセッション管理機構を自作せずに、実績のある言語やミドルウェアが提供しているセッション管理機構をそのまま使うのが良い。
対策もシンプル。次!!
2. セッションIDの盗み出し
なんらかの原因でセッションIDが外部から盗み出されてしまうケース。
なんらかの原因とは主に以下のケース。
・クッキー生成の属性不備
・ネットワークで盗聴される
・XSS脆弱性
・セッションIDをURLに保持している場合
別のところで基本的な対策をしていれば問題なさそうなので、ここではセッションIDをURLに保持している場合を考える。
セッションIDをURLに埋め込んでいるとReferrerヘッダを通してセッションIDを外部から取得できてしまう。
そのため、そもそもURL埋め込みのセッションIDは禁止すべき。
これも言語ごとに設定とかがあるっぽいのでちゃんと設定すべき。
これも対策シンプル。次!!
3. セッションIDの固定化
これが一番対策した方がよさげな項目。
セッションIDを外部から強制する方法であり、セッションIDの固定化攻撃と呼ばれるらしい。
これまでの漏洩や推測とは異なり、これは攻撃者が特定の人に対して任意のセッションIDを強制するというもの。
主な手順は以下の通り
1. セッションIDの入手
2. 被害者に対して1のセッションIDを強制する
3. 被害者がアプリにログインする
4. 攻撃者は強制したセッションIDを使ってアプリにログインする
3の時点でセッションIDを使ってログインしているので、4ではそのセッションIDでログインできてしまうというカラクリ。
さて、根本的な原因としてはセッションIDが外部から強制されてしまうことである。
したがって、それを防げばいい…のだが、そのためにはクッキーモンスターバグに対応したり中間社攻撃でクッキーを設定する攻撃に対応したりと、なんやかんやで対策が膨大かつOSのバグの影響など自分で対策仕切れないものもある。
したがって、セッションIDが外部から強制されることは許容し、セッションIDの固定化攻撃が行われてもセッションハイジャックされないように対策するのが現実的な解決策。
具体的には認証が成功した後で、セッションIDを変更することが対策になる。
手順のところの被害者が3でアプリにログインした後、そのセッションIDを使って攻撃者がアプリにログインできてしまうのが問題なのである。
したがって、たとえセッションIDを強制されていたとしても、それでログインした後にそのセッションIDを変更してしまえば攻撃者は強制したセッションIDでログインできなくなる。
基本的にセッションIDの再生性は言語やミドルウェアで用意されているものだが、それがない場合はトークンを使用する。
ログイン時にトークンを発行し、クッキーとセッション変数の両方に記憶させて、各ページの認証時にそれらを比較する。
トークンが外部に出てくるタイミングはログイン時のクッキー生成のみなので、攻撃者はトークンの内容を知り得ない。
めでたしめでたし。
まとめ
セッションハイジャックは起きるケースは3種類あるけどどれもわりと簡単に対策できそうな印象。
セキュアな情報なんだから推測できないようにしたり、URLとかの外部から見えるところに書かないようにしたりってのはここに限らずそうだよねって感じ。
対策も言語だったりフレームワーク で簡単にできそう。
ようやくセキュリティシリーズ終わったけど本当まとめてよかった。
今後は主にReact関連について書いていきたい。
ガッツリまとめるものもあっていいけど、もうちょいさくっとメモ程度に書いていきたいなーとも思ったりする。
コメント