Go Wiki: Spectre

概要

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

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

ret緩和策はコンパイラとアセンブラの両方で有効にでき、Spectre variant 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と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の一部です。