地址空间布局随机化(ASLR)是操作系统的内存保护过程,防止缓冲区溢出攻击后卫。这有助于确保对系统运行的进程相关联的内存地址是不可预测的,因此与这些进程相关联的将是更加难以利用的缺陷或漏洞。
ASLR今天使用在Linux,Windows和MacOS系统。它于2005年在Linux上首次实施在2007年,该技术被部署在Microsoft Windows和MacOS。而ASLR提供每个这些操作系统的相同的功能,它被不同地实现上各一个。
ASLR的有效性取决于地址空间的整体布局上剩余未知的攻击者。另外,只有被编译为位置无关可执行文件的可执行文件(PIE)的方案将能够从权利要求ASLR技术,最大程度的保护,因为代码的所有部分将在随机位置被加载。PIE机器代码将正常执行而不管其绝对地址。
ASLR限制
尽管ASLR制作开发的系统漏洞更加困难的,其在保护系统的作用是有限的。要明白,ASLR是非常重要的:
- 不解决漏洞,反而使得利用它们更是一个挑战
- 不跟踪或报告漏洞
- 不提供不与ASLR支持内置的二进制任何保护
- 也不能幸免于规避
如何ASLR作品
ASLR通过使得更加难以对攻击者通过随机它在存储器中的布局使用的偏移量来执行一个成功的缓冲区溢出攻击增加了系统的控制流完整性。
ASLR工作好得多在64位系统,这些系统提供了更大的熵(随机潜力)。
ASLR是工作在Linux系统上?
无论是下图所示的两个命令会告诉你ASLR是否在您的系统上启用。
$执行cat / proc / sys目录/内核/ randomize_va_space2$的sysctl -a --pattern随机化kernel.randomize_va_space =2
在上述命令中所示的值(2)表示ASLR在充分随机化模式下工作。示出将在下列之一的值:
0 =禁止1 =保守随机化2 =完全随机化
如果禁用ASLR和运行下面的命令,你应该注意到的是,在显示的地址LDD下面输出都在连续的相同LDD命令。该LDD命令的工作通过加载共享对象和表示在那里它们在存储器中结束。
$须藤的sysctl -w kernel.randomize_va_space = 0 <==禁用用于SHS [须藤]密码:kernel.randomize_va_space = 0 $ LDD /斌/庆典Linux的vdso.so.1(0x00007ffff7fd1000)<==同一地址libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6(0x00007ffff7c69000)libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2(0x00007ffff7c63000)libc.so.6的=> /lib/x86_64-linux-gnu/libc.so.6(0x00007ffff7a79000)/lib64/ld-linux-x86-64.so.2(0x00007ffff7fd3000)$ LDD /斌/庆典Linux的vdso.so.1(0x00007ffff7fd1000)<==同一地址libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6(0x00007ffff7c69000)libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2(0x00007ffff7c63000)libc.so.6的=> /lib/x86_64-linux-gnu/libc.so.6(0x00007ffff7a79000)/lib64/ld-linux-x86-64.so.2(0x00007ffff7fd3000)
如果该值被设置回2启用ASLR,你会看到地址将每次运行命令时间而改变。
$须藤的sysctl -w kernel.randomize_va_space = 2 <==启用SHS [须藤]密码:kernel.randomize_va_space = 2 $ LDD /斌/庆典Linux的vdso.so.1(0x00007fff47d0e000)<==第一组地址libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6(0x00007f1cb7ce0000)libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2(0x00007f1cb7cda000)libc.so.6的=> /lib/x86_64-linux-gnu/libc.so.6(0x00007f1cb7af0000)/lib64/ld-linux-x86-64.so.2(0x00007f1cb8045000)$ LDD /斌/庆典Linux的vdso.so.1(0x00007ffe1cbd7000)<==第二组地址libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6(0x00007fed59742000)libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2(0x00007fed5973c000)libc.so.6的=> /lib/x86_64-linux-gnu/libc.so.6(0x00007fed59552000)/lib64/ld-linux-x86-64.so.2(0x00007fed59aa7000)
试图绕过ASLR
尽管它的优势,企图绕过ASLR并不少见,似乎可分为几类:
- 使用地址泄露
- 获得访问相对于特定的地址数据
- 利用执行弱点允许攻击者猜测地址时,熵是低或当ASLR实施故障
- 使用硬件操作的侧通道
包起来
ASLR是很有价值的,特别是在64位系统上运行,并正确实施。虽然从规避企图不能幸免,它的系统漏洞相当大的难度的化妆剥削。这里是一个可以提供很多更详细的参考在全ASLR对效力64位Linux,这里是一个规避努力纸绕过ASLR使用分支预测。