NXビット(No eXecute bit)とは
NXビットは、
ノイマン型アーキテクチャの
コンピュータにおいて、特定のメモリ領域に「実行不可」
属性を付与する機能です。この
属性を付与された領域にあるデータは、
CPUによってプログラムコードとして実行されることを防ぎます。これにより、悪意のあるコードの実行やデータの誤った取り扱いによるシステムクラッシュを防ぐことができます。
概要
NXビットの主な目的は、「データの誤実行」を防ぐことです。これは、メモリを「コード領域」と「データ領域」に分け、データ領域に特別な印(
属性)を付与することで実現されます。この印が付与された領域のデータは、
CPUによって実行を試みられるとエラー(例外)が発生します。
特に、バッファオーバーラン攻撃など、
ヒープや
スタック領域に置かれたデータを書き換えて任意のコードを実行させる攻撃からシステムを保護するために利用されます。この機能は、
オペレーティングシステム(OS)と
CPUが連携して動作することで効果を発揮します。
この技術自体は、以前から汎用機や
ワークステーションで利用されていましたが、パーソナル
コンピュータでは比較的新しい技術です。特に、AMDが最初に
実装したNXビットが広く知られるようになったため、一般的にこの名称が使われるようになりました。
ノイマン型アーキテクチャにおける課題
ノイマン型アーキテクチャでは、プログラムもデータも同じメモリ上に格納されます。そのため、メモリ上のデータがプログラムなのかデータなのかを区別することは本質的に困難です。この性質を利用したバッファオーバーラン攻撃は、メモリ上のデータを書き換えて悪意のあるコードを実行させるため、大きなセキュリティリスクとなっていました。
名称について
インテルでは、この機能を「XDビット(eXecute Disable)」と呼んでいます。しかし、XDビットとNXビットは、名称が異なるだけで機能は全く同じです。
ハードウェアの背景
x86プロセッサでは、以前から
セグメントレベルで同様の機能がありましたが、これは現代のソフトウェアには不十分でした。そのため、ページ単位で実行を制御する新しい機構が必要とされました。
このページレベルの機構は、
SPARC、Alpha、
PowerPCなどの他のアーキテクチャではすでに導入されていましたが、x86プロセッサでは比較的遅れて導入されました。
インテルは、
IA-64アーキテクチャの
Itaniumプロセッサで同様の機能を
実装しましたが、一般的なx86プロセッサには搭載しませんでした。
AMDがAMD64シリーズでこの機能を
実装し、「NXビット」と名付けたことで、x86プラットフォームでも広く利用されるようになりました。その後、
インテルもPrescottコアの
Pentium 4プロセッサから同様の機能を搭載しました。
NXビットは、x86プロセッサのページテーブルエントリ内の特定のビット(63番目のビット)を参照します。このビットが0に設定されている場合、そのページからコードが実行可能となり、1に設定されている場合は実行不可となり、データとして扱われます。この機能を利用するためには、
物理アドレス拡張ページテーブルフォーマットに準拠している必要があります。
ソフトウェアエミュレーション
ハードウェアでNXビットが利用可能になる前は、いくつかの
オペレーティングシステムが、ソフトウェアでこの機能をエミュレートしようとしていました。これらのソフトウェアエミュレーション技術には、W^XやExec Shieldなどがあります。
NXビットの機能を利用できるOSでは、
スタックや
ヒープメモリ領域が実行可能になることや、実行可能メモリが書き込み可能になることを防ぐことができます。これにより、
スタックオーバーフロー攻撃など、悪意のあるプログラムが挿入されて実行されることを防ぐことができます。
多くの
オペレーティングシステムがNXビットの機能を
実装またはエミュレートしています。
OpenBSDはW^X(Write XOR Execute)という技術を導入しており、NXビットを最大限に活用しています。W^Xは、NXビットをサポートしていない
CPUでも利用できます。
NetBSDは、NXビットをサポートするアーキテクチャでは、
スタックと
ヒープを実行不可にします。
Linuxは、標準でハードウェアNXをサポートしています。また、Ingo Molnar氏によるNX有効化パッチにより、32ビットモードでもNXビットを利用できるようになりました。
Exec Shield
レッドハットの
カーネル開発者であるIngo Molnar氏は、Exec Shieldという32ビットx86
CPUで
LinuxがNX機能を活用できるパッチを提供しました。
PaX
PaXは、NXビットをエミュレートしたり、ハードウェアのNXビットを利用したりできる技術です。NXビットを搭載していないx86
CPUでも利用できます。
Solaris 10は、NXビットをサポートするプロセッサで起動すると、自動的に保護が有効になります。
Windows
Windows XP Service Pack 2以降では、x86アーキテクチャでNX機能が
実装されました。Windowsでは、この機能は「データ実行防止(DEP)」と呼ばれており、重要なサービスのみに適用されます。ソフトウェアDEPは、NXビットとは関係なく、例外ハンドラのセキュリティを強化するものです。
同等技術間の比較
一般的に、NXビットのエミュレーションはx86
CPUでのみ可能です。NXビットのエミュレーションにはオーバーヘッド(追加の
CPU処理能力)が発生しますが、ハードウェアNXビットが利用できる場合はオーバーヘッドは発生しません。
オーバーヘッド
NXビットの機能をソフトウェアでエミュレートする場合、
CPUに追加の処理負荷がかかります。ハードウェアNXビットが利用できる
CPUでは、このオーバーヘッドは発生しません。
まとめ
NXビットは、
コンピュータのセキュリティを向上させるための重要な技術です。メモリの実行制御を細かく行うことで、バッファオーバーラン攻撃などの脆弱性を利用した攻撃からシステムを保護します。ハードウェアとソフトウェアの両面からの
実装が進むことで、より安全なコンピューティング環境が実現されています。