2013-02-05 82 views
4

当共享库被映射到内存中时,Linux内核将分配虚拟内存区域到这个内存区域并分别标记它们的权限。但是我们知道x86 arch中的页表项中没有可执行的位。如果程序中有“call * edx”等调用指令来调用共享库中的函数,Linux内核如何知道目标地址是否可执行?如果权限在vma列表中不兼容,是否会导致一般性保护错误?Linux内核中的内存保护

+0

“库”意味着你正在加载可执行代码,所以根据定义,加载库的内存区域进入将不得不被标记为可执行文件。 –

+3

如果启用了'PAE',则可以执行(无)执行控制。 –

+0

在NX支持(也可以在32位模式下工作,并且Linux使用它)之前,[使用x86段限制可以完成无执行保护](https://www.redhat.com/magazine/009jul05/features/execshield /)。根据那篇文章,Solar Designer的OpenWall发行版使用它。更重要的是,Solar Designer实际上发明了用于非可执行堆栈的技术。显然[它并不完美](http://insecure.org/sploits/non-executable.stack.problems.html)。我没有读过这个漏洞,想知道这是否是一个可以解决的实现问题,或者是没有合适的NX的基本限制 –

回答

3

它不能。

上的架构(/操作模式),其中有没有执行页面权限从读取权限不同,内核将无法发现一个所谓非法地址执行由MMU检测到故障的结果。

0

你说得对,理论上内核可以根据内存区域对象上的更细粒度的权限来决定,但是这样的决策过程必须位于页面错误处理程序中,而这(我想)会使例行内存访问非常昂贵。

的内核,而不是采用x86上的这些简化规则:

  • 读访问权总是意味着执行访问权
  • 写访问权总是意味着读访问权

来源:理解Linux内核,第一版,第205页