한때 컴퓨터 보안은 성가신 PC 바이러스를 의미했으며 그 후 위험성이 커졌다. 기업 및 정부 시스템의 해킹으로 개인 및 재무정보는 사기, 도난 그리고 횡령에 노출됐다. 그런데 지금도 임베디드 시스템의 보안, 정확히는 임베디드 시스템의 비보안은 중요한 데이터를 위협하고 있다.
오늘날의 세상은 데이터 상에서 운영되고 비트(bit) 또는 바이트(byte)가 잠재적인 공격의 표적이 된다. 동시에 소프트웨어와 하드웨어 시스템은 모두 훨씬 복잡해지고 있고 연결과 상호종속성도 마찬가지다. 그리고 복잡함에는 취약성이 뒤따른다. 수십억개 또는 수조개의 코드 라인들 그리고 밀접한 관계에 있는 하드웨어 모듈들, 서비스 시스템들, 파티션들 모두 작은 실리콘 조각 안에 밀어 넣어져 있어 해커에게는 즐거움이다.
물론 해커들이 가만히 있는 것도 아니고 임베디드 시스템의 취약성에 대한 보고는 끊이지 않고 있다. 위성통신시스템, 무선기지국, 가정 및 기업용 레이저프린터, 스마트 전기 그리드, 제세동기와 같은 의료장치, 기타 수많은 시스템들이 위험하다.
세월이 흐르면서 멀티코어 임베디드 시스템온칩(SoC)의 보안에 대한 필요성은 늘어만 갔다. 심장 장비, 스마트폰, 자동차 제어 장치 등의 임베디드 장치는 제어 센터를 보호하기 위해 임베디드 SoC를 포함한 여러 가지 컴포넌트를 필요로 한다.
첫째, 임베디드 애플리케이션에서 멀티코어 SoC를 보호하는데 반드시 필요한 구성요소를 알아보자. 둘째, 임베디드 프로세서 보안의 기본 레이어, 보안 부트(secure boot)에 대해 자세히 살펴본다. 보안 부트는 시스템을 ‘전원 켜짐’ 상태로부터 보호해 준다. 보안 부트가 없으면 시스템은 ‘전원 켜짐’부터 사용까지 공백이 생긴다. 위협의 성격이 점점 변화함에 따라 보안은 언제나 움직이는 표적이 될 것이다.
위험 관리
보안 위협은 언제나 존재하고 사물인터넷(IoT)의 빠른 확산에 따라 어디에서든지 간에 위협은 존재하며 심지어 눈에 잘 안 띄는 저가의 엔드노드 디바이스에서도 있다. 그래서 보안에 대한 기본 질문은 시스템이 공격을 받을 것인가를 묻는 게 아니라 언제 공격을 받게 될 것인가를 묻는 것이다.
보안은 보호이기 때문에 위험관리만큼 중요하다는 결론에 이르게 된다. 시스템이 공격을 받을 수 있다고 가정했을 때 시스템 설계자는 어떻게 해야 보안 위반 위험을 확실하게 최저 수준까지 낮출 수 있을까?
무엇을 보호해야 할까?
가치를 가진 모든 것은 공격 대상이 될 수 있다. 그리고 물론 해커의 관점과 의도에 따라 거의 모든 것이 가치 있는 것으로 인식될 수 있다. 아주 단순하게는 시스템을 침입했다는 스릴만으로 해커 커뮤니티의 대다수는 이를 가치라고 여긴다.
많은 해커들이 악의가 없는 스릴 추구자는 아니다. 전자지갑을 뒤지거나 신용카드와 은행계좌번호 같은 재무정보를 훔쳐 사기행위에 이용할 때 주저하지 않을 해커들도 많다. IP를 훔쳐서 팔거나 경쟁우위를 점할 수 있고 정부 기밀을 유용하여 교통시스템이나 상수도, 에너지분배네트워크, 핵발전소, 기타 국가의 공공 기반시설을 방해, 훼손, 파괴할 수도 있다.
물론 이 모든 가치들이 보호되어야 하지만, 일이 발생하기 전에 보안시스템 자체를 보호해야 한다. 임베디드 시스템의 경우 해당 시스템 내의 보안 구성요소와 보호하는 대상을 지켜야 한다. 가장 기초적인 단계에서는 소프트웨어와 사용자, 접속 링크 검증에 쓰이는 암호 키와 아이덴티티의 보안을 의미한다. 또 모든 시스템에서 실행되는 소프트웨어나 네트워크 내 노드 무결성 보장의 의미다. 그러려면 네트워크나 인터넷의 가장 얌전한 노드에서 부트업 및 런타임 소프트웨어를 확인하고 제어할 수 있어야 한다.
보안은 어느 정도 필요한가?
보안에는 마찬가지로 비용이 따른다. 시스템 개발자에게 보안 비용이란 시스템에 보안 조치를 설계하고 통합하는 비용뿐만 아니라 보안 조치에 요구되는 시스템 성능 사용료다. 끊임없이 변화하는 보안 위협의 속성과 IoT 같은 이니셔티브를 통해 이어지고 있는 임베디드 시스템의 편재성을 감안할 때 새로운 시스템의 디자인은 보안의 비용을 그 편익에 대비해 측정할 일련의 지표가 개발돼야 한다.
임베디드 디바이스는 더 가치 있는 자원이 배치될 수 있는 다른 시스템의 공격형 론치패드로써 사용되거나 대체될 수 있다. 예를 들어 프린터·복사기에 대한 해킹은 해커에게 이익이 별로일 수 있지만 프린터가 인쇄하거나 복사하는 모든 문서를 캡처해 해커에게 보낸다면 그 손실은 엄청날 수 있다.
임베디드 시스템 기반의 생산 제품이 매우 많기 때문에 보안 비용 측면에서 장점이 있다. 결과적으로 이러한 제품을 위해 개발되는 보안 서브시스템의 비용은 대량생산이 증가할 때마다 상각돼 보안 단위 비용이 낮아질 수 있다. 게다가 새로운 디자인을 위해 개발되는 다목적, 확장형, 이동형 보안 아키텍처는 밀접한 관계의 시스템으로 종종 이전시킬 수도 있고, 다른 제품의 필요에 적합하게 약간 수정할 수도 있다.
아키텍처 고려사항
많은 보안 서브시스템은 레이어로 설계되고 구획화를 활용한다. 보안 조치를 레이어로 배치하면 시스템 보안에 누적 효과가 발생하는데 각 레이어마다 어떤 조치를 취하기 전에 위 또는 아래 레이어의 보안을 인증할 수 있기 때문이다. 구획화는 시스템에서 실행되는 소프트웨어의 런타임 보안을 확보하는데 중요하고 보호해야 하는 자원이나 프로세스의 상대적 가치에 따라 설계자가 알맞은 보안 조치를 지정해 준다.
임베디드 보안은 하드웨어에서 시작된다. 소프트웨어 및 하드웨어 보안 기능들을 함께 묶으면 독립적으로 실행하는 솔루션보다 더 많은 보안 레이어가 가능해진다. 게다가 벤더가 제공하는 툴은 보안 서브시스템의 개발을 능률화하고 개발자의 요건들을 충족하는 아키텍처 결과물을 보장한다. 예를 들어 하드웨어 기반의 보안 가속기는 보안 서브시스템의 성능 비용을 경감시킬 수 있다.
물론 보안 아키텍처의 강도는 구축된 토대에 따라 달라질 것이다. 기본 레이어에는 보안 부트 프로세스, 하드웨어 기반 디바이스 ID/키, 암호 가속의 세 가지 필수 요소가 있다.
보안 피라미드
보안 피라미드(그림 1)는 다양한 레이어와 멀티코어 SoC 임베디드 프로세서의 포괄적인 보안 서브시스템의 구성 파트를 보여준다.
보안 부트
보안 부트(secure boot) 프로세스는 임베디드 시스템에 대해 ‘root-of-trust’를 정립한다. 심지어 외부 플래시 메모리로부터 부팅이 되더라도 보안 부트 프로세스는 임베디드 암호 키 등 여러 메커니즘을 통해 부트 펌웨어의 무결성을 검증한다. 보안 부트 레이어는 맬웨어의 의한 시스템 장악과 인시스템 IP의 복제, 원치 않는 애플리케이션의 우연한 실행 등의 보안 위험들을 막아준다.
또 보안 부트는 IP를 암호화하고 내부 메모리를 보호하기 위해 이를 안전하게 복사해 추가적인 보호 레이어를 제공함으로써 도움을 준다. 그리고 명령 받은 탐색 공격이 금지되기 때문에 암호화 능력이 있으면 코드 베이스를 위한 추가적인 보안이 제공된다.
핵심은 보안 부트가 임베디드 시스템 보안에 대한 밑바탕 정립에 도움이 된다는 것이다.
암호 가속
다양한 공개 및 비공개 키를 생성, 검증, 인증하는 암호 프로세싱은 임베디드 시스템의 성능과 스루풋에 큰 피해를 줄 수 있다. 어떤 SoC는 하드웨어 기반의 가속기 또는 코프로세서가 탑재되어 있어 코딩·디코딩 프로세스 속도를 크게 높여준다. 소프트웨어 기반의 가속도 이용이 가능하다. 하지만 소프트웨어로서 본질은 하드웨어 기반의 암호 가속만큼 안전하지 않다.
공통 암호화 요소
무작위 번호 생성기(RNG) 암호 알고리즘과 해싱 기능에 사용됨. 하드웨어에서 생성된 무작위 번호가 소프트웨어 생성의 RNG보다 더 안전하다.
암호 알고리즘
3데이터 암호화 표준(3DES)은 3번의 3DES 암호화 실행으로 암호화된 데이터의 보호를 강화하고 일부 DES 알고리즘의 취약성을 극복한다. 첨단 암호화 표준(AES)은 오늘날 널리 쓰이고 있는 가장 진화된 암호 알고리즘이다.
해싱 기능(서명 용도, 인증 용도 등)
메시지 다이제스트 알고리즘(MD5) 해싱 기능이 널리 배치돼 있지만 일부 애플리케이션에서는 특정 취약성이 나타난다.
보안 해시 알고리즘 2(SHA2) 대형 해시를 처리해서 SHA1보다 더 안전하다.
디버그 보안
시스템 개발 과정에서 설계자는 펌웨어 및 소프트웨어를 디버깅하기 위해 임베디드 멀티코어 프로세서에 접근할 필요가 있고 발생 가능한 하드웨어 문제를 해결할 수 있다. 대부분의 경우 JTAG 포트가 액세스를 제공한다. 운영 환경에서 디버그 포트는 퓨즈를 밀봉하거나 인증 받은 암호 키를 통해서만 접속이 가능해야 한다. 그렇지 않을 경우 그 디버그 포트는 해커를 위한 시스템에 들어갈 수 있는 쉬운 길이 될 수 있다.
신뢰할 수 있는 실행 환경
런타임 보안 레이어는 몇 개의 고유 기능들로 구성되어 있는데 이들 모두는 부트업 프로세스 이후와 시스템의 OS(operating system)가 실행되는 동안 시스템을 보호하는 역할을 한다. 런타임 보안의 중요한 요소는 시스템의 모든 요소를 모니터링해 침입이 발생하거나 시도된 때를 알아내는 것이다.
신뢰할 수 있는 실행 환경의 보안은 시스템이 보안 애플리케이션과 비보안 애플리케이션을 동시에 호스팅하고 시스템을 통해 그 파티션을 유지해 데이터 유출이 없도록 한다. 민감한 애플리케이션과 관련 코드·데이터 베이스가 다른 애플리케이션으로부터 완전히 샌드박스돼 있는 경우 민감한 애플리케이션 실행이 중요하다.
신뢰할 수 있는 실행 환경은 본래 멀티코어 시스템 내에 보안 파티션을 제공하고 인증 받은 보안 펌웨어, 소프트웨어, 애플리케이션만 실행이 되며 인증된 데이터만 저장할 수 있다. 신뢰할 수 있는 실행 환경을 나머지 멀티코어·멀티프로세싱 시스템과 분리하면 시스템을 통과할 수 있는 의심코드, 애플리케이션, 데이터가 미션 크리티컬 소프트웨어, 데이터, 그 밖의 IP 오염을 방지할 수 있다.
보안 스토리지
보안 키 및 데이터는 원치 않는 액세스에 영향을 받지 않을 시스템 메모리 내 장소에 저장해야만 한다. 암호화된 키 블롭, 마스터 키로만 해제할 수 있는 조작방지 보호, 비휘발성 메모리와 암호 엔진 사이의 비공개 키 버스 등 여러 가지 기능들로 보안 스토리지를 제공할 수 있다.
디바이스 ID
LAN(local-area network), WAN(wide-area network) 또는 인터넷으로 통신을 신뢰하기 위해서 디바이스는 공유될 수 있는 고유의 아이덴티티를 가져야 한다. 그러면 통신 디바이스는 대화에 참여하는 다른 디바이스가 진짜인지 믿을 수 있는지를 판단할 수 있다.
임베디드 프로세서는 보통 고유 ID 코드 같은 것이 있다. 아니면 ID 코드와 더불어 클라우드 서비스를 통해 접속 가능한 통신 공개 키를 이용해 서명 또는 인증 키로 스스로 알아보도록 할 수 있다.
외부 메모리 보호
설계자가 다른 애플리케이션이나 서브시스템을 추가해야 할 경우 외부 메모리를 메인 프로세서에 추가하고 메모리 버스로 연결해야 하는 상황을 자주 겪는다. 설계자는 외부 메모리에 저장된 데이터가 조작되거나 교체되지 않도록 보호해야 한다.
그래야 신뢰할 수 있는 데이터나 애플리케이션이 외부 메모리에 저장되었음을 확인 가능하다. 외부 메모리의 콘텐츠를 보호하기 위해 데이터를 프로세서의 통합 메모리에 로딩 하지 않고 바로 외부 메모리에서 보안 execute-in-place를 실행하는 방법, 애플리케이션을 메인 프로세서에서 실행과 동시에 기밀성을 유지할 수 있는 decrypt-on-the-fly 방법 등 수많은 방법을 사용할 수 있다.
네트워킹 보안
해커는 유무선 네트워크 통신을 가로채는데 매우 능숙하다. 사실 일부 통신 프로토콜은 이미 공개돼 있는 보안 약점이 있다. 보안성이 높은 통신 프로토콜만 배치한다면 통신 스트림의 암호화 및 복호화, 전송자 또는 수신자의 신분 검증에 상당히 많은 프로세싱 사이클이 수반된다.
설계자는 통신 처리량과 보안의 균형을 맞추는 상황을 가끔 겪는데 어떤 임베디드 프로세서는 표준 통신 프로토콜과 함께 사용되는 암호 알고리즘용 하드웨어 기반의 가속기를 통합해 딜레마를 피한다.
물리보안과 조작방지
체계적인 해킹 조직과 그렇지 않은 해킹 조직은 시스템에서 칩 또는 칩 패키지에서 실리콘 다이를 삭제해 임베디드에 접근한다.
디바이스나 다이가 삭제되면 해커는 레이저로 폭격을 하거나 지정된 전력 범위를 넘어 전력을 끌어올리거나 그 외 다른 방법을 사용한다.
그들의 목적은 디바이스에 해커가 접근하는데 이용되는 취약성이 반응에 노출될 수 있기 때문에 디바이스가 자극에 어떻게 반응하는지를 관찰하는 것이다. SoC의 디지털 및 아날로그 섹션에 대한 물리적 침입을 막기 위해 하드웨어 및 소프트웨어 기능에 임베디드 프로세서를 통합하기도 한다. 임베디드 멀티코어 프로세서에 통합된 조작방지 모듈에 전력 및 온도 모니터, 리셋 기능, 주파수 모니터, 프로그래머블 조작방지 등과 같은 기능을 넣을 수 있다.
인클로저 보호
인클로저 보호 기능은 시스템을 감싸고 있는 인클로저를 보호하는 물리 조치다. 잠금 메커니즘부터 전자 스위치, 분리 와이어 트립핑 메커니즘까지 다양하다.
임베디드 보안, 어디에서 시작할까?
임베디드 멀티코어 프로세서 보안의 기초는 하드웨어에서 시작된다. 하드웨어가 안전하지 않으면, 아무리 보안 소프트웨어가 많아도 도움이 되지 않는다. 보안 기능이 하드웨어 안에 구축되어 있다면 제일 먼저 보안 서브시스템을 구축해야 할 장소는 전원을 켜고 실행되는 첫 번째 소프트웨어, 부트 코드다.
부팅 프로세스가 진짜라는 것이 증명이 안되면 시스템에서 실행되는 다른 모든 소프트웨어도 마찬가지이다. 따라서 부트 프로세스의 보안이 가장 중요하며 그것을 바탕으로 시스템 내 모든 보안이 달라지게 된다. 보안 부트 프로세스는 ‘root-of-trust’를 확립시킨다. 이것은 모든 보안 서브시스템의 목적이다.
보안 부트 프로세스를 통해 ‘root-of-trust’를 확립하면, 시스템의 무결성을 확보할 수 있고 해커가 시스템의 일부를 장악하는 것을 막을 수 있다. 또 그 시스템 내의 고객 소프트웨어를 보호하고 복제 방지막 역할을 하여 시스템 또는 시스템 일부가 복제되지 않도록 막을 수 있다.
일반적으로 보안 부트 프로세스는 시스템 어딘가에서 공개 암호 키를 비휘발성 일회용 프로그래머블 메모리에 프로그래밍 한다. 이 공개 키가 부트 코드와 연관된 비공개·공개 키와 일치해야 암호화된 부트 코드의 유효성을 증명할 수 있고 실행이 시작된다. 부팅 펌웨어는 임베디드 프로세서의 RAM에 로딩되고 보안을 더 추가하기 위해 임베디드 프로세서의 외부 메모리에서 executed-in-place 보안을 실행할 수도 있다.
어떤 펌웨어 이미지는 여러 가지 컴포넌트 또는 모듈로 이뤄진다. 각 모듈을 복호화해 실행하기 전에 인증을 요구하면 부트 보안이 한층 강화된다.
결론
임베디드 프로세서 보안은 다층적이고 복잡하다. IoT의 증가와 임베디드 시스템의 편재성으로 해커에게는 어느 때보다도 표적이 넘쳐난다.
물론 기초적인 보안 기능은 하드웨어 안에 이미 존재하지만 임베디드 멀티코어 SoC를 위한 보안 서브시스템 구축은 보안 부트의 기본 레이어부터 시작해야 한다. 보안 부트 프로세스에서 나온 ‘root-of-trust’가 없으면 다른 어떤 보안 조치도 무의미하다. 이 ‘root-of-trust’가 확립되면 다른 시스템 보안 측면, 예컨대 디버그 보안, 런타임 보안, 네트워킹 보안 등은 단단한 바탕을 가지게 된다. 그렇지 않을 경우 모든 보안 측정은 모래 위에 쌓는 것과 같다.
<글 : 암리트 문드라(Amrit Mundra) TI 보안 설계 시스템 엔지니어>
<자료제공 텍사스인스트루먼트(TI)>