티스토리 뷰

IoT 기기를 개발할 때 random seed를 어떻게 만들어야 할지 고민이 될 때가 있다. 일반 PC의 경우 OS와 하드웨어에서 이를 지원하고, 프로토콜, 암호화 라이브러리에서 이들 난수(random number)를 내부적으로 사용하기 때문에 크게 신경쓸일이 없지만 RTOS 기반에서는 이와 같은 부분이 제공되지 않는 경우가 많다. 


1. 난수의 용도

기기에서 난수를 활용하는 주요 용도중 하나가 session 구분용이나 암호화 이다. 


세션용으로 예를 들면 TCP(RFC 793 3.3 Initial Sequence Number Selection)의 sequence number를 들 수 있다. 

Sequence number는 transaction의 순서나 중복 등을 위한 용도로 사용하지만 이것 이외에도 TCP session 구분용으로도 사용된다. TCP session을 보면 고유한 값은 local ip/port, remote ip/port, initial sequence number 이다. 부팅이 빠른 RTOS 기반의 기기에서, 부팅 시점에 global time source도 얻을 수 없고, 고유한 난수도 만들지 못한다면, 기기에서 선정한 local port, initial sequence number는 매 부팅시마다 동일한 값이 될 수 있다. 서버와 연결하는 기기인 경우, 이 단말이 내부 원인으로 인하여 부팅 직후 리부팅을 하게 되면 동일한 session 정보를 사용하게 되어 이전 session과 혼동되어 오류가 발생할 가능성이 있다. 

이외에도 프로토콜에 따라서 global uniqueness를 가지는 session ID를 요구하거나, replay attack 등의 공격을 방어하기 위하여 random initial sequence number 를 요구하는 경우도 있다. 

이런 부분에서 난수가 제대로 만들어 지지 않는 다면 충돌 가능성이나 보안 취약 문제가 있을 수 있다. 


암호화에도 마찬가지로 난수가 중요한 부분 중 하나이다. 개인 비밀키를 만드는데 난수 발생이 예측가능하거나 범위가 제한적이라면(lower entropy) 암호가 취약해 질 수 밖에 없게 된다. 이외에도 replay attack 을 막기 위하여 난수열을 덧붙여서 암호화를 하는데, 이런 부분에서도 난수가 예측가능하다면 반복적인 공격에 취약해 질 수 밖에 없게 된다. 



2. 난수 생성


가장 좋은 방법은 하드웨어적인 난수 발생기를 사용하는 것이다. MCU들을 보면 Random Number Generator를 내장하고 있는 것이 있다. 

예를 들어 IOT 기기에 많이 사용하는 STM32F4 시리즈의 경우 TRNG (True Random Number Generator)를 제공하는 MCU들이 있다. TCP/IP 네트워크를 사용하는 기기라면 RNG를 지원하는 MCU를 선정하는 것이 보안 면에서 도움이 될 것이다. 만일 이와 같은 random number generator를 제공하지 않는 경우 어느 정도 엔트로피를 가지는 난수가 필요하다면 ADC를 사용하여 하드웨어적인 구현할 필요가 있다. 

하드웨어 소자의 랜덤 특성을 이용한 로직으로 아래 링크나 위키피디아 링크를 기준으로 찾아보면 될 듯 하다. 


Session 충돌 방지 용도나 낮은 보안 레벨이어도 문제가 되지 않는 경우라면 이같은 hardware RNG 까지는 없고, 매 부팅마다 unique한 seed를 선택하여 PRNG(PseudoRandom Number Generator)를 이용하여 난수를 만들 수 있다. MAC address, 제품 serial number, 배터리 레벨, 마이크, 센서 등의 입력 값 등 여러 소스를 조합하여 seed로 사용할 수 있다. 하지만 실제 사용을 하다 보면 이와 같은 seed 소스가 상당히 제한적인 경우가 많다. MAC address, serial number는 기기마다 고유하지만 기기에 고정된 값이고, 배터리나 다른 센서 값들도 실제로 읽어 보면 값의 범위가 제한적이기 때문에 쉽게 중복될 수 있다. 특히 반복적인 부팅에서 동일한 seed가 선정되는 경우가 발생하게 된다. RTC(Real Time Clock)가 있다면 이를 seed 소스로 사용하면 이와 같은 문제는 막을 수 있지만 그렇지 않다면 부팅 시점마다 값을 바꿀 수 있는 방법을 고민하여야 한다. 


RTC가 없다면 아래와 같은 방법을 고려해 볼 수 있을 것이다. 

- 부팅 시 마다 flash memory에 값을 1씩 증가하거나 bit값을 바꾸어 이를 hash 함수 등으로 적당히 가공 후 seed로 이용

- 초기에 NTP 등을 얻어 올때까지 임시 seed를 사용하고, 시간을 얻어온 이후에는 시간과 transaction time 등을 seed 소스로 활용하여 재설정



3. 정리


아직까지 IOT 기기나 박스형태의 제품에서는 보안이 크게 부각되지는 않지만 점차적으로 IOT가 활성화 된다면 점차적으로 이슈화가 될 것이다. DTLS, TLS 등 좋은 보안 모듈을 제공하지만, 초기 난수 설정에서 문제가 발생한다면 쉽게 보안이 뚫릴 수 있어 개발 시 충분한 고려가 되어야 할 것이다. 특히 RTOS와 MCU를 사용하는 소형 IOT 기기의 경우 이 부분이 개발 시 고려 사항으로 강조되지 못하여 쉽게 간과되는 부분이다. 

저작자 표시
신고
댓글
댓글쓰기 폼