ragdo11 2025. 4. 17. 20:57

주요정보통신기밥 웹 취약 분석 평가 방법 첫 번째 항목인 버퍼 오버플로우(Buffer Overflow/BO)

버퍼 오버플로우는 지정된 버퍼의 용량을 뛰어넘는 양의 데이터를 버퍼에 저장하려고 시도할 때 발생한다.

출처 - 위키피디아

위의 사진과 같은 경우를 오버플로우가 일어났다고 표현하는데 단지 지정한 버퍼를 넘어서서 저장되는 것이 크게 문제가 될까? 라는 생각이 들 수 있다.

 

버퍼는 특별하게 할당된 독립된 메모리가 아니다. 지정된 버퍼 뒤의 메모리에서 어떤 작업이 일어나거나 데이터가 저장되어 있을 수 있다. 이를 이용하여 버퍼를 선언한 후 일부러 오버플로우를 발생시켜 특정 메모리의 데이터를 덮어서 시스템 상의 오류, 특정 기능 무력화 등 공격자가 원하는 결과가 나오게끔 하는 것이 버퍼 오버플로우 공격이라 할 수 있다.

 

이 버퍼 오버플로우가 어디서 나타는지에 따라 스택 버퍼 오버플로우, 힙 버퍼 오버플로우 등의 이름이 붙는다. 그런데 이 버퍼 오버플로우가 웹에서 발생한다는 건데.. 물론 불가능한 건 아니지만 좀 낮은 보안 수준의 조건이 붙어야 발생하는 경우를 볼 수 있을 것이다.

우선 첫 번째로 개발자가 메모리 단위로 신경써야 하는 C/C++을 사용해야 한다. C언어는 다른 언어하고 다르게 경계값을 검사하지 않기도 하고..

두 번째 > 주어진 버퍼의 크기를 신경쓰지 않고 데이터를 삽입/복사 등을 해주는 함수들이 있다. gets/strcpy/strcat 이 대표적으로 검사가 없는 함수들로 요새 C언어에서도 이런 함수를 사용하는 것은 잘 없으나 이와 같은 함수로 구성이 되어 있는 일부의 경우 버퍼 오버플로우 취약점이 있는 곳이라 할 수 있다.

 

결국 웹에서의 BO는 C/C++등이 주로 쓰이던 예전과는 달리 php, javascript, python, ruby 등의 언어의 사용과 요즘의 프레임워크는 입력값의 검증을 기본으로 하여 잘 발생하지는 않으나 발생할 여지는 있으며, 취약점이 있는 경우 시스템에 크게 영향을 줄 수 있는 공격이다! 라고 생각하면 된다.

 

다시 돌아가서 주통기반에서 BO의 보안 위협 부분을 보면 '웹 사이트에서 사용자가 입력한 파라미터 값의 문자열 길이를 제한하지 않는 경우 개발 시에 할당된 저장 공간보다 더 큰 값의 입력이 가능하고 이로 인한 오류 발생 시 의도되지 않은 정보 노출, 프로그램에 대한 비인가 접근 및 사용 등이 발생할 수 있음' 이라고 되어 있다.

위에서 설명한 것과 크게 다를것은 없다.

 

주통기반에서 제시한 보안설정방법을 살펴보면

  • 웹 서버, 웹 애플리케이션 서버 버전을 안정성이 검증된 최신 버전으로 패치

오래된 웹 서버에서는 웹 서버 고유의 취약점이 있다. Apache 웹 서버로 보더라도 CVE-2021-44790 이나 CVE-2022-22721 등 오버플로우 취약점이 있음을 알 수 있다. 취약점이 보완된 새로운 버전으로 패치하여 오래된 버전에 남아있을 수 있는 취약점을 제거하는 것이 좋다.

추가로 덧붙이자면 안정성이 검증된 최신 버전으로 패치하라고 되어 있다. 항상 최신 버전이라고 해서 좋다는 것은 아니다라는 의미.

  • 웹 애플리케이션에 전달되는 파라미터 값을 필요한 크기만큼만 받을 수 있도록 변경하고 입력 값 범위를 초과한 경우에도 에러 페이지를 반환하지 않도록 설정

C언어를 사용하지 말고 메모리 검사 기능이 있는 다른 언어(Java나 python 등)를 사용하거나 c언어에서도 strncpy, fgets, strncat 등 보완된 함수를 사용하면 된다.

  • 동적 메모리 할당을 위해 크기를 사용하는 경우 그 값이 음수가 아닌지 검사하여 버퍼 오버플로우를 예방하는 형태로 소스 코드 변경
  • 버퍼 오버플로우를 점검하는 웹 스캐닝 툴을 이용하여 주기적으로 점검