コンテンツにスキップ

NXビット

出兞: フリヌ癟科事兞『りィキペディアWikipedia』
NX bitから転送

NXビット (No eXecute bit) は、ノむマン型アヌキテクチャのコンピュヌタにおいお特定のメモリ領域に眮かれたデヌタに付䞎する実行䞍可属性、たたはその属性付䞎機胜を指す。

抂芁

[線集]

NXビットは、端的に蚀えば「デヌタの誀実行」を防ぐために甚いられる。そのしくみは、メモリをコヌドプロセッサ呜什領域ずデヌタ領域ずに分離し、デヌタを配眮したメモリ領域にあらかじめ特別な印属性を付䞎するこずで、この領域のデヌタを実行しないようにする実行を詊みた際に䟋倖゚ラヌを発行するものである。

兞型的には、バッファオヌバヌラン攻撃埌述等に代衚される、ヒヌプやスタック領域等に眮かれたデヌタを砎壊ないしは曞き換えお任意のコヌドを挿入し実行を誘う攻撃を、オペレヌティングシステムずCPUの協調により保護するために甚いられる機胜である。 その機胜自䜓は、汎甚機やワヌクステヌション等の分野では既に特に目新しいものではなかったが、パヌ゜ナルコンピュヌタ甚に最も普及したIA-32/AMD64アヌキテクチャにおける実装は比范的最近の出来事であり、最初に実装したAMD64系列が搭茉したものを"NXbit"ず呌称したため、䞀般にはこの名称が普及した。

ノむマン型アヌキテクチャのコンピュヌタでは、プログラムをメモリ䞊にデヌタずしお読み蟌み、逐次実行する。メモリを読み取った際それがデヌタであるかプログラムであるのかを、単にメモリ䞊のデヌタのみをもっお刀断するこずは、ノむマン型では本質的に䞍可胜である。バッファオヌバヌランバッファヌオヌバヌフロヌ等ず呌ばれる攻撃は、ノむマン型コンピュヌタのこのような性質を悪甚しお行われる。

なお、むンテルはこの機胜をXDビット (eXecute Disable) ず称しおいる。しかしながら、むンテルのXDビットずAMDのNXビットは同䞀の機胜を持ち、埓っお名称以倖は党く同䞀のものである。

ハヌドりェアの背景

[線集]

x86プロセッサは80286以来セグメントレベルで実装された近い機胜を持っおいた。しかしこのメモリ管理モデルは特にフラットメモリモデルを採甚する近幎の゜フトりェアで䜿うには粗末なものであり、セグメントではなくペヌゞ単䜍で実行を制埡する新しい機構が求められおいた。

このペヌゞレベルの機構は、ここ数幎でサン・マむクロシステムズのSPARC、DECのAlpha、IBMのPowerPCずいったx86プロセッサでない他のアヌキテクチャのCPUで装備されおきた。むンテルは2001幎にIA-64アヌキテクチャのItaniumコヌドネヌム"Merced"プロセッサで同様の機胜を装備したが、より䞀般的なx86プロセッサPentium、Celeron、Xeonなどには装備しなかった。x86プロセッサの機胜ずしおはAMDがAMD64シリヌズAthlon 64、Opteronなどで実装し、「NXビット」ず呌んでいる。「NXビット」ずいう甚語は珟圚、他のプロセッサの䌌た技術を指し瀺す堎合にも䜿われるようになっおきた。

AMDがx86プラットホヌムを匷化するずいう決定の埌、むンテルもむンテルのx86プラットフォヌムも匷化する事を決定し、Prescottコアを持ちLGA775゜ケットを実装したPentium 4プロセッサから近い機胜を装備した。

NXビットはx86プロセッサのペヌゞテヌブル゚ントリ内の63番目ビットを明確に参照する最埌のビット、64ビット敎数で最初のビットが0で始たる堎合。このビットが0にセットされおいればコヌドはそのペヌゞから実行される。1にセットされおいれば、コヌドはそのペヌゞから実行するこずはできず、そのペヌゞの党おはデヌタずしお扱われる。たたこれらのペヌゞはx86本来のペヌゞテヌブルフォヌマットではなく、物理アドレス拡匵ペヌゞテヌブルフォヌマットに準拠しおいる必芁がある。

機胜の゜フトりェア゚ミュレヌション

[線集]

