• 検索結果がありません。

Intel Memory Protection Extensions(Intel MPX) x86, x CPU skylake 2015 Intel Software Development Emulator 本資料に登場する Intel は Intel Corp. の登録

N/A
N/A
Protected

Academic year: 2021

シェア "Intel Memory Protection Extensions(Intel MPX) x86, x CPU skylake 2015 Intel Software Development Emulator 本資料に登場する Intel は Intel Corp. の登録"

Copied!
22
0
0

読み込み中.... (全文を見る)

全文

(1)

FFRI,Inc.

1

Monthly Research

Intel Memory Protection Extensionsとその活用

株式会社FFRI

http://www.ffri.jp

(2)

FFRI,Inc.

Intel® Memory Protection Extensions(Intel MPX)とは

•  x86, x86-64の命令拡張

–  メモリアクセスの境界チェックを支援する命令とレジスタ •  2015年2月現在、この機能を搭載したCPUは出荷されていない

–  skylake 世代(2015年出荷予定)で利用可能に

–  Intel Software Development Emulatorで動作を確認できる

2

(3)

FFRI,Inc.

Intel MPX利用の実例:

Code Instrumentationによるバッファオーバーフローの検知

1.  GCCコンパイラのcode instrumentationによるメモリ境界チェックコ ードの挿入 2.  LinuxカーネルによるIntel MPXのサポート(必須ではない) A[0] A[1] A[2] A[3] Stack … 0x00000000 0xffffffff …. int A[4];

A[3] = 0; // Regular access

A[4] = 0; // Illegal access

Not A member 3 A array members OK Violation

(4)

FFRI,Inc.

Intel Memory Protection Extensions (Intel MPX)

(5)

FFRI,Inc.

Intel MPXの概要

•  レジスタとそれに関するCPU命令が追加された

–  プレフィックスが0fなので、mpxが利用できないCPUではnop扱い •  メモリ境界とポインタを対応づけるbound paging機構が追加

•  CALL, RET, JMP Jcc命令実行時にboundsレジスタを待避&復元する 設定が利用可能になった

•  VMX, TSX命令が拡張された

(6)

FFRI,Inc.

New Registers

•  BND0-3 Bounds registers –  128bit長のレジスタ –  64bitずつ、メモリの上限と下限を設定する •  BNDCFGU –  Bound Pagingのベース(Ring3) •  BNDCFGS –  Bound Pagingのベース(Ring0-2) •  BNDSTATUS –  Bound Pagingの操作アドレスやエラーコードが入る 6

(7)

FFRI,Inc.

Bound Paging

•  ポインタの物理アドレスをindexとして、ポインタとBoundsのマ ッピングを管理する 7 DWORD Reserved DWORD Pointer Value DWORD Upper Bound DWORD Lower Bound

Bound Table Entry

(16Byte - 32bit, 32Byte - 64bit)

Bound Table

(16KB - 32bit, 4MB - 64bit)

Bound Table Entries

Bound Directory

(4MB - 32bit, 2GB - 64bit)

Bound Directory Entries

Linear Address of “pointer”(LAp)

(8)

FFRI,Inc.

BND命令

•  BNDMK –  boundsレジスタに境界をセット •  BNDCL –  boundsレジスタを指定し、レジスタまたはメモリアドレスが boundsの下限より上かどうかチェック •  BNDCU, BNDCN –  boundsレジスタを指定し、レジスタまたはメモリアドレスが boundsの上限より下かどうかチェック •  BNDMOV –  boundsレジスタの読み書き、メモリへの読み書き •  BNDLDX –  メモリからboundsレジスタに読み込み •  BNDSTX –  boundsレジスタのメモリへの待避 8

(9)

FFRI,Inc.

利用イメージ

(1)

9

//スタックベースから配列が確保されていると仮定

; int A[100] from RBP

// RAXに配列のベースアドレスを格納

LEA RAX, [RBP+offset]

// BND0 レジスタのLower bound(0-63bit)にRAXのアドレスを格納

// 同じくupper bound(127-64bit)に(RAX+399)の値を設定 BNDMK BND0, [RAX+399]

(10)

FFRI,Inc.

利用イメージ

(2)

10

//32bit integerなRBXの値を、RAXの示すアドレス(バッファ)に格納するとき

//バッファの境界はBND0に設定済みとする

BNDCL BND0, [RAX] ;下限のチェック

BNDCU BND0, [RAX+3] ;上限のチェック MOV Dword ptr [RAX], RBX;

もしBNDCLやBNDCUで境界を越えた場合、BNDSTATUSにエラーコ ードを設定し、例外#BRを発生させる

(11)

FFRI,Inc.

BR例外とError Code

•  例外発生時、BNDSTATUSレジスタの0-1bitにエラーコードが格納 される –  00b – NO Intel MPX exception –  01b – Bounds violation •  BNDCL, BNDLU, BNDCN命令にて発生する –  10b – Invalid bound directory entry

•  BNDLDX BNDSTX命令にて発生する

•  不正なBound directory entryの物理アドレスをBNDSTATUS

レジスタの127-2bitに格納する

–  11b - reserved

(12)

