SMEP / SMAP
SMEP / SMAP とは何ですか?
SMEP / SMAPSMEP と SMAP は、カーネルがユーザー空間のページを実行したりアクセスしたりすることを禁じる CPU 機能で、典型的なローカル権限昇格を阻止します。
Supervisor Mode Execution Prevention(SMEP)と Supervisor Mode Access Prevention(SMAP)は x86_64 の機能で、Intel が Ivy Bridge(SMEP、2012 年)と Broadwell(SMAP、2014 年)で導入しました。ARM には PXN と PAN という同等機能があります。SMEP はカーネルがユーザー空間にマップされたページから命令を取得しようとすると例外を発生させ、ret2usr 攻撃を阻止します。SMAP はカーネルからユーザーページへの読み書きをすべて例外にし、stac/clac で一時的に EFLAGS.AC を立てた場合のみ許可します(Linux では copy_from_user のラッパで実装)。両者により、ペイロードをユーザー領域に置く多くのカーネル攻撃が無効化され、KASLR、kCFI、KPTI、CET と組み合わせて多層防御を構築します。
● 例
- 01
SMEP 対応 CPU でカーネル脆弱性がユーザーページのシェルコードへジャンプして #PF を起こす。
- 02
Linux の copy_from_user が SMAP 下で stac/clac を使いユーザーバッファにアクセスする。
● よくある質問
SMEP / SMAP とは何ですか?
SMEP と SMAP は、カーネルがユーザー空間のページを実行したりアクセスしたりすることを禁じる CPU 機能で、典型的なローカル権限昇格を阻止します。 サイバーセキュリティの アプリケーションセキュリティ カテゴリに属します。
SMEP / SMAP とはどういう意味ですか?
SMEP と SMAP は、カーネルがユーザー空間のページを実行したりアクセスしたりすることを禁じる CPU 機能で、典型的なローカル権限昇格を阻止します。
SMEP / SMAP はどのように機能しますか?
Supervisor Mode Execution Prevention(SMEP)と Supervisor Mode Access Prevention(SMAP)は x86_64 の機能で、Intel が Ivy Bridge(SMEP、2012 年)と Broadwell(SMAP、2014 年)で導入しました。ARM には PXN と PAN という同等機能があります。SMEP はカーネルがユーザー空間にマップされたページから命令を取得しようとすると例外を発生させ、ret2usr 攻撃を阻止します。SMAP はカーネルからユーザーページへの読み書きをすべて例外にし、stac/clac で一時的に EFLAGS.AC を立てた場合のみ許可します(Linux では copy_from_user のラッパで実装)。両者により、ペイロードをユーザー領域に置く多くのカーネル攻撃が無効化され、KASLR、kCFI、KPTI、CET と組み合わせて多層防御を構築します。
SMEP / SMAP からどのように防御しますか?
SMEP / SMAP に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
SMEP / SMAP の別名は何ですか?
一般的な別名: SMEP, SMAP, PXN, PAN。
● 関連用語
- appsec№ 581
KASLR
KASLR(カーネル ASLR)は起動ごとにカーネル基底とモジュール配置を乱数化し、攻撃者が固定カーネルシンボルに依存したローカル権限昇格を行えないようにします。
- appsec№ 217
コントロールフロー整合性(CFI)
CFI はプログラムの間接呼び出しと戻りを事前計算した正当な遷移先集合に制限し、ROP や JOP による制御フロー奪取を阻止します。
- appsec№ 545
Intel CET
Intel CET(制御フロー強制技術)は、ハードウェアシャドースタックと間接分岐追跡(IBT)を組み合わせ、ROP/JOP/COP の悪用を阻止する CPU 機能です。
- appsec№ 670
メモリ安全性
メモリ安全性とは、プログラムが正当に確保していないメモリを読み書きしたり実行したりしないという性質で、脆弱性のクラスをまとめて排除できます。
- appsec№ 303
DEP(データ実行防止)
DEP(NX ビット、W^X)はメモリページを実行不可と印付けし、スタックやヒープに注入されたシェルコードの実行を阻止します。
- appsec№ 925
リターン指向プログラミング(ROP)
ROP は、RET で終わる短い命令列(ガジェット)を連結して、新しいコードを注入することなく任意の計算を実現するコード再利用型のエクスプロイト手法です。