업계 최초의 Arm® Cortex®-M33 기반 MCU 활용 – 2부: 수명 주기 보안 관리
DigiKey 북미 편집자 제공
2019-07-09
편집자 주: 2부로 구성된 이 시리즈의 1부에서는 낮은 전력에서 우수한 성능을 구현하기 위해 NXP Semiconductors의 LPC55S6x 범용 마이크로 컨트롤러(MCU)를 최적화하는 방법을 살펴보았습니다. 이제 2부에서는 수명 주기 보안 관리를 위해 이 마이크로 컨트롤러를 최적화하는 방법을 알아보겠습니다.
마이크로 컨트롤러 기반 시스템 개발자의 경우, 사물 인터넷(IoT), 산업 자동화, 개인용 전자기기 등 빠르게 성장하는 응용 분야의 광범위한 설계 요구 사항으로 인해 시스템 기능, 성능 또는 전력 소비 사이에서 어쩔 수 없이 타협해야 하는 경우도 있습니다. 보안 위협의 증가로 인해 이러한 설계에서 보안을 강화해야 하므로 개발자는 실행 가능한 마이크로 컨트롤러 솔루션이 훨씬 줄어든다는 문제에 직면합니다. 개발자는 익숙한 전력 소비 감소 및 고성능 요구 사항뿐 아니라 프로비저닝, 통신, 보안 부트, 보안 펌웨어 업데이트 등 설계 수명 주기의 모든 단계에서 증가하는 보안 강화 요구를 지원할 수 있는 마이크로 컨트롤러가 필요합니다.
1부에서는 NXP의 LPC55S6x 마이크로 컨트롤러 제품군을 소개하고 제품군의 기능이 성능 및 낮은 전력 소비 요구 사항을 어떻게 충족하는지를 설명했습니다. 2부에서는 LPC55S6x 마이크로 컨트롤러에 통합된 확장 보안 기능이 프로비저닝, 통신, 보안 부트, 보안 펌웨어 업데이트 등 수명 주기 전반에서 보안을 어떻게 지원하는지를 설명합니다.
1부에서 설명한 대로 NXP의 단일 코어 LPC55S66 및 이중 코어 LPC55S69 마이크로 컨트롤러는 Arm® Cortex®-M33 범용 프로세서 코어를 많은 특수 응용 분야 요구 사항을 해결하도록 설계된 하드웨어 기능과 결합합니다. 이러한 기능 중 대칭 및 비대칭 암호화를 위한 하드웨어 기반 가속기는 보안 통신에 필요한 기본 메커니즘을 제공합니다. 이전에는 암호화 가속기가 데이터 보호와 같은 기본 보안 기능에 충분한 것으로 여겨졌습니다. 하지만 지금은 더 포괄적인 보안 기능에 대한 사용자의 기대치로 인해 보안 부트, 보안 펌웨어 업데이트를 비롯하여 제조 프로비저닝부터 현장 커미셔닝까지 수명 주기 보안에 대한 요구 사항이 더욱 복잡해졌습니다.
이러한 확장된 보호를 실현하려면 하드웨어 수준을 상회하는 포괄적인 보안 프로토콜 및 정책이 필요합니다. 그렇다 하더라도 보안 프로토콜의 효율성은 신속하게 실행되는 동시에 연결된 장치에서 불가피하게 나타나는 위협 표면을 제거하거나 줄여주는 데 적합한 하드웨어 기반 메커니즘의 가용성에 따라 크게 달라집니다.
LPC55S6x 아키텍처는 Arm TrustZone® 기술, 유효한 보안 수준에 도달하는 데 필요한 여러 보호 계층을 비롯한 다양한 기능을 통해 수명 주기 보안을 위한 이러한 하드웨어 기반 지원을 제공합니다.
TrustZone 지원
TrustZone은 코드 실행 및 데이터를 특정 보안 도메인과 비보안 도메인으로 분리하여 보안을 위한 기반을 제공합니다. 프로그램 실행 중에 기본 Cortex-M33 코어가 코드 실행 모드에 따라 다른 실행 상태로 전환됩니다. CPU 상태 및 코드 실행 모드는 다음과 같습니다.
- 보안 권한 있음, 커널 수준 코드 또는 장치 핸들러 실행
- 보안 권한 없음, 보안 사용자 코드 실행
- 비보안 권한 있음, 일반 시스템 호출 실행
- 비보안 권한 없음, 일반 사용자 응용 제품 실행
권한 있는 실행과 권한 없는 실행의 차이는 전체 운영 체제 내구성에 매우 중요합니다. 하지만 이 기사의 목적에 따라 여기서는 보안 작업과 비보안 작업의 차이에 중점을 두고 이러한 실행 모드를 일괄하여 살펴봅니다. TrustZone 아키텍처에서 보안 CPU 상태에서 비보안 CPU 상태로 전환되면 코어에 대해 프로그램 메모리 또는 데이터 액세스를 위한 하드웨어 지원 제한이 적용됩니다.
보안 상태에서 코어는 메모리의 보안 영역과 비보안 영역에 있는 데이터에 모두 액세스할 수 있지만 메모리의 비보안 영역에 저장된 코드에 액세스할 수 없습니다(그림 1, 왼쪽). 비보안 상태에서 코어는 메모리의 비보안 영역에서만 코드 및 데이터에 액세스할 수 있습니다(그림 1, 오른쪽).
그림 1: Arm TrustZone을 지원하는 NXP의 LPC55S6x 마이크로 컨트롤러를 사용하면 보안(S) 상태로 작동되는 코어(왼쪽)는 S 상태 프로그램 메모리에 대한 명령어만 가져올 수 있고, 비보안(NS) 상태로 작동되는 코어(오른쪽)는 S 상태 메모리에 저장된 코드 또는 데이터에 연결할 수 없습니다. (이미지 출처: NXP Semiconductors)
LPC55S6x MCU 아키텍처는 최하위 수준의 버스 액세스에서 이 제어를 실행하여 공격자가 비보안 권한 없는 코드를 통해 “보호된” 영역에 대한 백도어 액세스 권한을 얻기 위해 사용하는 버퍼 오버플로를 비롯한 일반 위협 표면을 완화해줍니다. NXP는 보안 커널 코드를 응용 코드와 완전히 분리하도록 설계된 자체 IDAU(Implementation Defined Attribution Unit)와 함께 Arm TrustZone SAU(Security Attribution Unit)를 사용합니다. SAU는 보안 상태(보안 또는 비보안)를 제공하고 명령어를 메모리의 허용된 영역에서 가져왔는지 여부를 확인합니다. IDAU는 DAU(Device Attribution Unit)와 연결하여 향상된 세부 정보를 제공하며, SAU와 함께 특정 주소의 보안 특성을 결정합니다. 그 결과 적절한 보안 및 권한 수준에서 버스 요청이 제공됩니다(그림 2).
그림 2: NXP의 LPC55S6x 마이크로 컨트롤러는 버스 트랜잭션 수준에서 액세스를 보호하며, Arm TrustZone SAU를 IDAU와 함께 사용하여 시스템 버스 요청이 적절한 보안 및 권한 수준에서 작동하도록 보장합니다. (이미지 출처: NXP Semiconductors)
보안 스토리지 및 주변 장치
TrustZone 보호 메커니즘에서는 유휴 상태인 데이터와 전송 중인 데이터를 비롯하여 사용 중인 데이터의 주소를 지정하여(일반 데이터 보안 원칙 중 하나) 런타임 중에 응용 제품 코드 및 데이터를 분리합니다. 일반적으로 엔터프라이즈 수준 데이터 문제와 연관되지만 내장형 시스템의 코드 및 데이터에도 동일한 원칙이 적용됩니다. 여기서 일반 내장형 시스템에서 마이크로 컨트롤러의 통합 플래시 메모리를 사용하여 펌웨어 이미지, 코드 및 데이터를 저장할 경우 중대한 공격 벡터가 될 수 있습니다. LPC55S6x 장치는 PRINCE라는 암호화/암호 해독 알고리즘을 통해 이 위협을 완화합니다. [독자를 위한 참고 사항: PRINCE는 머리글자어가 아닙니다.]
PRINCE 알고리즘은 속도와 최소 리소스 요구 사항으로 인해 내장형 시스템에서 보안을 구현하는 데 적합합니다. LPC55S6x 장치의 하드웨어에서 구현되는 PRINCE 알고리즘은 실시간으로 작동되며, 데이터를 읽거나 쓸 때 즉석에서 데이터를 암호 해독하거나 암호화합니다. 많은 다른 암호화 알고리즘과 달리 PRINCE 알고리즘에서는 원래 데이터 또는 중간 결과를 유지하기 위해 RAM을 사용할 필요가 없으므로 다른 보안 취약성이 해소됩니다. 따라서 개발자는 마이크로 컨트롤러의 내부 플래시에서 응용 코드, 펌웨어 이미지 및 보안 키를 더 안전하게 저장할 수 있습니다.
암호화 엔진 및 보안 플래시 스토리지에서는 데이터 교환 및 저장 기능이 잠겨 있지만 보안 내장형 시스템에서는 센서 및 트랜스듀서와 상호 작용하기 위해 동일한 수준의 보안이 필요합니다. LPC55S6x MCU 아키텍처에서는 보안 DMA 기능과 함께 코어 또는 다른 버스 마스터와 통합 주변 장치, 메모리 또는 GPIO 간에 안전하게 교환하는 메커니즘을 제공합니다(그림 3).
그림 3: NXP의 LPC55S6x 마이크로 컨트롤러는 다층 버스 매트릭스를 MSWs, MPC 및 PPC와 결합하여 장치의 다른 버스 마스터와 주변 장치 및 메모리 간의 트랜잭션을 분리 및 보호합니다. (이미지 출처: NXP Semiconductors)
이 보호 체계에서 메모리 보호 검사기(MPC)는 보안되지 않은 응용 제품의 메모리 액세스를 제한합니다. 주변 장치 보호 검사기(PPC)는 주변 장치에 대해 동일한 유형의 액세스 제어를 제공하여 개발자가 주변 장치별로 다른 액세스 규칙을 설정할 수 있도록 허용합니다. SAU/IDU 메커니즘은 기본 Cortex-M33 코어에만 사용할 수 있으므로, 다른 버스 마스터에 대해 비슷한 액세스 보호를 제공하기 위해 마스터 보안 래퍼(MSW)가 사용됩니다. 다층 AHB 매트릭스는 버스 마스터와 주변 장치 또는 메모리 사이에 전용 경로를 생성하므로, 결과적으로 보안 내부 버스 연결이 장치에서 발생하는 다른 버스 트랜잭션과 분리됩니다.
또한 LPC55S6x MCU 아키텍처는 보안 GPIO 시스템을 통해 외부 장치에 대한 보안 액세스와 비보안 액세스를 분리합니다. 이 시스템은 보안 및 비보안 CPU 상태와 코드 실행 모드 사이에서 TrustZone 메커니즘에 의해 생성되는 GPIO 핀으로 동일한 유형의 분리 기능을 확장합니다. 그러면 보안 상태로 작동 중인 기본 Cortex-M33 코어에서만 보안 GPIO 핀에 액세스할 수 있으므로, 개발자가 중요 외부 장치에서 수신되는 신호를 보호할 수 있습니다.
보안 키 관리
이 기사에서 지금까지 설명한 다양한 보호 메커니즘은 보안 내장형 시스템의 기초를 제공합니다. 하지만 해당 시스템을 네트워크, 스마트폰 또는 다른 호스트에 안전하게 연결하려면 개발자가 초기 커미셔닝 및 지속적 트랜잭션 중에 연결 대상을 인증하고, 안전하게 암호화된 통신 채널을 유지할 수 있어야 합니다. 결과적으로 인증 프로토콜과 암호화 메커니즘의 핵심이 되는 비대칭 및 대칭 암호화 알고리즘의 보안이 해당 프로토콜 및 메커니즘에서 사용되는 개인 키의 보안에 따라 달라집니다.
통합 PUF(Physical Unclonable Function)를 사용하여 LPC55S6x 마이크로 컨트롤러는 기존 키를 안전하게 저장하고 새 키를 생성할 수 있는 매우 안전한 메커니즘을 제공합니다. 이 접근 방식은 다른 사용자 키를 암호화하는 데 사용되는 고유한 PUF 루트 키를 생성할 수 있는 PUF 하드웨어의 기능을 중심으로 돌아갑니다. PUF 루트 키의 고유성은 전원을 켤 때 SRAM 셀에서 임의의 0 및 1 콘텐츠로부터 파생되는 SRAM 시작 데이터와 내부 장치 함수의 사용에서 유래됩니다. PUF 등록 단계 중에 장치에서는 이 두 임의 데이터 소스를 사용하여 디지털 지문 및 연결된 1192바이트 활성화 코드를 생성합니다(그림 4).
그림 4: NXP LPC55S6x 마이크로 컨트롤러의 통합 PUF에서는 시작 시 SRAM의 임의의 상태와 다른 내부 함수를 사용하여 후속 키 생성 및 스토리지 작업에 사용되는 디지털 지문 및 활성화 코드를 생성합니다. (이미지 출처: NXP Semiconductors)
공장 또는 이후에 현장에서 장치 프로비저닝 중에 이 활성화 코드는 장치에서 보호되는 플래시 영역의 고객 현장 내 프로그래밍 가능 영역(CFPA)에 저장됩니다. 마이크로 컨트롤러의 전원을 켜고 PUF 시작 명령을 통해 PUF를 활성화할 때마다 PUF에서는 기존 활성화 코드를 SRAM 시작 데이터와 결합하여 디지털 지문을 재구성합니다.
이 PUF 시작 절차 이후에 PUF SetKey 명령을 실행하여 PUF에서 사용자 키(예: 공장에서 프로비저닝되는 공유 마스터 키, 개발자가 응용 제품에 제공하는 개인 키)를 인코딩합니다. 여기서 PUF는 키 크기, 키 인덱스 및 사용자 키를 기반으로 해당 사용자 키에 대한 키 코드를 생성합니다(그림 5).
그림 5: NXP의 LPC55S6x PUF는 디지털 지문을 통해 사용자 키 및 키 인덱스를 인코딩하는 SetKey 함수를 제공하여 나중에 원래 사용자 키에 액세스하는 데 사용되는 키 코드를 제공합니다. (이미지 출처: NXP Semiconductors)
개발자는 PUF GenerateKey 명령을 사용하여 새로운 키를 생성할 수도 있습니다. 이 명령은 SetKey와 동일한 생성 프로세스를 사용하지만 그림 5에 표시된 KEYIN 함수 대신 내부적으로 생성된 고유한 데이터를 사용합니다. 아래 설명된 대로 키 인덱스를 0으로 지정하여 키를 설정하거나 생성하여 보호를 강화할 수 있습니다.
키를 사용하기 위해 개발자는 PUF GetKey 명령을 호출하여 원래 사용자 키를 검색합니다. 이때 키를 설정하거나 생성할 때 사용된 키 인덱스 값에 따라 출력 경로가 둘 중 하나로 달라집니다. 키 인덱스가 0보다 큰 경우 PUF CODEOUTPUT 레지스터를 통해 사용자 키를 사용할 수 있습니다. 키 인덱스가 0인 경우 사용자 키가 AES 엔진에 직접 전달되거나 KEYENABLE 값에 지정된 PRINCE 엔진에서 지원되는 세 플래시 메모리 영역에 전달됩니다(그림 6). 키 검색에 직접 포함되지는 않지만 PUF의 4비트 KEYMASK 레지스터는 부채널 공격을 완화하도록 설계된 내부 메커니즘을 지원합니다.
그림 6: 키에 액세스하기 위해 개발자는 NXP LPC55S6x PUF GetKey 명령을 사용합니다. 여기서는 SetKey(또는 GenerateKey) 작업 중에 생성되는 키 인덱스 및 키 코드를 사용하여 원래 사용자 키를 출력하거나 비공개 버스를 통해 마이크로 컨트롤러의 암호화 가속기로 원래 사용자 키를 전송합니다. (이미지 출처: NXP Semiconductors)
인덱스가 0부터 시작하는 키를 사용하면 공장 프로비저닝 단계부터 수명 주기 보안을 강화할 수 있습니다. PUF SetKey를 통해 프로비저닝되는 경우 대칭 암호화에 사용되는 공유 마스터 키 또는 비대칭 암호화에 사용되는 개인 키로 장치를 종료하거나 시스템 버스를 시작할 수 없습니다. 대신 소프트웨어에서 액세스할 수 없는 전용 하드와이어 인터페이스를 통해 키가 AES 또는 PRINCE 엔진에 내부적으로 전송됩니다.
PUF 키 관리 메커니즘과 마이크로 컨트롤러의 다른 보안 기능이 보안 부트 및 펌웨어 업데이트를 비롯한 다른 수명 주기 보안 단계에서 함께 사용됩니다. 보안 부트의 경우 LPC55S6x는 PRINCE 플래시 영역에 저장된 이미지 암호화 또는 검증된 X.509 인증서를 사용한 RSA2048 서명 이미지 인증을 비롯한 다양한 보호 방법을 지원합니다. 어느 경우든 부트로더는 보호된 플래시 영역에 이미지와 함께 저장된 PUF 생성 키를 사용하여 PUF 키 저장소에서 인증서 유효성 검사 또는 이미지 암호 해독에 필요한 키를 안전하게 검색합니다.
펌웨어 업데이트에서는 비슷한 메커니즘을 사용하여 무선 업데이트 펌웨어 이미지를 인증하고, 암호 해독한 후 부트 준비를 합니다.
보안 부트 및 펌웨어 업데이트의 당면한 필요성을 넘어 장치의 여러 키 저장소 슬롯과 키 생성 기능은 키 및 인증서 해지를 위한 지속적 보안 수명 주기 요구 사항을 지원합니다. 즉, 이 키 관리 기능은 펌웨어 이미지 해지와 같은 상위 수준 보안 정책을 지원합니다.
개발자는 NXP LPCXpresso55S69 개발 기판을 NXP의 MCUXpresso 통합 개발 환경(IDE), IAR 또는 Keil IDE와 함께 사용하여 LPC55S6x 마이크로 컨트롤러의 기능을 빠르게 살펴볼 수 있습니다. MCUXpresso IDE에 통합된 MCUXpresso 구성 도구를 사용하면 개발자가 MCU 하드웨어를 설정하고 초기화 코드를 생성할 수 있습니다. 이 구성 도구 세트에서 신뢰할 수 있는 실행 환경(TEE) 도구를 사용하여 개발자가 LPC55S6x MCU의 다중 레벨 보안 액세스를 쉽게 구성할 수 있습니다. 개발자는 TEE 도구의 그래픽 인터페이스를 사용하여 앞서 설명한 네 CPU 상태 및 실행 모드 각각에 대해 메모리, 버스 마스터 및 주변 장치에 대한 액세스 권한을 구체화할 수 있습니다(그림 7).
그림 7: 개발자는 NXP MCUXpresso 구성 도구 유틸리티 세트 내에서 신뢰할 수 있는 실행 환경 도구의 그래픽 인터페이스를 사용하여 네 CPU 상태 및 실행 모드에서 실행 중인 코드를 위해 메모리, 버스 마스터 및 주변 장치에 대한 액세스 권한을 설정할 수 있습니다. (이미지 출처: NXP Semiconductors)
또한 코드 개발을 위해 NXP는 보안 GPIO, PUF 키 관리, 다른 장치 기능 등 마이크로 컨트롤러의 보안 기능을 사용하기 위한 기본 설계 패턴을 제공하는 많은 간단한 코드 예를 제공합니다. 하지만 개발 단계 중에도 LPC55S6x MCU를 사용하면 단일 전선 디버그(SWD) 인증 기능을 통해 수명 주기 보안을 유지할 수 있습니다.
인증 기능 이 기능을 사용하면 인증된 개발자가 보안 코드를 디버깅하고 비보안 소프트웨어 개발자에게 개발을 위임하기 전에 보안 관련 자료에 대한 추가 SWD 액세스를 비활성화할 수 있습니다. 즉, 개발자가 코드 디버그를 마친 이후에 SWD 포트를 통한 모든 디버그 액세스를 비활성화할 수 있습니다.
결론
개발자는 공장 프로비저닝부터 현장 보안 작업까지 수명 주기 전반에서 보안을 유지할 수 있는 저전력 고성능 설계에 대한 부담이 커지고 있습니다. 여기서 설명한 대로 NXP의 LPC55S6x 마이크로 컨트롤러 제품군은 범용 처리 기능을 수명 주기 보안을 지원하는 데 필요한 포괄적인 특수 하드웨어 기능과 결합하는 효과적인 솔루션을 제공합니다.
면책 조항: 이 웹 사이트에서 여러 작성자 및/또는 포럼 참가자가 명시한 의견, 생각 및 견해는 DigiKey의 의견, 생각 및 견해 또는 DigiKey의 공식 정책과 관련이 없습니다.