FFRI,Inc.

Intel MPX Support in GCC Compiler

(13)

FFRI,Inc.

GCCコンパイラによるIntel MPX利用

•  バッファーオーバーフローなど、連続して確保したメモリ領域を 超えるメモリアクセスを検知するためのcode instrumentationを行う –  -f mpxオプションで有効に 13 コンパイル 対象 コード オブジェクト リンカ 実行ファイル Code Instrumentationを実施

(14)

FFRI,Inc.

GCCが-f mpxでおこなうCode Instrumentation

•  メモリ境界の計算 –  コンパイル時に静的解析し、変数、ポインタごとにメモリ境界設定 コードを生成 •  メモリアクセスごとのチェックコード生成 •  関数呼び出し、終了時のboundsレジスタ初期化、復帰など •  Bounds tableの管理 –  ポインタと境界の対応付けを管理するBounds tableの管理は、基本 的にランタイムが行う •  ネストした構造体などにおける境界の圧縮 14

(15)

FFRI,Inc.

Memory accesses instrumentationの例

•  p[i]=0;のGIMPLE中間表現のダンプ例

15

<bb 2>:

_2 = (long unsigned int) i_1(D); _3 = _2 * 4; _6 = p_4(D) + _3; __builtin_ia32_bndcl (__bounds_of_p_5, _6); _8 = _6 + 3; __builtin_ia32_bndcu (__bounds_of_p_5, _8); *_6 = 0; Reference: https://gcc.gnu.org/wiki/Intel%20MPX%20support%20in%20the%20GCC%20compiler p[i] = 0; Instrumentation

(16)

FFRI,Inc.

Intel MPX in Linux Kernel

(17)

FFRI,Inc.

Linux kernel におけるIntel MPXサポート

•  Linux 3.19でIntel MPXのサポート機能がマージされた –  カーネルによるBounds Tableの動的アローケーション –  MPXによる例外に関するsignalの追加、変更 –  Bound Tableのクリーンアップ –  prctlへのコマンド追加 •  カーネルによるBounds Table管理を有効/無効にする 17

(18)

FFRI,Inc.

カーネルによる

Bound Tableの動的アローケーション

•  Bounds Tableは最大2Gの物理アドレスにマッピングしなければならない –  現実的ではない –  このため、カーネルがBNDSTXの例外をキャッチして、動的にBound Tableを拡張する –  VM_MPXフラグがついた仮想メモリをカーネルが常にトレースする •  また、do_munmap()をフックし、Bounds Tableがfreeされたら物理ア ドレスの予約状況を変更する 18

(19)

FFRI,Inc.

siginfo構造体の拡張

•  _sigfault構造体に、bounds違反に関するフィールドを追加

19 19

/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ struct {

void __user *_addr; /* faulting insn/memory ref. */ #ifdef __ARCH_SI_TRAPNO

int _trapno; /* TRAP # which caused the signal */ #endif

short _addr_lsb; /* LSB of the reported address */ struct {

void __user *_lower; void __user *_upper; } _addr_bnd;

} _sigfault;

(20)

FFRI,Inc.

まとめ

•  拡張命令自体はプリミティブだが、コンパイラと組み合わせる前 提で、ランタイムによるメモリ保護を行うために十分な機能が備わ っている •  パフォーマンスへの影響はまだはっきりと分からない

–  しかし、software fault isolationやruntime code instrumentationよ りは早いことは確実

•  新しいハードウェアが必要なため、すぐに普及する技術ではない –  しかし今後、主要コンパイラや言語ランタイムなどで使われてい

く可能性は大いにある

(21)

FFRI,Inc.

参考文献

•  Intel® Architecture Instruction Set Extensions Programming Reference Section 9

Version 319433-022 OCTOBER 2014

•  Intel® Memory Protection Extensions (Intel® MPX) support in the GCC compiler

https://gcc.gnu.org/wiki/Intel%20MPX%20support%20in%20the%20GCC%20compiler

•  Documentations/x86/intel-mpx.txt in Linux kernel 3.19

(22)

FFRI,Inc.

Contact Information

E-Mail : research—[email protected]

Twitter : @FFRI_Research

参照

関連したドキュメント

の商標です。Intel は、米国、およびその他の国々における Intel Corporation の登録商標であり、Core は、Intel Corporation の商標です。Blu-ray Disc

CN 割り込みが発生した場合、ユーザーは CN ピンに対応する PORT レジスタを読み出す

経費登録システム リリース後、新規で 実績報告(証拠 書類の登録)をす る場合は、全て. 「経費登録システ

CPU待ち時間 PCとPSWを 専用レジスタ

旅行者様は、 STAYNAVI クーポン発行のために、 STAYNAVI

手動のレバーを押して津波がどのようにして起きるかを観察 することができます。シミュレーターの前には、 「地図で見る日本

パキロビッドパックを処方入力の上、 F8特殊指示 →「(治)」 の列に 「1:する」 を入力して F9更新 を押下してください。.. 備考欄に「治」と登録されます。

① 小惑星の観測・発見・登録・命名 (月光天文台において今日までに発見登録された 162 個の小惑星のうち 14 個に命名されています)