インテル® コンパイラーを使用して投機実行サイドチャネルの問題を緩和

同カテゴリーの次の記事

プログラミング、リファクタリング、そしてすべてにおける究極の疑問

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Using Intel® Compilers to Mitigate Speculative Execution Side-Channel Issues」の日本語参考訳です。


概要

サイドチャネル攻撃とは、システムを観察することで、システムに関連するマイクロアーキテクチャーの特性計測など、通常はアクセスできない秘密情報や特権情報を取得する方法です。この記事に関する背景情報は、「投機実行サイドチャネルのインテルによる解析」 (英語) をご覧ください。この記事では、投機実行サイドチャネルの緩和に関するインテル® C++ コンパイラーとインテル® Fortran コンパイラーによるサポートについて説明します。

境界チェックのバイパス (Spectre Variant 1) の緩和

境界チェックのバイパス (Spectre Variant 1) として知られる脆弱性の詳細と条件および緩和策については、「投機実行サイドチャネルのインテルによる解析」 (英語) をご覧ください。

Spectre Variant 1 向けの 1 つの緩和策は、LFENCE 命令によって実現されます。LFENCE 命令は、先行するすべての命令がローカルで完了するまで実行されず、また、LFENCE 命令が完了しないと後続の命令は実行を開始しません。_mm_lfence() は、LFENCE 命令を発行するコンパイラーの組込み関数またはアセンブラーのインラインであり、コンパイラーの最適化はこの境界をまたいでメモリー参照を移動することはありません。境界チェック条件とメモリーロードの間に LFENCE 命令を挿入することで、境界チェック条件が完了するまでロードが開始されないことを確実にします。

インテル® C++ コンパイラーとインテル® Fortran コンパイラーは、プログラマーが LFENCE 命令を挿入することを可能にし、境界チェックのバイパス (Spectre Variant 1) の緩和に使用できます。

C/C++ における LFENCE 命令

次の例に示すように、C/C++ プログラムに LFENCE 命令を挿入できます。

#include <intrin.h>
#pragma intrinsic(_mm_lfence)

    if (user_value >= LIMIT)
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    else
    {    
        _mm_lfence();	/* 開発者が手動で挿入 */
        x = table[user_value];
        node = entry[x];
    }

Fortran における LFENCE 命令

次の例に示すように、Fortran アプリケーションに LFENCE 命令を挿入できます。
_mm_lfence() 組込み関数を呼び出す次のサブルーチンを実装します。

interface 
        subroutine for_lfence() bind (C, name = "_mm_lfence") 
            !DIR$ attributes known_intrinsic, default :: for_lfence
        end subroutine for_lfence
    end interface
 
    if (untrusted_index_from_user .le. iarr1%length) then
        call for_lfence()
        ival = iarr1%data(untrusted_index_from_user)
        index2 = (IAND(ival,1)*z'100') + z'200'    
        if(index2 .le. iarr2%length) 
            ival2 = iarr2%data(index2)
    endif

LFENCE 組込み関数は、次のインテル® コンパイラーでサポートされています。

  • インテル® C++ コンパイラー 8.0 以降 (Windows*、Linux*、および macOS*)。
  • インテル® Fortran コンパイラー 14.0 以降 (Windows*、Linux*、および macOS*) では、上記の方法で組み込み関数を適用できます。

分岐ターゲット・インジェクションの緩和 (Spectre Variant 2)

分岐ターゲット・インジェクション (Spectre Variant 2) として知られる問題の詳細、条件、および緩和策についてはインテルのホワイトペーパー「Retpoline: 分岐ターゲット・インジェクションの緩和」 (英語) で説明されています。このサイドチャネル攻撃には多くの対応策がありますが、このホワイトペーパーで説明されている緩和策は Retpoline として知られ、インテル® C++ および Fortran コンパイラーでも採用されています。

インテル® C++ および Fortran コンパイラーは、分岐ターゲット・インジェクション (Spectre Variant 2) の緩和に役立つコマンドライン・オプションを提供します。これらのオプションは、すべての間接分岐 (call/jmp) を Retpoline コードシーケンスで置き換えることを指示します。thunk-inline オプションは、緩和が必要なそれぞれの間接分岐に完全な Retpoline コード・シーケンスを挿入します。thunk-extern オプションは、Retpoline シーケンスを共有化することでコードサイズを軽減します。

コンパイラーは次のオプションを実装します。

  • -mindirect-branch=thunk-inline (Linux* および macOS*)
  • -mindirect-branch=thunk-extern (Linux* および macOS*)
  • /Qindirect-branch:thunk-inline (Windows*)
  • /Qindirect-branch:thunk-extern (Windows*)

上記のコマンドライン・オプションは、次のインテル® コンパイラーでサポートされます。

  • インテル® C++ コンパイラー 18.0 Update 2 以降 (Windows*、Linux*、および macOS*)
  • インテル® Fortran コンパイラー 18.0 Update 2 以降 (Windows*、Linux*、および macOS*)

