반응형

먼저 부트로더 및 어플리케이션의 구성이 프로젝트에 맞게 조정되었는지 확인한다.

Security Configuration of the app and bootloader 참조

 

보안 부팅(Secure boot)은 부팅하기 전에 설치된 펌웨어에서 서명 확인 절차를 수행한다.

이는 서명을 생성하는데 사용된 개인키의 소유자가 펌웨어를 인증했는지 확인하기 위한 것이다.

1. Introduction

nRF5 SDK 프로젝트가 부트로더를 사용하는 경우 시스템에는 최대 4개의 개별 독립 실행형 프로그램

또는 이미지가 포함될 수 있다.

  • Master Boot Record (MBR)
  • SoftDevice
  • Application
  • bootloader itself

장치가 핀 리셋이나 소프트 리셋(소프트웨어에 의해 트리거) 또는 슬립 상태에서 깨어나는 등의

리셋 상태에서 빠져나올 때 디버깅이 활설화되어 있지 않은 경우 항상 0번지의 이미지를 실행한다.

 

부팅되는 첫번재 이미지는 MBR이다. MBR을 첫번째 이미지로 사용할 수 있어야 한다.

MBR은 부트로더의 위치를 찾아 부팅한다.

부트로더를 찾을 수 없으면 0x1000(nRF52의 경우)에서 바로 이어지는 이미지를 부팅한다.

 

부트로더는 보안 부팅 기능을 담당한다. 암호화 서명을 사용하여 펌웨어가 개인키로 서명된 것을

확인하고 손상되지 않았는지 확인한다.

이러한 수행은 두가지 중요한 지점(시스템을 부팅할 때, 펌웨어 업데이트가 수신될 때마다)에서 수행된다.

  • 부팅시 이미 존재하는 코드가 변경되지 않았는지 확인한다.(Boot validation 참조)
  • 업데이트시 도착하는 모든 새 코드가 유효한지 확인한다.(Activation of updates 참조)
이러한 검사는 sdk_config.h 파일을 사용하여 활성화하거나 비활성화할 수 있다.
보안 부팅 프로세스에 대한 이 설명에서는 업데이트시 서명 확인이 활성화되어 있다고 가정한다.

암호화 외에도 부트로더는 하드웨어 보호 메커니즘을 사용하여 장치의 코드가 변경되지 않은 상태로

유지되도록한다. nRF52 장치에는 다음 Reset까지 플래시에 대한 쓰기 액세스를

비활성화하는데 사용할 수 있는 BPROT 또는 ACL이 있다.

Reset을 통하지 않는 한 비활성화된 쓰기 액세스는 다시 활성화할 수 없다.

부트로더는 이 기능을 사용하여 부팅되는 즉시 자신과 MBR을 보호하고

어플리케이션과 SoftDevice를 부팅하기 전에 보호한다.

MBR과 부트로더는 함께 시스템의 Root of Trust(RoT)를 구성한다.

이들은 먼저 부팅되기 때문에 어플리케이션에 의한 의도하지 않거나

악의적인 변조로부터 시스템을 보호하고 삽입된 코드를 감지할 수 있다.

2. Boot validation

이번 섹션은 부팅 유효성 검사의 다양한 측면에 대해 설명한다.

2.1 암호화(Cryptography)

부트로더는 ECDSA(Elliptic Curve Digital Signature Algorithm) secp256r1을

SHA-256 해싱 알고리즘과 함께 사용한다. ECDSA 공개키는 압축되지 않은

원시 형식(little-endian X followed by little-endian Y)으로 부트로더에 컴파일된다.

서명은 little-endian R followed by little-endian S로 저장된다.

이 문서에서 서명(Signature)은 ECDSA 디지털 서명을 나타낸다.
다이제스트(Digest)는 SHA-256 암호화 다이제스트를 나타낸다.

2.2 Boot validation modes

부팅 유효성 검사는 구성에 따라 4가지 모드로 실행할 수 있다.

  • Signature validation (ECDSA):
    부팅할 때마다 서명에 대한 직접 인증. 전력과 시간면에서 가장 높은 보안과 가장 높은 비용.
    이 모드만 보안 부팅으로 간주할 수 있다.
  • Hash validation (SHA-256):
    보안이 낮고 전력 및 시간 비용이 약간 낮다. 해시 유효성 검사는 코드에 대한 의도하지 않은 변경을
    감지할 수 있지만 해시 검사를 우회하거나 참조 다이제스트를 다시 작성할 정도로 발전된
    의도적이고 악의적인 변경은 감지할 수 없다.
  • CRC validation (CRC32):
    우연한 사건에 대한 보호이지만 이로적으로 악의적인 공격에 대한 보호는 없다.
    전력 및 시간 비용이 크게 절감된다.
  • No validation:
    전력 및 시간 비용은 기본적으로 쓰기 방지를 적용하고 DFU작업이 요청되었는지 확인하고
    다음 단계로 부팅하는 MBR 및 부틀더의 짧은 하우스 키핑 작업으로 제한된다.

2.3 Selecting the boot validation mode

펌웨어 업데이트 패키지는 각 이미지에 사용할 모드를 결정한다.

부트로더가 검증을 수행하기 때문에 SoftDevice와 어플리케이션만 검증할 수 있다.

부트로더는 업데이트될 때 항상 확인된다.

 

Signature 모드가 지정되면 서명도 업데이트 패키지의 일부이다.

이 서명은 업데이트 패키지 자체를 확인하는데 사용되는 것과 동일한 공개키를 사용하여 확인된다.

 

Hash 및 CRC 모드의 경우 참조 다이제스트가 온칩으로 생성되고 업데이트가 적용될 때 플래시에 기록된다.

