반응형

1. Device Firmware Update process

장치 펌웨어 업데이트를 수행하려면 두가지 장치 (DFU 대상과 DFU 컨트롤러)가 필요하다.

DFU 대상은 새 어플리케이션, SoftDevice, 부트로더 또는 SoftDevice와 부트로더의 조합을

포함할 수 있는 새 펌웨어 이미지로 업데이트되는 장치이다.

DFU 컨트롤러는 이미지를 전송하는 장치이다. 예를 들어 DFU 컨트롤러는 앱을 실행하는

휴대폰이거나 nrfutil 과 함께 nRF5 개발 키트가 될 수 있다.

 

DFU 대상은 적어도 하나의 Active DFU Transport가 있는 DFU를 실행하는 장치이다. DFU 모드의

부트로더일 수 있고, 백그라운드에서 실행되는 DFU가 있는 어플리케이션(예 DFU over TFTP)일 수 있다.

그런 다음 DFU 컨트롤러는 펌웨어 이미지의 전송을 시작할 수 있으며, 이는 DFU 대상에서 수신되고 

검증된다. 이미지가 유효하면 장치가 Reset되고 부트로더가 이미지를 활설화하여 기존 펌웨어를

교체한다. 이미지의 유형에 따라 어플리케이션, SoftDevice 또는 업데이트를 수신하는 현재 부트로더를

대체할 수 있다.

이미지가 저장되는 위치와 복사 방법에 대한 자세한 내용은 Dual-bank and single-bank updates를 참조한다.

DFU 컨트롤러로 다음의 Nordic Tool을 사용할 수 있다.

  • nrfutil (version 2.2.0 or later)
  • nRF Connect for Desktop
  • Nordic's mobile apps, such as nRF Connect for Mobile.

DFU 모듈은 DFU 대상을 구현하는데 사용될 수 있다.

다음 순서도는 DFU 대상에서 구현해야하는 펌웨어 업데이트에 필요한 단계를 보여 준다.

펌웨어 업데이트 프로세스에 대한 이벤트 및 절차는 사용 중인 전송 프로토콜과 무관하다.

DFU 모듈에는 BLE, UART 및 USB CDC에 대한 구현이 포함되어 있다. (DFU protocol 참조)

DFU 컨트롤러는 DFU 전송에서 해당 메세지를 전송하여 이벤트를 트리거할 수 있다.

2. DFU procedure

nrfutil 도구는 하나 또는 두개의 업데이트가 포함된 zip파일을 생성한다.

(Creating a firmware package with nrfutil 참조)

단일 업데이트는 새로운 펌웨어 세부 정보와 바이너리 데이터가 포함된 초기화 패킷으로

구성된다. DFU 컨트롤러는 초기화 패킷을 보내고 DFU 대상의 확인을 기다린다.

DFU 대상은 초기화 패킷의 유효성을 검사하고 결과로 응답한다.

유효성 검사가 성공하면 DFU 컨트롤러가 바이너리 데이터를 보낸다.

DFU 대상이 바이너리 데이터를 수신하면 검증이 수행된다.

검증에 성공하면 DFU 대상이 Reset되고 부트로더가 새 펌웨어를 활성화한다.

Zip파일에 두개의 업데이트가 포함된 경우 DFU 컨트롤러는 DFU 대상이 DFU 모드로

들어갈 것을 예상하고 연결을 설정하고 두번째 초기화 패킷을 전송하여 두번째 업데이트를

수행하려고 시도한다. DFU 컨트롤러 어플리케이션 사용자 입장에서는 이러한 업데이트가

2단계로 수행되더라도 단일 업데이트로 인식된다.

단일 업데이트에는 다음 요소가 포함될 수 있다.

  • the application,
  • a SoftDevice,
  • the bootloader,
  • the bootloader and a SoftDevice.

업데이트에 어플리케이션과 SoftDevice( 및 부트로더)가 포함되어야 하는 경우 zip 패키지에는

두 개의 업데이트가 포함된다. 부트로더가 SoftDevice에 의존하는 경우(Bootloader dependencies참조)

SoftDevice 업데이트가 포함된 패키지에 부트로더가 포함될 수 있다.

 

새 SoftDevice(및 부트로더)의 활성화로 끝나는 첫번째 단계를 완료한 후 어플리케이션은 여전히

유효하지만 SoftDevice 종속성이 손상되어 실행할 수 없다. 두번째 단계에서 업데이트해야 한다.

