クロスサイト・リクエスト
- 攻撃: CSRFやXSS
クロスサイト・リクエストとは
- 現在の(アドレスバーの)ドキュメントがあって、
- そこから別のドメインへのリクエスト
画面遷移あり: ドキュメントが入れ替わる
a
タグ、form
タグ
- アドレスバーのドメインが変わる
- 旧ドキュメントのJavaScriptは(自身がもう存在しないので)、新ドキュメントにアクセスできない
画面遷移なし: 別のドキュメントを内部で利用
fetch()
: 主に制限あり、CORSで許可- 埋め込み系:
iframe img link
タグなど
- ドメインそのまま、現在のドキュメントのまま(トップレベルは)
CORS
- レスポンスについて、利用制限と許可の仕組み
警戒すべき理由
攻撃: クロスサイト・リクエストフォージェリ(CSRF)
- 標的のWebサーバ: 認証に脆弱性
- 攻撃者: 悪意のあるリクエストを構成 (実行はしない)
- それをリンクやJavaScriptにしてどこかに置く
- ユーザをそこに誘導
- ユーザ: リンクを踏んだりして、意図せずリクエスト実行
攻撃: クロスサイト・スクリプティング(XSS)
- 標的のWebアプリ: 不正なJavaScriptが入り込む脆弱性
- 攻撃者: 不正なJavaScriptを生成させる
- サニタイズできてない入力から (不正なURL、ユーザ入力)
- サードパーティライブラリ汚染から
- ユーザ訪問: 意図せず外部へリクエスト実行 (例: セッション情報流出)
(XSSはクロスサイト・リクエストでなくてもリスクあり)
単純なGET
かつ画面遷移する場合
- 見るだけ: サーバ側に「追加・変更・削除」がない
GET
はリソースに変化をもたらさないようにサーバ実装する前提
- 画面遷移: ドキュメント自身が宛先のサイトのものに変わる
=> 比較的には安全
- CSRFが生じても、ユーザ自身がユーザ情報画面を見せられるだけ
- 「怪しいリンクを踏んだら、別途ログイン済みサイトの登録住所表示ページに画面遷移」
- => 実害なし?!
CSRFの対策
セッション情報を必須に
- クロスサイト・リクエストでは付加できないもの
- 特に
POST
など安全でないメソッドのとき
注意: cookie自動付加
SameSite=None
属性のとき- 攻撃者がcookie(セッション情報)を知らずに攻撃成功
- サイトA: ユーザがログイン (ログアウトせず)
- 攻撃者サイト: ユーザが訪問
- サイトAへクロスサイト・リクエスト (画面上はこっそりと)
- cookie自動付加
- サーバが処理してしまう
XSSの対策
- ユーザ入力をコンテンツに反映の場合: サニタイズ
- サードパーティライブラリの検査
- Content-Security-Policyヘッダ
同一オリジンポリシー
fetch()
する側 == される側
同一オリジン == プロトコル・ドメイン・ポートがすべて同じ
http
とhttps
は別オリジン
クロスオリジンfetch()
のレスポンスをブロック
- ブラウザ標準の制限
- CORSで許可できる
画面遷移系と埋め込み系はクロスサイトほぼ許可
画面遷移系タグ
a form
埋め込み系タグ
- セッション情報を通常直接は含まないか、利用できない
<script src="クロスサイトURL"></script>
- JSONPは使わない前提
img link video
など
iframe
- JavaScriptから
iframe
のドキュメントにアクセス制限(一部)
- JavaScriptから
fetch()
のレスポンス利用制限とは
- クロスオリジン・リクエストのとき
リクエストはできる
- リクエストを送信する前にエラー、ではない
- (プリフライトのエラーでは送信なし)
レスポンスもブラウザに届く
- => 開発ツールから閲覧可: FireFoxならF12 => ネットワーク
それを現ドキュメントで内部利用できない
fetch('http://別オリジン.example.com/パス', init).then(
res => res.text() // この中に到達せずエラー
).then(console.log).catch(console.error)
=> 注意: 「リクエスト到達 == 攻撃成功」の場合あり
localStorageの制限内容
- オリジンごとに隔離された設定・参照
- クロスサイト・リクエストとは直接関係なし
別オリジンへ許可できない
- 間接的に参照: クロスサイトの
iframe
とpostMessage()
でデータの受け渡し
XSSに注意
- グローバル変数
localStorage
へのアクセスが簡単
cookieの制限内容
- ドメインごとに隔離された設定・参照
- 「Public Suffix List」直下を単位
- クロスサイト・リクエスト時、宛先所属のcookie自動送信の場合あり