ASLR
ASLR とは何ですか?
ASLRASLR はコード、スタック、ヒープ、ライブラリのメモリ配置を乱数化し、攻撃者がエクスプロイトの標的アドレスを確実に予測できないようにする緩和策です。
ASLR は、プログラムが実行されるたびに、主要なプロセス領域(実行ファイル、共有ライブラリ、ヒープ、スタック、mmap 領域)の基底アドレスを乱数化する防御的な緩和策です。2001 年に PaX プロジェクトが先駆けて実装し、2005 年にメインラインの Linux カーネル(2.6.12)へ統合され、現在では Windows(Vista 以降)、macOS、iOS、Android に搭載されています。配置を予測不能にすることで、ASLR は攻撃者に対し、ROP や ret2libc といったコード再利用攻撃を仕掛ける前に、まずアドレスをリークすることを強います。
その強度はエントロピーに依存します。32 ビットシステムはわずか約 8〜16 ビットしか提供せず、その小ささゆえに Shacham の 2004 年の研究では fork された Apache のワーカーを数分で総当たり突破できました。一方、64 ビット Linux は 28 ビット以上の mmap エントロピーを提供します。カバレッジも同じくらい重要です。非 PIE のライブラリが 1 つでもあったり、スタック無制限で実行されたバイナリ(ADDR_NO_RANDOMIZE、CVE-2016-3672 により堅牢化)があれば、固定のアンカーが残ってしまいます。2014 年、Marco-Gisbert と Ripoll による offset2lib 攻撃は、GNU/Linux が PIE 実行ファイルをそのライブラリに隣接して配置していたことを示しました。そのため、リークしたアプリケーションのアドレス 1 つで、すべてのライブラリを一定のオフセットで脱ランダム化でき、完全な ASLR、NX、スタックカナリアを 1 秒未満で無効化しました。この修正は、実行ファイルの基底を mmap_base から分離しました。
ASLR は決して単独では機能しません。DEP/NX、スタックカナリア、制御フロー整合性(CFI)と組み合わせて用いること、そして信頼できる情報リークのプリミティブが 1 つでもあれば ASLR は完全に崩壊することを忘れないでください。
flowchart TD
E[exec / プログラムのロード] --> R{ASLR は有効か?}
R -->|No| F[固定された予測可能なアドレス]
R -->|Yes| RND[スタック、ヒープ、mmap、PIE、ライブラリの基底を乱数化]
RND --> ENT{十分なエントロピーと完全なカバレッジか?}
ENT -->|No| BF[総当たり / 非 PIE アンカー]
ENT -->|Yes| LEAK{攻撃者は情報リークを持つか?}
LEAK -->|Yes| BYP[実アドレスを再計算 例 offset2lib]
LEAK -->|No| BLOCK[ROP / ret2libc は信頼できない]
F --> EXP[エクスプロイト成功]
BF --> EXP
BYP --> EXP● 例
- 01
Linux は exec ごとにスタック、ヒープ、PIE バイナリの基底アドレスを乱数化する。
- 02
Windows の ASLR は起動ごとに kernel32.dll と ntdll.dll を再配置する。
● よくある質問
ASLR とは何ですか?
ASLR はコード、スタック、ヒープ、ライブラリのメモリ配置を乱数化し、攻撃者がエクスプロイトの標的アドレスを確実に予測できないようにする緩和策です。 サイバーセキュリティの アプリケーションセキュリティ カテゴリに属します。
ASLR とはどういう意味ですか?
ASLR はコード、スタック、ヒープ、ライブラリのメモリ配置を乱数化し、攻撃者がエクスプロイトの標的アドレスを確実に予測できないようにする緩和策です。
ASLR からどのように防御しますか?
ASLR に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
ASLR の別名は何ですか?
一般的な別名: アドレス空間配置のランダム化, PIE。