1. はじめに
その存在を通じて、Web はますます高機能な アプリケーションプラットフォームへと発展してきた。Secure Contexts は転送のセキュリティを形式化し、Cross Origin Isolation はサイドチャネル攻撃を緩和し、ブラウザーとオペレーティングシステムは、 特定のファイルやデバイスを選択することに基づく許可インターフェイスを実験し、 アクセスをより範囲限定され、ユーザーにとって理解しやすいものにしてきた。これらの 進歩はいずれも、Web プラットフォームの安全性保証を向上させるか、 ページの動作に対するより正確な期待へとユーザーを導き、安全に Web にもたらすことのできる新しい種類の機能を解放した。
これらの進歩にもかかわらず、依然として Web に安全に公開できない API が存在する。 それらは、合理的に対処できない形で Web のセキュリティプリミティブに違反しているか、 あるいは、サイトへのアクセスを許可するかどうかについてユーザーが 十分な情報に基づいて判断できるほど明確には説明できないためである。プラットフォームが、 特定のサイトに API を公開することが安全であると証明できないなら、 信頼は外部の証明に由来しなければならない。
ページの安全性または動作に関するいかなる主張も、そのページの 内容と動作を知っていることを必要とする。証明は、保証されたコードが 実行されているコードと同じである場合にのみ意味を持つ。このため、 信頼判断を委譲するあらゆるシステムは、実行しているコードの完全性を 検証できなければならない — すなわち、それが信頼を委譲されたコードと 一致していることを知っていなければならない。
さらに、Web の現在のセキュリティモデルに収まらない機能は、 他の Web コンテンツにリスクをもたらす可能性がある。このリスクは 双方向である。サンドボックスを貫通する機能は他のサイトを攻撃するために 使用され得るし、強力な機能へアクセスできることは、そのサイトを悪意ある者にとって より魅力的な標的にする。これらのリスクを緩和するため、この仕様で 説明される仕組みを通じて機能へのアクセスを許可されるあらゆるコンテンツは、 ユーザーの通常の閲覧セッションから分離されなければならない。
この仕様は、分離されたコンテキストを定義する。これは、 完全性と分離の最低基準を満たす環境であり、信頼性証明の目的で Web コンテンツを監査する手段を提供し、このコンテンツをユーザーの 他の閲覧データから分離するものである。
この仕様はユーザーエージェントが提供する機能に焦点を当てているが、 分離されたコンテキストは、その脅威モデルが Web のセキュリティモデルによって 満たされない任意の Web ページ機能に有益であり得る。たとえば、 一部のエンドツーエンド暗号化チャットアプリケーションの脅威モデルには サーバー侵害が含まれるが、これは今日の Web では防御されていない。 分離されたコンテキストによって可能になる監査可能性と証明により、 これらのアプリケーションは実行しているコードの完全性と出所に 確信を持つことができる。
2. 分離されたコンテキスト
分離されたコンテキストは、 既存の仕様に対する一連の § 3 モンキーパッチを通じて 定義される。
完全性は、クロスオリジンの実行可能コンテンツが読み込まれないことを保証する 厳格な [CSP] と、ページ内に読み込まれた コンテンツを検証する抽象的な仕組みである完全性検証アルゴリズムの 組み合わせによって検証される。この仕様は特定の検証方法を義務付けず、 環境が分離されたコンテキストであるかどうかを判断するために、 それがどのように使用されるかだけを定義する。
2.1. どの API が分離されたコンテキストを必要とすべきか?
可能な限り少なくすべきである。分離されたコンテキストにのみ公開できる API は、 Web の少なくとも 1 つの設計 原則に違反している可能性が非常に高く、最も一般的には、Web ページを訪問することは安全であるべき という原則である。API を使用するために分離されたコンテキストを 要求する前に、次の質問を検討すること:
-
この API が解決しようとしている問題に対処する唯一の方法は、新しい Web Platform API なのか? Web Extensions やネイティブアプリケーションにも役割がある。
-
ある機能をユーザーに明確に伝えられない場合、その問題を解決する、 ユーザーにとってより理解しやすく、どのコンテンツがそれにアクセスできるかについて 十分な情報に基づいた判断を可能にする別の方法はあるか?
-
平均的な Web ページに公開された場合にも許容できないリスクを もはや生じないように、API の範囲を縮小できるか?
代替手段が見つからない場合、最後の手段として、API を分離された コンテキスト内で実行することを要求することを検討できる。
Web をこれほどユニークで成功したプラットフォームにしている要素の 1 つは、 ゲートキーパーの不在である。誰でもドメイン名を購入し、 他者の承認なしに自分のコンテンツをホストでき、Web Platform の API 表面へ 完全にアクセスできる。誰もが対等な立場にある。分離されたコンテキストが 提供するセキュリティ保証は監査可能性を可能にし、それがさらに証明を可能にする。 ブラウザーベンダーまたは第三者による証明が提供する安全性が、 API が分離されたコンテキストに制限される主な理由である。証明サービスを 提供する主体は、Web Platform のゲートキーパーとなる可能性があり、 これはプラットフォームが進むべき望ましい方向ではない。ブラウザーベンダーは、 分離されたコンテキストで許可する API について極めて選択的でなければならない。 可能な場合には、API を Secure Context で使用できるように変更することが 強く優先されるべきである。
2.2. UI の扱い
この仕様は、完全性と分離を達成するために必要な技術的要件に焦点を当てているが、 分離されたコンテキストが強力な機能を有効にするために使用される場合、 ユーザーの期待に反しないことも重要である。
ユーザーが Web を信頼しているのは、Web ページは安全であり、デバイスへの アクセスは制限されており、そのアクセスを自分が制御していると 教えられてきたためである。Web Platform 上のすべての API は、 Web ページを訪問することは 安全であるべきことを確保するという目標のもと、この目的に向けて 慎重に設計されてきた。
ブラウザーベンダーは、分離されたコンテキストに制限される機能が、 Web ページに何ができるかについてのユーザーの期待に反しないかどうかを 検討すべきである。これらの期待に反することは、そのサイトへの信頼を 損なうだけでなく、Web Platform 全体に対するユーザーの信頼を損なう リスクがある。
これを緩和するため、ユーザーエージェントは、分離されたコンテキスト内で 実行されるコンテンツが典型的な Web コンテンツではないことを ユーザーに伝えるための措置を講じるべきである。これには、 インストールフローまたは Web App UI の扱いが含まれ得る。
3. モンキーパッチ
この仕様は、既存の仕様に対して次のモンキーパッチを行う:
-
[CSP] へのパッチは、攻撃に対して意味のある形で 防御するのに十分堅牢なポリシーの特性を定義し、クロスオリジン コンテンツを読み込めないことを強制する。これは、[strict-csp] や [securer-contexts] のような探索から学んだことを土台とし、 開発者をよく理解され価値のある防御へと導く。
-
[HTML] へのパッチは、 それらの CSP 特性が、他のセキュリティ要件とともに、 与えられたコンテキスト内で評価される方法を定義する。これは概念的には secure context および cross-origin isolated capability に似ている。さらに、user agent が origin のリソースの完全性を検証するために必要な プロパティを定義する。
-
[WEBIDL] へのパッチは、
[IsolatedContext]属性と、 与えられた WebIDL 構成要素の公開を制御するために、 上記の変更に依存する方法を定義する。 -
[STORAGE] へのパッチは、分離されたコンテキストのダブルキー化要件を定義する。
3.1. Content Security Policy
[CSP] では、 CSP list 内に含まれる ポリシーの集合体の強度を評価するアルゴリズムを定義する。 いくつかの補助アルゴリズムも定義するが、§ 3.1.1 ポリシーは インジェクション攻撃を意味のある形で緩和するか? が、CSP が HTML に公開する 中核的な入口点である。
3.1.1. ポリシーはインジェクション攻撃を意味のある形で緩和するか?
Meaningful" を返す場合、インジェクション攻撃を意味のある形で
緩和すると言われる。返り値として可能な値は "Meaningful" および
"Not meaningful enough" である。
-
meets object requirements、meets base requirements、meets script requirements、meets style requirements、meets subresource requirements、および meets trusted type requirements を、 値が
falseである boolean とする。 -
policies 内の各 policy について、反復する:
-
policy の disposition が "
enforce" でない、 または policy の source が "header" でない場合、continue する。 -
policy が プラグインを十分に緩和する場合、 meets object requirements を
trueに設定する。 -
policy が 相対 URL 操作を十分に 緩和する場合、meets base requirements を
trueに設定する。 -
policy が スクリプト実行を十分に緩和する場合、 meets script requirements を
trueに設定する。 -
policy が スタイル評価を十分に緩和する場合、 meets style requirements を
trueに設定する。 -
policy が 安全でないサブリソースを十分にブロックする場合、 meets subresource requirements を
trueに設定する。 -
policy が DOM シンクを十分に緩和する場合、 meets trusted type requirements を
trueに設定する。
-
-
meets object requirements、meets base requirements、meets script requirements、meets style requirements、meets subresource requirements、および meets trusted type requirements がすべて
trueである場合、"Meaningful" を返す。 -
"
Not meaningful enough" を返す。
3.1.2. 型に対する有効なディレクティブを取得する
-
fallback chain を、directive name に対して Get fetch directive fallback list を実行した結果とする。
-
fallback chain 内の各 name について、反復する:
-
policy の directive set が、その name が name である directive directive を 含む場合、 directive を返す。
-
-
null を返す。
3.1.3. ポリシーはプラグインを十分に緩和するか?
Sufficient" を返す場合、プラグインを十分に緩和する。
返り値として可能な値は
"Sufficient" および "Not sufficient" である。
3.1.4. ポリシーは相対 URL 操作を十分に緩和するか?
Sufficient" を返す場合、相対 URL
操作を十分に緩和する。
返り値として可能な値は "Sufficient" および "Not sufficient" である。
-
policy の directive set 内の各 directive について、反復する:
-
"
Not sufficient" を返す。
3.1.5. ポリシーはスクリプト実行を十分に緩和するか?
Sufficient" を返す場合、スクリプト実行を十分に緩和する。
返り値として可能な値は "Sufficient" および "Not sufficient" である。
-
policy から、"
script-src" が与えられたものとして active directive を 取得する。 -
次のすべてが true である場合、"
Sufficient" を返す:-
active directive が null でない
-
active directive 内のすべての source expressions が、 文字列 "
'none'", "'self'", または "'wasm-unsafe-eval'" に対する ASCII case-insensitive 一致である。
-
-
"
Not sufficient" を返す。
3.1.6. ポリシーはスタイル評価を十分に緩和するか?
Sufficient" を返す場合、スタイル評価を十分に緩和する。
返り値として可能な値は "Sufficient" および "Not sufficient" である。
-
policy の directive set 内の各 directive について、反復する:
-
policy から、"
style-src" が与えられたものとして active directive を 取得する。 -
次のすべてが true である場合、"
Sufficient" を返す:-
directive の name が "
style-src" である。 -
active directive 内のすべての source expressions が、 文字列 "
'none'", "'self'", または "'unsafe-inline'" に対する ASCII case-insensitive 一致である。
-
-
-
"
Not sufficient" を返す。
3.1.7. ポリシーは安全でないサブリソースを十分にブロックするか?
Sufficient" を返す場合、安全でない
サブリソースを十分にブロックする。
返り値として可能な値は "Sufficient" および "Not sufficient" である。
-
集合 [
frame-src,connect-src,img-src,media-src,font-src] 内の各 directive name について、反復する:-
policy から、directive name が与えられたものとして active directive を 取得する。
-
active directive 内のいずれかの source expression が、 文字列 "
'none'", "'self'", "https:", "blob:", または "data:" に対する ASCII case-insensitive 一致でない場合、 "Not sufficient" を返す。
-
-
"
Sufficient" を返す
3.1.8. ポリシーは DOM シンクを十分に緩和するか?
Sufficient" を返す場合、DOM シンクを十分に緩和する。
返り値として可能な値は "Sufficient" および "Not sufficient" である。
-
policy の directive set 内の各 directive について、反復する:
-
次のすべてが true である場合、"
Sufficient" を返す:-
directive の name が "
require-trusted-types-for" である。 [TRUSTED-TYPES] -
directive の value が、文字列 "
'script'" に対する ASCII case-insensitive 一致 [0] を 含む。
-
-
-
"
Not sufficient" を返す。
3.1.9. 例
次の CSP はインジェクション 攻撃を意味のある形で緩和する:
base-uri 'none'; default-src 'self'; object-src 'none'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src 'self' https: blob: data:; connect-src 'self' https: blob: data:; img-src 'self' https: blob: data:; media-src 'self' https: blob: data:; font-src 'self' blob: data:; require-trusted-types-for 'script';
3.1.10. ポリシーは UI リドレッシング攻撃を意味のある形で緩和するか?
Meaningful" を返す場合、UI リドレッシング攻撃を意味のある形で
緩和すると言われる。[UISECURITY]
返り値として可能な値は "Meaningful" および "Not meaningful enough" である。
-
policies 内の各 policy について、反復する:
-
policy の disposition が "
enforce" でない、 または policy の source が "header" でない場合、continue する。 -
policy の directive set 内の各 directive について、 反復する:
-
-
"
Not meaningful enough" を返す。
3.2. HTML
HTML では、リソースの完全性検証に使用されるいくつかのプロパティと、 § 3.1 Content Security Policy で定義されたものと組み合わせて使用されるいくつかのアルゴリズムを定義し、 environment settings object の特性を定義する。 これらの特性は、与えられた IDL 構成要素が関連する global object 上に公開されるかどうかを判断する際に、 [WEBIDL] から 調べられる。
3.2.1. 完全性
完全性 検証アルゴリズムは、implementation-defined なアルゴリズムであり、request と response を受け取り、 boolean を返す。
注: 典型的な完全性 検証アルゴリズムは、 レスポンス本文が期待される値へハッシュされること、または既知の リソースバンドルに由来することを検証するかもしれない。
user agent は、オリジン完全性検証マップを保持する。 これは、tuple origins から 完全性 検証アルゴリズムへの map である。
注: ユーザーエージェントがオリジン完全性検証マップをどのように 設定するかは、この仕様の範囲外である。この仕様は、完全性と分離を 確立するために必要なプロパティに焦点を当てている。Isolated Web Apps は、インストール済みの Isolated Web Apps の集合に基づいてこのマップを構築する、1 つの実装可能性を提供する。
3.2.2. 環境設定オブジェクトのプロパティ
注: CSP list に対する意味のあるインジェクションおよび UI リドレッシングの 緩和の定義は、ヘッダーで配信されたポリシーのみに依存するため、 これらのプロパティは環境の生存期間中に変化しない。
true を返す場合、分離されたコンテキストである:
-
environment がインジェクション攻撃を意味のある形で 緩和しない場合、
falseを返す。 -
environment の cross-origin isolated capability が concrete でない場合、
falseを返す。 -
environment が UI リドレッシング攻撃を緩和しない場合、
falseを返す。 -
origin を environment の origin とする。
-
user agent の origin integrity verification map[origin] が存在しない場合、
falseを返す。 -
trueを返す。
3.3. Fetch
Fetch では、レスポンスが期待される内容を持っていることを検証するために、 § 3.2.1 完全性 で定義された 完全性検証アルゴリズムを使用する。
3.3.1. レスポンスの完全性を検証する
not applicable", "invalid", または "valid" である。
- client を request の client とする。
- client が
nullの場合、"not applicable" を返す。 - origin を request の origin とする。
- user agent の origin
integrity verification map[origin]
が存在しない場合、"
not applicable" を返す。 - integrity verification algorithm を、user agent の origin integrity verification map[origin] とする。
- response の body が
nullの場合、"invalid" を返す。 - request および response が与えられたものとして
integrity verification algorithm を実行した結果が
falseである場合、 "invalid" を返す。 - "
valid" を返す。
3.3.2. 「Main Fetch」アルゴリズムへのパッチ
main fetch アルゴリズムは次のように拡張される:- request を fetchParams の request とする。
- response を
nullとする。 -
request の integrity metadata が空文字列でない場合、
次を行う:
- ...
-
レスポンスの完全性を検証するを
request および response が与えられたものとして実行した結果が
"
invalid" である場合、fetchParams と network error が与えられたものとして fetch response handover を実行する。 - それ以外の場合、fetchParams と response が与えられたものとして fetch response handover を実行する。
注: 理想的には、完全性検証を [SRI] の integrity metadata およびその補助アルゴリズムと 統合したい。 そのためには、[SRI] 仕様が integrity metadata 文字列を扱う方法について、 かなりのリファクタリングが必要になる。これは将来追求する価値があるかもしれない。
3.4. WebIDL
WebIDL では、[IsolatedContext] 属性を定義し、
それを上記の HTML で作成されたフックに接続する:
3.4.1. [IsolatedContext]
[IsolatedContext]
extended attribute が、interface、partial interface、interface mixin、
partial interface mixin、callback interface、namespace、partial namespace、interface
member、interface mixin member、または namespace
member 上に現れる場合、
その構成要素がexposed されるのは
分離されたコンテキスト内だけであることを示す。
[IsolatedContext]
extended attribute は、他のいかなる構成要素にも使用してはならない。
[IsolatedContext]
extended attribute は、引数を
取ってはならない。
[IsolatedContext]
がoverloaded な operation 上に
現れる場合、それはすべてのオーバーロードに現れなければならない。
[IsolatedContext]
extended attribute は、次のうち複数に
指定してはならない:
-
interface member と、その interface または partial interface;
-
interface mixin member と、その interface mixin または partial interface mixin;
-
namespace member と、その namespace または partial namespace。
注: これは、含む側の定義も
[IsolatedContext]
extended attribute で注釈されている場合に、
member
上に [IsolatedContext]
extended attribute を追加しても、
その member の公開をさらに制限しないためである。
[IsolatedContext]
extended attribute を持たない interface は、
[IsolatedContext]
を指定している別の interface から継承してはならない。
3.4.2. 「exposed」アルゴリズムへのパッチ
WebIDL の exposed アルゴリズムは次のように調整される。すなわち、
[CrossOriginIsolated]
を同様に扱った後に、単一の手順を追加する
(下記の手順 4)。
- construct の exposure
set が
*でなく、かつ realm.[[GlobalObject]] が construct の exposure set 内にある interface を実装していない場合、false を返す。 - realm の settings object が secure context でなく、かつ construct が [
SecureContext] 上で conditionally exposed される場合、 false を返す。 - realm の settings object の cross-origin isolated
capability が false であり、
かつ construct が [
CrossOriginIsolated] 上で conditionally exposed される場合、false を返す。 -
realm の settings object が分離された
コンテキストでなく、
かつ construct が [
IsolatedContext] 上で conditionally exposed される場合、falseを返す。 - true を返す。
3.5. Storage
obtain a storage key for non-storage purposes アルゴリズムは、user agent が完全性検証アルゴリズムを持つと知っている environment の top-level origin に属するすべてのストレージに対して、 ダブルキー化を要求するよう拡張される。
- environment が environment settings object である場合は、 origin を environment の origin とする。そうでない場合は、 origin を environment の creation URL の origin とする。
- top-level origin を environment の top-level origin とする。
- user agent の origin integrity verification map [top-level origin] が存在する場合、 top-level origin と origin からなる tuple を返す。
- origin からなる tuple を返す。
注: これは本質的に、 Client-Side Storage Partitioning の 最小限に仕様化されたバージョンである。それが完全に仕様化され、必要な仕様へ マージされた場合、それらの変更はこのセクションを置き換え、 このセクションは削除できる。