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