Linux平台的ASLR机制

79人浏览   2024-04-26 22:47:35

简介

ASLR,全称为 Address Space Layout Randomization,地址空间布局随机化。ASLR 技术在 2005 年的 kernel 2.6.12 中被引入到 Linux 系统,它将进程的某些内存空间地址进行随机化来增大入侵者预测目的地址的难度,从而降低进程被成功入侵的风险。当前 Linux、Windows 等主流操作系统都已经采用该项技术。

具体实现

分级

Linux 平台上 ASLR 分为 0,1,2 三级,用户可以通过一个内核参数 randomize_va_space 进行等级控制。它们对应的效果如下:

0:没有随机化。即关闭 ASLR。

1:保留的随机化。共享库、栈、mmap() 以及 VDSO 将被随机化。

2:完全的随机化。在 1 的基础上,通过 brk() 分配的内存空间也将被随机化。

看到这里列出的几项内存空间,很自然有两个地方十分值得注意,第一,代码段以及数据段(data段和bss段)是否被随机化了?第二,堆是否被随机化了?

ASLR 并不负责代码段和数据段的随机化

以下代码用于说明即使 ASLR 已经被开启了,主程序段也是不会被随机化的,除非被编译成 PIE。

#include <stdlib.h>
#include <stdio.h>

void* getEIP () {
    return __builtin_return_address(0)-0x5;
};

int main(int argc, char** argv){
    printf("EBP located at: %p\n",getEIP());
    return 0;
}1234567891011

上述代码编译成非 PIE,执行结果如下图所示:



非 PIE 的 .text 没有被随机化


可见每一次运行,库都被定位到随机的地址处,而代码段的地址却总是静止的。当可执行文件被编译成 PIE 后,从下图可以看到代码段的地址同样被随机化了,因此对于攻击者来说代码段的地址就变得不可猜测了。



在 PIE 文件中代码段也被随机化了


ASLR 的丑陋

到目前为止一切都还不错。非 PIE 可执行文件不会从 ASLR 保护中受益,所以该怎么办?Linux 的二进制文件肯定要编译成 PIE 来减缓大多数的漏洞利用,所以他们这样做了吗?根据一些研究,在 Linux 发行版中被用作 web 服务器最多的是 CentOS、Ubuntu Server 以及 Debian(尽管我猜 RedHat enterprise 同样会有一个不错的份额)。基于这个研究结果,我收集了一些有关 PIE 可执行文件在以上 Linux 发行版中的数量的数据。具体的系统环境为:

  • Ubuntu Server 12.10 x86_64 + apache2 + mysql + php5 +sshd
  • Debian 6 x86_64 + web server + mysql + php5 + sshd
  • CentOS 6.3 x86_64 + apache2 + mysql + php5 + sshd

所有系统均安装为标准选项。下列的结果是通过 checksec 来收集的,checksec 是一个非常棒的脚本,它可以用来检查一些主流的安全机制如 ASLR、NX、Canaries 以及 RELRO 等是否被启用。你可以从这里获取到 checksec。下面是数据:

发行版二进制文件数目启用PIE非PIEUbuntu 12.10646111 (17.18%)535Debian 659261 (10.30%)531CentOS 6.31340217 (16.19%)1123

结果令人十分惊讶,PIE 并没有广泛地被上述 Linux 系统所接受。然而,网络守护进程总是编译为 PIE,以此来缓解问题并减少攻击面。不管不开启 PIE 是不是因为性能的原因(PIE二进制文件需要额外的间接操作),但安全性方面的影响极大地补偿了这一点。快速但并不十分准确的数据显示在 Linux 系统上 82.82% 到 89.7% 的二进制文件并没有被 ASLR 有效地保护。

同样地,在这次练习中其它的一些保护比如说 stack canaries 以及 RELRO 同样被考虑进去了,而结果却并不规律且同样使人惊讶。然而,为了获取到这些安全机制的当前状态的一个更真实的视角,还有更多的工作需要完成。例如说,GCC 仅仅会在满足一定条件的函数中启用 satck canaries,换句话说,那些 GCC 认为可能会成为缓冲区溢出攻击的函数才是目标函数。结果就是,一些没有启用 stack canaries 的二进制文件并不是说它就是缺少了一些缓解攻击的机制,而很有可能是它本来就不需要。

相关推荐