Linuxカーネルでは、stack_canary
スタック保護メカニズムの1つです。
値はによって生成されますboot_init_stack_canary()
。 ( /init/main.c
)
boot_init_stack_canary()
stack_canary
からランダムに生成されますget_random_bytes()
。
そして、このカナリア値は作業構造(struct task
)で参照され、gs
セグメントレジスタに格納されます。
プロセスが作成されると、セグメントstack_canary
から取得されます。gs
これ以上更新されない場合は、stack_canary
すべてのプロセスで同じ値になりますかstack_canary
?
それ以外の場合、生成する他の方法はありますか?
答え1
作業構造がコピーされるたびに、スタックカナリアは任意の値に初期化されます。dup_task_struct()
存在するkernel/fork.c
(特に380ラインバージョン4.7)。したがって、各分岐プロセスにはランダムなカナリアがあります。非常に各プロセスが異なるカナリアを持つ可能性が高い(より重要なのは、他のプロセスのスタックカナリアを予測できないことです)。
boot_init_stack_canary()
最初の「作業」(カーネル)にスタックカナリアがあることを確認してください。このカナリアはプロセスで再利用されません。