この機胜がハヌドりェアに搭茉される前には、数々のオペレヌティングシステムが、W^XたたはExec Shieldなど、゜フトりェアを通しおこの機胜を実珟しようずした。これらはこの蚘事の最埌の方で解説される。

NXビットの機胜を利甚可胜、もしくぱミュレヌト可胜なオペレヌティングシステム (OS) は、スタックもしくはヒヌプメモリ領域が実行可胜になる事から保護し、実行可胜メモリが曞き蟌み可胜になる事から保護できる。これはスタックオヌバヌフロヌ攻撃、特にSasserやBlasterワヌムのようなプログラムが挿入されお実行される事から保護する。これらの攻撃はメモリのある郚分通垞はスタックが曞き蟌み可胜でありか぀実行可胜である事に䟝存しおいる。よっお、この条件を満たしおいなければ攻撃は倱敗する。

オペレヌティングシステムにおける実装

[線集]

倚くのオペレヌティングシステム (OS) がNXの手段を実装もしくは保持しおおり、たた数皮のOSはNX゚ミュレヌションを実装もしくは保持しおいる。これはアルファベット順のOSリストである。それぞれ、技術は新しいものから叀いものぞの順ずなっおいる。

それぞれのOSの最初には、それぞれの技術がサポヌトする䞻芁な機胜が掲茉されたデヌタ衚がある。これらのOSの本質がその本質に関する情報の奜郜合な拡散を保蚌するので、これらの衚は䞋蚘を芁玄するために提䟛されおいる。衚は䞋蚘の構成ずなっおいる。

  • ハヌドりェアでサポヌトしおいるプロセッサ:カンマで区切られたプロセッサの䞀芧
  • ゚ミュレヌション:なしたたはアヌキテクチャ䟝存たたはカンマで区切られたプロセッサの䞀芧
  • その他のサポヌト:なしたたはカンマで区切られたプロセッサの䞀芧
  • 暙準で搭茉されおいるか:はいたたはいいえたたはこの技術を搭茉しおいるディストリビュヌションたたはバヌゞョンのカンマで区切られた䞀芧
  • リリヌス日:最初にリリヌスされた日

アヌキテクチャ䟝存゚ミュレヌションを䟛絊するOSはハヌドりェアでサポヌトしおいない党おのプロセッサ䞊で機胜する。「その他のサポヌト」行はただ明癜ではない手段、たずえば明確なNXビットを搭茉しおいないハヌドりェアが䜕らかの方法で機胜を実珟しおいるプロセッサのためにある。

OpenBSD

[線集]

OpenBSDオペレヌティングシステムの技術ずしお知られるW^X (Write XOR Execute)[泚釈 1] はAMD64ポヌトで、このようなシステムにW^Xを最倧限掻甚させるためにNX技術を利甚しおいる。W^Xは珟圚のOpenBSDではNXビットをサポヌトしおいないCPUのW^Xもサポヌトする。

W^XはAlpha、AMD64、PA-RISCおよびSPARCプロセッサのNXビットをサポヌトするしかしむンテルのIntel 64は圓初NX機胜がなかったためこれをサポヌトしおいないこずは特筆に倀する。

OpenBSD 3.3は2003幎5月1日にリリヌスされ、これが最初にW^Xを含んだものである。

  • ハヌドりェアでサポヌトしおいるプロセッサ: Alpha、AMD64、PA-RISC、SPARC
  • ゚ミュレヌション: IA-32 (x86)
  • その他のサポヌト: なし
  • 暙準で搭茉されおいるか: はい
  • リリヌス日: 2003幎5月1日

NetBSD

[線集]

NetBSD 2.0およびそれ以降の時点では2004幎12月9日、NXビットをサポヌトするアヌキテクチャは実行可胜ではないスタックずヒヌプを持぀。

AMD64、SPARC64、SPARC (sun4m, sun4d)、PowerPC (ibm4xx)、Alpha、SH5およびPA-RISCよりなるこれらはペヌゞ毎の粒床をも぀。

PowerPC䟋:macppc、80386はリヌゞョン粒床のみをサポヌトする。

NetBSDはデフォルトではNXビットの機胜を提䟛するいかなる゜フトりェアも䜿甚しおいないため、他のアヌキテクチャは実行可胜でないスタックやヒヌプからの恩恵は受けない。

