Content Attestation Set Verifier Processing in HTML Documents
適用範囲
本文書は、Verifier Processing Model を HTML 文書における Content Attestation Set (CAS) の検証と、その検証の入力としての Originator Profile Set (OPS) の扱いについて具体化します。本文書は、Verifier Processing Model が検証者処理文書に求める事項を定めます。
CA の検証手順そのものは Content Attestation の検証プロセスに、CA の検証に用いる OPS の検証手順そのものは Originator Profile Set の検証プロセスにしたがいます。本文書は、それらの検証をいつ開始し、結果をいつまで有効とし、どう提示するかを定めます。
用語
本文書に説明のない用語については、用語、Verifier Processing Model、および Site Profile Verifier Processing in HTML Documents の用語を参照してください。
加えて、次の用語を用います。
- 入力依存対象: Content Integrity Descriptor の検証入力が依存する、Document の状態の種類。入力依存対象で定めます
- 配布者: Document に CAS および OPS の script 要素を設置する者。CA の発行者や、OPS に含まれる OP の保有者と同じとは限りません
探索
対象の識別
検証対象は、Document に script 要素によって紐づけられた CAS に含まれる各 CA です。
OPS は検証対象ではなく、CA の検証に用いる材料です (入力範囲)。検証者は、CAS がなく OPS のみが紐づけられた Document について、OPS を検証対象として扱いません。
OPS には、Document と結びつける情報がありません。Site Profile は Website Profile の allowedOrigin プロパティによってオリジンに、CA は allowedUrl プロパティによって Web ページの URL に結びつきますが、OPS は署名済みの公開データであり、任意の Document に設置できます。OPS のみを検証してその Document の発信者として提示すると、Document と発信者の結びつきを誰も検証していないにもかかわらず、検証済みであると誤認させます。
探索の契機
検証者は、type 属性が application/ca-set+json である script 要素が Document に挿入された時点で、その CAS の探索を開始しなければなりません (MUST)。パーサーによる挿入とスクリプトによる挿入を区別しません。非推奨のメディアタイプの扱いはメディアタイプにしたがいます。
挿入を契機とすることで、パーサーによって構築する Document もスクリプトによって構築する Document も、同じ規則で扱えます。配布者は、CAS の script 要素を挿入する時点によって検証の開始を制御できます。
解決
取得経路
CAS および OPS は、script 要素の内容への埋め込み、または src 属性による外部参照のいずれかの経路で取得されます。
Content Integrity Descriptor の検証入力は、その type ごとに定められた方法で取得されます。
src 属性による外部参照、ExternalResourceTargetIntegrity の対象のリソース、および image データ型の id の URL は、Fetch Standard にしたがって取得します。HTTP キャッシュに保存された応答を用いてもかまいません (MAY)。
入力範囲
ある Document 中の CA の検証に用いてよい OP は、次に限られます (MUST)。
- 同一の Document に設置された OPS
- 検証者があらかじめ保持する OPS
- その Document がトップレベル文書である場合、そのオリジンの Site Profile の
originatorsプロパティ
CP の検証には、検証者があらかじめ認めた CP 発行者の検証鍵と OP ID を用います。
検証者は、親の Document または兄弟の Document に設置された OPS を、CA の検証に用いてはなりません (MUST NOT)。
「同一の Document に設置された」とは、入力スナップショットを取った時点でその Document に存在していたことを意味します。
サブフレーム中の Document で CA を提示する配布者は、その検証に必要な OPS を同一の Document に設置しなければなりません (MUST)。
配布者は、CA の検証に必要な OPS の script 要素を、その CA の検証を開始する時点までに Document に挿入しなければなりません (MUST)。OPS の script 要素を CAS の script 要素より前に挿入すれば、この要件を満たせます。
入力範囲を Document に限る理由は二つあります。
一つは、埋め込み先への非依存です。同じコンテンツが、どの Document に埋め込まれるかによって異なる検証結果を得てはなりません。親の Document の OPS を用いてよいとすると、同一の広告が親ページ A では検証を通過し、B では通過しないことが起こりえます。
もう一つは、入力の混入の防止です。悪意ある親の Document が OPS を設置して、サブフレーム中の CA を不当に検証済みにできてはなりません。逆に、悪意あるサブフレームが設置した OPS が、親の Document の CA の検証に用いられてもなりません。
本節の規定により、同一のコンテンツが、トップレベル文書としてアクセスされた場合は検証を通過し、サブフレームに埋め込まれた場合は通過しないことがありえます。トップレベル文書では Site Profile の originators プロパティを用いられるのに対し、サブフレームでは用いられないためです。これは同一オリジンのサブフレームにもあてはまります。検証者の試験では、トップレベル文書とサブフレームの両方を対象とすることが望まれます。
入力依存対象
Content Integrity Descriptor の検証入力は、type ごとに次のいずれかの入力依存対象に依存します。
| 入力依存対象 | 意味 |
|---|---|
| response | 取得したリソースのバイト列 |
| parsed DOM | パース済みの DOM |
| rendered result | レンダリング結果 |
登録済みの type の入力依存対象は次のとおりです。
| type | 入力依存対象 | 検証可能になる時点 |
|---|---|---|
ExternalResourceTargetIntegrity | response | 対象のリソースの取得の完了 |
HtmlTargetIntegrity | parsed DOM | Document の readiness が interactive になった時点 |
TextTargetIntegrity | parsed DOM | Document の readiness が interactive になった時点 |
VisibleTextTargetIntegrity (非推奨) | rendered result | Document の readiness が complete になった時点 |
入力依存対象は、検証を開始する時点、無効化、および再利用の判定に用います。
検証
適用しうる検証
CA に適用しうる検証は次のとおりです。括弧内は、個々の検証を識別する単位です。
- CA の VC について、OP VC Data Model に準拠した VC の検証のうち、
imageデータ型の検証を除くもの (CA ごと) allowedUrlの検証 (CA ごと)- Content Integrity Descriptor の検証 (
targetごと) - CA の発行者の OP を含む OPS の各 VC について、OP VC Data Model に準拠した VC の検証のうち、
imageデータ型の検証を除くもの (VC ごと) imageデータ型の検証 (imageデータ型のプロパティごと)
検証処理の順序は、Content Attestation の検証プロセスおよび Originator Profile Set の検証プロセスにしたがいます。
Document がトップレベル文書であり、CA の発行者の OP を Site Profile の originators プロパティから得る場合、検証者はその OP について改めて検証をおこなわず、SP の検証結果を用いてかまいません (MAY)。ただし、その SP の結果状態が検証済みである場合に限ります。このとき、CA の検証結果の検証範囲は、用いた SP の検証結果の検証範囲を含みます。
OPS は、annotations プロパティおよび media プロパティに複数言語の VC を含みえます (Originator Profile Set の国際化)。言語によって検証する VC を絞った場合、その検証結果の検証範囲は、適用しうる検証の一部のみを含みます。
言語によって検証する VC を絞ると、同一の発信者について、利用者の言語設定によって検証範囲の異なる検証結果が得られます。提示の要件により、利用者はその違いを識別できます。
allowedUrl の評価
allowedUrl の検証における「CA が提示された Web ページの URL」は、入力スナップショットを取った時点の document's URL です (MUST)。
検証を開始する時点
検証者は、次のすべてを満たすまで、その CA の検証を開始してはなりません (MUST NOT)。
- その CA を含む CAS の script 要素が Document に挿入されていること。
src属性による外部参照の場合は、その取得を完了していること - Document に挿入されている OPS の script 要素のうち、
src属性による外部参照であるものについて、その取得を完了していること - その CA のすべての
targetについて、入力依存対象が検証可能になる時点に達していること
検証者は、検証を開始する時点で入力スナップショットを取ります。本文書における「入力スナップショットを取った時点」は、検証を開始する時点を指します。
この時点で target に一致する要素が存在しない場合を含め、いずれかの target が Content Integrity Descriptor の検証を通過しなかった場合、その CA の結果状態は検証失敗です。
配布者は、スクリプトによって検証の対象を構築する場合、その構築を終えた後に CAS の script 要素を Document に挿入しなければなりません (MUST)。
入力依存対象が検証可能になる時点は、Document のライフサイクルによって機械的に観測できる時点です。スクリプトによる構築が終わったかどうかは機械的に観測できないため、配布者が CAS の script 要素を挿入する時点によって示します。これにより、構築の途中であることを改ざんされていることとして提示することを防ぎます。
HTML の link 要素の rel="expect" は、指定した要素がパースされるまでレンダリングを妨げる仕組みです。入力依存対象が検証可能になる時点を、配布者が要素の単位で示す手段として用いることは検討事項です。
保持
検証結果の帰属先
CA の検証結果は、Document とその入力スナップショットに束縛されます。
1 つの CA の検証入力は、単一の Document の単一の入力スナップショットでなければなりません (MUST)。複数の Document にまたがる入力から、1 つの検証結果を導いてはなりません (MUST NOT)。
入力同一性
CA の検証入力の入力同一性は、次のすべてによって判定します。
- Document が同一であること
- その CA を含む CAS が、取得経路ごとの同一性において同一であること
- 検証に用いた OPS が、取得経路ごとの同一性において同一であること
- すべての
targetの入力依存対象が変化していないこと allowedUrlの評価結果が、現在の document's URL に対しても一致すること- 検証に用いた CP 発行者の検証鍵と OP ID を、検証者が引き続き認めていること
CAS および OPS の同一性は、取得経路ごとに次のとおり判定します。入力範囲は、取得経路によらず入力範囲のとおりです。
- 埋め込み: script 要素が Document に存在し続けており、その内容が同一であること
- 外部参照: script 要素が Document に存在し続けており、
src属性の URL が同一で、取得した内容が同一であること - 検証者があらかじめ保持する OPS: 検証者が同一の OPS を引き続き保持し、認めていること
- Site Profile の
originatorsプロパティ: 用いた SP の検証結果の入力同一性が保たれていること
無効化
Verifier Processing Model の無効化の条件に加え、検証入力の変化として次のいずれかが生じた時点で、検証結果は無効化します (MUST)。
- いずれかの
targetの入力依存対象が変化した - 検証に用いた SP の検証結果が無効化した
- 検証に用いた CP 発行者の検証鍵または OP ID を、検証者が認めなくなった
- その CA を含む CAS、または検証に用いた OPS が、取得経路ごとの同一性において同一でなくなった
document.open()によって Document の内容が置き換えられた- same-document navigation によって document's URL が変化し、
allowedUrlの再評価の結果が一致しなくなった
検証者は、same-document navigation が生じた場合、allowedUrl を再評価しなければなりません (MUST)。
無効化の後、検証者はその CA について改めて検証を開始してかまいません (MAY)。これは新たな検証結果です。
入力依存対象の変化は、入力依存対象を改めて求めた結果が変化したことを意味します。target に一致する要素は Document のルート要素から検索されるため、対象の部分木の外に一致する要素が加わることも入力依存対象の変化です。rendered result は、DOM が同一であってもレイアウトの変化によって変わりえます。
入力依存対象を常に求め直すことはブラウザの性能や消費電力への影響が大きいため、実装は次の変化の検知によって近似してかまいません。
- parsed DOM: CSS セレクターに一致する要素の集合の変化、および一致した要素の部分木の変化
- rendered result: parsed DOM と同じ変化に加え、ビューポートの大きさの変化と Document の可視性の変化
rendered result についてのこの近似は、それ以外の要因によるレイアウトの変化を検知できません。
Document のライフサイクルと再利用
| 事象 | 検証結果の扱い |
|---|---|
| 別 URL へのナビゲーション | 遷移先の Document について改めて探索します |
| リロード | 遷移先の Document について改めて探索します |
| same-document navigation | allowedUrl を再評価します |
document.open() | 無効化します |
| back/forward cache からの復元 | 入力依存対象に応じて扱います (後述) |
back/forward cache からの復元では、同一の Document が再び fully active になるため、Document の同一性は保たれます。しかし、入力依存対象が保たれるとは限りません。検証者は、Verifier Processing Model の再利用の条件に加え、入力依存対象が変化していない場合に限り、検証結果を再利用してかまいません (MAY)。
- response に依存する
target: 再利用してかまいません - parsed DOM に依存する
target:pageshowイベントのハンドラーなどによる DOM の変更がなければ、再利用してかまいません - rendered result に依存する
target: 改めて検証しなければなりません (MUST)。back/forward cache にある間にビューポートの大きさや向きが変わると、レンダリング結果が変わりうるためです
提示
提示の要件に加え、次の要件があります。
- fenced frame 中の CAS の検証結果を、埋め込み側の Document の検証結果に含めて提示してはなりません (MUST NOT)
- 提示する VC の言語は、提示の時点で選択します。選択は RFC 4647 セクション 3 の Lookup にしたがうべきです (SHOULD)
配布者は、既定として扱われる VC を含む OPS を設置するべきです (SHOULD)。
開示の範囲
検証処理は、Document の取得に加えて、次のネットワークアクセスを発生させえます。
- 解決:
src属性によって参照された CAS および OPS の取得 - 解決:
ExternalResourceTargetIntegrityの対象のリソースの取得 - 検証および提示: CA および OPS に含まれる VC の
imageデータ型のプロパティの検証および提示における、そのidの URL の取得
これらは、利用者がその Document を利用していることを、アクセス先のオリジンに開示しえます。HTTP キャッシュに保存された応答が用いられる場合、そのネットワークアクセスは生じません。
セキュリティに関する考慮事項
フレームを跨いだ入力の混入
フレームを跨いで OPS を結合する実装は、結合の単位をどのように厳密にしても、他者が制御する材料を検証入力に含めることになります。入力範囲の要件は、検証入力を Document に閉じることでこれを防ぎます。
未完了の検証の誤った提示
入力依存対象が検証可能になる時点より前に検証を開始すると、正当なコンテンツが改ざんされたものとして提示されえます。検証を開始する時点の要件は、これを防ぐために定められています。
付録 A. 実装との対応
このセクションは非規範的です。
Document の同一性やライフサイクル、フレームの種類の対応は、Site Profile Verifier Processing in HTML Documents の付録 A を参照してください。加えて、本文書の概念は次のように対応します。
| 本文書 | 対応する API |
|---|---|
| script 要素の Document への挿入 | subtree を指定した MutationObserver による childList の変更 |
| Document の readiness | document.readyState および readystatechange イベント |
| 入力依存対象 (parsed DOM) の変化 | Document を対象とし、subtree を指定した MutationObserver による変更 |
| ビューポートの大きさの変化 | resize イベント |
| same-document navigation | WebExtensions API の webNavigation.onHistoryStateUpdated および webNavigation.onReferenceFragmentUpdated |
| back/forward cache からの復元 | persisted が true である pageshow イベント |
| Document の可視性 | document.visibilityState および visibilitychange イベント |