ここ数か月の間に Chuck Silvers が実行禁止マッピングの サポートを改良してくれた。これによりスタックやヒープ が書き込み可能な時には、それを実行禁止にすることができる。 その結果、潜在的なバッファオーバーフロー攻撃がより困難になった。 各プラットフォームの実行禁止マッピングのサポート状況 について混乱があるように思えるので、現在の 状況について詳細な情報を記述したページを別にして付け加えて みた。以下がその内容である。
実行禁止のスタックとヒープ
NetBSD 2.0 はハードウェアが許可するプラットフォームにおいて、実行禁止マッピングの サポートを開始する。プロセスのスタックとヒープのマッピングはデフォルトで実行禁止となる。 これにより潜在的なバッファオーバーフロー攻撃がより困難になる。 NetBSD は 全てのプラットフォームにおいて、mmap() によって PROT_EXEC 許可をサポートする。 各プラットフォームでは、ハードウェアがデータアクセスと実行アクセスを区別する。この時、 ページ単位の実行許可制御機構は必ずしも必要としない。 ハードウェアがより大きい単位で実行許可を制御する場合、次のようなルールが適用される。 より大きな単位の中の任意のページが実行許可されているなら、その大きな領域全体が 実行許可される。そうでなければ、その領域全体は実行禁止である。
この機能のサポートを有効にするために、コンパイルオプション を指定する必要はない。 いつでも利用可能になっている。
サポートされるプラットフォーム
ハードウェアの制約に基づいたサポートレベルのリストを以下に示す。 ここで、「スタック」とは伝統的な UNIX のプロセススタックであり、 pthread のスタックではない。
- amd64, sparc64, sparc (sun4m, sun4d), powerpc (ibm4xx), alpha, sh5, hppa: 完全サポート、 各ページは独立して実行許可または禁止にできる。
- powerpc (eg. macppc): ハードウェアでの管理単位は、ページではなく、256MB のセグメントで ある。デフォルトでスタックを含むセグメントは実行許可されない。
- i386: ハードウェアのサポートはかなり制限されていて、管理単位は非常に粗い。 NetBSD で現在実現されているのは、アプリケーション用のアドレス空間として 2つの領域のみを準備し、それぞれ個別に実行許可されたものとそうでないものとにした。 つまり、スタックとスタック以外の全てのものである。 デフォルトでスタックは実行許可されず、他の全ては実行許可されている。
- その他全て; arm, m68k, mips, pc532, sh3, sparc(sun, sun4c), vax: 未サポート。 ハードウェアは実行アクセスとデータアクセスを区別しない。 プロセスがデータとして読み取り可能なものは、プロセスがコードとして実行可能である。
一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy