在Linux内核中,stack_canary是堆栈保护机制之一。
此值由boot_init_stack_canary()生成。(/init/main.c)
boot_init_stack_canary()从get_random_bytes()随机生成stack_canary。
该金丝雀值被引用到任务结构(struct task)中,并保存在gs段寄存器中。
生成进程时,流程从stack_canary段获得gs。
如果不再刷新stack_canary,那么所有进程都具有相同的stack_canary值?
否则,是否有不同的产生方法?
发布于 2016-09-07 10:02:18
每当任务结构被复制时,堆栈金丝雀都会被随机值初始化;请参见dup_task_struct()在……里面kernel/fork.c (特别是Version4.7中的第380行 )。因此,每个分叉进程都会得到一个随机金丝雀,这意味着每个进程都有一个不同的金丝雀(更重要的是,您无法预测另一个进程的堆栈金丝雀)。
boot_init_stack_canary()确保第一个“任务”(内核)有一个堆栈金丝雀。金丝雀不能再用于进程。
https://unix.stackexchange.com/questions/308367
复制相似问题