SoftDevice로 패키지를 활성화한 후 부트로더는 어플리케이션 업데이트를 기대하는 DFU모드로

들어간다. 어플리케이션 업데이트는 선택사항(SoftDevice minor version update후에는 필요하지 않음)

이므로 부트로더의 비활성 시간 제한은 기본값(NRF_BL_DFU_CONTINUATION_TIMEOUT_MS)과

다른(더 짧은)값으로 설정된다.

반응형
반응형

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

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)를

사용해야 한다.

 

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

범위를 벗어난다.

 

 

반응형
반응형

[nRF5 SDK v16.0.0 기준]

1. Bootloader

부트로더 모듈은 다음을 담당한다.

  • 응용프로그램으로 부팅
  • 새 펌웨어 활성화
  • 선택적으로 DFU 전송을 활성화하고 새 펌웨어가 제공될 수 있는 DFU Mode로 진입
  • Watchdog 타이머 feeding

SDK에 제공된 각각의 부트로더 예제는 하나의 DFU 으로 구성된다.

API에 대한 개요는 Bootloader modules을 참조한다.

2. Bootloader Settings page

비휘발성 메모리의 페이지(Memory layout 참조)는 부트로더 및 DFU 정보를 유지하는데

사용된다. 설정 페이지에는 다음에 대한 정보가 포함되어 있다.

  • 현재 펌웨어 - size, CRC32
  • 보류 중인 펌웨어 - size, CRC32
  • 펌웨어 업데이트 진행 상황
  • 펌웨어 활성화 상황
  • 현재 펌웨어 버전(응용프로그램 및 부트로더)
  • 전송 관련 데이터

3. Firmware activation

펌웨어 활성화는 펌웨어 업데이트 프로세스의 마지막 단계이다. 활성화는 부팅 중에 읽은 설정

페이지의 정보를 기반으로 트리거 된다.

펌웨어 활성화에는 기존 펌웨어 대신 새 펌웨어를 복사하고

(Dual-Bank update의 경우 Dual-bank and single-bank updates 참조)

새 펌웨어를 부팅할 수 있도록 설정 페이지를 업데이트한다.

부트로더는 복사가 전원 fail-safe를 보장한다. 부트로더를 업데이트할 경우

MBR Feature를 사용하여 전원 fail-safe 복사(SD_MBR_COMMAND_COPY_BL)를 수행한다.

4. DFU Mode

DFU 모드에서 부트로더는 DFU 전송을 활성화하고 장치는 새 펌웨어를 받을 준비가 된다.

부트로더는 다음 조건에서 DFU 모드로 진입한다.

DFU모드에 들어가면 비활성 타이머가 시작된다. 타이머가 만료되면 부트로더가 재설정된다.

비활성 타이머는 모든 DFU 활동에서 재시작된다. 비활성 타임 아웃은 NRF_BL_DFU_INACTIVITY_TIMEOUT_MS 로

설정된다. SoftDevice 활성화 후 DFU 모드로 전환되면 타임 아웃은 NRF_BL_DFU_CONTINUATION_TIMEOUT_MS 로

설정된다.

5. Starting the application

설정 페이지의 정보를 기반으로 부트로더는 어플리케이션의 존재 여부와 위치를 결정한다.

부트로더는 시작하기 전에 어플리케이션의 무결성을 확인한다.

선택적으로 부팅시간을 줄이기 위해 무결성 검사를 건너 뛸 수 있다.

(NRF_BL_APP_CRC_CHECK_SKIPPED_ON_GPREGRET2, NRF_BL_APP_CRC_CHECK_SKIPPED_ON_SYSTEMOFF_RESET)

다음의 조건이 발생하면, 부트로더는 DFU 모드로 진입한다.

  • 어플리케이션이 설치되어 있지 않음.
  • 무결성 검사 실패.
  • 설정 페이지가 없음.

6. Watchdog timer support

부트로더는 Watchdog 타이머가 활성 상태인지 감지하고 이를 Feed하여 Watchdog reset을 방지한다.

7. Bootloader dependencies

전송을 제외한 부트로더 모듈은 SoftDevice에 의존하지 않는다. BLE DFU 전송 (BLE 참조)만

SoftDevice에 종속된다.

부트로더는 SoftDevice가 시스템에 전혀 존재하지 않는 경우를 지원한다.

8. Programming the bootloader

시스템 시작 중 MBR(Marster Boot Record)은 부트로더가 설치된 경우 부트로더 시작을 담당한다.