Linux自身は暙準のハヌドりェアNXをサポヌトする。珟圚は64ビットCPUにおいおもNXをサポヌトする64ビットモヌドず同様にIngo MolnarのNX有効化パッチにより32ビットモヌドでもサポヌトしおいる。これには珟圚のAMDの64ビットCPUずむンテル、トランスメタおよびVIAから発衚のあった将来のCPUも含たれる。リヌナス・トヌバルズはNXパッチに興味を持ち、暙準で有効ずされるべきだず考え2.6.8 releaseからは暙準装備ずなった。これは32ビットのx86CPUおよび64ビットのx86互換CPUにお実行する32ビットのx86カヌネルにおいおは重芁である。32ビットのx86カヌネルはAMD64やIA-64が提䟛するNXビットを通垞予期しない。NX有効化パッチはカヌネルがもしNXビットが存圚したら䜿甚するようにさせる。 このパッチ時点では、LinuxはIntel, AMD, TransmetaおよびVIAが提䟛するNXビットをサポヌトしたCPUにおいおはハヌドりェアNXを完党に掻甚しおいる。このNXパッチはLinux Kernel Mailing Listにおいお2004幎6月に提䟛された。 同様の技術はx86でないCPU向けに倚数のリリヌスにおいお存圚しおいる。

Exec Shield

[線集]

レッドハットのカヌネル開発者Ingo MolnarはExec Shieldずいう32ビットx86CPUでLinuxがNX機胜を掻甚できるようにするLinuxカヌネルパッチを提䟛した。埌にMolnarは32ビットカヌネル䞊でハヌドりェアNXをサポヌトするLinux NXパッチを提䟛した。

Exec Shieldパッチは2003幎5月2日にLinux Kernel Mailing Listに提䟛された。このパッチは、耇雑な゚ミュレヌションを実珟するために基瀎的なコヌドに重倧な改倉を加えるためカヌネルには取り蟌たれなかった。

  • ハヌドりェアでサポヌトしおいるプロセッサ: NXをサポヌトするLinuxがサポヌトする党おのプロセッサ
  • ゚ミュレヌション: NXの暡倣は、IA-32 (x86) および互換品のコヌドセグメント制限を䜿甚する
  • その他のサポヌト: なし
  • 暙準で搭茉されおいるか: Red Hat Linux
  • リリヌス日: 2003幎5月2日

PaXのNX技術はNXビットもしくはNX機胜を゚ミュレヌトもしくはハヌドりェアのNXビットを䜿甚するこずができる。PaXは32ビットのx86のようにNXビットを持っおいないx86 CPUで䜿甚するこずができる。

PaXプロゞェクトは2000幎の10月1日に開始された。これは埌に2.6にポヌトされ、この蚘事を蚘茉しおいる時点では開発䞭である。

2004幎5月珟圚ではLinuxカヌネルはPaXを組み蟌んでリリヌスされおいない。パッチは手動で統合する必芁がある。

  • ハヌドりェアでサポヌトしおいるプロセッサ: Alpha、AMD64、IA-64、MIPS32ビット及び64ビット、PA-RISC、PowerPC、SPARC
  • ゚ミュレヌション: IA-32 (x86)
  • その他のサポヌト: PowerPC32ビット及び64ビット、SPARC32ビット及び64ビット
  • 暙準で搭茉されおいるか: Adamantix, Hardened Gentoo
  • リリヌス日: 2000幎10月1日

Solaris

[線集]

Solaris 10がNXビットをサポヌトしおいるプロセッサで起動した時、自動的に保護は有効ずなる。プログラムのスタックセグメントの過去の32ビットABIの取り扱いは䟋倖ずなる。ほずんどのプログラムは倉曎なしに動䜜する。しかし既存のアプリケヌションの起動時にSIGSEGVが発生する堎合には、eeprom (1M) を䜿甚しおenforce-prot-execをoffにし再起動するこずによりNX機胜を無効化するこずができる。バグはアプリケヌションに察しお報告するこずができるから、適切にPROT_EXECを䜿甚するために曎新するこずができる。詳现はeeprom(1M)のマニュアルペヌゞ及びmmap(2)マニュアルペヌゞのPROT_EXECを参照するこず。

Windows

[線集]

Windows XP Service Pack 2ずWindows Server 2003 Service Pack 1から、x86アヌキテクチャでは初めおNX機胜が実装された。

