/Qspectre

特定のスペクター バリアント 1 のセキュリティ脆弱性を軽減するコンパイラの命令生成を指定します。

構文

/Qspectre

解説

/Qspectre オプションを指定すると、コンパイラによって特定のスペクター セキュリティ脆弱性を軽減する命令が挿入されます。 これらの脆弱性は、投機的実行サイドチャネル攻撃と呼ばれます。 これらの脆弱性は、多くのオペレーティング システムと、Intel 製、AMD 製、ARM 製のプロセッサを含む最新のプロセッサに影響を与えます。

/Qspectre オプションは、Visual Studio 2017 バージョン 15.5.5 以降のすべてのバージョンで使用できます。 これは、KB 4338871 を通じて、Visual Studio 2015 Update 3 で提供されています。

既定では、/Qspectre オプションはオフになっています。

最初のリリースでは、/Qspectre オプションは最適化されたコードに対してのみ機能しました。 Visual Studio 2017 バージョン 15.7 以降では、/Qspectre オプションはすべての最適化レベルでサポートされています。

スペクターの軽減策を含むバージョンの Microsoft C++ ライブラリもいくつかリリースされています。 Visual Studio 用のスペクター軽減済みライブラリは、Visual Studio インストーラーでダウンロードできます。 これらは [コンパイラ、ビルド ツール、およびランタイム][個別のコンポーネント] タブにあり、名前には "Libs for Spectre" が含まれています。 軽減策が有効な DLL および静的ランタイム ライブラリのいずれも、次の Visual C++ ランタイムのサブセットに使用できます。VC++ のスタートアップ コード、vcruntime140、msvcp140、concrt140、および vcamp140。 DLL はアプリケーションのローカル展開にのみサポートされています。 Visual C++ ランタイム ライブラリ再頒布可能パッケージの内容は変更されません。

また、MFC と ATL 用のスペクター軽減済みライブラリをインストールすることもできます。 これらは、[SDK、ライブラリ、およびフレームワーク][個別のコンポーネント] タブにあります。

Note

ユニバーサル Windows (UWP) アプリやコンポーネント用のスペクター軽減済みライブラリのバージョンはありません。 このようなライブラリのアプリローカル配置はできません。

適用性

信頼境界を越えてデータを操作するコードの場合は、/Qspectre オプションを使用してコードをリビルドして再展開し、できるだけ早くこの問題を軽減することをお勧めします。 このようなコードの例としては、実行に影響を与える、信頼できない入力を読み込むコードがあります。 たとえば、リモート プロシージャ呼び出しを行ったり、信頼されていない入力やファイルを解析したり、他のローカル プロセス間通信 (IPC) インターフェイスを使用したりするコードです。 標準的なサンドボックスの手法では不十分な場合があります。 コードが信頼境界を越えていないと判断する前に、サンドボックスを慎重に調べるようにしてください。

可用性

/Qspectre オプションは、Visual Studio 2017 バージョン 15.5.5 以降と、2018 年 1 月 23 日以降に作成された Microsoft C/C++ コンパイラ (MSVC) のすべての更新プログラムで利用できます。 Visual Studio インストーラーを使用してコンパイラを更新し、スペクター軽減済みライブラリを個別のコンポーネントとしてインストールします。 /Qspectre オプションは、修正プログラムを介して Visual Studio 2015 Update 3 でも利用できます。 詳細については、KB 4338871 を参照してください。

Visual Studio 2017 バージョン 15.5 のすべてのバージョンと、Visual Studio 2017 バージョン 15.6 のすべてのプレビューには、 ドキュメントに記載していないオプション (/d2guardspecload) が含まれています。 これは、/Qspectre の初期動作に相当するものです。 これらのバージョンのコンパイラでは、/d2guardspecload を使用してコードに同じ軽減策を適用できます。 このオプションをサポートするコンパイラでは、/Qspectre を使用するようにビルドを更新することをお勧めします。 /Qspectre オプションは、コンパイラの今後のバージョンで新しい軽減策もサポートする可能性があります。

結果

/Qspectre オプションを指定すると、スペクター バリアント 1 の Bounds Check Bypass (CVE-2017-5753) を軽減するコードが出力されます。 これは、投機的コード実行バリアとして動作する命令を挿入することで機能します。 プロセッサの投機の軽減に使用される具体的な命令は、プロセッサとそのマイクロアーキテクチャによって異なり、今後のバージョンのコンパイラでは変更される可能性があります。

/Qspectre オプションを有効にした場合、コンパイラでは、投機的実行によって境界チェックがバイパスされる可能性があるインスタンスの特定が試行されます。 そこが、バリア命令の挿入される場所となります。 コンパイラでバリアント 1 のインスタンスを特定するために実行できる分析には制限があることに注意してください。 この理由から、/Qspectre を指定しても、バリアント 1 の可能性があるすべてのインスタンスがインストルメント化される保証はありません。

パフォーマンスへの影響

/Qspectre によるパフォーマンスへの影響は、いくつかの非常に大規模なコード ベースでは、無視できる程度であることが確認されています。 ただし、/Qspectre が指定されたコードのパフォーマンスへの影響がないという保証はありません。 このオプションがパフォーマンスに与える影響を判断するには、コードのベンチマークを実行することをお勧めします。 パフォーマンスが重要なブロックまたはループで、この軽減策が不要なことがわかっている場合は、__declspec(spectre(nomitigation)) ディレクティブを使用してこの軽減策のみを無効にすることができます。 このディレクティブは、/d2guardspecload オプションのみをサポートするコンパイラでは使用できません。

必要なライブラリ

