假设我从另一个进程中 fork 了一个进程。地址空间布局随机化 (ASLR) 是否会应用于已设置 ASLR 的操作系统中?
请注意,我说的是在执行 fork 后不调用 execve 函数的情况。
最佳答案
是的。
但是请注意,在 fork
之后, parent 和 child 都应用了相同的随机化(毕竟他们是彼此的副本!)。
如果 child 和 parent 要调用 mmap(NULL, ...)
,然后他们的地址映射将开始分歧。
更新:
Isn't your statement contradictory?
完全没有。在 fork
之后,父地址空间和子地址空间是相同的(这就是 fork
所做的定义)。但是 ASLR 对 parent 和 child 仍然有效。随机化不能“回到过去”并随机化已经做出的决定,但任何 future 的决定(例如下一个 mmap
的放置位置)将随机化,并且可能会导致 parent 和 child 的不同结果。
Does it have to do with basic mmap or OS writers introduce randomness in mmap as well for security?
也许你不明白什么是ASLR?
简而言之,在启用 ASLR 的情况下,操作系统将 r andomize placement of main stack, and placement of any non-MAP_FIXED
mmaps .
当您fork
时,主堆栈的位置早已确定,因此父子堆栈将相同。 future 的 mmap
是唯一可以(并且将会)受 ASLR 影响的东西。
关于c - 地址空间布局随机化是否应用于 fork 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8171298/