스택 카나리 (Stack Canary)

정보보안학
한 줄 정의: 함수의 반환 주소 앞에 미리 심어 둔 특수한 값으로, 함수 종료 시 이 값이 바뀌었는지 검사해 스택 버퍼 오버플로 공격을 탐지하는 방어 기법입니다.

쉽게 풀면

옛날 광부들이 유독가스를 감지하려고 카나리 새를 데리고 들어갔던 데서 이름을 따왔습니다. 함수가 쓰는 메모리 영역과 중요한 반환 주소 사이에 '감시용 값'을 하나 심어 두고, 함수가 끝날 때 이 값이 그대로인지 확인합니다. 만약 값이 훼손됐다면 버퍼가 넘쳐 공격이 진행 중이라는 신호이므로 프로그램을 즉시 중단합니다.

왜 중요한가

스택 카나리는 오래된 취약점인 스택 버퍼 오버플로를 저비용으로 막는 대표적 컴파일러 수준 방어책으로, 오늘날 거의 모든 프로그램에 기본 적용됩니다. 메모리 보호 기법의 기초로 자주 등장합니다.

논문에서는 이렇게 쓰입니다

"컴파일 시 스택 카나리를 삽입하도록 옵션을 활성화하자, 반환 주소 덮어쓰기를 시도한 오버플로 익스플로잇이 카나리 불일치로 즉시 차단되었다."

조금 더 깊게 보면

카나리 값은 프로그램 실행마다 무작위로 정해지거나, 널 바이트를 포함시켜 문자열 복사 함수로 덮어쓰기 어렵게 만드는 등 여러 변형이 있습니다. 다만 카나리는 반환 주소 '덮어쓰기'는 탐지해도, 카나리를 건너뛰어 임의 주소에 직접 쓰는 공격이나 카나리 값 자체를 유출해 우회하는 공격에는 취약할 수 있습니다. 그래서 ASLR, DEP, 제어흐름 무결성 같은 다른 방어와 함께 겹겹이 씁니다.

주의할 점

스택 카나리는 스택 오버플로에 특화된 방어일 뿐 힙 오버플로나 다른 메모리 손상은 막지 못합니다. 카나리 값이 유출되면 우회되므로 단독 방어로 신뢰해서는 안 됩니다.

관련 용어