クッキー出力にまつわる脆弱性
書籍を読んで
こちらの書籍を読んでWebアプリケーションを作る際に重要な要点を自分用としてアウトプットします。
クッキー出力にまつわる脆弱性
Webアプリケーションではクッキーによるセッション管理が広く用いられているが、クッキーの扱い方次第で脆弱性が生まれる場合がある
○ クッキーはセッションIDの保管場所として利用すべき
× データそのものをクッキーに保存するのはよくない
クッキー出力時に発生する脆弱性
- HTTPヘッダ・インジェクション脆弱性
- クッキーのセキュア属性不備
クッキーの不適切な利用
クッキーに保存すべきでない情報
セッション変数は外部から書き換えができないのに対して、クッキー値はアプリケーションの利用者によって書き換えが出来てしまう
このため、書き換えられると困る情報をクッキーに保存すると脆弱性の原因になる
クッキーにデータを保存しないほうがよい理由
クッキーにデータを保存する方法と、セッション変数を使う方法を比較した場合に、クッキーで実現できてセッション変数で実現できない項目は以下の2点のみ
- 情報の寿命の制御
- セッション限り
- 異なるサーバとの情報共有
- 基本的には不可能
この2点以外はセッション変数が便利、かつ安全に使用出来るため、通常はセッション変数を利用すべきである
クッキーのセキュア属性不備
セキュア属性がついている場合
- HTTPSの場合のみブラウザからサーバに送信される
セキュア属性がついていない場合
- 平文で送信される場合があり、盗聴される可能性がある
脆弱性が生まれる原因
直接的な原因は、
単にセキュア属性をつけていないだけ
セキュア属性をつけない主な原因
- 開発者がセキュア属性について知らない
- セキュア属性をつけるとアプリケーションが動かなくなる
ショッピングサイトは、カートに追加するまではHTTP、認証〜購入まではHTTPSを利用している場合がある。
対策としては、サイト全体をHTTPSにする「常時TLS」にした上でクッキーにセキュア属性をつけること
対策
クッキーにセキュア属性をつけること
セッションIDをを保持するクッキーにセキュア属性をつけられない場合は、「セッションIDの固定化」と同じ対策としてトークンを利用してセッションハイジャックを防止する方法がある
セキュア属性以外の属性値に関する注意
- Domain属性
- デフォルト状態(指定しない状態)がもっとも安全な状態
- Path属性
- PHPのセッションIDは、デフォルトでは「Path=/」という属性で発行され、通常はこれで問題ない
- Path属性を指定しても、安全性が高まるわけではない
- Expires属性
- セッションIDには通常Expires属性を付けず、ブラウザ終了と同時にクッキーが削除される状態にする
- Expires属性を設定すると、ブラウザを終了した後も認証状態を維持することが出来る
- HttpOnly属性
- HttpOnly属性をつけたクッキーはJavaScriptから参照できなくなる
- セッションIDをJavaScriptから参照する意味はない
- そのため、HttpOnly属性は通常つけることにすると良い