サポートされるインテル® コンパイラーで利用可能な緩和オプションのアップデートについては、「インテル® コンパイラー – サポートされるコンパイラーのバージョン」 (英語) をご覧ください。

最新のインテル® C++ コンパイラーとインテル® Fortran コンパイラーの入手方法

インテル® C++ コンパイラーは、インテル® Parallel Studio XE および インテル® System Studio ツールスイートに同梱されています。インテル® Fortran コンパイラーは、インテル® Parallel Studio XE 2018 に同梱されています。これらのツールは、インテル® ソフトウェア開発製品レジストレーション・センターからダウンロードできます。Retpoline は、インテル® Parallel Studio XE 2018 Update 2 以降、またはインテル® System Studio 2018 Update 1 以降でサポートされます。サポートされるインテル® コンパイラーで利用可能な緩和オプションのアップデートについては、「インテル® コンパイラー – サポートされるコンパイラーのバージョン」 (英語) をご覧ください。

まとめと追加情報

Spectre と Meltdown の問題に関する最新情報は、Intel Newsroom (英語) でご覧いただけます。また、ソフトウェアに関連する最新情報は、サイド・チャネル・セキュリティー・サポート (英語) Web サイトで公開されています。「投機実行サイドチャネルの緩和策」 (英語) と 「Linux* における潜在的なサイド・チャネル・キャッシュの利用に関するインテルの緩和策の概要」の詳しい情報は、サイド・チャネル・セキュリティー・サポート (英語) Web サイトでご覧いただけます。

問題が生じた場合は、サポートの方法をサポートサイト (英語) でご覧ください。

インテルは、特定されたセキュリティーの問題に対してインテル® ソフトウェア開発製品の改善を続けています。インテル® C++ コンパイラーとインテル® Fortran コンパイラー製品のアップデートに関して、この記事を更新していく予定です。

著作権と商標について

インテル® テクノロジーの機能と利点はシステム構成によって異なり、対応するハードウェアやソフトウェア、またはサービスの有効化が必要となる場合があります。実際の性能はシステム構成によって異なります。絶対的なセキュリティーを提供できるコンピューター・システムはありません。詳細については、各システムメーカーまたは販売店にお問い合わせいただくか、http://www.intel.co.jp/ を参照してください。

ここに記載されているすべての情報は、予告なく変更されることがあります。インテルの最新の製品仕様およびロードマップをご希望の方は、インテルの担当者までお問い合わせください。

本書で説明されている製品およびサービスには、エラッタと呼ばれる設計上の不具合が含まれている可能性があり、公表されている仕様とは異なる動作をする場合があります。そのようなエラッタは、インテルの保証範囲外です。現在確認済みのエラッタについては、インテルまでお問い合わせください。

本資料は、は、現状のまま提供され、いかなる明示的または暗黙的保証もいたしません。

Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation またはその子会社の商標です。

* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

© 2018 Intel Corporation. 無断での引用、転載を禁じます。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事

  • インテル Parallel Universe 26 号日本語版の公開インテル Parallel Universe 26 号日本語版の公開 インテル Parallel Universe マガジンの最新号が公開されました。この号では、インテル® Xeon Phi™ プロセッサー向けのコードの現代化について説明します。また、インテル® Parallel Studio XE 2017 […]
  • インテル® IPP における OpenMP* サポートの変更インテル® IPP における OpenMP* サポートの変更 この記事は、インテル® ソフトウェア・ネットワークに掲載されている「OpenMP support changes in Intel Performance libraries […]
  • Parallel Universe マガジンParallel Universe マガジン Parallel Universe へようこそ。 米国インテル社が四半期に一度オンラインで公開しているオンラインマガジンです。インテルの技術者によるテクノロジーの解説や、最新ツールの紹介など、並列化に関する記事を毎号掲載しています。第1号からのバックナンバーを PDF 形式で用意しました、ぜひご覧ください。 12 […]
  • インテル® MKL 2017: 複雑な問題を解くためのクックブックインテル® MKL 2017: 複雑な問題を解くためのクックブック インテル® マス・カーネル・ライブラリー (インテル® MKL) には、行列を乗算する、連立方程式を解く、フーリエ変換を行うなど、さまざまな数値問題を解く際に役立つ多くのルーチンが含まれています。専用のインテル® MKL ルーチンが用意されていない問題については、インテル® MKL […]
  • ベクトル異形関数でのプロセッサー ID 指定ベクトル異形関数でのプロセッサー ID 指定 インテル® C/C++ および Fortran コンパイラーのバージョン 16.0 以降では、プログラマーがスカラー関数に対応するベクトル関数を明示的に記述することを可能にする、ベクトル異形関数 (Vector Variant Function) をサポートしています。 Windows* および Linux* […]