Google I/O 2021 で発表されたコンテンツから、日本のデベロッパーへ向けて特にお届けしたいテーマに焦点を当て紹介をするウェビナーを拝見した
developersonair.withgoogle.com
その中でセキュリティに関する話の個人的メモ
Spectreからユーザーを守る
Spectreは悪意のあるユーザが同一のオリジンポリシーでの保護にも関わらずメモリーを読み取り、クロスオリジンのコンテンツを傍受可能にしてしまう問題
Spectreは以前調べた
https://uga-box.hatenablog.com/entry/2021/04/02/000000
これはハードウェアであるCPUが原因なので、この脅威をハードウェアレベルで排除するのはまだ難しい
そこで、ブラウザ側とサイト開発者側でこれらを防ぎたい
Sprectreからの保護で肝心なのは分離
サイトのシステムデータが攻撃者のサイトと同じ環境で処理されることが絶対ないことを確認することが必要
1. クロスオリジンドキュメントがリソースを読み込めないようにする
CORS(Cross-Origin Resource Sharing)を使用するか、CORP(Cross-Origin Resource Policy)ヘッダーを使用する
// CORP usage: Cross-Origin-Resource-Policy: same-origin Cross-Origin-Resource-Policy: same-site Cross-Origin-Resource-Policy: cross-origin
2. COOP(Cross-Origin Opener Policy)でポップアップ表示時にブラウザにドキュメントの分離制御を指示する
// COOP usage: Cross-Origin-Opener-Policy: same-origin // クロスオリジンのドキュメントからドキュメントを分離する Cross-Origin-Opener-Policy: same-origin-allow-popups // それ自体で開いたウィンドウとはコンテキストは共有可能 Cross-Origin-Opener-Policy: unsafe-none // デフォルトでクロスオリジンのドキュメントとコンテキストを共有できる
3.ドキュメントの読み込みはX-Frame-OptionsヘッダーとContent-Security-Policy(CSP)のframe-ancestorsディレクティブで防ぐ
// XFO usage X-Frame-Options: DENY // CSP usage Content-Security-Policy: frame-ancestors 'self' http://other.example; // オリジン毎の細かい制御が可能
4. XCTO(X-Content-Type-Options)でブラウザにMIMEスニッフィングを適用しないように指示する
X-Content-Type-Options: nosniff
オプトインとしてのセキュリティからデフォルトのセキュリティへ
ここまではオプトインとしてのセキュリティ対策だが、デフォルトで有効であるべきという話
デフォルトで保護し、保護をはずすほうが健全だよねということ
1. document.domainをやめる
スクリプトを用いると、document.domain の値を現在のドメインまたは上位ドメインに変更し同一オリジンポリシーを緩和できる
これにより、同じサイトの保護されていないプロパティを同一オリジンにすることができ、攻撃者によって悪用される可能性がある
→利用を廃止するべき
→window.postMessageに切り替える
2. クロスオリジンのドキュメント埋め込みを禁止する
iframeはデフォルトでクロスオリジンのドキュメントが読み込める
これによりフレームにメッセージを渡したり、iframe内の子要素の数を数えたりできるため、例えばログイン前と後の差分で個人情報を特定することができる
これをデフォルトで禁止し、オプトインでクロスオリジンの埋め込みができるようにする
→XFOやCSPのframe-ancestorsを送信する
X-Frame-Options: ALLOWALL or Content-Security-Policy: frame-ancestors 'self' [urls]
Popupでも同じことができるのでデフォルトで禁止し、やりたい場合は下のオプションをつけて送信する →COOP unsafe-none
Cross-Origin-Opener-Policy: unsafe-none
その他
same-originとsame-siteの違い
same-origin
scheme, host name, port の3つ全てが一致したとき
- scheme [https]
- host name [www.example.com]
- port [443]
same-site
eTLD+1が一致した時
TLDとは
- TLD: [com]
- TLD+1: [example.com]
eTLDとは
※eはeffectiveの頭文字とのこと