소프트웨어(SW) 보안약점 진단원/구현단계 보안약점 제거 기준

구현단계 보안약점 기준 - 초기화되지 않은 변수 사용

브루노W 2025. 6. 4. 22:59
유형 코드오류
보안약점 초기화되지 않은 변수 사용
개요
C 언어의 경우 스택 메모리에 저장되는 지역변수는 생성될 때 자동으로 초기화되지 않는다.
 
초기화되지 않은 변수를 사용하게 될 경우 임의 값을 사용하게 되어 의도하지 않은 결과를 출력하거나 예상치 못한 동작을 수행할 수 있다.
보안대책
초기화되지 않은 스택 메모리 영역의 변수는 임의값이라 생각해서 대수롭지 않게 생각할 수 있으나 사실은 이전 함수에서 사용되었던 내용을 포함하고 있다.
 
공격자는 이러한 약점을 사용하여 메모리에 저장되어 있는 값을 읽거나 특정 코드를 실행할 수 있다.
모든 변수를 사용 전에 반드시 올바른 초기값을 할당함으로서 이러한 문제를 예방한다.
진단방법
변수의 선언과 동시에 초기화가 이루어지는지 확인한다.
 
C++ 언어와 같이 객체의 필드가 초기 값을 가지지 않는 경우에는 생성자로 필드의 초기화가 이루어지는지 확인한다.
이와 같은 작업이 이루어지지 않을 경우에는 기본적으로 취약하다고 판단한다.
연관된 설계단계 기준 -

 

코드예제

 

● 안전하지 않은 코드 예 (C)

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

 

● 안전한 코드 예 (C)

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

 

 

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

 

 

● 정탐코드

class Foo {
    public:
    Foo() {} // default constructor, doesn’t initialize a_
    Foo(int a) : a_(a) {} // constructor
    int get_a() const {return a_;}
    private:
    int a_;
};

int main(void) {
    Foo foo1; // calls default
    constructor
    std::cout << foo1.get_a() << std::endl;
    return 0;
}

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