C和C++安全编码(原书第2版)
上QQ阅读APP看书,第一时间看更新

2.6.11 PaX

在Linux中,不可执行栈的概念最先由PaX内核补丁提出。PaX特别把程序内存标记为不可写的,并把数据内存标记为不可执行的。PaX还提供了地址空间布局随机化(ASLR,在2.6.1节处讨论)。它终止任何试图将控制转移到不可执行的内存的程序。如果NX技术可用,PaX可以使用它,否则,PaX可以效仿它(代价是较慢的性能)。把那些将控制转移到不可执行的内存的尝试中断可以减少任何远程代码执行或信息泄露漏洞攻击,导致一个单纯的拒绝服务攻击,这使得PaX对于 DoS是保护信息或防止弧注入的一个可以接受的后果的系统的理想选择。无法容忍DoS的系统不应该使用PaX。PaX是现在的grsecurity项目的一部分,该项目为Linux内核提供了一些额外的安全增强。

StackGap。很多基于栈的缓冲区溢出的利用都依赖于内存中一个已知位置的缓冲区。如果攻击者能够覆盖位于溢出缓冲区内一个固定位置的函数返回地址,就能执行攻击者提供的代码。如果在栈中分配栈内存时加入随机大小的空隙,则可以使得攻击者更难定位栈上的返回地址并仅消耗一页实存(real memory)。这对栈的起始地址加入了随机偏移量,因此攻击者不会从程序的一次运行而知道下一次运行的栈上的任何项目的绝对地址。这种缓解措施,通过把与先前显示的、允许让JIT编译的相同的代码添加到Linux内核,可以相对容易地添加到一种操作系统。

虽然Stackgap使得攻击者对漏洞的利用变得更加困难,但它并不能阻止攻击者利用相对地址而非绝对地址发起攻击。

其他平台。ASLR自2007年以来,在自2007年以来Mac OS X(10.5)中是部分可用的,并自2011年(10.7)以来是全部功能都可用的。自4.3版本以来,它也一直在iOS中可用(用于iPhone和iPad)。