공시 한 판

정보보호론 개념서 · 응용 프로그램 취약점

버퍼 오버플로우

설명 영상 버퍼 오버플로우 · 2:10

핵심 정리

버퍼 오버플로우는 버퍼에 정해진 크기 이상의 데이터를 입력해 프로그램을 공격하는 행위다. 이 공격은 입력 길이 검사가 빠진 프로그램에서 일어난다. 입력 길이 검사가 부족하면 버퍼 크기를 넘는 데이터가 저장되고, 이것이 버퍼 오버플로우 공격이다. 공격자는 이 빈틈을 이용해 프로그램이 예상하지 못한 데이터를 집어넣는다.

할당된 버퍼 한계 밖 덮어쓰기 버퍼 오버플로우는 할당된 버퍼 한계를 벗어나 인근 메모리 위치를 덮어쓰는 것이다. 덮어쓰인 메모리에 함수의 반환 주소 같은 제어 정보가 있으면 공격자는 프로그램의 실행 흐름을 바꿀 수 있다. 그래서 이 공격은 단순한 오류가 아니라 보안 문제가 된다.

효과는 인접 메모리 훼손과 시스템 동작 방해다. 버퍼 경계를 넘어 데이터를 기록해 인접 메모리를 훼손하고 시스템 동작을 방해하는 공격이다. 프로그램이 충돌하거나 부정확하게 동작하는 것도 같은 원인에서 나온다.

가장 기본적인 대응은 취약한 함수를 쓰지 않는 것이다. strcpy(), strcat() 등 버퍼 오버플로에 취약한 함수는 사용하지 않는 것이 좋다. 프로그램 쪽의 보호 기법으로는 경계 검사, 카나리 값, 태깅이 쓰인다. 다만 이들 기법은 버퍼 오버플로에 대한 완벽한 해결책이 아니다.

자세히

입력 길이 검사의 부재

버퍼는 프로그램이 데이터를 담기 위해 할당한 고정 크기 공간이다. 입력을 받는 쪽이 버퍼 크기와 입력 길이를 비교하지 않으면, 정해진 크기를 넘는 데이터가 그대로 기록된다. 경계 검사 유무가 핵심 그래서 이 취약점은 함수 이름보다 경계 검사가 있는지에 달려 있다. 입력 길이를 제한하는 코드가 있으면 넘침은 막히고, 없으면 같은 입력이 버퍼 밖으로 흘러간다. 원인을 묻는 물음에서는 '입력 길이 검사'라는 말이 들어간 진술을 골라야 한다.

취약한 함수의 이름

realpath() 함수는 버퍼 오버플로에 취약한 함수이다. 취약 함수는 입력을 버퍼에 옮기는 과정에서 길이를 따로 제한하지 않는 함수를 말한다. 그래서 함수 이름만으로 안전 여부를 판단하면 안 되고, 함수가 버퍼 크기를 인자로 받아 길이를 제한하는지를 함께 봐야 한다.

이어지는 내용

로그인하면 하루 5페이지까지 무료로 전체를 읽을 수 있습니다.

앱에서 이 절 읽기