运行时堆栈不应该是可执行的

时间:2014-04-21 12:39:56

标签: security stack embedded

我正在阅读有关嵌入式系统安全性的内容,并且发表了这样的声明:" Web浏览器的运行时堆栈不应该是可执行的。"。我很清楚堆栈是什么,它是如何工作的,但是我很难理解它不可执行的含义。这是否意味着您不能在运行时更改堆栈,或者其他什么?

2 个答案:

答案 0 :(得分:2)

对于Von Neumann架构(今天最常见),程序和数据存储在同一存储器中。因此,必须对程序是什么以及什么是数据进行分析。而且,如果不对所执行的内容进行控制,许多程序就可以执行恶意作业。防止恶意程序执行错误操作的一种方法是,在程序执行时,将代码加载到只读可执行存储器区域中,并将不可执行的可写存储器区域用作堆栈。

有一个叫做程序计数器的东西指向正在执行的当前指令。程序可以将其值更改为指向堆栈并从那里执行可以通过网络接收的恶意指令,例如,将未经授权的人员访问您的计算机。

此外,在linux操作系统中,有一个权限系统,允许您指定文件是否可以执行以及由哪些人执行。

此主题:Linux process memory scheme 有一个非常明确的图像,说明进程的内存是如何组织的。只有包含代码的文本部分才是可执行的(这意味着程序计数器只能指向该区域中的存储单元)。

答案 1 :(得分:2)

在具有MMU的体系结构上,可以使用可读可写可执行文件的属性标记内存区域。未标记为可执行文件的区域只能用于数据 - 尝试将程序计数器设置为并从该区域获取指令将导致处理器异常。

一个常见的漏洞是使用代码和修改后的返回值强制堆栈上的缓冲区溢出,这样当函数返回时它会跳转到缓冲区溢出的代码。通过使堆栈不可执行,漏洞利用尝试将失败。