優れた機能のために「クロスオリジン分離」が必要な理由

SharedArrayBufferperformance.measureUserAgentSpecificMemory()、高解像度タイマーなどの優れた機能を高い精度で使用するためにクロスオリジン分離が必要な理由について説明します。

はじめに

ウェブサイトを「クロスオリジン分離」するCOOP と COEP では、「クロスオリジン」を導入する方法を説明しました。 分離されています」状態をモニタリングできます。これは、Security Command Center Premium の ブラウザで強力な機能を利用するためにクロスオリジン分離が必要な理由。

背景

ウェブは同一オリジン ポリシー: アクセスを制限するセキュリティ機能 ドキュメントやスクリプトが別のオリジンのリソースとやり取りする方法。この ウェブサイトがクロスオリジン リソースにアクセスする方法が制限されます。対象 たとえば、https://a.example のドキュメントはデータにアクセスできません https://b.example で開催します。

ただし、同一オリジン ポリシーには過去にいくつかの例外がありました。すべてのウェブサイトでできること:

  • クロスオリジン iframe の埋め込み
  • 画像やスクリプトなど、クロスオリジン リソースを含める
  • DOM 参照を含むクロスオリジン ポップアップ ウィンドウを開く

ウェブをゼロから設計できたとしたら、このような例外は存在しません。 残念ながら、ウェブ コミュニティがウェブ コミュニティの主要な利点に ウェブではすでにこれらの例外が適用されていました。

このような緩い同一オリジン ポリシーによるセキュリティの副作用は、2 つの部分でパッチが適用されました。 できます。その方法の一つが、Cross-Cloud Interconnect という新しいプロトコルを導入したことです。 オリジン リソース シェアリング(CORS) サーバー間でリソースの共有が許可されるように、 表示されます。もう 1 つの方法は、コンテンツへの直接のスクリプト アクセスを暗黙的に クロスオリジン リソースにアクセスできます。そのような クロスオリジン リソースは「不透明」と呼ばれ、説明します。たとえば、次のような理由があります。 CanvasRenderingContext2D によるクロスオリジン画像のピクセル操作 イメージに CORS が適用されていない限り、失敗します。

こうしたポリシーに関する決定はすべて、ブラウジング コンテキスト グループ内で行われます。

ブラウジング コンテキスト グループ

長い間、CORS と不透明なリソースを組み合わせるだけで、 確認しました場合によっては、エッジケース(JSON や 脆弱性) パッチの適用が必要でしたが、全体として クロスオリジン リソースの RAW バイトへの直接読み取りアクセスを許可するため、 成功です。

これがすべて Spectre コードと同じブラウジング コンテキスト グループに読み込まれるデータも、 読み取り可能な可能性があります攻撃者は、特定の操作にかかる時間を測定することで、 CPU キャッシュの内容を推測でき、それを通じて、 process'できます。粒度の低いタイマーを使用すると、このようなタイミング攻撃が可能になる プラットフォームに存在するものの、高精度のタイマーを使用して高速化できます。 明示的(performance.now() など)と暗黙的( SharedArrayBuffer 秒)。evil.com にクロスオリジン画像を埋め込む場合は、 Spectre 攻撃によってピクセルデータを読み取るため、保護は以下に依存します。 "不透明度"非効率的です

スペクトル

理想的には、すべてのクロスオリジン リクエストはサーバーで明示的に精査される リソースを所有します。審査が提供されていない場合 アクセスしないと、データが閲覧に送られることは決してありません。 コンテキスト グループに分類されるため、Spectre には到達しません。 攻撃の種類です。これをクロスオリジン分離状態と呼びます。 COOP+COEP の特徴です

クロスオリジン分離状態では、リクエスト元のサイトは SharedArrayBufferperformance.measureUserAgentSpecificMemory()高解像度 タイマーの精度が向上し スペクターのような攻撃に使用します。また、インフラストラクチャの変更も document.domain

クロスオリジン埋め込みポリシー

クロスオリジン エンベディング ポリシー(COEP)は、 明示的に権限を付与していないクロスオリジン リソースを (CORP または CORS を使用)。この機能を使用すると、 ドキュメントで読み込めないリソースを定義します。

