为什么linux的进程地址空间中的堆栈权限是执行的?

时间:2013-03-15 03:24:01

标签: linux kernel

linux内核将进程的statck权限设置为执行。我们知道,堆栈包含数据而不是指令,所以我想知道为什么kenel会这样做。 特别是,缓冲区溢出攻击通常将恶意代码存储到堆栈中,并在成功利用系统时执行它。如果堆栈的权限不是执行,则应该避免攻击,这是对的吗? 所以在我看来,将堆栈的权限设置为执行是有害的,即使它存在缓冲区溢出攻击的风险,linux的真正目的是什么呢?

2 个答案:

答案 0 :(得分:2)

Linux内核 支持拥有它的CPU上的NX位。自2004年以来一直支持。

某些发行版附带的内核不支持使用NX所需的选项,但这更多地与设置这些选项(特别是使用PAE模式)这一事实有关导致操作系统无法在某些硬件上启动。

这就是为什么我倾向于重新编译我的内核而不是采用发行版中提供的默认值。这样,我确定它针对我的硬件进行了优化,而不仅仅是一般情况。

答案 1 :(得分:-3)

Linux是* nix。所有* nix都基于以汇编程序/机器代码编写的早期操作系统,其中安全性概念不存在且也是不必要的。随着越来越多的人开始使用计算机,操作系统逐渐发展成为世界各地众多人的贡献,更重要的是,计算机从外部世界获得了更多的投入。

机器代码仅作为在不修改硬件的情况下更改机器行为的方式而存在,仅此而已。人们现在使用C,其目的是使组装/机器代码移植到其他处理器架构更容易。

堆栈只是实现递归的一种方法。

机器代码和C中根本没有安全概念。用户可以选择映射到机器代码的抽象概念。 C不是其中之一。没有多少人和时间将会或者永远不会验证足够合理的代码库(例如Linux内核+ libc),因为它需要验证分散在数百万行代码中的算术方程,而且这些方程式正在改变所有代码。编译器的时间也是如此,而且语言本身甚至没有很好地定义。 C程序中任何地方的单个算术错误足以危及该程序的整个地址空间。没有任何数量的SELinux,堆栈粉碎保护,ASLR,App Armor,NX位,防护页面等都可以解决这个问题。

你的问题就像问一个野蛮的原始男性为什么他不做瑜伽。

如果禁用堆栈上的代码执行(这些天大多数操作系统都支持),仍然有无限的其他方式来拥有C代码 - 例如,替换返回地址和它下面的单词来设置对任意函数的调用有恶意参数。现在有人会像“哦,可以修复,你只需要一个金丝雀”,但不,这并不能解决使用的语言是C的事实,只是让人们分散了真正的问题,这是如果你想要安全,你就不能拥有C. PERIOD。