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

インテル® DPC++/C++ コンパイラーインテル® Fortran コンパイラーセキュリティー

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


概要

サイドチャネル攻撃とは、システムを観察することで、システムに関連するマイクロアーキテクチャーの特性計測など、通常はアクセスできない秘密情報や特権情報を取得する方法です。この記事に関する背景情報は、「投機実行サイドチャネルのインテルによる解析」 (https://newsroom.intel.com/wp-content/uploads/sites/11/2018/01/Intel-Analysis-of-Speculative-Execution-Side-Channels.pdf) をご覧ください。この記事では、投機実行サイドチャネルの緩和に関するインテル® C++ コンパイラーとインテル® Fortran コンパイラーによるサポートについて説明します。

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

境界チェックのバイパス (Spectre Variant 1) として知られる脆弱性の詳細と条件および緩和策については、「投機実行サイドチャネルのインテルによる解析」 (https://newsroom.intel.com/wp-content/uploads/sites/11/2018/01/Intel-Analysis-of-Speculative-Execution-Side-Channels.pdf) をご覧ください。

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 の問題に関する最新情報は、https://newsroom.intel.com/press-kits/security-exploits-intel-products/ でご覧いただけます。また、ソフトウェアに関連する最新情報は、サイド・チャネル・セキュリティー・サポート (英語) Web サイトで公開されています。「投機実行サイドチャネルの緩和策」 (英語) と 「Linux* における潜在的なサイド・チャネル・キャッシュの利用に関するインテルの緩和策の概要」の詳しい情報は、サイド・チャネル・セキュリティー・サポート (英語) Web サイトでご覧いただけます。

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

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

著作権と商標について

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

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

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

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

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

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

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

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

タイトルとURLをコピーしました