COEP の仕組み

このポリシーを有効にするには、次の HTTP ヘッダーをドキュメントに追加します。

Cross-Origin-Embedder-Policy: require-corp

COEP に指定できる値は require-corp キーワードのみです。これにより、 ドキュメントが同じ生成元からのみリソースを読み込めるというポリシー 明示的に別の送信元から読み込み可能とマークされています。

別の送信元からリソースを読み込めるようにするには、次のいずれかをサポートしている必要があります。 クロスオリジン リソース シェアリング(CORS)またはクロスオリジン リソース ポリシー(CORP)。

クロスオリジン リソース シェアリング

クロスオリジン リソースがクロスオリジン リソース シェアリングをサポートする場合 (CORS)を使用する場合は、 crossorigin 属性 COEP によるブロックを受けずにウェブページに読み込むことができます。

<img src="https://third-party.example.com/image.jpg" crossorigin>

たとえば、この画像リソースが CORS ヘッダー付きで提供される場合、 crossorigin 属性により、リソースを取得するリクエストで CORS が使用される モードです。また、 CORS ヘッダーを設定しない限り、画像が読み込まれないようにします。

同様に、fetch() メソッドを使ってクロスオリジン データをフェッチできます。 サーバーが適切なレスポンスを返す限り、 HTTP ヘッダー

クロスオリジン リソース ポリシー

クロスオリジン リソース ポリシー (CORP) 当初は、リソースが Google Compute Engine に 別のオリジンで読み込まれましたCOEP のコンテキストでは、CORP はリソース リソースを読み込めるユーザーに関するオーナー ポリシー。

Cross-Origin-Resource-Policy ヘッダーは次の 3 つの値を取ります。

Cross-Origin-Resource-Policy: same-site

same-site とマークされたリソースは、同じサイトからのみ読み込むことができます。

Cross-Origin-Resource-Policy: same-origin

same-origin とマークされたリソースは、同じオリジンからのみ読み込むことができます。

Cross-Origin-Resource-Policy: cross-origin

cross-origin とマークされたリソースは、どのウェブサイトからでも読み込むことができます。(が CORP 仕様と COEP)。

クロスオリジン オープナー ポリシー

クロスオリジン オープナー ポリシー (COOP)では、 トップレベル ウィンドウが他のドキュメントから分離されていることを、 別のブラウジング コンテキスト グループを作成し、 表示されます。たとえば、COOP が設定されたドキュメントでポップアップを開いた場合、 window.opener プロパティは null になります。また、Terraform の .closed プロパティは オープナーがそれを参照すると true が返されます。

COOP

Cross-Origin-Opener-Policy ヘッダーは次の 3 つの値を取ります。

Cross-Origin-Opener-Policy: same-origin

same-origin とマークされたドキュメントは同じ閲覧コンテキストを共有できます 明示的に same-origin とマークされている同一オリジン ドキュメントを持つグループです。

COOP

Cross-Origin-Opener-Policy: same-origin-allow-popups

same-origin-allow-popups を含む最上位ドキュメントは、任意の参照を保持します。 COOP を設定していないポップアップや COOP を unsafe-none に設定します。

COOP

Cross-Origin-Opener-Policy: unsafe-none

デフォルトは unsafe-none で、これにより、ドキュメントをその冒頭部分に追加できます。 閲覧コンテキスト グループ(オープナー自体の COOP が same-origin の場合を除く)

概要

SharedArrayBuffer などの強力な機能へのアクセスが保証されたい場合は、 performance.measureUserAgentSpecificMemory() または高解像度 タイマーは精度が向上しています。 ドキュメントで値が require-corp の COEP と、 same-origin の値と COOP を設定します。どちらもない場合、ブラウザは これらの強力な機能を安全に有効にするための十分な分離が保証されるわけではありません。マイページ ページの状況を判断するために self.crossOriginIsolatedtrue を返します。

実装手順については、ウェブサイトを「クロスオリジン」にする 分離されています」COOP と COEP を使用する

リソース