2011年10月26日水曜日

Cookieを使ってもいいの?

Cookieといえば、ログインを伴うサイト構築を行う際に、セッションIDを保存するアレだ。
しかし、なんとなく使っているCookieなので、セキュリティとかどうなの?とかHTML5のWeb Storageと比べてどうなの?など、突き詰めるとモヤっとした部分が多い。

今回は、とりあえずCookieの使用を検討するにあたって知っておくべきと思われることをまとめる。

Cookieとは

複数のページを跨いだ、あるいはブラウザの起動を跨いだ情報共有を行うための機構である。 その実態は、PC上に保存されたテキストファイルであり、ページにアクセスする度にサーバーへ送信される。

Cookieのパラメータ

パラメータ意味
KEY=VALUECookieに設定するキーと値
expires=VALUE有効期限、省略=ブラウザ終了まで、過去=Cookie削除
domain=VALUECookieの送信先ドメイン
path=VALUECookieの送信先パス
secureSSL通信時のみCookieを送信する

Cookieの発行方法


その1:HTML
<meta http-equiv="Set-Cookie" content="VISITED=1; expires=Sat,26-Nov-2011 00:00:00 GMT;">

その2:JavaScript
document.cookie
  ="VISITED=1; expires=Sat,26-Nov-2011 00:00:00 GMT;";

その3:サーバーサイド

HTTPヘッダで指定する

Set-Cookie: VISITED=1; expires=Sat,26-Nov-2011 00:00:00 GMT;

Cookieにまつわるセキュリティの話


Domainパラメータ

ockeghem(徳丸浩)の日記によれば、RFC6265に規定されている通り、Cookieの送信先ドメインはDomainパラメータで指定したドメインおよびそのサブドメインであるらしい。
送信先を限定するという意味では、Domainパラメータを指定しない(=発行元ホストのみに限定する)ほうが安全である。

但し、IE9、iモードではDomain指定無しでもRFC6265を無視してサブドメインへも送信してしまうので注意が必要。


Pathパラメータ

PathパラメータではCookieの送信先パスのプレフィクスを指定できるが、その効果は「無用なCookie送信を抑制する」くらいであり、「指定したパス以外にCookieが送信されないことを保証」できるものではない

高木浩光@自宅の日記に詳細が記されているが、同一ドメイン内の任意のページでFRAME+JavaScriptを利用することでCookieを取得できてしまう。


Cookie Monster Bug(Cross Domain Cookie Injection)

  • .example.co.jpに対して発行したCookieは、そのサブドメインであるwww.example.co.jpにも送信される。
  • 同様に.co.jpに対して発行したCookieは、あらゆるxxx.xxx.co.jpに対して送信される。

故に.co.jpや.comに対してCookieが発行されないようにブラウザが規制すべきだが、IE9やOpera 11にはこの規制が無い…という問題。
(参考:属性型JPドメインと地域型JPドメインに対するCookie Monster Bug調査)

典型的な影響としてセッションIDの固定化攻撃(Session Fixation)というのがあるらしい。奴らはこんな感じで攻めてくる。


Session Fixation攻撃への対策

  • ログインの度にセッションIDを再発行して、ちゃんとCookieに設定し直す。


Cookie Monster Bugへの対策

Cookie Monster Bugの影響により、上位のドメインに対して発行されたCookieが干渉する可能性がある。一例として下記が挙げられる。

SESSIDという名前で2つの値が送信されているHTTPリクエスト

POST /login.cgi HTTP/1.0
(略)
Cookie: SESSID=malicious_cookie; SESSID=08afa677654dcbg44eadfb46e1858119
Content-Type: application/x-www-form-urlencoded
Content-Length: 35

対策として

  • 上位のドメインに対して有効期限切れのCookieを発行して無効化する
  • 複数SESSIDへの対応を行う(有効なものを探す or エラーとしてしまう)
  • Cookie使わない
といったことが考えられる。
参考:Cookie Monster襲来! 戦え、星野君

0 件のコメント:

コメントを投稿