ASLR【Address Space Layout Randomization】アドレス空間配置のランダム化
概要

メモリ上には実行コード本体や共有ライブラリ、スタック領域、ヒープ領域などが配置される。従来はこれらの位置関係が常に一定であることが多かったため、攻撃者はメモリアドレスを事前に推測しやすく、不正なコードを送り込んで実行させる攻撃が成立しやすかった。
代表的な手口が「バッファオーバーフロー」である。プログラムが用意した入力用のバッファ領域に想定を超える長さの文字列などを送り込み、隣接する領域にある戻りアドレスや関数ポインタを書き換えて、攻撃者の用意したコードを実行させる手法である。既存のコード断片を連鎖させて利用する「return-to-libc」や「ROP」(Return Oriented Programming)といった攻撃も知られている。
ASLRが導入された環境では、実行ファイルや共有ライブラリ、スタック、ヒープ、mmap領域などの開始アドレスが乱数に基づいて決定され、実行の度にメモリ上のレイアウトが変化する。攻撃者は狙うべきアドレスを事前に特定できず、攻撃が失敗した場合はプログラムが不正なアドレスへのアクセスによって異常終了するため、被害はコードの実行ではなく単なる停止に留まる。
ASLRの効果はメモリアドレスの取り得る範囲の広さに依存する。32ビット環境では候補となるアドレスの空間が狭く、総当たりや情報漏洩との併用によって突破されるリスクがあるが、64ビット環境では候補が大幅に増加し、現実的な推測は事実上困難になる。また、ASLRを十分に機能させるには、プログラム自体が特定のアドレスに依存しない位置独立実行(PIE:Position Independent Executable)の形式でコンパイルされている必要があり、満たされない場合は一部の領域のみがランダム化される。
近年では、カーネル領域を対象とする「KASLR」(Kernel ASLR)や、共有ライブラリ単位でランダム化の粒度を細かくする方式も導入されている。ただし、何らかの手段でメモリアドレスの情報が取得可能だと効果が低下するため、データ実行防止(DEP:Data Execution Prevention)など他の保護技術と組み合わせて運用されることも多い。2007年前後から主要なOSへの実装が進み、現在では多くの製品でデフォルトで有効に設定されている。