セッションハイジャックとは
セッションハイジャックは、ネットワーク通信において、当事者間で行われる一連の通信(セッション)を、本来の通信者ではない第三者が不正に奪取する攻撃手法です。特にWebアプリケーションにおけるHTTPセッションの乗っ取りがよく知られていますが、この用語はHTTPに限らず、より広範なネットワーク通信におけるセッションの乗っ取りを指します。
セッションの概要
ネットワーク通信では、複数のやり取りを通じて一連の処理が完結することがあります。これをセッションと呼びます。例えば、Webアプリケーションでユーザーがログインし、操作を行い、ログアウトするまでの一連の流れや、動画
ストリーミングの開始から終了までがセッションとして扱われます。これらのセッションは、双方向性や連続性を持つ通信を管理するために重要な役割を果たします。
各セッションは、一意のセッションIDによって識別されます。通信の当事者はこのIDを相互に送受信することで、どのセッションに関する通信であるかを特定します。
セッションハイジャックの手口
セッションハイジャックは、攻撃者が何らかの方法でこのセッションIDを不正に取得し、正規のユーザーになりすまして通信を乗っ取ることで行われます。例えば、銀行のオンラインシステムにログイン中のユーザーのセッションをハイジャックした場合、攻撃者はそのユーザーの口座から不正に送金を行うことが可能になります。
多くのWebアプリケーションでは、ユーザーが最初にログインする際にパスワード認証を行いますが、ログイン後はセッションIDのみでユーザーを識別します。そのため、攻撃者がセッションIDを奪取すれば、パスワードを知らなくても不正な操作が可能になるのです。
HTTPセッションハイジャックの分類
HTTPセッションのハイジャックには、主に以下の3つの方法があります。
1.
セッションIDの推測: セッションIDが予測可能な方法で生成されている場合、攻撃者はそのIDを推測して不正アクセスを試みます。例えば、連番、タイムスタンプ、ユーザーIDなどを基に生成されたIDは、推測されやすいです。
2.
セッションIDの盗み出し: Webアプリケーションに
脆弱性がある場合、攻撃者は
クロスサイトスクリプティング(XSS)やHTTPヘッダインジェクションなどを利用して、ユーザーのブラウザに保存されているセッションIDを盗み出すことができます。また、URLにセッションIDが含まれている場合、リファラ情報を悪用して盗まれることもあります。
3.
セッションID固定化攻撃: これは、攻撃者が用意したセッションIDを被害者のブラウザに強制的に設定し、そのセッションを乗っ取る手法です。攻撃者は、URLを改ざんしたり、
脆弱性を利用してcookieを書き換えたりして、セッションIDを固定化します。
セッションID固定化攻撃の詳細
セッションID固定化攻撃では、攻撃者はまず自身でセッションIDを取得し、何らかの手段で被害者のブラウザにこのIDを送り込みます。これにより、被害者がWebアプリケーションにアクセスする際に、攻撃者が指定したIDでセッションが開始されます。
この攻撃は、セッションIDをURLに埋め込んでいるWebアプリケーションでは、改ざんしたURLを被害者にクリックさせることで実行可能です。cookieを使用している場合は、
クロスサイトスクリプティングなどの
脆弱性を悪用し、cookie内のセッションIDを書き換えます。
攻撃者が使用するIDは、ランダムに生成したものや、攻撃者自身がWebアプリケーションと確立したセッションIDを流用する場合があります。後者の場合、Webアプリケーションが発行した正規のIDが使用されるため、対策がより難しくなります。Webアプリケーションの側で自身の発行したセッションIDを全て管理していれば、Webアプリケーションは攻撃者の生成したセッションIDを受け入れずにすむはずですが、古いバージョンのPHPのように、自身の発行していないIDも受け入れてしまう言語特性(セッションアダプション)が問題になることがあります。
セッション管理の方法と対策
Webアプリケーションとブラウザ間でセッションIDをやり取りする方法として、以下の3つが一般的です。
1.
cookie: WebアプリケーションはSet-Cookieヘッダーでcookieを発行し、ブラウザは自動的にそのcookieをサーバーに送信します。
2.
フォームデータのhiddenフィールド: セッションIDをフォームのhiddenフィールドに含め、フォーム送信時にサーバーに送ります。
3.
URL: URLにセッションIDを含める方法ですが、セキュリティリスクが高いため、特別な理由がない限り避けるべきです。
安全なセッション管理のためには、cookieまたはhiddenフィールドを使用すべきです。hiddenフィールドの方がセキュリティは高いものの、実装が複雑になります。また、ログイン認証後にセッションIDを変更することで、ログイン前に漏洩したセッションIDによるハイジャックを防ぐことができます。セッション管理機能を持つフレームワークを活用することも有効です。
TCPセッションとセッションハイジャック
TCPは、IP通信にコネクション機能を追加したもので、セッション管理の基礎となる機能を提供しています。TCPでは、
IPアドレスとシーケンス番号がセッションIDに相当します。攻撃者は、送信元
IPアドレスの詐称とTCPシーケンス番号の予測攻撃を組み合わせて、セッションを乗っ取ったり、不正なデータを挿入したりすることが可能です。
過去には
TCPシーケンス番号予測攻撃による大規模な被害が発生しましたが、現在では対策が進んでおり、沈静化しています。
参考文献
徳丸浩『体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践』SBクリエイティブ、2011年3月1日。
“CWE-384: Session Fixation”. MITRE (2015年12月8日).
“Session fixation”. OWASP (2014年8月14日).
“セキュアプログラミング講座 Webアプリケーション編 第4章 セッション対策セッション乗っ取り:#1 セッションIDとセッションID侵害手口”.
[情報処理推進機構] (2014年10月2日).
“米CERT/CCが警告したTCPスタックの深刻なぜい弱性”. 日経BP. 2009年1月28日.
“「セッション管理」のすべて”.
日経BP. 2009年1月28日.