共有メモリーに関する変更予定

開発者が SharedArrayBuffer オブジェクトを再び作成できるように、標準化作業が進行中ですが、スレッドをまたがってこれらを使用するために変更が必要です (例えば、 postMessage()SharedArrayBuffer オブジェクトを使用すると、既定で例外が発生します)。これらの変更により、サイト間の分離がさらに進み、共有メモリーで作成できる高解像度タイマーを使った攻撃の影響を軽減するのに役立ちます。

メモ: Firefox 79 以降では、この記事で説明している機能は既定で有効になります。

Chrome はこれらの制約をデスクトップ版の Chrome 92 と Android 版の Chrome 88 から始めました。

新しい HTTP ヘッダーの鉱脈

基本要件として、文書は安全なコンテキストにあることが必要です。

最上位の文書の場合、 2 つのヘッダーを設定する必要があります。

この 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 (en-US) が標準化されつつあります(論理値を返すゲッターであり、 true はヘッダーが設定されていることを示します)。ウィンドウとワーカーのコンテキストで利用可能です。

WebAssembly の共有メモリー

WebAssembly のスレッドの提案により、 WebAssembly.Memory オブジェクトは新しいコンストラクターのフラグである shared を指定することがで作成することができるようになりました。このフラグを true に設定すると、構築された Memory オブジェクトは SharedArrayBuffer と同様に postMessage() によってワーカー間で共有できるようになり、Memory オブジェクトのバッキング bufferSharedArrayBuffer となります。したがって、上記の SharedArrayBuffer をワーカー間で共有するための要件は、 WebAssembly.Memory を共有する場合にも当てはまります。

WebAssembly スレッドの提案では、新しい不可分命令のセットも定義しています。ちょうど SharedArrayBuffer とそのメソッドが無条件に有効であるように(そしてスレッド間の共有のみが新しいヘッダーでゲートされます)、WebAssembly の不可分命令も無条件に許可されます。

参考文献