![모든 프로세스에 동일한 stack_canary가 있습니까?](https://linux55.com/image/94011/%EB%AA%A8%EB%93%A0%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%97%90%20%EB%8F%99%EC%9D%BC%ED%95%9C%20stack_canary%EA%B0%80%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
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
더 이상 새로고침되지 않으면 stack_canary
모든 프로세스에 대해 값이 동일하게 되나요 stack_canary
?
그렇지 않으면 생성하는 다른 방법이 있습니까?
답변1
작업 구조가 복사될 때마다 스택 카나리아는 임의의 값으로 초기화됩니다.dup_task_struct()
존재하다kernel/fork.c
(특히380라인버전 4.7). 따라서 각 분기된 프로세스는 임의의 카나리아를 갖게 됩니다.매우각 프로세스가 서로 다른 카나리아를 가질 가능성이 높습니다(더 중요한 것은 다른 프로세스의 스택 카나리아를 예측할 수 없다는 점입니다).
boot_init_stack_canary()
첫 번째 "작업"(커널)에 스택 카나리아가 있는지 확인하세요. 이 카나리아는 프로세스에서 재사용되지 않습니다.