시큐어코딩
- home
- 보안소식
- 시큐어코딩
40. [코드오류] 초기화되지 않은 변수 사용
2019.08.08 17:03
안녕하세요 신뢰와 정직의 정보보안 전문기업 지에스인포입니다!
오늘은 행정안전부 47개 보안취약점 중 '초기화 되지 않은 변수 사용'에 대해 알아보겠습니다.
# 초기화 되지 않은 변수 사용 : 변수를 초기화하지 않고 사용하여 예기치 않은 오류가 발생 될 수 있는 보안 취약점
이번에도 자원에 관련 된 보안취약점입니다. 지난번에는 자원을 사용하고 적절하게 해제하지 않아 시스템의 낭비를 초래하는 보안 취약점이었다면, 이번에는 반대로 초기화 되지 않은 변수를 그대로 사용 할 때 발생 할 수 있는 문제인데요.
그럼 여기서 '초기화'가 무엇일까요?
초기화 : 변수를 선언한 후 처음으로 값을 입력하는 행위
프로그램에서 변수를 선언한다는 것은 데이터 값을 넣을 '그릇'을 만드는 행위에 비유 할 수 있습니다.
컴퓨터에서 연산을 수행하려면 데이터 값이 있어야 하고, 해당 데이터를 담을 메모리가 있어야 하기 때문이지요.
그런데 컴퓨터에서 다양한 작업을 수행하려고 할 때, 데이터를 담을 그릇이 1개만 있다면 하나의 연산작업이 끝날 때까지 다른 연산은 수행이 되지 못하는 불편사항이 생기게 됩니다.
그래서 컴퓨터는 필요에 따라 하나의 메모리를 여러가지의 그릇으로 쪼개어 사용하는데요. 그 하나하나의 그릇을 '변수' (Variation)이라고 명명하는 것입니다.
그런데 이 변수를 사용하는데 있어서도 제대로 프로그래밍을 하지 않으면 보안 취약점이 발생 할 수 있다는 것이지요. C언어의 경우 스택 메모리에 저장되는 지역변수가 생성 될 시 자동으로 초기화 되지 않는 특징이 있는데요. 따라서 C언어 사용시 지역변수를 선언하면 반드시 초기화를 해 주어야 프로그램이 정상적으로 작동하게 됩니다.
만약 초기화 되지 않은 변수를 사용 할 경우 임의값을 사용하게 되어 의도하지 않은 결과를 출력하거나 예상치 못한 동작을 수행 할 수 있기 때문이지요. 또한 공격자는 이런 약점을 이용하여 메모리에 저장되어 있는 값을 읽거나 특정 코드를 실행 할 수도 있습니다.
참 무섭지요...?
따라서 우리의 소중한 정보를 안전하게 지키고 싶다면 프로그램 설계시 모든 변수를 사용 전에 반드시 올바른 방법으로 초기값을 할당 해 주어야 합니다.
소스코드 예제와 함께 보시겠습니다.
위 소스코드는 커서의 위치를 정하는 로직인데요. switch문 안에서 초기화를 수행하도록 구현이 되어있으나, default 부분에서 변수 x만 초기화하고 변수 y는 초기화시키지 않은 모습을 볼 수 있습니다. 이렇게 되면 해당 함수가 수행되기 전에 공격자가 y 함수에 다른 값을 입력하는 것도 가능해지고, 그렇게 될 경우 심각한 서비스 장애가 발생 할 수 있겠죠?
따라서 위 예제처럼 switch문 안에 case 항목으로 존재하던 초기화 구문을 switch문 밖으로 꺼내어 변수를 올바르게 초기화 해 주어야 안전한 SW가 설계되었다고 볼 수 있습니다!
어때요? 공부할 수록 정말 많은 보안취약점이 소스코드 안에 숨어있다는 것을 느끼고 계시지 않나요?
함수부터 DB, 이제는 변수까지 신경 써 줘야 하는 소스코드 보안 취약점들... 프로그램 하나 설계하기가 정말 복잡하지요? ㅠㅠ
하지만 걱정마세요!
여러분의 정보를 늘 든든하게 지켜드리는 저희 지에스인포가 늘 여러분들 곁에 있으니까요 ^-^
안전은 만사의 기본! 여러분의 소중한 정보보호를 지켜드리기 위해 오늘도 지에스인포는 열심히 달려나가고 있답니다. 정보보호가 필요하실 땐 언제든 저희 지에스인포를 찾아주세요!
오늘은 '초기화되지 않은 변수 사용'에 대해 알아보았습니다. 다음에도 유익한 소식으로 찾아뵙겠습니다.