面向开发者的 Oracle® Solaris 11 安全性指南

退出打印视图

更新时间: 2014 年 7 月
 
 

地址空间布局随机化 (Address Space Layout Randomization, ASLR)

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 可设置为 enabledisable。如果未指定 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:

  • 临时在系统范围内禁用 ASLR

    % sxadm exec -s aslr=disable /bin/bash
  • 使用 ldelfedit 命令将相关二进制文件标记为禁用 ASLR

  • 建立禁用 ASLR 的 shell,从中执行调试操作

    % sxadm exec -s aslr=disable /bin/bash 

    注 - 此 ASLR 修改不会应用到 SUID 或特权二进制文件。

有关更多信息,请参见 sxadm(1M) 手册页和Chapter 2, Configuring Oracle Solaris Security, in Oracle Solaris 11 Security Guidelines