首页 理论教育 Linux内核安全模块ASLR与KASLR实现

Linux内核安全模块ASLR与KASLR实现

时间:2023-11-22 理论教育 版权反馈
【摘要】:ASLR是“Address Space Layout Randomization”的缩写,意思是地址空间布局随机化ASLR的目标是让用户态进程空间的地址出现某种随机化,从而提高针对地址发动攻击的难度内核地址空间的随机化,KASLR,也已实现。图23-1概念性地示意了一个进程的地址空间布局。mmap进程调用系统调用mmap将文件的内容映射到进程的mmap地址空间。这部分地址空间向地址大的方向生长。堆的终点由系统调用brk设定,ASLR可以控制堆的起点。所以应用通过malloc申请的空间有可能不在heap地址空间。

Linux内核安全模块ASLR与KASLR实现

ASLR是“Address Space Layout Randomization”的缩写,意思是地址空间布局随机化ASLR的目标是让用户态进程空间的地址出现某种随机化,从而提高针对地址发动攻击的难度内核地址空间的随机化,KASLR,也已实现。详情可以参考https://lwn.net/Articles/569635/。

图23-1概念性地示意了一个进程的地址空间布局。

978-7-111-54905-5-Part06-94.jpg

图23-1 进程虚拟地址布局

图中所示是进程的虚拟地址(Virtual Address),不是物理地址。图的上部是高地址空间,也就是地址数值大的部分,下部是低地址空间,也就是地址小的部分。最上部是内核地址,用户态无法访问。用户态可以访问的地址,从上向下依次为:

(1)stack

进程的栈空间。一般情况下是向地址小的方向生长,但在某些架构下,比如pa-risc和ia64,是向地址大的方向生长。ASLR可以控制栈的起点。

(2)mmap

进程调用系统调用mmap将文件的内容映射到进程的mmap地址空间。进程所使用的共享库一般是由系统加载程序(loader)通过mmap映射到进程地址空间的。这部分地址空间也是向地址小的方向生长,内核分配地址时先使用高地址,再使用低地址。ASLR可以控制mmap的起点。(www.xing528.com)

(3)heap

进程的堆。这部分地址空间向地址大的方向生长。堆的终点由系统调用brk设定,ASLR可以控制堆的起点。起点和终点之间是进程的堆,进程可以对这部分内存执行读写操作。一般情况下这部分内存由C库管理。应用在调用申请内存的库函数时(例如malloc),C库会在堆中分配一块内存。当然,应用也可以抛开C库直接管理自己的堆。

系统调用brk的名字来自break,意思是设置program break。改变program break的意义是改变了进程中程序部分(program)的终点。何为程序部分?把代码、数据、堆三者合一看作程序就好了。

应用一般不会调用brk,而会调用malloc,在C库的malloc实现中,C库在堆空间不足时会调用brk。但是在某些情况下,C库也可能会调用mmap申请一块匿名地址映射供进程使用。所以应用通过malloc申请的空间有可能不在heap地址空间。

(4)data

进程的数据段(data segment)。ASLR不会影响这部分的地址 [6]

(5)code

进程的代码段,ELF的标准术语是“text”。ASLR不会影响这部分的地址。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