ASLR は、スタック、ライブラリ、brk ベースのヒープといったプロセスのアドレス空間の主要部分の開始アドレスをランダム化する、Oracle Solaris システムの機能です。デフォルトでは、ASLR は ASLR を要求するように明示的にタグ付けされているバイナリに対して有効になります。次のコマンドは、ASLR のステータスに関する情報を提供します。
% sxadm info
EXTENSION STATUS CONFIGURATION aslr enable (tagged-files) enable (tagged-files)
新しく作成されるオブジェクトに ASLR 要求のタグを付けるには、ld(1) コマンドの –z オプションを使用します。使用法は次のとおりです。
ld -z aslr[=mode]
mode は enable または disable に設定できます。mode が指定されていない場合は、enable と見なされます。
次の例は、ASLR を有効にして実行可能ファイルを作成するための –z オプションの使用法を示しています。
% cat hello.c #include <stdio.h> int main(int argc, char **argv) { (void) printf("Hello World!\n"); return (0); } % cc hello.c -z aslr
ASLR タグ付けは、オブジェクトの動的セクションのエントリによって実現され、elfdump(1) で調べることができます。
% elfdump -d a.out | grep ASLR [28] SUNW_ASLR 0x2 ENABLE
elfedit(1) コマンドを使用して、既存のオブジェクトの ASLR 動的エントリを追加または変更することができます。
% cc hello.c % elfedit -e 'dyn:sunw_aslr enable' a.out % elfdump -d a.out | grep ASLR [29] SUNW_ASLR 0x2 ENABLE
% elfedit -e 'dyn:sunw_aslr disable' a.out % elfdump -d a.out | grep ASLR [29] SUNW_ASLR 0x1 DISABLE
あるプロセスに対する ASLR 要求は、そのプロセスの起動時に確立され、プロセスが起動したあとは変更できません。このため、ASLR タグ付けは、プロセスのプライマリ実行可能オブジェクトに対してのみ意味を持ちます。
pmap(1) ユーティリティーを使用して、プロセスのアドレスマッピングを調べることができます。ASLR が有効になっている実行可能ファイルのマッピングを調べる場合、スタック、ライブラリマッピング、および brk ベースのヒープに使用される具体的なアドレスは、呼び出しのたびに異なります。
システムのデフォルト ASLR のデフォルト動作を制御するには、sxadm(1) コマンドを使用します。ASLR を無効にするように明示的にタグ付けされたバイナリは、sxadm によって確立されたシステムのデフォルト動作よりも優先されます。
アドレス空間のランダム化はデバッグ時に問題になることがあります。一部のデバッグ状況では、プログラムを繰り返し呼び出す場合に同じアドレスマッピングを使用する必要があります。次のいずれかの方法で、ASLR を一時的に無効にすることができます。
システム全体で ASLR を一時的に無効にする
% sxadm exec -s aslr=disable /bin/bash
ld または elfedit コマンドを使用して、指定のバイナリで ASLR を無効にするようにタグ付けする
ASLR が無効になったシェルを確立し、そこでデバッグを実行する
% sxadm exec -s aslr=disable /bin/bash
詳細は、sxadm(1M) のマニュアルページおよび Chapter 2, Configuring Oracle Solaris Security, in Oracle Solaris 11 Security Guidelines を参照してください。