malloc分配的内存保护标志是什么?

时间:2011-06-11 10:09:23

标签: c memory-management protection

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

man malloc没有提及保护这一问题。

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:1)

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

$ man mprotect