Buffer overflow(Buffer overrun)와 대응방안
Buffer overflow와 그 대응방안에 대해 알아봅시다.
버퍼오버플로우와 그 대응방안에 대해 알아봅시다.
버퍼오버플로우란?
일단 버퍼는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역입니다.
해당 공간이 넘쳤다고(overflow) 생각하면 될 것 같. 컴퓨터 보안과 프로그래밍에서 프로세스가 버퍼에 데이터를 저장할 때 프로그래머가 지정한 곳을 넘어 인접 메모리까지 덮어쓰게 되었을 때 버퍼오버플로우라고 한다.1
대응방안
- 컴파일 타임에서의 대응방안과 런타임에서의 대응방안으로 나눌 수 있다.
컴파일 타임에서의 대응방안
C, C++ 같은 언어에서 특히 안전한 함수를 사용해야한다.
- strncat()2, strncpy(), fscanf(), snprintf(), vsnprintf() …
경계값 및 파라미터를 체크한다.
Stack Guard
Stack 영역의 보호를 위해 Return Address의 수정이 일어나는지 확인을 하기위해 변수와 Return Address사이에 canary라는 특별한 문자를 사용한다. 해당 문자를 확인할 수 없다면 Return Address가 수정되었을 가능성이 높아 프로그램의 실행을 막는다.
Stack shield
Return Address를 안전한 장소에 복사해 함수종료 시 현재 스택의 리턴 주소와 비교해 변조여부를 확인합니다.
런타임에서의 대응방안
스택과 힙을 실행 불능으로 설정한다.
Address Space Layout Randomization
주소 공간 배치를 난수화한다. 실행 시 마다 메모리 주소를 변경시켜 특정 주소 호출을 방지한다.
참고문헌 및 각주
https://koreascience.kr/article/CFKO200634741480717.pdf
https://security.stackexchange.com/questions/44131/stack-guard-vs-stack-shield
https://hackstoryadmin.tistory.com/entry/Linux-Memory-Protection-Stack-Canary