メインコンテンツまでスキップ

信頼されていないコードの緩和策

2018年初頭、GoogleのProject Zeroの研究者が新しい攻撃手法のクラスを公開し、これは多くのCPUで使用されている投機的実行最適化を悪用するものでした。V8がJavaScriptを効率的に実行するために最適化されたJITコンパイラTurboFanを使用しているため、特定の状況下では、この公開で説明されているサイドチャネル攻撃に対して脆弱な場合があります。

信頼できるコードのみを実行する場合、変更はありません

あなたのプロダクトがV8の埋め込みインスタンスを使用して、完全に管理下にあるJavaScriptまたはWebAssemblyコードを実行するだけであれば、V8の使用は投機的サイドチャネル攻撃(SSCA)の脆弱性の影響を受けない可能性があります。信頼できるコードのみを実行するNode.jsインスタンスは、このような影響を受けない例の一つです。

この脆弱性を利用するには、攻撃者があなたの埋め込み環境内で慎重に設計されたJavaScriptやWebAssemblyコードを実行する必要があります。開発者として、埋め込まれたV8インスタンスで実行されるコードを完全に管理している場合、それが可能になる可能性は非常に低いです。しかし、あなたの埋め込みV8インスタンスが任意のまたは信頼できないJavaScriptやWebAssemblyコードをダウンロードして実行できる場合、あるいは完全に管理下にないJavaScriptやWebAssemblyコードを生成して実行する場合(例えば、コンパイルターゲットとして使用する場合など)、緩和策を検討する必要があります。

信頼されていないコードを実行する場合…

最新のV8に更新して緩和策を利用し、緩和策を有効化する

V8 v6.4.388.18から、この攻撃クラスに対する緩和策がV8自体に導入されています。そのため、埋め込みV8をv6.4.388.18以降に更新することを推奨します。FullCodeGenやCrankShaftをまだ使用する古いバージョンのV8にはSSCAに対する緩和策はありません。

V8 v6.4.388.18から、SSCA脆弱性に対する保護を提供するための新しいフラグがV8に導入されました。このフラグは--untrusted-code-mitigationsと呼ばれ、ビルド時のGNフラグv8_untrusted_code_mitigationsによってランタイムでデフォルトで有効化されます。

これらの緩和策は以下の方法で--untrusted-code-mitigationsランタイムフラグによって有効化されます:

  • WebAssemblyおよびasm.jsでのアドレスのマスク処理により、投機的に実行されたメモリロードがWebAssemblyおよびasm.jsヒープ外のメモリにアクセスできないようにします。
  • 投機的実行パス内のJavaScript配列や文字列へのアクセスで使用されるインデックスをJITコード内でマスク処理し、投機的ロードがJavaScriptコードでアクセスできないはずのメモリアドレスに対して行われないようにします。

埋め込み者は、緩和策がパフォーマンスにトレードオフを伴う可能性があることを理解する必要があります。実際の影響は、ワークロードによって大きく異なります。Speedometerのようなワークロードでは影響はわずかですが、より過激な計算ワークロードでは影響が最大で15%に達する可能性があります。あなたの埋め込まれたV8インスタンスが実行するJavaScriptおよびWebAssemblyコードを完全に信頼している場合、実行時にフラグ--no-untrusted-code-mitigationsを指定することでこれらのJIT緩和策を無効にすることを選択できます。ビルド時にはGNフラグv8_untrusted_code_mitigationsを使用して緩和策を有効化または無効化することができます。

V8は、Chromiumがサイト隔離を使用するプラットフォームなど、埋め込み者がプロセス隔離を使用すると想定されるプラットフォームでは、デフォルトでこれらの緩和策を無効にしていることに注意してください。

信頼されていないコードの実行を別プロセスでサンドボックス化する

信頼されていないJavaScriptおよびWebAssemblyコードを機密データとは別のプロセスで実行すると、SSCAの潜在的な影響は大幅に軽減されます。プロセス隔離によって、SSCA攻撃は実行中のコードと同じプロセス内でサンドボックス化されたデータのみを監視できるようになり、他のプロセスからのデータを取得することはできなくなります。

提供される高精度タイマーの調整を検討する

高精度タイマーは、SSCA脆弱性でサイドチャネルを観測するのを容易にします。あなたの製品が信頼されていないJavaScriptまたはWebAssemblyコードによってアクセス可能な高精度タイマーを提供している場合、これらのタイマーをより粗くするか、またはジッターを追加することを検討してください。