アドレス空間配置のランダム化
Appleは、Mac OS X v10.5(2007年10月リリース)で、一部のライブラリオフセットのランダム化を導入した。この実装は、ASLRが防ぐことを目的とした攻撃に対する完全な保護を提供しない。
Mac OS X Lion 10.7(2011年7月リリース)では、AppleはASLR実装をすべてのアプリケーションに拡大した。32ビットアプリケーションでも利用できるようになり(ヒープメモリ保護も同様)、64ビットと32ビットアプリケーションの攻撃に対する耐性が向上した。
OS X Mountain Lion 10.8(2012年7月リリース)以降では、システム起動時にカーネルだけでなく、kextやzoneを含むシステム全体がランダムに再配置される。
アドレス空間配置のランダム化はランダムに置かれた領域を攻撃者が探し出すことを困難にすることを狙ったものである。探索空間が増大すれば、その分セキュリティも向上する。したがって、アドレス空間のランダム化は無作為なオフセット内に存在するエントロピーが大きくなるほど効果的である。エントロピーを大きくするにはランダム化が行われる仮想記憶領域空間の量を増やすか、ランダム化を行う時間間隔を短縮する。時間間隔は通常は可能な限り小さくなるよう実装されるので、ほとんどのシステムは仮想記憶領域の量を増やさねばならない。
攻撃者はランダム化に対抗するために、攻撃を加えようとする全ての領域の位置の推測に成功しなければならない。攻撃用のコードや役に立つデータを乗せるためのスタックやヒープのようなデータ領域については、コードならばNOPスライドの使用、データならばコピーの繰り返しによって、攻撃可能な状態を増やすことができる。領域がランダム化された結果それらの状態のどれか1つになれば攻撃は成功する。一方、基本ライブラリやメイン実行ファイルのようなコード領域はその位置を正確に知る必要がある。しばしばこれらの領域は混合される。たとえばスタックフレームはスタック上に注入され、ライブラリはそこを戻り先にされる。
まず、以下の変数を宣言する:
E s = entropy bits of stack top {\displaystyle E_{s}={\mbox{entropy bits of stack top}}\,}
β = number of libraries used by the attacker {\displaystyle \beta \,={\mbox{number of libraries used by the attacker}}}
E m = log 2  ( l ) : β = 1 , l ≥ 1 {\displaystyle E_{m}=\log _{2}\left(l\right):\beta \,=1,l\geq \,1}
E m = ∑ i = l l − ( β − 1 ) log 2  ( i ) : β ≥ 1 , l ≥ 1 {\displaystyle E_{m}=\sum _{i=l}^{l-\left(\beta \,-1\right)}\log _{2}\left(i\right):\beta \,\geq \,1,l\geq \,1}
これらの値は l {\displaystyle l} が大きな値でも、低くなる傾向にある。もっとも重要な点は、攻撃者は通常C標準ライブラリしか使えず、そのためしばしば β = 1 {\displaystyle \beta \,=1} と仮定できるということである。しかし、興味深いことにライブラリの数が少なくともここで数ビットのエントロピーが得られる。このようにライブラリロード順序のランダム化を仮想メモリ領域アドレスのランダム化と組み合わせることにより、数ビットの追加エントロピーを得られる可能性がある。これらの追加ビットはライブラリのみに適用され、他のmmap()セグメントなどには適用されないことに注意。