BSD-annex (20056) の日記

○ ◎ ●

NetBSD: 実行禁止マッピング機能の更新

BSD-annex による 2004年05月24日 14時39分 の日記 (#221395)
●情報源
  NetBSD Recent News
  Non-executable stack and heap

ここ数か月の間に 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

処理中...