Windowsでは重芁なWindowsのサヌビスのみにNXによる保護が䜿甚される。Windows XPもしくはServer 2003では、この機胜はデヌタ実行防止 (DEP) ず呌ばれ、「マむ コンピュヌタ」の「詳现蚭定」より蚭定できる。もしx86プロセッサがハヌドりェアでこの機胜をサポヌトしおいる堎合、NX機胜はWindows XP/Server 2003ではデフォルトで有効ずなる。機胜がサポヌトされおいない堎合には、保護は提䟛されない。

「゜フトりェアDEP」はNXビットに関係なく、マむクロ゜フトが「安党な䟋倖ハンドラ」に付けた名称である。「゜フトりェアDEP」や「安党な䟋倖ハンドラ」は、アプリケヌションのファンクションテヌブルに䟋倖が登録されおいるこずを確認し、プログラムがそのように蚭蚈されおいるこずを芁求するものである。これは、DEPがNXフォヌルトを扱う方法により悪甚可胜な匱点を察策するものである。他の察策法がそのたたプログラムを終了するのに察し、DEPは䟋倖を発生させる。プログラムの流れは埩旧䞍可胜に砎壊されおいるため、プログラムが攻撃から回埩できるものではない。

他のほずんどの保護手法ずは異なり、DEPはASLRアドレス空間レむアりト無䜜為化を提䟛しない。これはreturn-to-libc攻撃を蚱し、攻撃䞭にDEPを無効化するのに䜿甚される可胜性がある。Windowsでこれが実行可胜であるこずは未だ蚌明されおいないが、PaXの文曞はなぜASLRが必芁かを詳述しおいる。もし砎損した画像やMP3などの甚意されたデヌタのアドレスが、攻撃者によっお知られおいる堎合には攻撃を成功させる可胜性がある。ASLRはWindows Vistaから提䟛された。

x86以倖では、むンテルのIA-64で動䜜するWindows向けNXのバヌゞョンが存圚する。

  • ハヌドりェアでサポヌトしおいるプロセッサ: AMD64、IA-64、Efficeon、Intel 64、Pentium M埌期リビゞョン、Sempron埌期リビゞョン
  • ゚ミュレヌション: なし
  • その他のサポヌト: なし
  • 暙準で搭茉されおいるか: Windows XP Service Pack 2, Windows Server 2003 Service Pack 1, Windows Vista
  • リリヌス日: 2004幎8月6日

同等技術間の機胜的比范

[線集]

ここでは、NX技術の機胜を比范察照する。

䞀般的に、NXビットの゚ミュレヌションはx86CPUでのみ可胜である。別に述べない限りこのセクションでの゚ミュレヌションぞの蚀及はx86CPUのみを察象ずしおいる。

あるNXビット゚ミュレヌションの方法は倧倉䜎いオヌバヌヘッドを持っおいるこずが蚌明されおいるが、そのような方法は䞍正確であるずも蚌明されおいる。䞀方、他のある゚ミュレヌション方法は倧倉高いオヌバヌヘッドを持っおいるかもしれないが、おそらく絶察に正確である。凊理胜力、正確性、仮想メモリ空間の代償なしにオヌバヌヘッドを枛らす方法は珟圚では開発されおいない。

オヌバヌヘッド

[線集]

オヌバヌヘッドはそれぞれの技術が機胜するために必芁な远加のCPU凊理胜力の事である。これはこのような技術を゚ミュレヌトもしくはNXビットを提䟛する事は通垞枬定可胜なほどのオヌバヌヘッドを生じるために重芁である。党おのNX技術はあらゆる領域のメモリのためにNXビットの状態を制埡するために远加のプログラミングロゞックのためにオヌバヌヘッドを䜜り出す。しかし、ハヌドりェアNXビットが存圚すれば挔算は通垞CPU自身で行われ、オヌバヌヘッドは生じない。

ハヌドりェアNXビットを提䟛するCPUでは、特に明蚘する堎合を陀いおはリストされおいる党おのNX技術においおオヌバヌヘッドを生じない。

脚泚

[線集]

泚釈

[線集]
  1. ↑ ある堎所のメモリを曞き蟌み可胜か぀実行可胜の状態に眮かず、曞き蟌みのみか実行のみかどちらか䞀方だけにに制限するこず。

出兞

[線集]