この記事は、インテル® デベロッパー・ゾーンに掲載されている「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. 無断での引用、転載を禁じます。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。