시큐어코딩
- home
- 보안소식
- 시큐어코딩
24. [보안 기능] 적절하지 않은 난수값 사용
2019.05.28 10:12
안녕하세요 지에스인포입니다.
추위에 덜덜 떨던 게 얼마 전 같은데 어느덧 봄이 되었습니다.
저희 블로그를 방문해주신 분들도 따뜻한 봄날의 햇살을 느끼면서 주변의 소중한 사람들과 근처 공원이라도 나가서 즐거운 시간을 보내시면 좋겠습니다.
여러분들의 소중한 정보보안을 지켜드리기 위해 정보보호 전문기업인 저희 지에스인포는 오늘도 쉬지 않고 일하고 있답니다. 보안이 필요하시면 언제든 저희 지에스인포의 문을 두드려주세요!
오늘은 행정안전부 SW 개발보안가이드 47개 항목 중 24번째인 '적절하지 않은 난수값 사용' 항목에 대해 알아보겠습니다.
# 적절하지 않은 난수값 사용 : 공격자가 예측 가능한 난수를 사용할 경우 SW에서 생성되는 다음 숫자를 예상하여 공격이 가능해지는 보안약점
프로그램에서 예측 가능한 난수를 사용하는 것은 시스템에 보안약점을 유발합니다.
여기서 난수란? 특정한 순서나 규칙을 가지지 않는 수를 말합니다.
영어로는 random number라고 하는데요.
아래 예시와 함께 설명을 하겠습니다.
1-2-3-4-5-?
위 수열 다음에 나올 ? 안의 숫자는 무엇일까요?
아마 대부분 어렵지 않게 '6'이라고 답하셨을 거라고 생각되는데요.
1-2-3-4-5 까지 숫자가 이어지는 동안 숫자가 1씩 증가한다는 규칙성이 있었기 때문입니다.
2-4-6-8-10-12-14-?
마찬가지로 위와 같은 숫자도 마지막에 나올 숫자가 무엇일지 예측이 어렵지 않게 가능할 것입니다.
숫자가 2씩 증가한다는 규칙이 보이기에 ? 안 에 들어갈 숫자도 14에서 2를 더하면 되기 때문이지요.
그렇다면 아래와 같은 경우는 어떨까요?
4-9-5-6-1-8-2 - ?
? 안에 어떤 숫자가 들어가야 하는지 감이 오시나요?
아마 이번에는 ? 안에 어떤 숫자가 들어가야 하는지 확신하기가 어려우셨을 겁니다.
왜냐하면 나열 된 수열 사이에 규칙성이 없었기 때문이죠.
이처럼, 난수(random number)의 경우 어떤 숫자가 나올지 예측 할 수 없다는 특징이 있습니다.
때문에 프로그램에서는 다양한 목적을 위해 난수를 활용하곤 하는데요.
예를 들면 게임에서 랜덤 아이템을 생성 하고자 할 때나, 설문조사 프로그램에서 설문조사 대상을 선정 할 때 등 무작위 값이 필요할 때 난수값은 매우 요긴하게 사용되곤 한답니다.
그런데 이 난수값이 SW 보안에 있어서도 매우 중요하다는 사실, 알고 계셨나요?
프로그램에서 예측 불가능한 숫자가 필요한 상황에서 예측 가능한 난수를 사용한다면, 공격자는 SW에서 생성되는 다음 숫자를 예상하여 시스템을 공격하는 것이 가능합니다.
따라서 이럴 경우에는 예측 불가능한 난수가 생성되도록 프로그래머가 코딩을 잘 짜야 하는데요. 난수발생기에서 시드(Seed) 를 사용하는 경우에는 예측하기 어려운 방법으로 변경하는 것이 좋습니다.
일반적으로 JAVA 언어에서는 java.lang.Math.random() 메소드 사용을 자제하고 java.util.Random 클래스를 사용하는 것이 좋은데요, 아래 구체적인 예시와 함께 보시면 이해가 더 빠를 것 같습니다.
위의 소스코드의 경우, java.lang.Math 클래스의 random() 메소드에서는 seed 를 재설정 할 수 없기 때문에 다음 난수 값을 예측 할 수 있다는 보안약점이 있습니다.
따라서 이처럼 java.util.Random 클래스를 사용하면 seed를 굳이 재설정 해주지 않아도 매번 예측이 어려운 난수를 생성하기 때문에 적절한 난수값을 생성하는 코딩방법에 적합하다고 할 수 있을 것입니다.
하나 더 예시를 들어볼까요? 이번에는 C#으로 보겠습니다!
위 소스코드의 경우에도 System.Random 클래스의 Next 메소드를 사용시 seed를 재설정하지 않기 때문에 보안상 약점이 존재합니다.
따라서 이처럼 Guid.NewGuid().GetHashCode() 호출을 통해 seed를 생성하고, 이를 Random 생성자에 적용 해 주면 훨씬 더 안전한 SW를 개발할 수 있답니다!
오늘도 흥미롭게 읽으셨나요?
매번 지에스인포의 블로그를 찾아주시는 분들께 감사의 말씀을 드리며, 저희는 다음에도 흥미롭고 유익한 포스팅으로 찾아뵙겠습니다 ^^