UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Webセキュリティ】Google I/O 2021 で発表されたセキュリティの話

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つ全てが一致したとき

https://www.example.com:443

same-site

eTLD+1が一致した時

TLDとは

https://www.example.com:443

eTLDとは

https://my-project.github.io:443

※eはeffectiveの頭文字とのこと

他参考

https://web.dev/security-headers/