mconditional-branch、Qconditional-branch

条件付き分岐のスペキュレーション・ミスによりセキュリティーで保護されたデータが漏洩する可能性のある、投機的実行のサイドチャネル攻撃に対して脆弱なコードを特定および修正できます。これは C++ 固有のコンテンツです。DPC++ には適用されません。

構文

Linux*:

-mconditional-branch=keyword

macOS*:

-mconditional-branch=keyword

Windows*:

/Qconditional-branch:keyword

引数

keyword

コンパイラーのとるべき動作を示します。設定可能な値は以下のとおりです。

keep

脆弱なコードの検出と修正を行わないようにコンパイラーに指示します。-mconditional-branch オプションを指定しない場合と同じです。

pattern-report

コンパイル中に脆弱なコードの検索を実行して、すべての結果を stderr に出力するようにコンパイラーに指示します。

pattern-fix

コンパイル中に脆弱なコードの検索を実行して、検出されたデータアクセスが投機的に実行されないコードを生成するようにコンパイラーに指示します。修正されたパターンはすべて stderr に出力されます。

この設定は、完全な排除を保証するものではありません。コンパイラーによって脆弱性のすべての要素が確認または決定できるケースのみ修正します。O3 オプションや -ipo (または /Qipo) オプションなどの高度な最適化オプションが指定されたまたは有効な場合、パターン検出はより完全なものになります。

all-fix

脆弱なコードが投機的に実行されたり、投機的実行のサイドチャネル問題が生成されないように、脆弱なコードをすべて修正するようにコンパイラーに指示します。この設定は、Spectre Variant 1 攻撃に対する完全な緩和策であるため、ランタイム・パフォーマンス・コストが最も高くなります。

pattern-fix 設定とは対照的に、コンパイラーは不正な投機的実行を引き起こした可能性のある条件付き分岐を特定しません。

all-fix-lfence

これは all-fix 設定と同じです。

all-fix-cmov

(予測ミスした場合に) メモリーロードの投機的実行が脆弱性を引き起こすパスを処理するようにコンパイラーに指示します。コンパイラーは、脆弱性を引き起こすパスを検出すると緩和するためのコードを自動的に追加しますが、all-fix (または all-fix-lfence) とは異なる手法を使用します。

この手法は、投機的実行を制限する CMOVcc 命令実行を使用して、各条件分岐で更新されるプレディケート値を追跡します。

Spectre Variant 1 攻撃を防ぐため、コードが予測ミスパス上にある場合、脆弱性を引き起こす可能性がある各メモリーロードはプレディケートとビット単位の OR (論理和) を実行して、ロードされた値をマスクアウトします。

これは、投機的なロードを強化する Clang コンパイラーのオプションに似ています。

この設定は、インテル® 64 アーキテクチャー・ベースのシステムでのみサポートされます。

デフォルト

-mconditional-branch=keep/Qconditional-branch:keep

コンパイラーは、脆弱なコードの検出と修正を試みません。

説明

このオプションは、条件付き分岐のスペキュレーション・ミスによりセキュリティーで保護されたデータが漏洩する可能性のある、投機的実行のサイドチャネル攻撃に対して脆弱なコードを特定できるようにします。選択する設定に応じて、脆弱性が検出され、セキュリティー・リスクを軽減するコードが生成されます。

IDE オプション

Visual Studio*: [Code Generation [Intel C++]] > [Spectre Variant 1 Mitigation]

Eclipse*: なし

Xcode*: なし

代替オプション

なし