アドレス空間配置のランダム化

利点

アドレス空間のランダム化は、攻撃者が標的のアドレスを予測することをより困難にすることによって、ある種のセキュリティ攻撃を妨害する。たとえば、return-to-libc攻撃で実行を試みる攻撃者は実行されるコードの位置を特定しなければならず、スタック上に注入されたシェルコードの実行を試みる他の攻撃者はまずスタックを見つけなければならない。どちらの場合も、関連するメモリアドレスは攻撃者から隠されている。攻撃者はこれらの値を推測しなくてはならず推測が失敗すると通常アプリケーションはクラッシュするため、回復は不可能である。

エントロピーの削減

攻撃者は単純な情報漏洩から、攻撃1回あたりの複数ビットエントロピー攻撃（heap sprayingによる攻撃など）まで、いくつかの方法を使ってランダム化されたアドレス空間に現れるエントロピーを削減できる。これに対してできることはほとんどない。
書式文字列攻撃を使用したメモリレイアウトに関する情報の漏洩がありうる。printf()のような書式文字列関数は可変長引数リストを使用して作業を行う。書式指定子は引数リストがどのように見えるかを記述する。引数が渡される通常の方法のために、各種書式指定子はスタックフレームの先頭近くに移動する。最終的に、戻り先のポインタとスタックフレームポインタの抽出が可能であり、脆弱なライブラリのアドレスと既知のスタックフレームのアドレスが現れる。これにより攻撃者に対する障害としてのライブラリとスタックのランダム化を完全に取り除ける。
スタックやヒープのエントロピーを減らすこともできる。スタックは通常16バイトの倍数境界に配置されなければならないので、ランダム化の間隔もそれより小さくにできない。さらにヒープはページ（通常4096バイト）境界に配置されなければならない。攻撃を試みるとき、重複した攻撃をこれらの境界に合わせることが可能である。NOPスライドをシェルコードの注入に使うことができ、system()への戻りを試みるときは文字列 '/bin/sh' を任意個数のスラッシュの '////////bin/sh' に置き換えることができる。削減されるビット数は間隔の攻撃に対して、ちょうどである。
このような減少はスタックやヒープのデータ量のために制限される。たとえば、スタックは通常8MBに制限され、それよりも伸長はずっと少ない。これにより削減が可能なのは最大19ビットであるが、より保守的な見積もりでは4-16KBのスタックの詰め物に対しておよそ 8-10ビットである。一方ヒープはメモリアロケータの振る舞いに制限される。glibcの場合、128KBを超える割り当てはmmap()を使って作られ、攻撃者のビット削減を5ビットに制限する。これはブルートフォースに対する制限要因でもある。行われる攻撃の回数を削減することはできるが、攻撃のサイズが十分大きくなると一部の環境での振る舞いは侵入検知システムと似たものになりうる。

歴史

PaXプロジェクトが最初に「ASLR」という造語を発明した。PaXはASLRの最初の設計と実装を 2001年7月に発行した。これは現在でも最も完全な実装であり、2002年10月からはカーネルスタックのランダム化も提供している。PaXは他の実装と比べて、各ランダム化されたレイアウトごとに最大のエントロピーを与える実装であり続けている。

実装

いくつかの主流の、汎用目的のオペレーティングシステムがASLRを実装している。

OpenBSD

OpenBSDはASLRをサポートした（そしてデフォルトで有効にした）、最初の主流のオペレーティングシステムの1つとなった。

Linux

Linuxは弱い形のASLRを、カーネルバージョン2.6.12からデフォルトで有効にした。PaXとExec ShieldのLinuxカーネルに対するパッチ集はより完全な実装を提供する。Adamantix、Alpine Linux、Hardened Gentoo、およびHardened Linux From Scratchを含む各種のLinuxディストリビューションはPaXのASLR実装をデフォルトで備えている。
Linux用のExec Shieldパッチは16バイトの間隔上で19ビットのスタックエントロピーを供給する。そして4096バイトの1ページ間隔上で8ビットのmmap()エントロピーを供給する。これは524288通りの位置がありうる8MBの広さの領域にスタック基底を置く。そして256通りの位置がありうる1MBの広さの領域にmmap()基底を置く。
位置独立実行ファイル (PIE) の機能はメイン実行ファイルバイナリのランダムな基底アドレスを2003年から実装する。これはメイン実行ファイルに対して、共有ライブラリで使われるものと同じアドレスのランダム性を提供する。PIEの機能はネットワークに直接向き合うデーモンにのみ使われている - PIE機能は同じ実行ファイルでprelinkの機能と同時に使うことができない。
prelinkツールは実行時ではなくprelink時にランダム化を実装する。なぜならば仕様によりprelink は、動的リンカが行わなければならなくなる前にライブラリの再配置を行うことで、プログラムを何度も走らせても再配置が1回しか行われないようにすることが目的だからである。結果として、真のアドレス空間ランダム化はprelinkの目的を打ち消してしまう。

Microsoft Windows

マイクロソフトのWindows Vista、Windows Server 2008、Windows 7、およびWindows Server 2008 R2は、ASLRが有効となるよう特別にリンクされた実行ファイルとダイナミックリンクライブラリについてのみではあるが、デフォルトでASLRを有効にしている。これにはService Pack 1より前のWindows Vista上のInternet Explorer 7が含まれていなかった。ASLRとDEPは両方がアプリケーション互換性の目的で無効にされていた。Internet Explorer 8を含む、より新しいバージョンはこれらの保護を有効にした。すべての実行ファイルとライブラリで強制的にASLRを有効または無効にするレジストリ設定が存在する。レジストリキー "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages" である。
ヒープ、スタック、プロセス環境ブロック、およびスレッド情報ブロックの位置もランダム化される。シマンテックのセキュリティホワイトペーパーは、32ビットのWindows VistaにおけるASLRは期待されるほど堅牢ではない可能性があると注意しており、マイクロソフトはその実装の弱点を認めている。
WehnTrustやOzoneのようなホストベースの侵入検知システムも、ASLRをWindows XPとWindows Server 2003オペレーティングシステムに提供している。しかし、これらの実装の完全な詳細は公開されていない。

Solaris

Solaris 11.1 よりサポートされた。

macOS

アップルは、Mac OS X v10.5で一部のライブラリオフセットのランダム化を導入した。この実装は、ASLRが防ぐことを目的とした攻撃に対する完全な保護を提供しない。

iOS (iPhone, iPod touch, iPad)

アップルは、iOS 4.3においてASLRを削除した。

Android

Android 4.0 Ice Cream Sandwichはシステムとサードパーティーのアプリケーションをメモリ管理の問題に起因する脆弱性攻撃から保護するためのASLRを提供する。また、4.1においては位置独立実行ファイル (PIE) への対応が追加された。