이렇게 하려면 MBR이 부트로더의 시작 주소를 알아야 한다. 이 시작 주소는 MBR 자체 또는

MBR_UICR_BOOTLOADER_ADDR에 정의된다. 부트로더를 프로그래밍할 때 이 값을

올바른 값으로 설정해야 한다. 자세한 내용은 S132 SoftDevice Specification 을 참조한다.

부트로더는 기본적으로 시작 주소를 MBR_UICR_BOOTLOADER_ADDR 에 배치하고,

처음 부팅하는동안 시작 주소를 MBR_BOOTLOADER_ADDR 에 쓴다.

부트로더를 프로그래밍하려면 다음 단계가 필요하다.

  • 장치를 지운다.
  • SoftDevice를 프로그래밍한다.(Programming SoftDevices 지침 참조)
  • 부트로더를 컴파일한다.
  • 부트로더를 프로그래밍한다. Segger Embedded Studio 와 nrfjprog directly(GCC 사용시) 에 대한 지침은 다음을 참조한다.

9. Programming using Segger Embedded Studio

부트로더 응용 프로그램이 플래시 될 때 Segger Embedded Studio에서 SoftDevice 및 UICR을

암시적으로 프로그래밍하므로 추가 작업이 필요하지 않다.

10. Programming using nrfjprog directly

명령줄에서 직접 nrfjprog 를 사용하여 부트로더를 프로그래밍 할 수도 있다.

이렇게 하려면 다음 명령을 실행한다.

nrfjprog --reset --program application.hex --family NRF52 --sectoranduicrerase

"application.hex"를 hex 파일의 이름으로 변경한다.

11. Memory layout

장치에 부트로더를 추가할 때 장치 메모리에서 다른 펌웨어 구성 요소가 있는 위치를 알고 있어야 한다.

다음 표는 현재 SoftDevices가 있는 다양한 칩의 메모리 레이아웃을 보여준다.

다음 그림은 nRF52장치의 기본 메모리 레이아웃을 보여준다. 여기서 nRF52832의 플래시 크기는 512kB, nRF52840의

플래시 크기는 1024kB, nRF52810의 플래시 크기는 192kB, nRF52833의 플래시 크기는 512kB이다.

부트로더의 크기는 장치의 수명동안 고정된다. 부트로더의 시작 주소를 저장하는 위치(MBR_BOOTLOADER_ADDR)를 안전하게 업데이트할 수 없기 때문이다. 자세한 내용은 SoftDevice Specification 을 참조한다.

 

반응형
반응형

부트로더 및 DFU 모듈은 SDK의 일부로 제공되는 Secure Bootloader, Open Bootloader with DFU에

사용되지만, 이를 사용하여 사용자 정의 부트로더를 빌드할 수도 있다.

기본적으로 부트로더는 메모리의 특정 위치에 있는 응용프로그램을 시작하므로

이러한 부트로더의 기능을 구현할 수 있다. 

예를 들어 여러 응용 프로그램 간에 전환이나, 응용 프로그램을 시작하기 전 장치를 초기화할 수 있다.

부트로더 모듈이 제공하는 가장 중요한 기능은 DFU(Device Firmware Update)기능이다.

DFU의 주요 기능은 다음과 같다.

  • 응용 프로그램, SoftDevice 및 부트로더 업데이트
  • 인증된 소스의 업데이트(서명된 업데이트)
  • 다운그레이드 방지
  • 하드웨어 호환성 검증
  • 다양한 전송 : BLE, UART,USBD
  • SoftDevice 유무에 관계없이 어플리케이션 업데이트 지원
  • SoftDevice 종속 펌웨어를 SoftDevice 독립 펌웨어로 교체하기 위한 지원
  • SoftDevice 독립 펌웨어를 SoftDevice 종속 펌웨어로 교체하기 위한 지원

ANT를 사용하는 DFU 부트로더의 경우 실험 : ANT Secure DFU 부트로더 예제 참조

다음 그림은 부트로더 모듈의 계층 아키텍처를 보여준다.

사용 가능한 모듈에 대한 자세한 내용은 다음 페이지를 참조한다.

또한 보안 기능을 구현하고 DFU 부트로더에 서명하는데 사용할 수 있는 암호화 라이브러리 

에 대한 정보를 참조한다.

nRF52840 전용의 DFU 트리거 라이브러리(USB)도 참조한다. 

Secure BootloaderOpen Bootloader with DFU 예제는 보안 및 개방형 장치 펌웨어 업데이트 전송의 전체 구현이다.

반응형

+ Recent posts