セッションに係る脆弱性とその対策① - セッションハイジャック
前日の記事では、ユーザがHTTPリクエストにパラメータを乗っける代わりに、セッションを活用する記事を書いた。 セッションを利用することで、クライアントが任意のデータを送信し、それに対応するデータの取得を防止できる(なりすましを防げる)。 但し、セッションを利用するサービスを運用する上で頭に入れておくべき有名な脆弱性があるので、復習を兼ねてメモ。
セッションを利用したパラメータの取得
今回も、オンラインショッピングサイトを例に取る。
クライアントはサーバに対して「カート情報を取得する」HTTPリクエストを送信する。サーバはクライアントからのリクエストを受け取った時、ユーザとのセッション情報からセッションIDを取得、セッションIDから対応するユーザIDを(予め用意したユーザIDテーブルなどから)取得しDBを叩く。
この仕組みによって、直接通信経路上でユーザIDがやり取りされない。また悪意あるユーザが第三者ユーザのIDを送りつけ、第三者のカート情報を取得することも防ぐ。
セッションハイジャック
セッションハイジャックとは、悪意ある第三者が、サービスを利用するユーザのセッションID盗む・推測し、そのIDを使って正規のユーザになりすます攻撃を指す。
ユーザIDが指定できなくとも、セッションIDがクライアント・サーバ間でやり取りされているので、結局元々あったなりすましの脆弱性がセッションIDのやり取りにすり替わったという話。
ユーザIDの場合、設計上整数値などわかりやすい値で扱われることが多いため、すぐに推測されやすい。 一方で、セッションIDはハッシュ値とすることで、推論によるセッションID偽装の可能性をユーザIDよりも低く抑えられる。
但し、一つのクライアントが常に同じユーザIDを使い続けていたり、ハッシュ値を使わず連番や生年月日を使ってしまうと、 当然推測が容易になってしまう。
また、通信経路の暗号化がなされていない場合、プレーンテキストが丸見えなため、セッションIDが盗まれやすくなってしまう。
セッションが盗まれることによるリスク
セッションIDが盗まれることで、悪意ある第三者がサービスのユーザの情報を盗み見ることができる。またログインをセッションを利用して行う場合、認証無しでアカウントを利用できる。例えば上記サービスであれば、メールアドレスや住所、電話番号等の個人情報の窃取や、実際に買い物をしてしまうことさえ可能になる。
セッションハイジャック対策
セッションハイジャックのヒガイを防ぐためには、セッションIDが漏洩しないこと、そして推測されないことが必須である。 セッションIDの漏洩を防ぐには、クライアント・サーバ間の通信の暗号化が必須である。また推測を防ぐためには、 簡易なセッションIDを使うのをやめ、ハッシュ値などの推測しにくい値をセッションIDとして使用するとよい。
まとめ
セッションフィクセーションなど、他のセッションに関する脆弱性についてもメモっておきたい。
TODO
- 具体的なセッションID盗聴防止対策・推測防止対策