스택 카나리(Stack Canary)는 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법입니다.
스택 버퍼 오버플로우로 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야 하므로 카나리 값을 모르는 공격자는 반환 주소를 덮을 때 카나리 값을 변조하게 됩니다. 이 경우, 에필로그에서 변조가 확인되어 공격자는 실행 흐름을 획득하지 못합니다.
security_init 함수에서 TLS에 랜덤 값으로 카나리를 설정하면, 카나리로 보호 받는 함수에서 이를 참조해 사용합니다. TLS의 주소는 fs 레지스터에 저장되며, 카나리는 TLS + 0x28 위치에서 확인할 수 있습니다.