
上QQ阅读APP看书,第一时间看更新
2.6.9 不可执行栈
不可执行栈是一种针对缓冲区溢出的运行时解决方案,设计它的目的在于防止在栈段(stack segment)内运行可执行代码。很多操作系统都可以被配置为使用不可执行栈。
不可执行栈常常被描绘成防范缓冲区溢出漏洞的“万能药”,然而,不可执行栈只能防止在栈内存中的恶意代码执行。它们并不能阻止堆或数据段的缓冲区溢出。它们阻止不了攻击者利用缓冲区溢出来修改返回地址、变量、对象指针或函数指针。它们对在堆或数据段内的弧注入或可执行代码注入也无能为力。禁止攻击者在栈中执行代码能够阻止对某些漏洞的利用,但对攻击者而言这种方式往往形同虚设。
不可执行栈在不同的实现机制下对性能有着不同的影响。它还有可能使得一些依赖于在栈段内执行代码的程序(包括Linux signal delivery和GCC trampolines等)无法工作。