在Linux内核中,stack_canary
是堆栈保护机制之一。
该值由 生成boot_init_stack_canary()
。 ( /init/main.c
)
boot_init_stack_canary()
随机生成stack_canary
自get_random_bytes()
.
并且这个金丝雀值被引用到任务结构体( struct task
)中并保存在gs
段寄存器中。
当一个进程生成时,该进程stack_canary
从gs
segment中获取。
如果stack_canary
不再刷新,所有进程的stack_canary
值都一样吗?
否则,还有其他不同的生成方法吗?
答案1
每当任务结构被复制时,堆栈金丝雀就会用随机值初始化;看dup_task_struct()
在kernel/fork.c
(特别是380线在 4.7 版本中)。所以每个分叉进程都会得到一个随机的金丝雀,这意味着有一个非常每个进程都有不同的金丝雀的可能性很高(更重要的是,您无法预测另一个进程的堆栈金丝雀)。
boot_init_stack_canary()
确保第一个“任务”(内核)有一个堆栈金丝雀。该金丝雀不会重新用于流程。