web-dev-qa-db-ja.com

最新のOSが静的アドレスを割り当てるのはなぜですか、なぜASLRがまだ必要なのですか?

物事にランダムなアドレスを割り当てるASLRについて質問があります。私の理解(これは間違っているかもしれません)に基づいて、最新のOSはかなり複雑なメモリ管理メカニズムを備えており、同じプログラムに同じアドレスを毎回割り当てるのは本当に難しいようです。つまり、直感的には、ランダム化されたアドレスがデフォルトの動作であり、静的アドレスを割り当てるには多少の労力が必要だと思います。

この理解は完全に間違っていますか?または、OSは各プロセスに個別のアドレススペースを割り当てて、各アドレススペースでプロセスが常にデフォルトで快適な静的アドレスを取得できるようにしますか?

1
ios learner

最近のほとんどのシステムには メモリ管理ユニット 、またはMMUがあります。 MMUは、物理アドレスを仮想アドレスに変換します。これは、各プロセスに独自のプライベート 仮想メモリ を与えるために使用されます。1つのプロセスのアドレスXは同じではありませんこれは、パフォーマンス、セキュリティを向上させ、クラッシュのリスクを軽減しますが、ASLRを実装するために使用できるという利点もあります。物理メモリ内の非ランダムアドレスにデータを配置することもできますが、システムはプロセスの仮想メモリ内の必要な場所にデータを自由に配置できます。

プロセスが最初に作成されたとき、プロセスがアクセスできる唯一の実メモリはスタックです。これは制限されており、一般的な目的で使用することを意図していません。重要なメモリが必要な場合は常に、プロセスで heap を使用する必要があります。これを行う唯一の方法は、システムコールを介してカーネルにメモリを要求することです。 このシステムコール には、必要なメモリの量、メモリのタイプなどを指定するいくつかの引数が与えられます。この呼び出しは、指定されたサイズの新しく割り当てられたメモリのベースアドレスを返します。 ASLRが行うことの1つは、このベースアドレスを予測不能にすることです。 ASLRを無効にすると、割り当てられたメモリは予測可能な場所に配置されます。

ASLRは、割り当てられたメモリのベースをランダム化するだけではありません。バイナリが実行されると、動的リンカーがそれを必要なすべての共有ライブラリに接続します。特定のライブラリは物理メモリ内の1か所にのみ保存されますが、システムはそれを使用する各プロセスの仮想アドレスに変換できます。このアドレス変換は効率上の理由で行われますが、ASLRは仮想アドレスがランダムであることを保証することにより、さらに使用します。 Position-Independent Executable (PIE)として特別にコンパイルされた実行可能ファイルは、ライブラリのベースアドレスがランダム化されていても、ライブラリ関数を呼び出すことができます。

これはASLRのすべてではありません。特定のセキュリティ重視のオペレーティングシステム(OpenBSD、HardenedBSD、grsecurity/PaXパッチを適用したLinuxなど)では、さらに多くの機能を果たすASLRの形式を使用します。

2
forest