ASLR 是 Oracle Solaris 系统的一种功能,利用此功能可以随机生成进程地址空间(例如栈、库和基于 brk 的堆)的关键部分的起始地址。缺省情况下,为显式标记为需要 ASLR 的二进制文件启用 ASLR。以下命令提供有关 ASLR 状态的信息:
% sxadm info
EXTENSION STATUS CONFIGURATION aslr enable (tagged-files) enable (tagged-files)
ld(1) 命令的 –z 选项用于标记需要使用 ASLR 的新建目标文件。用法如下所示:
ld -z aslr[=mode]
其中 mode 可设置为 enable 或 disable。如果未指定 mode,则假定使用 enable。
以下示例说明了如何使用 –z 选项创建启用了 ASLR 的可执行文件:
% 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 的堆的具体地址在每次调用时均不同。
sxadm(1) 命令用于控制系统的 ASLR 缺省行为。显式标记为禁用 ASLR 的二进制文件优先于 sxadm 建立的系统缺省行为。
调试期间,地址空间随机化可能会出现问题。某些调试需要重复调用同一程序时使用相同的地址映射。您可以采用以下方式之一禁用 ASLR:
临时在系统范围内禁用 ASLR
% sxadm exec -s aslr=disable /bin/bash
使用 ld 或 elfedit 命令将相关二进制文件标记为禁用 ASLR
建立禁用 ASLR 的 shell,从中执行调试操作
% sxadm exec -s aslr=disable /bin/bash
有关更多信息,请参见 sxadm(1M) 手册页和Chapter 2, Configuring Oracle Solaris Security, in Oracle Solaris 11 Security Guidelines 。