クッキーとセッション管理における脆弱性
はじめに
ブログ初心者で、エンジニアとしての経験も浅いですが、技術ブログを始めたいと思い初めて投稿してみました。
webセキュリティの基礎を学ぶ中で、クッキーとセッション管理においての脆弱性について自分用にアウトプットします。
学んだこと
クッキーとセッションについて
前提としてhttp通信はステートレスであり、前回の通信の内容に影響されない。
セッションを用いたwebサーバーとの通信を行う際は以下の手順で通信が行われる。
1.webサーバーがHttpのレスポンスヘッダの「Set:cookie」により、ブラウザにクッキーの値(セッションID)を覚えるように指示する。
2.クッキーの値(セッションID)を覚えたブラウザはその後の通信にてサーバーに値を送信するようになり、ステートフルな通信が可能となる。
このようにサーバーに情報を保持したい場合に便利なクッキーとセッションの仕組みですが、以下に記述する悪人がセッションIDを強制する(セッションIDの固定化攻撃)やセッションIDが漏洩することによるなりすましの危険性があります。
セッションIDの固定化攻撃
以下のような手順の攻撃です。
1.利用者がセッションを用いた通信を行おうとする際に、悪人がセッションIDを指定。
2.何も知らない利用者が、悪人が指定したセッションIDを用いて利用者が認証を行う。
3.利用者の認証済みの情報で悪人がサーバーに対して通信を行う。(
対策として、認証が完了した時点で別のセッションIDを発行するという手段があります。
セッションIDの漏洩の原因
・クッキー発行の際の属性に不備がある(後述)
・ネットワーク的にセッションIDが盗聴される
・XSSなどのアプリケーションの脆弱性により漏洩する
クッキーの属性について
クッキーのdomain属性
ブラウザがクッキーを送信するサーバーのドメインを指定できます。不用意に設定すると前述したセッションIDの固定化攻撃などの脆弱性の原因となりますので、通常は設定しないようにします。
クッキーのSecure属性
セキュア属性をつけていないクッキーはHttpsの通信かどうかに関わらず、サーバーに送信される。一方でセキュア属性をつけたクッキーはHttps通信時にのみクッキーをサーバーに送信します。
クッキーのHttpOnly属性
httpOnly属性をつけるとJavaScriptによるクッキーを盗み出すことができなくなります。 特にHttpOnly属性をつけることによるデメリットはないようですので、基本つけるようにするといいようです。
参考
下記の参考書に詳しく分かりやすく、書かれています。
体型的に学ぶ安全なwebアプリケーションの作り方
Discussion