버퍼 오버플로우(BOF : Buffer Overflow)란?
버퍼 오버플로우(buffer overflow, BOF)는 메모리 오류로 인해 잘못된 동작을 하는 프로그램 취약점입니다. 프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하는 것을 의미합니다. 벗어난 데이터는 인접 메모리를 덮어 쓰게 되는데 이 과정에서 프로그램 변수와 프로그램 흐름 제어 데이터가 손상될 수 있습니다. 이로 인해 잘못된 프로그램 동작이 나타날 수 있으며, 메모리 접근 오류, 잘못된 결과, 프로그램 종료, 또는 시스템 보안 누설이 발생할 수 있습니다.
버퍼 오버플로우는 코드를 실행시키도록 설계되거나 프로그램 작동을 변경시키도록 설계된 입력에 의해 촉발될 수 있습니다. 따라서 이는 많은 소프트웨어 취약점의 근간이 되며 악의적으로 이용될 수 있습니다.
버퍼 오버플로우 발생을 방지하기 위해 사용되는 대표적인 보호 대응 수단에는 프로그래밍 언어 선택, 안전한 라이브러리 사용, 버퍼 오버플로우 보호, 포인터 가드, 실행 공간 보호, 주소 공간 배치 난수화, 심층 패킷 조사가 있습니다.
프로그래밍 언어 선택은 버퍼 오버플로우 발생에 깊이 있는 영향을 미칠 수 있습니다. C와 C++는 메모리상 어떤 부분에서도 데이터 접근과 덮어쓰기에 대한 내장 보호 기능이 없습니다. 더 구체적으로, 데이터가 어떤 배열 (버퍼의 구현)에 씌어지는 데이터가 그 배열의 범위 안에 씌어지는지 검사하지 않습니다. 그러나 표준 C++ 라이브러리는 데이터를 안전히 저장하는 많은 방법을 제공하고, C언어에서 버퍼 오버플로우를 회피하기 위한 기술도 존재합니다. 장기간 작동시키며 안정성을 유지해야 하는 프로그램을 작성해야 한다면 보다 데이터 타입과 오버플로우 검사가 엄격한 C#과 자바를 사용할 수 있습니다.
또한, 표준 라이브러리 함수를 이용할 때는 경계를 검사하지 않는 함수의 사용을 피할 것이 권고됩니다(ex. gets, scanf, strcpy) 버퍼 오버플로우 보호는 가장 일반적인 버퍼 오버플로우를 검출하기 위해 사용되며 함수가 귀환할 때 스택이 변경되었는지 검사합니다. 변경되었다면 프로그램이 세그멘테이션 오류를 발생 시키며 중단됩니다. 그러한 시스템의 세가지 예가 gcc 패치인 립세이프 LibSafe, 스택 가드, 프로폴리스입니다. 마이크로소프트의 데이터 실행 방지 모드는 명백히 SEH 예외 처리기를 가리키는 포인터를 덮어쓰기로부터 보호합니다. 더 강력한 스택 보호는 스택을 두가지로 나눔으로써 가능합니다. 하나는 데이터용이고 다른 하나를 함수 귀환에 사용하는 것입니다. 이러한 구분은 포스 프로그래밍 언어에 비록 안전을 위한 기능은 아니지만 채택되어 있습니다. 이는 귀환 주소가 아닌 민감한 데이터가 여전히 덮어씌어질 가능성이 있기 때문에 버퍼 오버플로우에 관한 완벽한 해결책은 아닙니다.
버퍼 오버플로우는 포인터를 조작함으로써 (저장되어 있는 주소를 포함하여) 작동합니다. 포인트 가드는 컴파일러 확장으로 제안되었는데, 공격자가 신뢰성 있게 포인터와 주소를 조작하는 것을 방지합니다. 접근 방법은 컴파일러가 추가 코드를 삽입하여 자동적으로 포인터를 사용 전후에 XOR-인코딩하도록 하는 것입니다. 공격자가 (이론적으로는) 어떤 값이 포인터를 인코드/디코드할 때 사용할지 알지 못하기 때문에 어떤 값으로 덮어 써야 원하는 효과를 거둘 수 있을지 알기 힘들게 됩니다. 포인트가드가 배포된 적은 없지만 마이크로소프트에서 비슷한 접근 방법을 구현하여 윈도 XP SP2와 윈도 서버 2003 SP1 이후에 적용하였습니다. 포인터 보호를 자동 기능으로 구현하지는 않았고, API를 추가하여 프로그래머의 재량에 따라 호출하여 사용하도록 하였습니다. XOR이 선형이므로, 공격자가 암호화된 포인터를 조작하여 어떤 주소의 하위 바이트만 덮어쓸 수 있습니다. 이렇게 하면 공격자가 여러번 시도하거나 복수의 위치 (예를 들어 NOP 슬라이드 안의 어떤 위치) 에 대해 시도함으로써 공격이 성공할 수 있습니다. 마이크로소프트는 임의로 암호화 방안을 변경함으로써 이 약점을 보완, 부분적으로만 덮어쓰기가 가능하게 하였습니다.
실행 공간 보호는 버퍼 오버플로우를 방지하기 위한 접근 방법으로 스택이나 힙 상의 코드가 실행되는 것을 막습니다. 공격자는 버퍼 오버플로우를 이용하여 임의의 코드를 프로그램의 메모리에 삽입할 수 있지만, 실행 영역 보호가 있다면, 그 코드를 실행하고자 하는 어떠한 시도도 예외를 발생시킬 것입니다.
주소 공간 배치 난수화 (Address space layout randomization, ASLR)는 컴퓨터 보안 기능으로 중요 데이터 영역, 예를 들어 실행 코드의 기반 주소, 라이브러리, 힙, 스택 주소 등을 임의로 프로세서의 주소 공간에 배치하는 것입니다. 함수와 변수를 찾을 수 있는 가상 메모리 주소의 난수화로 버퍼 오버플로우 이용이 더 어려워지지만 불가능한 것은 아닙니다.
심층 패킷 조사로 네트워크 경계에서 아주 간단한 버퍼 오버플로우 원격 시도를 공격 고유 신호과 경험적 방법으로 검출할 수 있습니다. 알려진 공격 고유 신호 또는 긴 NOP 명령이 검출되면 패킷을 막을 수 있으며, 공격 패킷 내용이 조금 달라도 사용할 수 있습니다.
'보안용어' 카테고리의 다른 글
누킹(Nuking) (0) | 2020.05.08 |
---|---|
논리 폭탄(Logic Bomb) (0) | 2020.05.08 |
다크웹(Dark Web) (0) | 2020.05.07 |
보안관련 용어 - 취약점 (0) | 2020.05.06 |
정보보안이란? (0) | 2020.05.06 |
댓글