アドレス空間配置のランダム化(Address Space Layout Randomization, ASLR)は、
コンピュータセキュリティにおける重要な技術です。この技術は、プログラムが実行される際、メモリ上の重要なデータ領域の位置をランダムに配置します。具体的には、
実行ファイル、
ライブラリ、ヒープ、
スタックなどが対象となり、これらのアドレスを予測困難にすることで、セキュリティ攻撃を阻止することを目的としています。
ASLRの利点と有効性
ASLRの最大の利点は、攻撃者が標的とするアドレスを特定しにくくすることです。例えば、
Return-to-libc攻撃では、攻撃者は実行されるコードのアドレスを知る必要があります。また、
スタックに注入された
シェルコードを実行しようとする攻撃者は、まず
スタックの位置を特定しなければなりません。ASLRはこれらの重要なアドレスを攻撃者から隠し、攻撃を困難にします。攻撃者がアドレスを推測に頼らざるを得ない状況を作り出し、推測が失敗した場合、通常はアプリケーションがクラッシュするため、攻撃は失敗に終わります。
ASLRの効果は、ランダムに配置される領域を探すために攻撃者が費やすべき労力に比例します。探索空間が大きければ大きいほど、セキュリティは向上します。そのため、ASLRの効果は、ランダム化に使用される仮想メモリ空間の大きさ(エントロピー)に大きく依存します。エントロピーを増やすためには、ランダム化する仮想メモリ領域の量を増やすか、ランダム化の時間間隔を短くする必要があります。時間間隔は通常、可能な限り小さく実装されるため、ほとんどのシステムは仮想メモリ領域の量を増やすことでエントロピーを向上させようとします。
攻撃者は、攻撃対象とする全てのアドレスを推測しなければ攻撃を成功させることはできません。
スタックやヒープのようなデータ領域は、攻撃用のコードや有用なデータを配置するために利用されます。これらの領域では、NOPスライドの使用やデータの繰り返しコピーによって、攻撃の可能性を高めることができます。しかし、基本的な
ライブラリやメインの
実行ファイルのようなコード領域では、正確なアドレスを把握する必要があります。
ASLRにおけるエントロピーの計算
ASLRの有効性を評価するためには、攻撃者がアドレスを推測する際の難易度、すなわちエントロピーを計算する必要があります。ここでは、いくつかの変数を定義します。
Eₛ:
スタックトップのエントロピービット数
Eₘ: mmap()ベースのアドレスのエントロピービット数
Eₓ: メイン
実行ファイルベースのアドレスのエントロピービット数
Eₕ: ヒープベースのアドレスのエントロピービット数
Aₛ:
スタックエントロピーに対する1回の攻撃試行で攻撃されるビット数
Aₘ: mmap()ベースのエントロピーに対する1回の攻撃試行で攻撃されるビット数
Aₓ: メイン
実行ファイルのエントロピーに対する1回の攻撃試行で攻撃されるビット数
Aₕ: ヒープベースのエントロピーに対する1回の攻撃試行で攻撃されるビット数
α: 試行回数
N: 攻撃に必要なエントロピーの合計
これらの変数を用いて、攻撃者が成功する確率を計算できます。試行回数αは、シグネチャベースの侵入防止システムなどの要因によって中断されないと仮定します。
攻撃が成功する確率を計算する式は、以下のようになります。
g(α): 各試行後に
アドレス空間が再ランダム化される場合の、独立した推測攻撃での成功確率
g(α) = 1 - (1 - 2⁻ᴺ)ᵅ, 0 ≤ α
b(α): 同じ
アドレス空間を持つプログラムのコピーに対する、体系的なブルートフォース攻撃での成功確率
b(α) = α / 2ᴺ, 0 ≤ α ≤ 2ᴺ
多くのシステムでは、2ᴺは数千から数百万の範囲になります。
64ビットシステムでは、これらの数値は少なくとも数百万に達します。ただし、アドレスのランダム化に16ビットを使用する32ビットシステムでは、ブルートフォース攻撃によって数分で破られる可能性もあります。ASLRの適切な実装は、攻撃者が一定時間内に設定された回数以上クラッシュした
実行ファイルの実行を妨げるなど、ブルートフォース攻撃を困難にする手法を提供します。
ライブラリロード順序のランダム化
一部のシステムでは、
ライブラリがロードされる順序をランダム化する、
ライブラリロード順序のランダム化も実装されています。これはASLRの一形態です。この技術は、攻撃者が通常必要とする1つの
ライブラリに対してある程度のエントロピーを提供します。複数の
ライブラリを使用する場合は、計算が複雑になります。
l: ロードされた
ライブラリの数
β: 攻撃者が使用する
ライブラリの数
1つの
ライブラリのみを使用する場合、エントロピーEmはlog₂(l)で表されます。複数
ライブラリの場合は、Σᵢ₌ₗˡ⁻⁽ᵝ⁻¹⁾log₂(i)となります。攻撃者は通常C標準
ライブラリのみを使用するため、β=1と仮定できる場合が多いです。
ライブラリロード順序のランダム化は、仮想メモリ領域アドレスのランダム化と組み合わせることで、追加のエントロピーを提供し、セキュリティを強化できます。
エントロピーの削減
攻撃者は、情報漏洩やheap sprayingのような攻撃によって、ASLRが提供するエントロピーを削減することができます。例えば、
書式文字列攻撃によって、メモリレイアウトに関する情報を取得し、
ライブラリや
スタックのランダム化の効果を無効化することができます。
スタックやヒープのエントロピーを減らすことも可能です。
スタックやヒープの境界に攻撃を合わせることで、ランダム化の範囲を狭めることができます。ただし、このようなエントロピー削減は、
スタックやヒープのデータ量によって制限されます。
ASLRの歴史と実装
ASLRという用語は、
PaXプロジェクトによって最初に提唱されました。
PaXは2001年7月にASLRの最初の設計と実装を発表し、2002年10月からはカーネル
スタックのランダム化も提供しています。
PaXのASLRは、現在でも最も完全な実装の1つです。
主要なオペレーティングシステムでは、以下の通りASLRが実装されています。
OpenBSD: 最初にASLRをサポートし、デフォルトで有効にしたオペレーティングシステムの1つです。
Linux: カーネルバージョン2.6.12からASLRがデフォルトで有効になっています。
PaXとExec Shieldのパッチはより完全な実装を提供します。
Microsoft Windows: Windows Vista以降、ASLRがデフォルトで有効になっています。レジストリ設定によって、全ての
実行ファイルと
ライブラリでASLRを強制的に有効または無効にできます。
Solaris:
Solaris 11.1以降でサポートされています。
macOS:
Mac OS X v10.5で一部の
ライブラリオフセットのランダム化が導入され、OS X Lion 10.7以降ですべてのアプリケーションに拡大されました。
iOS: iOS 4.3以降でASLRが導入されています。
*
Android: Android 4.0以降でASLRが提供され、4.1以降で位置独立
[実行ファイル]がサポートされています。
これらの実装は、攻撃者によるメモリアドレスの予測を困難にし、システムのセキュリティを向上させる上で重要な役割を果たしています。
結論
アドレス空間配置のランダム化(ASLR)は、現代のコンピュータシステムにおいて不可欠なセキュリティ対策です。アドレスのランダム化によって、攻撃者が悪意のあるコードを注入したり、システムを制御したりすることを困難にします。ASLRは、多くのオペレーティングシステムで標準実装されており、エントロピーを最大限に活用することで、セキュリティ効果をさらに高めることができます。セキュリティの脅威は常に進化していますが、ASLRは、これらの脅威に対する重要な防波堤として機能し続けるでしょう。