부트로더는 Signature 모드를 사용하여 업데이트 패키지만 수락하도록 구성할 수 있다.

 

4가지 보안 부팅 모드는 부팅 유효성 검사에만 적용되며

펌웨어 업그레이드 중에 수행되는 유효성 검사와는 별개이다.

즉, 업데이트 패키지에 포함된 보안 부팅 모드에 관계없이 업데이트 패키지가 서명된다.

BPROT/ACL 보호와 결합되 업데이트 시간 검증은 부팅 검증 없이도 시스템이 무단 펌웨어 이미지 설치로부터

보호된다는 것을 의미한다. 이는 부팅 유효성 검사가 각 부팅에 전력과 시간을 모두 소비하므로

특정 어플리케이션에서 사용이 제한되기 때문에 관련이 있다.

3. Root of Trust (ROT) reset

부트로더가 이미지 업그레이드와 같은 민감한 작업을 수행할 때마다 시스템은 알려진 상태로

전환되고 BPROT/ACL 보호를 해제하기 위해 Root of Trust reset을 거쳐야 한다.

4. Activation of updates

업데이트 패키지를 받은 후 부트로더는 업데이트를 마지막으로 확인하기 전에

Root of Trust reset을 요구한다. 검사를 통과하면 패키지가 활성화된다. 

패키지가 제자리에 복사되고 해당 메타데이터가 설정 페이지의 활성 부분에 기록된다.

 

부트로더 자체의 업데이트를 활성화할 때 부트로더는 재작성되는 동안 코드를 실행할 수 없기 때문에 활성화를

수행할 수없다. 대신 부트로더는 power-failure-safe copy 작업을 수행할 수 있는 MBR을 활용한다.

부트로더는 작업 세부 정보를 MBR 매개변수 페이지에 저장하는 MBR을 호출한다.(SVC를 통해)

그런 다음 MBR은 자체 Root of Trust reset을 수행하고 MBR 매개변수 페이지에 남겨둔 지침을 따른다.

복사 절차 중 언제든지 reset이 발행하면 세부 정보가 플래시에 저장되기 때문에 MBR이 복사 작업을 계속하거나

다시 시작한다. 이 작업이 완료되면 MBR 매개변수 페이지를 지우고 새 부트로더를 부팅한다.

5. Bootloader settings backup

부트로더 설정 페이지에는 승인된 펌웨어 업그레이드의 결과로만 변경되어야 하는 민감한 정보가 포함되어 있다.

이 때문에 상상 보호된 백업을 유지한다. 어플리케이션이 부트로더와 데이터를 교환할 수 있도록

원래 설정을 열어 둘 수 있다.(예: 백그라운드 DFU용)

그러나 악의적이거나 의도하지 않은 변조로부터 보호하기 위해 설정 페이지의 민감한 부분은 항상 백업에서 읽는다.

6. Recoverability

nRF5 SDK의 부트로더에는 독립 실행형 DFU 기능이 있다.

즉, 어플리케이션이 완전히 작동하지 않더라도 부트로더의 DFU메커니즘을 사용하여 시스템을 복구할 수 있다.

BLE 부트로더에는 SoftDevice가 필요하다.

구성에 따라 GPIO를 사용하여 현재 어플리케이션을 부팅하는 대신 부트로더를 DFU 모드로 강제 전환할 수 있다.

7.Security Configuration of the app and bootloader

다음 구성 옵션은 보완과 관련이 있다.

자세한 설명과 사용 가능한 구성 옵션의 전체 목록은 sdk_config.h 파일을 참조한다.

아래의 구성에 대한 몇가지 참고 사항도 참조한다.

Cortex-M4의 플래시 패치 기능은 악성 코드에서 보안 부팅 검사를 우회하는데 사용될 수 있다.

nRF52840 및 nRF52833에서는  DEBUGCTRL의 CPUFPBEN에 0x00을 Write하여 플래시 패치를

비활성화 할 수 있다. 이렇게하면 breakpoints도 비활성화되므로 기본적으로 수행되지 않는다.

NRF_BL_DEBUG_PORT_DISABLE을 활성화하면 CPUFPBEN에도 0이 Write된다.

 

Debug Access Port(DAP)는 기본적으로 CPU코어 및 주변 장치에 대한 전체 메모리 액세스 및 레지스터 액세스

권한을 갖는다. APPROTECT를 사용하여 DAP를 비활성화할 수 있다. nRF52840 및 nRF52833에서

ITM/ETM 추적은 DEBUGCTRL을 사용하여 비활성화할 수도 있다. NRF_BL_DEBUG_PORT_DISABLE 구성

옵션을 활성화하면 UICR 레지스터의 APPROTECTDEBUGCTRL이 모두 비활성화된다.

 

어플리케이션 버전을 엄격하게 오름차순으로 적용하면 이전 버전의 이미지에서 알려진 보안 결함을 악용하는

롤백 공격을 방지할 수 있다. NRF_DFU_APP_ACCEPT_SAME_VERSION 구성 옵션을 비활성화하여 

이 작업을 수행할 수 있다.

 

여러 프로젝트가 공개키를 공유하는 경우 한 프로젝트의 이미지가 다른 프로젝트의 장치에 적용되어

잠재적으로 briking될 위험이 있다. 이를 방지하려면 프로젝트에서 다른 HW ID(NRF_DFU_HW_VERSION)를

사용해야 한다.

 

개인키에 액세스할 수 있는 사람은 누구나 원하는 펌웨어를 장치에 넣을 수 있다. 개인키 관리는 이 문서의

범위를 벗어난다.

 

 

반응형

+ Recent posts