ESP32 - ENABLE_SECURITY_DOWNLOAD eFuse의 역할

ESPRESSIF|2025. 9. 19. 16:52

ENABLE_SECURITY_DOWNLOAD eFuse의 역할

  • Secure boot V2에서 sign된 펌웨어만 다운로드 가능하도록 조치하기 위함
  • ENABLE_SECURITY_DOWNLOAD를 efuse에 Burn하면 ROM 다운로드 모드가 보안 모드로 전환됩니다.
  • 보안 모드에서는:
    • Secure Boot, Flash Encryption 등 보안 정책을 우회할 수 있는 기능이 차단됨
    • 인증된(서명된) 이미지나 허용된 명령만 실행 가능
  • 사실상 출하 후 물리적 공격을 통한 펌웨어 변조 가능성을 크게 줄이는 효과가 있습니다.

중요한 주의사항

  • 이 eFuse를 burn하면 espefuse.py를 통한 이후 추가 모든 eFuse 설정이 불가능해집니다.
    • 즉, eFuse 변경은 ROM 다운로드 모드를 통해서만 가능한데, 이 모드가 보안 모드로 잠기면 더 이상 eFuse를 쓸 수 없음
  • 따라서 반드시 모든 eFuse 설정(키 등록, 키 폐기, JTAG 차단, Flash Encryption 설정 등)을 완료한 뒤 마지막 단계에서만 실행해야 합니다.

명령 예시

 
espefuse.py --port <PORT> burn_efuse ENABLE_SECURITY_DOWNLOAD
  • <PORT> : ESP32가 연결된 시리얼 포트 (예: /dev/ttyUSB0 또는 COM3)
  • ENABLE_SECURITY_DOWNLOAD : 해당 eFuse 비트를 1로 설정하여 보안 다운로드 모드 활성화

적용 순서 예시 (출하 전)

  1. Secure Boot v2 설정 및 키 Digest eFuse 굽기
  2. Flash Encryption 설정 및 키 보호
  3. JTAG/USB-JTAG/Direct Boot 차단 eFuse 굽기
  4. 미사용 키 Digest 슬롯 폐기
  5. 마지막 단계에서 ENABLE_SECURITY_DOWNLOAD eFuse 굽

시큐어 부트 적용후 코드 변경시, Sign이 안된 펌웨어는 펌웨어 라이팅 자체가 안되도록 만고, Sign된 펌웨어만 펌웨어 라이팅이 가능하다. 

 

[1] 코드 변경
    ↓
[2] 새 펌웨어 빌드
    - 앱 바이너리(.bin) 생성 (서명 전 상태)
    ↓
[3] 동일한 개인키(Private Key)로 서명
    - espsecure.py sign_data ...
    - 서명 블록(Signature Block) 생성
      ├─ 공개키(Public Key)
      ├─ 이미지 해시(SHA-256)
      ├─ 서명값(RSA-PSS 또는 ECDSA)
      └─ CRC32
    ↓
[4] 플래싱 시도 (UART0/USB)
    ↓
[5] ROM 부트로더 진입
    - ENABLE_SECURITY_DOWNLOAD=1이면 "보안 다운로드 모드"로 동작
    ↓
[6] 서명 블록 존재 여부 확인
    - 없으면 → 거부
    ↓
[7] 공개키 해시(Digest) 계산
    - 서명 블록의 공개키 → SHA-256 해시
    - eFuse에 저장된 SECURE_BOOT_DIGEST0/1/2와 비교
    - 일치하지 않으면 → 거부
    ↓
[8] 서명 검증
    - eFuse에 등록된 공개키로 이미지 서명값 검증
    - 실패 시 → 거부
    ↓
[9] 검증 성공
    - 플래시 메모리에 쓰기 허용
    - 이후 부팅 시에도 동일 절차로 검증 후 실행


(주) 아이디케이 테크놀러지

ESPRESSIF 한국 공식 대리점

www.idktech.co.kr

문의메일 : INFO@IDKTECH.CO.KR