본문 바로가기
CTF/Dreamhack

[Dreamhack] System Hacking STAGE 6 - Mitigation: Stack Canary

by 8희 2022. 11. 6.

Mitigation: Stack Canary

Stack Canary(스택 카나리)

- 스택 버퍼 오버플로우로부터 반환 주소를 보호

- 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법

- 나리 값의 변조가 확인되면 프로세스는 강제로 종료

- 스택 버퍼 오버플로우로 반환 주소를 덮으려면 반드시 카나리를 먼저 덮어야 하므로 카나리 값을 모르는 공격자는 반환 주소를 덮을 때 카나리 값을 변조 / 이 경우, 에필로그에서 변조가 확인되어 공격자는 실행 흐름을 획득 X

 

카나리 생성 과정

- 카나리 값은 프로세스가 시작될 때, TLS에 전역 변수로 저장되고, 각 함수마다 프롤로그와 에필로그에서 이 값을 참조

- security_init함수에서 TLS에 랜덤 값으로 카나리를 설정하면, 매 함수에서 이를 참조하여 사용

 

카나리 우회

1. 무차별 대입 (Brute Force)

- x64 아키텍처에서는 8바이트의 카나리가 생성되며, x86 아키텍처에서는 4바이트의 카나리가 생성

- 각각의 카나리에는 NULL 바이트가 포함되어 있으므로, 실제로는 7바이트와 3바이트의 랜덤한 값이 포함

- 무차별 대입으로 x64 아키텍처의 카나리 값을 알아내려면 최대 256^7번, x86 에서는 최대 256^3 번의 연산이 필요

- 실제 서버를 대상으로 이 정도  횟수의 무차별 대입을 시도하는 것은 불가능

 

2. TLS 접근

- 카나리는 TLS에 전역변수로 저장되며, 매 함수마다 이를 참조해서 사용

- TLS의 주소는 매 실행마다 바뀌지만 만약 실행중에 TLS의 주소를 알 수 있고, 임의 주소에 대한 읽기 또는 쓰기가 가능하다면 TLS에 설정된 카나리 값을 읽거나, 이를 임의의 값으로 조작할 수 있다.

- 그 뒤, 스택 버퍼 오버플로우를 수행할 때 알아낸 카나리 값 또는 조작한 카나리 값으로 스택 카나리를 덮으면 함수의 에필로그에 있는 카나리 검사를 우회 가능

 

3. 스택 카나리 릭

- 스택 카나리를 읽을 수 있는 취약점이 있다면, 이를 이용하여 카나리 검사를 우회할 수 있다.