2016.12.30 사물인터넷 소형 스마트 홈, 가전 보안 가이드(기업용)
1. 개요
사물 인터넷은 앞으로 정보를 생성, 수집, 공유, 가공하여 다양한 서비스를 제공하게 된다.
2. 스마트 홈, 가전 보안 위협
-
웹 인터페이스, 인증/허가 보안 위협 개발 편의성을 위해 시스템 명령입력이 가능한 디버깅 페이지 및 유지보수용 계정을 따로 만들어 놓고 제거하지 않은 채 사용자에게 배포
-
네트워크 서비스 보안 위협 개방된 텔넷 포트를 통해 기본 계정 로그인을 통한 관리자 권한 획득 게이트웨이가 기기에 센서로 명령을 내릴 때 암호화를 하지 않은 상태로 전송
-
모바일 앱 보안 위협 디버깅을 통한 실제 코드 노출
-
펌웨어 업데이트, 물리적 보안 위협 오픈소스(Open SSH, SSL)의 알려진 취약점 펌웨어 업데이트의 무결성 검증 미흡 디버깅 포트 (UART, JTAG, SPI 접근) 암호화 키 관리 미흡
3. 스마트 홈, 가전 보안 가이드
3.1 웹 인터페이스
3.1.1 관리자 페이지에서 사용자가 5회 로그인 실패할 경우, 캡차(CAPTCHA) 등의 보안 기능을 수행한다
- 관리자 페이지 접근 시 캡차를 적용해야 하며, 사용자가 5회 이상 로그인에 실패했을 경우 입력을 3-5분간 중지시키는 등의 계정 잠금 메커니즘을 적용함
3.1.2 웹 공격에 대한 보안 대응책을 수립해야한다.
- 시큐어 코딩 가이드 라인 참고
3.2 인증/허가
3.2.1 관리자 페이지 접속 시 최초 ID와 비밀번호의 경우 제품마다 다르게 한다. 3.2.2 모든 비밀번호(최초, 변경 모두 해당)는 영문, 숫자, 특수문자를 포함하여 8자 이상으로 설정해야 한다.
- 제조사에서는 기기 각각의 비밀번호를 명시 (스티커)
- 비밀번호 설정/변경 시 영문, 숫자, 특수문자를 포함하여 8자 이상으로 설정
- 기기 각각의 비밀번호 명시가 어려울 경우, 사용자가 최초 접속 시 복잡도를 만족하는 비밀번호 강제 변경 설정
3.2.3 사용자 관리 페이지 이외에 유지 보수 등을 위한 페이지(숨김 페이지 등) 및 계정을 별도로 구현하지 않아야 한다.
- 사용자 계정 외 슈퍼 계정을 미 구현
- 관리자 권한 인증 없이 관리자 권한의 페이지에 접속 가능한지 사전 검증
- 유지보수용 숨김 페이지
3.2.4 모든 관리자 페이지는 인증 후에 접근할 수 있도록 세션 인증 등을 구현한다 3.2.5 세션 인증 구현 시 순차적으로 증가하는 값이거나 단순 ID 값 등 예측 가능한 세션 ID 값을 사용하지 않도록 한다.
- 세션 인증 구현 시 예측 가능한 세션 ID 값을 미 사용
- 세션 인증 구현 시 Hidden Field, Client Side Cookie 기반 인증 기법이 아닌 서버세션 ID 인증을 사용
- 세션 인증 시 주기적인 세션 값을 변화 시켜야 하며 일정 시간이 지난 후에 폐기
- 세션 길이는 32비트 이상의 값
3.2.6 디바이스는 게이트웨이를인증하고 게이트웨이는 디바이스를 인증하는 등 상호 인증(이중 인증)을 수행해야 한다
- 상호 인증을 시작하기 전에 초기키(PSK : Pre-Shared Key)가 안전하게 주입 및 관리
- 비대칭키 방식의 개인키를 이용한 인증 방식 권장
- 인증 후 발행된 세션키는 주기적으로 갱신
- 디바이스에 키를 저장할 경우 최대한 안전한 방식을 사용(키 관리)
3.2.7 디바이스를 제어하는 패킷이 탐지될 경우 이용자에게 알림을 제공한다.
- 사전에 IP & MAC 등을 인증받고, 위 변조를 통해 정상적이지 않은 패킷을 전송할 경우, 탐지하여 이용자에게 알림 제공
3.3 네트워크
3.3.1 시큐어코딩을 통해 보안 취약점을 최소화하여야 한다.
- 시큐어 코딩 가이드 라인 참고
3.3.2 불필요한 외부 접속 포트나 Telnet, FTP, UPnP, SNMP 등의 서비스 비활성화를 기본 값으로 하여야 한다.
- 불필요한 외부 접속 포트(Telnet, FTP, UPnP, SNMP) 등의 서비스 비활성화를 기본 값으로 설정
- 외부 접속 포트 사용 시 비밀번호 설정, 접근 IP 제한 등 추가적인 보안 조치 수행
3.3.3 네트워크 패킷에서 중요 정보(계정 로그인, IoT 기기 제어 명령 시 등)가 보이지 않도록 암호화해야 한다.
- 중요정보 암호화 시 전자서명이 포함된 인증서를 사용하여, HTTPS, CoAP(DTLS)등의 프로토콜 이용
- 영상 암호 송출 시 SRTP, IPSec, SSL 등의 암호 프로토콜 사용
3.4 모바일 앱
3.4.1 컴퍼일러 옵션을 활용하여, 난독화 등의 메모리 보호 기법 적용하여야 한다
- ProGuard는 안드로이드 SDK를 통해 난독화 지원
- DexGuard는 유로
- 행정안전부의 모바일 대국민 전자정부서비스 앱 가이드라인 참고(https://developer.android.com/studio/build/shrink-code.html#configuring)
3.4.2 무선 네트워크 연결 시 인증 정보가 노출되지 않도록 한다.
- 무선 네트워크 연결 시 중요정보 및 인증정보가 노출되지 않도록 스니핑 방지 기법을 적용
3.5 펌웨어
3.5.1 개인영상정보를 DB에 별도로 저장, 보관하는 경우에는 이를 암호화하여야 한다.
저장 : 특정 파일에 정보가 계속 쌓이게 되는 것
보관 : 특정 파일 내 정보가 일정 시간(규칙)에 의해 저장되었다가 추후 다른 값으로 사용되는 것
- 개인영상정보 데이터를 수집 및 저장할 경우 데이터 암호화 적용
- CCTV 개인영상정보보호 가이드 해설서 참고
3.5.2 중요 정보(테스트용 계정, 개인키 등)를 하드 코딩하지 않도록 한다.
- busybox에 원격 명령 실행 취약점 주의(busybox menuconfig 설정)
- nc : 원격 접속 가능
- wget : 외부의 악성코드를 기기로 다운로드 가능
- telnetd : 원격 백도어로 악용 가능
- ftpd : 파일 전송 기능
3.5.3 커널이나 프로그램 컴파일 시 옵션에 각종 보안 기능이 포함되도록 빌드 해야 한다.(ASLR, DEP, NX)
- 컴파일 시 ASLR/DEP 등의 보호기능을 추가하여 빌드
- ASLR(Address Space Layout Randomization) : 바이너리를 실행 때 마다 메모리 주소가 변경
- DEP(Data Execution Prevention) : 데이터 영역에서 코드가 실행되는 것을 방지
3.5.4 기기별 MAC 주소 인증 방식 등을 사용하여, ARP Spoofing 을 최소화하도록 한다.
- 지속적인 ARP Response packet 발생 시 이용자에게 알림 제공
- 정적인 ARP 테이블 관리 수행
- packet 필터링 적용
- 데이터 통신 시 타임 스탬프, 순서 번호 등을 이용
- 각 디바이스 별 MAC 주소를 기반으로 한 인증 방식 제공
3.5.5 취약점 발견 시 업데이트를 할 수 있는 기능을 제공해야 한다.
- 펌웨어 다운그레이드는 허용하지 않도록 권고
- 보안 패치된 오픈소스 라이브러리로 업데이트
- 펌웨어 업데이트가 발생하는 경우, 사용자에게 인지할 수 있는 방안을 강구(팝업 등을 통해 실시간으로 알려주기 어려운 경우, 제조사 및 서비스 홈페이지에 보안 업데이트 사항 게시)
3.5.6 펌웨어 업데이트 실행 시 파일 고유 해시 값을 비교하여 변조 여부에 대한 무결성 검증을 실시할 수 있도록 한다.
- 검증 시 해시 알고리즘을 사용(SHA-256 이상, SIMON, SPECK, LEA)
- 무결성 검증에 실패한 경우 다운로드 받거나 복사한 파일은 삭제
- 공개키 알고리즘을 이용한 프로그램 코드에 대한 디지털 서명을 통해 펌웨어 업데이트 시 무결성과 인증 과정을 제공
- 아래의 펌웨어 디지털 서명 과정 구현 (그림 생략)
번호 | 설명 |
---|---|
1 | 펌웨어 제조사는 공개키와 개인키를 생성하고 공개키를 인증기관(CA)에 전달하여 인증기관(CA)으로부터 서명된 인증서를 발급받음 |
2 | 펌웨어 제조사는 발급받은 디지털 인증서(공개키)와 개인키를 디지털 서명 용도의 안전한 시스템에 보관 |
3 | 펌웨어 제조사는 개발되어 배포 준비된 펌웨어 이미지를 디지털 서명 센터에 전달 |
4 | 디지털 서명 센서는 펌웨어에 개인키로 서명한 디지털 서명 정보를 추가하여 배포 |
5 | 디바이스는 로드된 펌웨어 이미지를 기기에 내장된 공개키를 이용하여 검증 |
6 | 검증 결과 일치 시, 펌웨어 업데이트 진행 |
3.6 물리적 보안
3.6.1 USB 포트를 사용하지 않도록 설정하는 기능을 제공해야 하며, 디버그 포트를 통해 중요 정보가 노출되지 않도록 하여야 한다.
- USB : 엔지니어의 펌웨어 업데이트용 포트가 외부에 노출되지 않도록 제거 및 임의의 메모리를 자동으로 마운팅하지 않도록 조치
- RS-232/485 : 시리얼 라인을 물리적으로 노출되지 않도록 배치
- UART, JTAG : UART(RX, TX, GND, VCC), JTAG(TDI, TDO, TCK, TMS, TRST) 핀이 쉽게 노출되지 않도록 라벨 삭제
- SPI : 플레시 메모리 접근을 막기 위한 보안 설정 적용
- JTAG 디버그 기능을 사용할 수 없도록 설정
- 칩 삭제 시에 EEPROM에 저장된 내용을 보호하기 위한 설정
- 엔지니어 모드 진입 시 필요한 암호키 설정
- 내부 데이터를 보호하기 위한 OTP(one time programming) 영역 사용