【问题标题】:What's the protection flags of memory allocated by malloc?malloc分配的内存的保护标志是什么?
【发布时间】:2011-09-13 00:06:57
【问题描述】:

根据this threadmalloc分配的内存至少有PROT_READ | PROT_EXEC,否则contaned函数无法执行。

man malloc 没有提到任何关于保护的内容,因此是个问题。

【问题讨论】:

  • 你确定这是正确的线程吗?我在那里看不到任何关于 PROT_READ 或 PROT_EXEC 的信息。我认为这两个与mmap有关。 (见pubs.opengroup.org/onlinepubs/007908799/xsh/mmap.html
  • @Catcall ,这就是为什么我说malloc返回的内存隐含了PROT_READPROT_EXEC,因为它不必mprotect(p, 1024, PROT_READ|PROT_EXEC)mmap返回的内存必须.

标签: c memory-management protection


【解决方案1】:

malloc 不是为代码分配内存的正确工具。您应该使用mmap,并且根据您系统上的偏执安全策略,您可能还需要使用mprotect 来更改权限。

malloc 不是正确工具的原因之一:

  • 权限设置仅使用页面粒度,但malloc 获得的内存不太可能是页面对齐的,因此您最终也会在相邻内存上设置权限,可能会破坏。
  • 如果您在调用free 之前不恢复旧权限,您可能会破坏malloc 的内部结构。

【讨论】:

  • 关于权限仅以页面粒度设置,您的意思是void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);返回的内存总是以页面为单位吗?不过,length 参数似乎并没有保证。
  • @Je Rog:是的,mmap() 创建内存映射,具有页面粒度(!MMU 系统除外)
  • 而且“!mmu”不能符合POSIX(需要内存保护)。
  • @ninjalj ,length 不需要是页面的倍数,怎么会?这是否意味着如果我们 mmap 4000 bytes ,那么 96 bytes 将被浪费?
  • @Je Rog:它们将被映射,请参阅 Linux 上的 /proc/<pid>/maps
【解决方案2】:

malloc() 通常会返回具有读写权限的内存。某些架构(例如:较旧的 x86)可能不允许直接禁用执行权限,但这只是平台的不足。

如果您想从分配的内存中执行代码,则必须明确授予执行权限,并且可能必须删除写权限,因为在同一内存上同时拥有写权限和执行权限被认为具有潜在危险在某些系统上(通常称为 W^X)。

还有其他几个线程从程序员分配的内存中执行代码:

Allocate executable ram in c on linux
Is it possible to execute code from the stack in standard C?

【讨论】:

  • 你有一台带有 NX 位的机器来测试它吗?
【解决方案3】:

在分配内存后,您可能需要调用mprotect 自己设置PROT_EXEC 标志。

$ man mprotect

【讨论】:

  • 好像没有,见链接段,不涉及mprotect,表示malloc返回的内存已经开启PROT_EXEC
  • @Je Rog:好的——我很惊讶 Linux 默认为 malloc 内存设置了PROT_EXEC——可能其他操作系统采取了更具防御性的方法——如果你的问题是 Linux -具体然后你应该标记它linux
  • 是的,就是这样,我想知道设置了哪些其他标志,但man malloc 没有给出任何线索。另外,我不知道它是否是特定于 linux 的,所以我认为添加那个标签是不合适的。
  • @Je Rog:最好不要做任何假设,特别是如果您关心可移植性和面向未来的情况。
  • 较旧的 x86 CPU 没有页面的执行权限位,因此通常读取权限隐含执行权限。较新的 CPU 有一个 NX(非执行)位。
【解决方案4】:

malloc() 库函数是由 C 语言标准指定的,因此在所有操作系统上都是相同的。内存保护是处理器和操作系统的一个功能,所以在Windows、Linux等上做的不同。

自从定义 malloc() 以来,这种工作方式多年来发生了变化。我记得大多数处理器不支持单独的“可执行”内存权限 - 如果它是可读的,它就是可执行的。许多嵌入式系统根本没有任何内存保护,所有内存都可以读取、写入和执行。 malloc() 函数在所有这些情况下的工作方式都是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2019-11-18
    • 2014-04-24
    • 2011-04-29
    相关资源
    最近更新 更多