NXビット
出典: フリー百科事典『ウィキペディア(Wikipedia)』
NXビット(No eXecute bit)は、パーソナルコンピュータにおいてバッファオーバーラン攻撃(後述)をオペレーティングシステムとCPUで保護する技術のこと。CPUではAMDのAMD64系列から搭載され始めた。
NXビットは、ある種の悪意のあるソフトウェアがそれ自身を他のプログラムのデータ領域に挿入し、その領域から挿入したコードを実行することによって、コンピュータを乗っ取るという攻撃を防ぐために用いられる。この攻撃はバッファオーバーラン(バッファーオーバーフロー)攻撃と呼ばれ、多くの場合にNXビットはこれを防ぐことができる。そのしくみは、メモリをコード(プロセッサ命令)領域とデータ領域とに分離して、データ領域にコードがあっても実行できないようにするものである。
なお、インテルはこの機能をXDビット (eXecute Disable)と称している。しかしながら、インテルのXDビットとAMDのNXビットは同一の機能を持ち、従って名称以外は全く同一のものである。
目次 |
[編集] ハードウェアの背景
たとえばサン・マイクロシステムズのSPARCやAlpha、IBMのPowerPC、そしてインテルのIA-64(ItaniumまたはMercedとしても知られる)アーキテクチャでさえこの機構をここ数年装備していたにもかかわらず、NXという用語はAMDがAthlon 64またはOpteronのようなAMD64シリーズのプロセッサに使用するために作られた。現在では他のプロセッサの似たような技術を一般的に指し示す場合にも通常用いられる用語となってきた感がある。(Intelのx86プロセッサは80286以来セグメントレベルで近い機能を持っていたが、そのメモリ構造は現代のオペレーティングシステムやプロセッサでは時代遅れとして扱われている。事実上現在のプログラムでは使用できず、AMDはページレベルで現在フラットメモリモデルに使用されるこの機能を再装備した。
NXビットはx86プロセッサのページテーブルエントリ内の63番目ビットを明確に参照する(一番最後のビット、64ビット整数でもし最初のビットが0で始まる場合)。もしこのビットが0にセットされている場合、コードはそのページから実行される。もし1にセットされている場合、コードはそのページから実行することはできず、そのページの全てはデータとして扱われる。またこれらのページはx86本来のページテーブルフォーマットではなく、物理アドレス拡張ページテーブルフォーマットに準拠している必要がある。
Intelは2001年にItaniumプロセッサに同様の機能を装備したが、より一般的なx86プロセッサには装備しなかった(Pentium, Celeron, Xeonファミリ)。AMDがx86プラットホームを強化するという決定の後、IntelもIntelのx86プラットホームも強化する事を決定し、Prescottコアを持つ最新のPentium 4プロセッサから近い機能を装備した。
[編集] 機能のソフトウェアエミュレーション
この機能がハードウェアに搭載される前には、数々のオペレーティングシステムが、W^XまたはExec Shieldなど、ソフトウェアを通してこの機能を実現しようとした。これらはこの記事の最後の方で解説される(この記事は翻訳中なのでまだそこまで翻訳されてない)。
NXビットの機能を利用可能、もしくはエミュレート可能なオペレーティングシステムは、スタックもしくはヒープメモリ領域が実行可能になる事から保護し、実行可能メモリが書き込み可能になる事から保護する事ができる。これはスタックオーバーフロー攻撃、特にSasserやBlasterワームのようなプログラムが挿入されて実行する事、が成功する事から保護する。これらの攻撃はメモリのある部分、通常はスタックである、が書き込み可能でありかつ実行可能である事に依存している。よって、この条件を満たしていなければ攻撃は失敗する。
[編集] オペレーティングシステムにおける実装
多くのオペレーティングシステムがNXの手段を実装もしくは保持しており、また数種のオペレーティングシステムはNXエミュレーションを実装もしくは保持している。これはアルファベット順になったオペレーティングシステムのリストである。それぞれ技術は新しいものから古いものへの順となっている。
それぞれのOSの最初には、それぞれの技術がサポートする主要な機能が掲載されたデータ表がある。これらのOSの本質がその本質に関する情報の好都合な拡散を保証するので、これらの表は下記を要約するために提供されている。表は下記の構成となっている。
- ハードウェアでサポートしているプロセッサ: (カンマで区切られたプロセッサの一覧)
- エミュレーション: (なし)または(アーキテクチャ依存)または(カンマで区切られたプロセッサの一覧)
- その他のサポート: (なし)または(カンマで区切られたプロセッサの一覧)
- 標準で搭載されているか: (はい)または(いいえ)または(この技術を搭載しているディストリビューションまたはバージョンのカンマで区切られた一覧)
- リリース日: (最初にリリースされた日)
アーキテクチャ依存エミュレーションを供給するOSはハードウェアでサポートしていない全てのプロセッサ上で機能する。「その他のサポート」行はまだ明白ではない手段、たとえば明確なNXビットを搭載していないハードウェアが何らかの方法で機能を実現しているプロセッサのためにある。
[編集] OpenBSD
[編集] W^X
OpenBSDオペレーティングシステムの技術として知られるW^XはAMD64ポートで、このようなシステムにW^Xを最大限活用させるためにNX技術を利用している。W^Xは現在のOpenBSDではNXビットをサポートしていないCPUのW^Xもサポートする。
W^XはAlpha, AMD64, HPPAおよびSparcプロセッサのNXビットをサポートする(しかしIntelのIntel 64は当初NX機能がなかったためこれをサポートしていないことは特筆に値する)。
OpenBSD 3.3は2003年5月1日にリリースされ、これが最初にW^Xを含んだものである。
- ハードウェアでサポートしているプロセッサ: Alpha, AMD64, HPPA, Sparc
- エミュレーション: IA-32(x86)
- その他のサポート: なし
- 標準で搭載されているか: はい
- リリース日: 2003年5月1日
[編集] NetBSD
NetBSD 2.0およびそれ以降の時点では(2004年12月9日)、NXビットをサポートするアーキテクチャは実行可能ではないスタックとヒープを持つ。
amd64, sparc64, sparc (sun4m, sun4d), powerpc (ibm4xx), alpha, sh5およびhppaよりなるこれらはページ毎の粒度をもつ。
powerpc(例:macppc), i386はリージョン粒度のみをサポートする。
NetBSDはデフォルトではNXビットの機能を提供するいかなるソフトウェアも使用していないため、他のアーキテクチャは実行可能でないスタックやヒープからの恩恵は受けない。
[編集] Linux
Linux自身は標準のハードウェアNXをサポートする。現在は64ビットCPUにおいてもNXをサポートする64ビットモードと同様にIngo MolnarのNX有効化パッチにより32ビットモードでもサポートしている。これには現在のAMDの64ビットCPUとIntel, TransmetaおよびVIAから発表のあった将来のCPUも含まれる。Linus Torvaldsは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
Red Hatのカーネル開発者Ingo MolnarはExec Shieldという32ビットx86CPUでLinuxがNX機能を活用できるようにするLinuxカーネルパッチを提供した。後にMolnarは32ビットカーネル上でハードウェアNXをサポートするLinux NXパッチを提供した。
Exec Shieldパッチは2003年5月2日にLinux Kernel Mailing Listに提供された。このパッチは、複雑なエミュレーションを実現するために基礎的なコードに重大な改変を加えるためkernelには取り込まれなかった。
- ハードウェアでサポートしているプロセッサ: NXをサポートするLinuxがサポートする全てのプロセッサ
- エミュレーション: NXの模倣は、IA-32(x86)および互換品のコードセグメント制限を使用する
- その他のサポート: なし
- 標準で搭載されているか: Red Hat Linux
- リリース日: 2003年5月2日
[編集] PaX
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 サービスパック2とWindows Server 2003 サービスパック1から、x86アーキテクチャでは初めてNX機能が実装された。将来のバージョンのWindowsオペレーティングシステムでもNXビットをサポートする。現在ではWindows 2000などの古いバージョンへのバックポートは計画されていない。
Windowsでは重要なWindowsのサービスのみにNXによる保護が使用される。Windows XPもしくはServer 2003では、この機能はデータ実行防止(DEP)と呼ばれ、「マイ コンピュータ」の「詳細設定」より設定できる。もしx86プロセッサがハードウェアでこの機能をサポートしている場合、NX機能はWindows XP/Server 2003ではデフォルトで有効となる。機能がサポートされていない場合には、保護は提供されない。
「ソフトウェアDEP」はNXビットに関係なく、Microsoftが「安全な例外ハンドラ」に付けた名称である。「ソフトウェアDEP」や「安全な例外ハンドラ」は、アプリケーションのファンクションテーブルに例外が登録されていることを確認し、プログラムがそのように設計されていることを要求するものである。これは、DEPがNXフォールトを扱う方法により悪用可能な弱点を対策するものである。他の対策法がそのままプログラムを終了するのに対し、DEPは例外を発生させる。プログラムの流れは復旧不可能に破壊されているため、プログラムが攻撃から回復できるものではない。
他のほとんどの保護手法とは異なり、DEPはASLR(アドレス空間レイアウト無作為化)を提供しない。これはreturn-to-libc攻撃を許し、攻撃中にDEPを無効化するのに使用される可能性がある。Windowsでこれが実行可能であることは未だ証明されていないが、PaXの文書はなぜASLRが必要かを詳述している。もし破損した画像やMP3などの用意されたデータのアドレスが、攻撃者によって知られている場合には攻撃を成功させる可能性がある。ASLRはWindows Vistaで提供される。
x86以外では、IntelのIA-64で動作するWindows向けNXのバージョンが存在する。
- ハードウェアでサポートしているプロセッサ: AMD64, IA-64, Efficeon, Intel 64, Pentium M (後期リビジョン), AMD Sempron (後期リビジョン)
- エミュレーション: なし
- その他のサポート: なし
- 標準で搭載されているか: Windows XP サービスパック2, Windows Server 2003 サービスパック1, Windows Vista
- リリース日: 2004年8月6日
[編集] 同等技術間の機能的比較
ここでは、NX技術の機能を比較対照する。
一般的に、NXビットのエミュレーションはx86 CPUでのみ可能である。別に述べない限りこのセクションでのエミュレーションへの言及はx86 CPUのみを対象としている。
あるNXビットエミュレーションの方法は大変低いオーバーヘッドを持っていることが証明されているが、そのような方法は不正確であるとも証明されている。一方、他のあるエミュレーション方法は大変高いオーバーヘッドを持っているかもしれないが、おそらく絶対に正確である。処理能力、正確性、仮想メモリ空間の代償なしにオーバーヘッドを減らす方法は現在では開発されていない。
[編集] オーバーヘッド
オーバーヘッドはそれぞれの技術が機能するために必要な追加のCPU処理能力の事である。これはこのような技術をエミュレートもしくはNXビットを提供する事は通常測定可能なほどのオーバーヘッドを生じるために重要である。全てのNX技術はあらゆる領域のメモリのためにNXビットの状態を制御するために追加のプログラミングロジックのためにオーバーヘッドを作り出す。しかし、ハードウェアNXビットが存在すれば演算は通常CPU自身で行われ、オーバーヘッドは生じない。
ハードウェアNXビットを提供するCPUでは、特に明記する場合を除いてはリストされている全てのNX技術においてオーバーヘッドを生じない。