NXビット

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


OpenBSDはW^X(Write XOR Execute)という技術を導入しており、NXビットを最大限に活用しています。W^Xは、NXビットをサポートしていないCPUでも利用できます。

NetBSD


NetBSDは、NXビットをサポートするアーキテクチャでは、スタックヒープを実行不可にします。

Linux


Linuxは、標準でハードウェアNXをサポートしています。また、Ingo Molnar氏によるNX有効化パッチにより、32ビットモードでもNXビットを利用できるようになりました。

Exec Shield

レッドハットカーネル開発者であるIngo Molnar氏は、Exec Shieldという32ビットx86CPULinuxがNX機能を活用できるパッチを提供しました。

PaX


PaXは、NXビットをエミュレートしたり、ハードウェアのNXビットを利用したりできる技術です。NXビットを搭載していないx86 CPUでも利用できます。

Solaris


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ビットは、コンピュータのセキュリティを向上させるための重要な技術です。メモリの実行制御を細かく行うことで、バッファオーバーラン攻撃などの脆弱性を利用した攻撃からシステムを保護します。ハードウェアとソフトウェアの両面からの実装が進むことで、より安全なコンピューティング環境が実現されています。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。