学習忘備録

学習のアウトプットや感じた事を発信していきます

クッキー出力にまつわる脆弱性

書籍を読んで

www.amazon.co.jp

こちらの書籍を読んでWebアプリケーションを作る際に重要な要点を自分用としてアウトプットします。

クッキー出力にまつわる脆弱性

Webアプリケーションではクッキーによるセッション管理が広く用いられているが、クッキーの扱い方次第で脆弱性が生まれる場合がある

○ クッキーはセッションIDの保管場所として利用すべき

× データそのものをクッキーに保存するのはよくない

クッキー出力時に発生する脆弱性

  • HTTPヘッダ・インジェクション脆弱性
  • クッキーのセキュア属性不備

クッキーの不適切な利用

クッキーに保存すべきでない情報

セッション変数は外部から書き換えができないのに対して、クッキー値はアプリケーションの利用者によって書き換えが出来てしまう

このため、書き換えられると困る情報をクッキーに保存すると脆弱性の原因になる

クッキーにデータを保存しないほうがよい理由

クッキーにデータを保存する方法と、セッション変数を使う方法を比較した場合に、クッキーで実現できてセッション変数で実現できない項目は以下の2点のみ

  • 情報の寿命の制御
    • セッション限り
  • 異なるサーバとの情報共有
    • 基本的には不可能

この2点以外はセッション変数が便利、かつ安全に使用出来るため、通常はセッション変数を利用すべきである

クッキーのセキュア属性不備

セキュア属性がついている場合

  • HTTPSの場合のみブラウザからサーバに送信される

セキュア属性がついていない場合

  • 平文で送信される場合があり、盗聴される可能性がある
脆弱性が生まれる原因

直接的な原因は、

単にセキュア属性をつけていないだけ

セキュア属性をつけない主な原因

  • 開発者がセキュア属性について知らない
  • セキュア属性をつけるとアプリケーションが動かなくなる

ショッピングサイトは、カートに追加するまではHTTP、認証〜購入まではHTTPSを利用している場合がある。

対策としては、サイト全体をHTTPSにする「常時TLS」にした上でクッキーにセキュア属性をつけること

常時TLSへの以降が難しい場合はトークンを用いた対策がある

対策

クッキーにセキュア属性をつけること

セッションIDをを保持するクッキーにセキュア属性をつけられない場合は、「セッションIDの固定化」と同じ対策としてトークンを利用してセッションハイジャックを防止する方法がある

セキュア属性以外の属性値に関する注意
  • Domain属性
    • デフォルト状態(指定しない状態)がもっとも安全な状態
  • Path属性
    • PHPのセッションIDは、デフォルトでは「Path=/」という属性で発行され、通常はこれで問題ない
    • Path属性を指定しても、安全性が高まるわけではない
  • Expires属性
    • セッションIDには通常Expires属性を付けず、ブラウザ終了と同時にクッキーが削除される状態にする
    • Expires属性を設定すると、ブラウザを終了した後も認証状態を維持することが出来る
  • HttpOnly属性
    • HttpOnly属性をつけたクッキーはJavaScriptから参照できなくなる
    • セッションIDをJavaScriptから参照する意味はない
    • そのため、HttpOnly属性は通常つけることにすると良い