/Qspectre コンパイラ オプションを使用すると、独自のコードの問題を軽減できます。 保護を強化するために、スペクター軽減策を提供する目的で構築されたライブラリも使用することを強くお勧めします。 いくつかの Microsoft ランタイム ライブラリは、スペクター軽減策と共に提供されています。

これらのライブラリは省略可能なコンポーネントであり、Visual Studio インストーラーを使用してインストールする必要があります。

  • MSVC version version_numbers Libs for Spectre [(x86 and x64) | (ARM) | (ARM64)]
  • Visual C++ ATL for [(x86/x64) | ARM | ARM64] with Spectre Mitigations
  • Visual C++ MFC for [x86/x64 | ARM | ARM64] with Spectre Mitigations

Visual Studio IDE の既定の MSBuild ベース プロジェクト システムでは、プロジェクトの [Spectre 軽減策] プロパティを指定できます。 このプロパティでは、/Qspectre コンパイラ オプションを設定し、スペクター軽減済みランタイム ライブラリをリンクするようにライブラリ パスを変更できます。 コードをビルドするときにこれらのライブラリがインストールされていない場合は、ビルド システムによって警告 MSB8040 が報告されます。 MFC コードまたは ATL コードのビルドに失敗し、リンカーから "fatal error LNK1104: cannot open file 'oldnames.lib'"(致命的エラー LNK1104: ファイル 'oldnames.lib' を開けません) などのエラーが報告される場合は、これらのライブラリが見つからないことが原因の可能性があります。

Visual Studio IDE の既定の MSBuild ベース プロジェクト システムでは、プロジェクトの [Spectre 軽減策] プロパティを指定できます。 このプロパティでは、/Qspectre コンパイラ オプションを設定し、スペクター軽減済みランタイム ライブラリをリンクするようにライブラリ パスを変更できます。 コードのビルド時にこれらのライブラリがインストールされていない場合、ビルド システムは警告MSB8038報告します。"Spectre 軽減策は有効になっていますが、Spectre 軽減ライブラリが見つかりません"。MFC または ATL コードのビルドに失敗し、リンカーが "致命的なエラー LNK1104: ファイル 'oldnames.lib' を開くことができない" などのエラーを報告した場合、これらの不足しているライブラリが原因である可能性があります。

ビルド コマンド ラインにスペクター軽減済みライブラリを指定するには、いくつかの方法があります。 /LIBPATH リンカー オプションを使用してスペクター軽減済みライブラリへのパスを指定し、それらを既定のライブラリにすることもできます。 /NODEFAULTLIB リンカー オプションを使用して、スペクター軽減済みライブラリを明示的にリンクすることもできます。 または、LIBPATH 環境変数を設定して、ターゲット プラットフォーム用のスペクター軽減済みライブラリへのパスを含めることもできます。 環境内でこのパスを設定する方法の 1 つは、spectre_mode オプションを使用して設定された開発者コマンド プロンプトを使用することです。 詳しくは、「既存のコマンド ウィンドウで開発者ツールを使用する」をご覧ください。

x86、x64、および ARM プラットフォーム用のスペクター軽減済みランタイム ライブラリは、KB 4338871 を通じて提供されている修正プログラムの一部として入手できます。 既定では、これらのライブラリは次のディレクトリにインストールされます。

  • x86: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre
  • x64: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\amd64
  • ARM: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\arm

ビルド コマンド ラインにスペクター軽減済みライブラリを指定するには、いくつかの方法があります。 /LIBPATH リンカー オプションを使用してスペクター軽減済みライブラリへのパスを指定し、それらを既定のライブラリにすることもできます。 /NODEFAULTLIB リンカー オプションを使用して、スペクター軽減済みライブラリを明示的にリンクすることもできます。 または、LIBPATH 環境変数を設定して、ターゲット アーキテクチャ用のスペクター軽減ライブラリへのパスを含めることもできます。 詳細については、「コマンド ラインから Microsoft C++ ツールセットを使用する」を参照してください。

追加情報

詳細については、公式の「マイクロソフト セキュリティ アドバイザリ ADV180002 | 投機的実行のサイドチャネルの脆弱性を緩和するガイダンス」を参照してください。 Intel の「Speculative Execution Side Channel Mitigations」(投機的実行サイド チャネルの軽減策) と ARM の「Cache Speculation Side-channels」(キャッシュ投機的サイドチャネル) のガイダンスも利用できます。

Windows 固有のスペクターとメルトダウンの軽減策の概要については、「Understanding the performance impact of Spectre and Meltdown mitigations on Windows Systems」(スペクターとメルトダウンの軽減策が Windows システムに対して与えるパフォーマンスへの影響の概要) を参照してください。

MSVC の軽減策で対応しているスペクターの脆弱性の概要については、C++ チーム ブログの「Spectre mitigations in MSVC」(MSVC でのスペクターの軽減策) を参照してください。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[コード生成] プロパティ ページを選択します。

  3. [Spectre 軽減策] プロパティの新しい値を選択します。 [OK] を選択して変更を適用します。

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  3. [追加のオプション] ボックスに /Qspectre コンパイラ オプションを入力します。 [適用] を選択して変更を適用します。

  4. [構成プロパティ]>[リンカー]>[全般] プロパティ ページを選択します。

  5. プロジェクトのプロパティ内のプラットフォームごとに、[追加のライブラリ ディレクトリ] プロパティを編集します。 ターゲット プラットフォーム用のスペクター軽減済みランタイム ライブラリ ディレクトリへのパスを設定し、[適用] を選択して変更を適用します。 完了したら [OK] をクリックします。

このコンパイラ オプションをコードから設定するには

関連項目

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q オプション (低水準の操作)
MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文