Go Wiki: Spectre

概要

Go 1.15では、Spectre系列のCPU脆弱性の2つの亜種の影響を軽減するためのコード生成調整を有効にするためのサポートが追加されました。コンパイラとアセンブラの両方に、有効にするSpectre軽減策のリストを指定する新しいフラグ `-spectre` があります。`-spectre=index` や `-spectre=index,ret` のように指定します。特殊なケース `-spectre=all` は、利用可能なすべての軽減策を有効にします。

`index` 軽減策はコンパイラで有効にすることができ、コード生成を変更してSpectre亜種1(「境界チェックバイパス」)に対する保護を生成します。この軽減策は、推測が間違っている場合にインデックスをゼロにマスクすることにより、CPUが任意のメモリにアクセスしないようにします。この変更により、通常、実行速度が約5〜10%低下します。正確な速度低下はワークロードによって異なります。

`ret` 軽減策はコンパイラとアセンブラの両方で有効にすることができ、コード生成を変更してSpectre亜種2(「分岐ターゲットインジェクション」)に対する保護を生成します。この軽減策は、すべての間接呼び出し命令をretpolineガジェットの使用に置き換えます。この変更により、通常、実行速度が約10〜15%低下します。繰り返しますが、正確な速度低下はワークロードによって異なります。

適用性

執筆時点では、Googleで実行されているGoプログラムにこれらの軽減策のいずれも使用しておらず、今後使用することも予定していません。これらは、非常に特殊なユースケース(または重大なパラノイア)を持つユーザー向けの「多層防御」の一種としてGoツールチェーンに含まれています。

これらの軽減策は、Goプログラムに対する潜在的なSpectre攻撃が存在する場合にのみ必要になります。これは、以下のすべてが当てはまる必要があります。第一に、攻撃者は、秘密を含む被害者のGoプログラムと同じCPU上で任意のコードを実行できる必要があります。第二に、攻撃者は、被害者のGoプログラムに対して何らかのHTTPまたはRPCリクエストを行うことができる必要があります。第三に、これらのリクエストは、潜在的に脆弱なコードフラグメントをトリガーして、攻撃者が選択した動作に推測させる必要があります。最も一般的には、これは、任意の攻撃者提供の整数をスライスまたは配列のインデックスに使用することを意味します。これらの3つの条件がすべて同時に当てはまることは非常にまれです。

すべてのパッケージで両方の軽減策(および将来の軽減策)を有効にしてプログラムをビルドするには、次を使用します

go build -gcflags=all=-spectre=all -asmflags=all=-spectre=all program

謝辞

Andrea Mambretti _他_ に、論文(下記リンク)を出版前に共有してくれたことに感謝します。また、彼ら、Chandler Carruth、Paul Turnerに有益な議論をしてくれたことに感謝します。

参考文献

Spectre Attacks: Exploiting Speculative Execution
Paul Kocher _他_ 著(決定版の論文)

Speculative Buffer Overflows: Attacks and Defenses
Vladimir Kiriansky and Carl Waldspurger著。

Retpoline: a software construct for preventing branch-target-injection
Paul Turner著。

A Systematic Evaluation of Transient Execution Attacks and Defenses
Claudio Canella _他_ 著(亜種の優れた概要)。

Spectre is here to stay: An analysis of side-channels and speculative execution
Ross McIlroy _他_ 著(これらはなくなりません)。

Spectre Returns! Speculation Attacks using the Return Stack Buffer
Esmaeil Mohammadian Koruyeh _他_ 著(戻り予測でさえ安全ではありません)。

Speculative Load Hardening
Chandler Carruth著(LLVMが投機的な範囲外アクセスを防ぐために何をしているか)。

Bypassing memory safety mechanisms through speculative control flow hijacks
Andrea Mambretti _他_ 著(メモリセーフ言語への影響の調査)。


このコンテンツはGo Wikiの一部です。