소프트웨어 개발보안 가이드 분석(2021) : 초기화되지 않은 변수 사용

C 언어의 경우 스택 메모리에 저장되는 지역변수는 생성될 때 자동으로 초기화되지 않는다.

초기화 되지 않은 변수를 사용하게 될 경우 임의값을 사용하게 되어 의도하지 않은 결과를 출력하거나 예상치 못한 동작을 수행할 수 있다.

소프트웨어 개발보안가이드(2021), 한국인터넷진흥원

 

초기화되지 않은 변수 사용이란?

  • 초기화되지 않은 변수 사용은 의미 그대로 변수를 선언하여 변수가 값으로 초기화되지 않은 채로 사용되는 경우를 가리킵니다. 이는 소프트웨어 개발 시 프로그래밍에서 흔히 발생하는 실수 중 하나입니다.
  • 프로그래밍에서 변수를 선언할 때, 변수에는 값을 할당하는 과정이 필요합니다. 이를 통해 변수가 메모리에서 적절한 초기값으로 설정되고, 이후에 사용될 때 예상치 못한 결과가 발생하는 것을 방지합니다. 초기화되지 않은 변수는 이러한 초기값이 할당하지 않고 사용하는 상태를 의미합니다.
  • 초기화되지 않은 변수를 사용하면 해당 변수에는 이전에 메모리에 저장되어 있던 값이 그대로 사용될 수 있습니다. 이는 프로그램이 예기치 않은 방식으로 동작하거나, 민감한 정보가 노출될 수 있는 상황을 만들어낼 수 있습니다.
  •  

공격 메커니즘

초기화되지 않은 변수 사용 취약점은 공격자가 악의적인 코드를 실행하거나 예기치 않은 동작을 유발하는 데 악용될 수 있습니다. 해당 취약점을 통한 공격 메커니즘은 주로 다음과 같습니다.

  1. 변수 값 조작 : 공격자는 프로그램 메모리를 직접 수정하거나 악의적인 입력을 통해 변수 값을 조작할 수 있습니다. 이로 인해 프로그램이 예기치 못한 동작을 하거나 오류를 발생시킬 수 있습니다.
  2. 버퍼 오버플로우 공격 : 공격자는 버퍼 오버플로우 공격을 통해 변수에 예상보다 많은 데이터를 입력하여 프로그램 오류를 발생시킬 수 있습니다. 이 오류를 악용하면 공격자는 프로그램 코드를 실행하거나 제어권을 탈취할 수 있습니다.
  3. 코드 실행 공격 : 공격자는 초기화되지 않은 변수에 악의적인 코드를 삽입하여 프로그램 실행 시 삽입한 코드를 실행할 수 있습니다. 이 공격을 통해 공격자는 시스템에 악성 코드를 설치하거나 데이터를 탈취할 수 있습니다.
  4. 메모리 누수 : 공격자는 초기화되지 않은 변수를 사용하여 메모리 누수를 발생시킬 수 있습니다. 메모리 누수는 더 이상 사용되지 않은 데이터가 메모리를 점유하고 있는 상황을 의미합니다. 결국 사용하지 않은 메모리를 해제하지 않아 시스템 성능 저하를 초래할 수 있습니다.

 

취약한 웹 애플리케이션의 예

  1    int x, y;
       switch(position) {
       case 0:
           x = base_position;
           y = base_position;
           break;
       case 1:
           x = base_position + i;
           y = base_position - i;
           break;
       default:
           x = 1;
           break;
       }
       setCursorPosition(x, y);
  • 1 : x와 y 변수는 선언되었지만 초기화되지 않았습니다.
  • 이로 인해 position 값이 case 0 또는 case 1 이외의 값일 경우 default 블록에서만 x가 초기화되고, y는 초기화되지 않은 상태로 setCursorPosition 함수에 전달되어 예상치 못한 상황이 발생할 수 있습니다.
  • 그렇기 때문에 x와 y 변수를 선언과 동시에 적절한 값으로 초기화해줘야 합니다.

 

시큐어코딩 적용 방법

1 int x = 0, y = 0; switch(position) { case 0: x = base_position; y = base_position; break; case 1: x = base_position + i; y = base_position - i; break; default: x = 1; break; } setCursorPosition(x, y);
  • 1 : x와 y를 선언과 동시에 0으로 초기화해주었습니다.
  • position 값이 case 0 또는 case 1이외의 값을 전달받아 default로 이동해 x만 1로 초기화하여도 y는 0으로 초기화되어있기 때문에 예상치 못한 상황으로 번지지 않습니다.

초기화되지 않은 변수 사용 취약점을 방지하기 위한 방법은 다음과 같습니다.

  • 모든 변수를 선언 후 즉시 값을 할당합니다.
  • 함수에서 변수를 반환하기 전에 반환 값을 확인합니다.
  • 코드 검사 도구를 사용하여 초기화되지 않은 변수를 찾아내고 수정합니다.

  • 이전 소프트웨어 개발보안 가이드 분석(2021) : 해제된 자원 사용
  • 다음 소프트웨어 개발보안 가이드 분석(2021) : 신뢰할 수 없는 데이터의 역직렬화