未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

Execution Disable Bit

Intelの実行不可ビットの話の続き。

The IA-32 Intel(R) Architecture Software Developer's Manual, Volume 3: System Programming Guide にはまだそのビットの記述がないと一昨日記した。いろいろ調べたのだけど見つからないのでIntelの中島さんに聞いてみた。Intelの開発者向けサイト http://developer.intel.com でexecution disable bit で検索すれば簡単に見つかるとのこと。 http://cache-www.intel.com/cd/00/00/14/93/149307_149307.pdf である。中島さん、どうもありがとう。

というわけで、Execute Disable Bit Functionality Blocks Malware Code Execution を読んでみよう。

Execute Disable Bit Capability Overview

Software can detect the presence of the Execute Disable Bit capability using the CPUID instruction with the input value 80000001H in EAX. Presence is indicated by a value returned in EDX. If bit 20 of EDX is set, the Execute Disable Bit is available.

If CPUID extended function 80000001H reports that Execute Disable Bit capability is available and PAE is enabled, software can enable the Execute Disable Bit capability by setting the NXE bit to 1 in IA32_EFER MSR (address C0000080H). IA32_EFER is available if bit 20 or bit 29 of the EDX register returned by CPUID-extended function 80000001H is 1.

概要:実行不可ビット(Execution Disable Bit)が存在するかどうかの確認は、EAXレジスタに80000001Hを入れCPUID命令を実行することによって行える。EDXレジスタの20ビット目が1だと実行不可ビットが存在するプロセッサである。

もし実行不可ビットが存在しかつPAEが有効になっていたら、IA32_EFER MSRのNXEビットを1にすることで実行不可機能を有効にすることができる。IA32_EFERは80000001HでCPUIDを実行した結果EDXレジスタの20ビット目ないし29ビット目が1であれば存在する。(おもいっきり直訳ですが、IA32アーキテクチャを知らないとチンプンカンプンですね。逐次訳していく。)

CPUID命令というのはIA32の実装ごとの違いを調べるために用意されている命令でアーキテクチャの違い例えばPentiumなのかPentiumIIなのかはたまたIntelXeonなのかなどをチェックできる。IA-32 Intel® Architecture Software Developer's Manual Volume 1: Basic Architecture *1 の14章Processor Identification and Feature Determinationに解説があるので興味のある人は確認してほしい。

PAEというのはPhysical Address ExtensionでThe IA-32 Intel(R) Architecture Software Developer's Manual, Volume 3: System Programming Guide *2 の3章8節36-Bit Physical Addressing Using the PAE Paging Mechanismに詳細がある。PentiumProから導入された機能でIA32はもともとは32ビットのアドレス空間を提供していたのだがPAEによって物理アドレスを36ビットに拡張できるようになった。(仮想記憶は32ビットのままなのでアプリケーション的には見えないのだが物理メモリを64GBまで積めるようになったのである。)

IA32_EFERというのはExtended Feature Enable Registerで今回の64ビット拡張から導入されたMSR(Model Specific Register)である。MSRというのはモデルに固有のレジスタでIA32_EFERというMSRは古いIA32の実装(Pentium4以前)には存在しない。

ということでIA32_EFER MSRのNXEビットを1にすれば実行不可機能を有効にすることができる。一段落読むのに一時間程度かかってしまったがマニュアルを精読するということはそーゆーことである。英語の問題ではない。

IA32_EFERのビット位置と機能
0: SysCall Enable (SCE)
1-7: Reserved
8: IA32e mode Enable (LME)
9: Reserved
10: IA-32e mode Active (LMA)
11: Execute Disable Bit Enable (NXE)
12-63: Reserved

と今日はこのくらいにしておく。IA-32eモードでのアドレス変換の話などが続く。(予定)