보안 공부/소스코드 보안약점 진단

소스코드 보안약점 진단 - 소스코드 보안약점 진단 - 해제된 자원 사용

H.J.World 2022. 2. 3. 10:10
728x90
반응형

소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.

SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.

해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.

 

제 5절 코드오류

타입 변환 오류, 자원(메모리 등)의 부적절한 반환 등과 같이 개발자가 범할 수 있는 코딩오류로 인해 유발되는 보안약점이다.


4. 소스코드 보안약점 진단 - 해제된 자원 사용

가. 개요

C 언어의 경우 스택 메모리에 저장되는 지역변수는 생성될 때 자동으로 초기화되지 않는다. 초기화 되지 않은 변수를 사용하게 될 경우 임의값을 사용하게 되어 의도하지 않은 결과를 출력하거나 예상 치 못한 동작을 수행할 수 있다.

나. 보안대책

초기화되지 않은 스택 메모리 영역의 변수는 임의값이라 생각해서 대수롭지 않게 생각할 수 있으나 사실은 이전 함수에서 사용되었던 내용을 포함하고 있다. 공격자는 이러한 약점을 사용하여 메모리 에 저장되어 있는 값을 읽거나 특정 코드를 실행할 수 있다. 모든 변수를 사용 전에 반드시 올바른 초기값을 할당함으로서 이러한 문제를 예방한다.

다. 코드예제

다음 코드는 커서의 위치를 정하는 프로그램이다. switch문 안에서 초기화를 수행하도록 구현이 되어 있으나, default 부분에서 변수 x만 초기화하고 변수 y는 초기화되지 않았으므로 이 함수가 수행되기 전에 공격자가 이 변수에 원하는 값을 저장해 놓는다면 서비스 거부 공격도 가능하다.

- 안전하지 않은 코드의 예 C -

1: //변수의 초기값을 지정하지 않을 경우 공격에 사용 될 수 있어 안전하지 않다.
2: int x, y;
3: switch(position) {
4: case 0: x = base_position y = base_position beak;
5: case 1: x = base_position + i y = base_position - i break;
6: default: x=1; break;
7: }
8: setCursorPosition(x,y);

 

- 안전한 코드의 예 C -

아래의 예제는 switch 문 안에 case 항목으로 존재하던 초기화 구문을 switch문 밖으로 꺼내어 변수를 올바르게 초기화 하고 있으므로 안전하다. 

1: //변수의 초기값은 항상 지정하여야 한다.
2: int x=1, y=1;
3: switch(position) {
4: case 0: x = base_position y = base_position beak;
5: case 1: x = base_position + i y = base_position - i break;
6: default: x=1; break;
7: }
8: setCursorPosition(x,y);

 

라. 진단방법

변수의 선언과 동시에 초기화가 이루어지는지 확인한다. C++ 언어와 같이 객체의 필드가 초기 값을 가지지 않는 경우에는 생성자를 통해 필드의 초기화가 이루어지는지 확인한다. 이와 같은 작업이 이루어지지 않을 경우에는 기본적으로 취약하다고 판단한다.

다음 예제는 C++ 코드로, 디폴트 생성자에서 필드의 초기화가 이루어지지 않기 때문에 디폴트 생성 자를 이용할 경우 필드는 임의의 값을 가진다. 따라서 다음 예는 초기화되지 않은 필드에 접근하여 값을 가져오게 되므로 보안약점이 존재하는 코드라고 진단할 수 있다.

1: class Foo
2: {
3: public:
4: Foo() {} // default constructor, doesn’t initialize a_
5: Foo(int a) : a_(a) {} // constructor
6: int get_a() const {return a_;}
7: private:
8: int a_;
9: };
10:
11: int main(void)
12: {
13: Foo foo1; // calls default
constructor 14:std::cout << foo1.get_a() <<
std::endl; 15: return 0;
16: }

 

728x90
반응형