所有进程都有相同的stack_canary?

所有进程都有相同的stack_canary?

在Linux内核中,stack_canary是堆栈保护机制之一。

该值由 生成boot_init_stack_canary()。 ( /init/main.c)

boot_init_stack_canary()随机生成stack_canaryget_random_bytes().

并且这个金丝雀值被引用到任务结构体( struct task)中并保存在gs段寄存器中。

当一个进程生成时,该进程stack_canarygssegment中获取。

如果stack_canary不再刷新,所有进程的stack_canary值都一样吗?

否则,还有其他不同的生成方法吗?

答案1

每当任务结构被复制时,堆栈金丝雀就会用随机值初始化;看dup_task_struct()kernel/fork.c(特别是380线在 4.7 版本中)。所以每个分叉进程都会得到一个随机的金丝雀,这意味着有一个非常每个进程都有不同的金丝雀的可能性很高(更重要的是,您无法预测另一个进程的堆栈金丝雀)。

boot_init_stack_canary()确保第一个“任务”(内核)有一个堆栈金丝雀。该金丝雀不会重新用于流程。

相关内容