共有メモリーに関する変更予定
開発者が SharedArrayBuffer
オブジェクトを再び作成できるように、標準化作業が進行中ですが、スレッドをまたがってこれらを使用するために変更が必要です (例えば、 postMessage()
で SharedArrayBuffer
オブジェクトを使用すると、既定で例外が発生します)。これらの変更により、サイト間の分離がさらに進み、共有メモリーで作成できる高解像度タイマーを使った攻撃の影響を軽減するのに役立ちます。
メモ: Firefox 79 以降では、この記事で説明している機能は既定で有効になります。
Chrome はこれらの制約をデスクトップ版の Chrome 92 と Android 版の Chrome 88 から始めました。
新しい HTTP ヘッダーの鉱脈
基本要件として、文書は保護されたコンテキストにあることが必要です。
最上位の文書の場合、 2 つのヘッダーを設定する必要があります。
Cross-Origin-Opener-Policy
の値はsame-origin
です(攻撃からオリジンを守ります)。Cross-Origin-Embedder-Policy
値はrequire-corp
(オリジンから犠牲者を保護する)です。
この 2 つのヘッダーを設定すると、 postMessage()
は SharedArrayBuffer
オブジェクトを使用しても例外が発生しなくなり、スレッド間での共有メモリーが利用できるようになります。
ネストされた文書と専用ワーカーは、 Cross-Origin-Embedder-Policy
ヘッダーも同じ値で設定する必要があります。ネストされた文書とサブリソースが同一オリジンであれば、これ以上の変更は必要ありません。ネストされた文書とサブリソースが同じサイト(ただし別オリジン)であった場合は、 Cross-Origin-Resource-Policy
ヘッダーに same-site
を値として設定する必要があります。そして、それらのオリジン間(およびサイト青だ)の対応するものは、 cross-origin
を値とした同ヘッダーを設定する必要があります。 Cross-Origin-Resource-Policy
ヘッダーに same-origin
以外の値を設定すると、潜在的にリソースが Spectre などの攻撃にさらされてしまうので注意してください。
Cross-Origin-Opener-Policy
ヘッダーは、ポップアップへの参照を保持する能力を制限することに注意してください。2 つの最上位ウィンドウコンテキスト間の直接アクセスは、基本的に同一オリジンであり、同じ 2 つの値を持つ同じ 2 つのヘッダーを運ぶ場合にのみ機能します。
API の変更
この新しく必要とされる環境の結果として、いくつかの API の影響があります。
Atomics
オブジェクトは常に利用可能です。SharedArrayBuffer
オブジェクトは原則的に常に利用可能ですが、残念ながらウェブコンテンツとの互換性のために、上記の 2 つのヘッダーが設定されていない限り、グローバルオブジェクトのコンストラクターは非公開になります。将来的には、この制限が取り除かれる可能性があります。WebAssembly.Memory
はまだインスタンスを取得するために使用することができます。- 上記の 2 つのヘッダーが設定されていない限り、さまざまな
postMessage()
API はSharedArrayBuffer
オブジェクトを使用すると例外が発生します。これら設定されていれば、Window
オブジェクトと専用ワーカーのpostMessage()
が機能し、メモリ共有が可能になります。 postMessage()
が例外を発生させるかどうかをチェックする必要がないように、self.crossOriginIsolated
が標準化されつつあります(論理値を返すゲッターであり、true
はヘッダーが設定されていることを示します)。ウィンドウとワーカーのコンテキストで利用可能です。
WebAssembly の共有メモリー
WebAssembly のスレッドの提案により、 WebAssembly.Memory
オブジェクトは新しいコンストラクターのフラグである shared
を指定することがで作成することができるようになりました。このフラグを true
に設定すると、構築された Memory
オブジェクトは SharedArrayBuffer
と同様に postMessage()
によってワーカー間で共有できるようになり、Memory
オブジェクトのバッキング buffer
は SharedArrayBuffer
となります。したがって、上記の SharedArrayBuffer
をワーカー間で共有するための要件は、 WebAssembly.Memory
を共有する場合にも当てはまります。
WebAssembly スレッドの提案では、新しい不可分命令のセットも定義しています。ちょうど SharedArrayBuffer
とそのメソッドが無条件に有効であるように(そしてスレッド間の共有のみが新しいヘッダーでゲートされます)、WebAssembly の不可分命令も無条件に許可されます。
参考文献
- COOP and COEP explained.
Cross-Origin-Opener-Policy
: whatwg/html issue #3740, draft specification.Cross-Origin-Embedder-Policy
: whatwg/html issue #4175, draft specification.Cross-Origin-Resource-Policy
: standardized in Fetch, newcross-origin
value is part of theCross-Origin-Embedder-Policy
effort.postMessage()
changes andself.crossOriginIsolated
: whatwg/html issue #4732, whatwg/html issue #4872, draft specification.- SharedArrayBuffer updates in Android Chrome 88 and Desktop Chrome 92