linux内核设置进程的statck权限为执行。众所周知,堆栈通常包含数据而不是指令,所以我想知道 kenel 这样做的原因。特别是缓冲区溢出攻击一般将恶意代码存储到堆栈中,并在成功利用系统后执行。如果堆栈的权限不是执行的,应该避免攻击,是这样吗?因此,在我看来,将堆栈的权限设置为执行是有害的,即使存在缓冲区溢出攻击的风险,linux 这样做的真正目的是什么?
2 回答
Linux 内核确实支持NX
具有它的 CPU 上的位。自 2004 年以来,这种支持一直存在。
一些发行版附带的内核不启用所需使用的选项,NX
但这更多是因为设置这些选项(特别是使用 PAE 模式)将导致操作系统无法在某些硬件上启动。
这就是为什么我倾向于重新编译我的内核而不是使用发行版中提供的默认值。这样,我确信它针对我的硬件进行了优化,而不仅仅是一般情况。
Linux 是一个 *nix。所有 *nix 都基于用汇编程序/机器代码编写的早期操作系统,其中不存在安全性概念,也没有必要。随着越来越多的人开始使用计算机,操作系统演变成某种东西,得到了全世界无数人的贡献,更重要的是,计算机从外部世界获得了更多的输入。
机器代码仅作为一种在不修改硬件的情况下改变机器行为的方式而存在,仅此而已。如今,人们使用 C,其目的是使将汇编/机器代码移植到其他处理器架构更容易。
栈只是实现递归的一种手段。
机器代码和 C 中根本没有安全概念。由用户选择映射到机器代码的抽象。C 不是其中之一。没有多少人和时间将拥有或永远不会验证一个大小合理且有用的代码库(例如 Linux 内核 + libc),因为它需要验证分散在数百万行代码中的算术方程,而且这正在改变所有时间和编译器也是如此,甚至语言本身都没有很好的定义。C 程序中任何地方的单个算术错误都足以危及该程序的整个地址空间。再多的 SELinux、堆栈粉碎保护、ASLR、App Armor、NX-bit、保护页面等都无法解决这个问题。
你的问题就像问一个野蛮的原始男性为什么不做瑜伽。
如果您禁用堆栈上的代码执行(现在大多数操作系统都支持),仍然有无限的其他方法来拥有 C 代码 - 例如,替换返回地址和它下面的单词以设置对带有恶意参数的任意函数的调用. 现在有人会说“哦,可以修复,你只需要一个金丝雀”,但是不,这并不能解决所使用的语言是 C 的事实,并且只会分散人们对这里真正问题的注意力,即如果你想要安全,你就不能拥有 C. PERIOD。