この記事は、インテル® デベロッパー・ゾーンに公開されている「Intel® Memory Protection Extensions Enabling Guide」の日本語参考訳です。
概要: このドキュメントは、インテル® Memory Protection Extensions (インテル® MPX) とその目的、プログラミング・モデルについて説明します。そして、サポートする OS (Linux* および Windows*) とコンパイラー (インテル® C++ コンパイラー、GCC、Visual C++*) における要件と現在の対応状況について述べ、インテル® MPX アプリケーションに境界チェックを導入する方法を示します。
はじめに
C/C++ ポインター計算は、データ配列を処理する際によく使用される言語構造です。繰り返し書き込み操作を行う場合、書き込むメモリー位置の境界を考慮しないと、隣接するメモリー位置が破損する恐れがあります。このように、開発者が意図せずに隣接するデータを変更してしまうことをバッファー・オーバーフローと呼びます。同様に、制御されていない読み取りにより、暗号化キーやパスワードが明らかになってしまう可能性もあります。バッファー・オーバーフローが悪用されると、サービス拒否 (DOS) 攻撃やシステムクラッシュを引き起こします。より悪質な攻撃では、ユーザーやシステム管理者が気付く前に、スタックフレームのリターンアドレスなど、コードの実行パスを変更して、悪意のあるコードやスクリプトを実行します。
インテルの XD ビット (eXecute Disable Bit) やほかのベンダーの同様のハードウェア機能は、データとして保存された悪意のあるコードに実行をリダイレクトするすべてのバッファー・オーバーフロー攻撃をブロックしてきました。バッファー・オーバーフローの問題を軽減するため、コンパイラー・ベンダーはその他にもさまざまな手法を採用しています。詳細は、添付資料の「Reference」セクションを参照してください。
インテル® MPX テクノロジーは、新しいインテル® アーキテクチャー命令とレジスターで構成されています。C/C++ コンパイラーは、それらを利用することで、ポインターを使用する前にポインターの境界をチェックすることができます。この新しいハードウェア・テクノロジーは、将来のインテル® プロセッサーで利用できるようになる予定です。インテル® C/C++ コンパイラー、GCC (GNU* C/C++ コンパイラー)、Microsoft* Visual C++* コンパイラーがサポートされます。
ライセンスに同意することで、インテル® MPX Runtime Driver をダウンロード (英語) することができます。
Intel_MPX_EnablingGuide.pdf (1.68MB)
(https://software.intel.com/protected-download/606847/550012)
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。