0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【セキスペ対策】SameSiteとかCookieの属性の勉強

Posted at

概要

情報処理安全確保支援士を目指してCookieの属性を勉強していると、
どの属性がどういう用途なのか混乱してきたので整理。

Cookieの主なセキュリティ属性

属性名 概要 主な目的
HttpOnly JavaScriptからアクセスできなくする XSS対策
Secure HTTPS通信でのみCookieを送信 通信の盗聴対策
SameSite クロスサイトからのリクエストでのCookie送信制御 CSRF対策

※クロスサイト
 Cookieの発行元以外のWebサイトにそのCookieを送信すること。

HttpOnly

ずばりクロスサイトスクリプティング(XSS)対策のための属性
XSSは簡単に言うと、攻撃者が用意したJavascriptをブラウザで実行してしまう攻撃
 ※XSSについてはこちらにまとめたので参考にしてもらえれば。
  https://qiita.com/muramasa03/items/6e1ad421b12962103d22

Javascriptをブラウザで実行してしまったとき、スクリプトがCookieを利用できてしまうと
セッションIDなどの大事な情報が攻撃者に転送されてしまいかねない。

そもそもスクリプト内で

document.cookie

を実行するとアクセス可能なCookie一覧が取得できるのだが、
HttpOnly属性のCookieは一覧に含まれないので、スクリプトで利用されることがなくなる。

めも1
HttpOnly属性はスクリプトにCookieを使われることを防ぐものであって、スクリプトの実行自体を防ぐものではない。
スクリプトの実行防止は別の対策(CSPとか)が必要。

めも2
どうやらHttpOnly属性では、すべてのスクリプトからのCookie利用を禁止するしかできない模様。
(特定のスクリプトからは利用可能。。といった柔軟な設定はない。)

Secure

盗聴防止。「HTTPでの通信ではこのCookieを送信できないよ。HTTPSならOK」という属性。
セッションIDなど盗聴されると困るCookieに対して暗号通信を必須化したいときにSecure属性をつける。

試験で「Cookieの盗聴が」みたいな記載があればSecureを思い浮かべるとよさそう。

めも3
Secure属性はXSSには無力。
Javascriptはあくまでブラウザ内で実行されるので、HTTPSかどうかは関係ない。
そしてJavascriptはブラウザ内でCookie情報を取得した後、攻撃者のサイトにHTTPS通信で情報を送れてしまう。

SameSite

クロスサイトリクエストフォージェリ(CSRF)対策。
Secure属性を付与した場合、Cookieの平文での送信を防ぐ(HTTPSプロトコルに制限する)ことはできるが、
HTTPS通信であればどこにでも遅れてしまう。(攻撃者が用意したサイトにも送れちゃう。)

それでは困るのでCookieの送信先を制限するのが、SameSite。
SameSiteは3段階のセキュリティとなっている。

属性 仕様
strict Cookieの発行元にしか送信しない
lax GETリクエストだけは許可
none すべて許可

strict

前提:
そもそもCookieはWebサイト(サーバ)側が発行するので、
そのCookieを発行したWebサイトが存在する。

仕様:
strictの場合、Cookieの発行元と送信先の以下3要素が完全一致する場合のみCookieを送信する。
 ・スキーム(http / https)
 ・ホスト(例:example.com)
 ・ポート番号(通常 http→80, https→443)

例:
"https://example.com" が発行したCookie情報は、"https://example.com" にしか送らない。
("https://sub.example.com" とか "http://example.com" でも別物扱い。)

lax

仕様:
基本的にはstrict準拠。
ただし、Getリクエストのみは「Cookieの発行元と送信先が不一致でもOK」

補足:なぜGetだけ許すのか。
結論から書くとGetはPostリクエストより安全性が高いから。

例えば、SNSに銀行口座Webサイトのリンクが貼ってあり、リンクをクリックしたとする。
Postリクエストを許していたら、攻撃者口座に振り込みができてしまう。(データ操作)
Deleteリクエストを許せば、攻撃者口座への振込履歴を削除できてしまう。(データ削除)
と、被害が大きい。

一方で、Getリクエストは口座残高を取得される(データ取得)ものの、POSTとかより被害は小さい。
なので、利便性を優先しようという考えがLax。
例:
SNSに貼られた通販商品へのリンクをクリックした際にセッション情報の取得を許可することで
商品ページが表示される。(毎回ログインページに誘導されることはない。)

めも4
laxは”ゆるい”という意味の英単語。

None

何も制限しない!

そもそも属性ってどうやってつけるのか。

繰り返すが、Cookieを発行するのはWebサーバ側。
ブラウザからのHTTPリクエストに対して、WebサーバがセッションIDなどのCookieを発行した際、
HTTPレスポンスに

Set-Cookie: session_id=abc123; SameSite=Lax; Secure; HttpOnly

と表記することでsession_idというCookieの発行と属性付与を行うことができる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?