부트로더 사용

잠금 해제 및 Trusty

권장사항

모든 Google 브랜드 기기는 위에서 나열한 모든 파티션을 다시 플래싱할 수 있도록 잠금 해제가 가능해야 합니다.  이 잠금 해제 모드는 fastboot flashing unlock을 통해 설정되며, 일단 설정되면 재부팅 후에도 지속됩니다.

fastboot flashing get_unlock_ability 가 '1'이 아닌 경우라면 기기는 fastboot flashing unlock 명령어를 거부해야 합니다. get_unlock_ability가 '0'인 경우 사용자는 홈 화면으로 부팅한 후 설정 > 시스템 > 개발자 옵션 메뉴로 이동하고 OEM 잠금 해제 옵션을 사용 설정하여 unlock_ability를 '1'로 설정해야 합니다. 이 플래그는 재부팅 및 초기화 중에 유지되어야 합니다.

fastboot flashing unlock 명령어가 전송되면 기기는 비공식 이미지에 문제가 발생할 수 있음을 경고하는 메시지를 사용자에게 표시해야 합니다. 확인 후에는 초기화를 완료하여 승인되지 않은 데이터 액세스를 방지해야 합니다. 기기를 제대로 다시 포맷할 수 없는 경우에도 부트로더는 기기를 재설정해야 합니다. 재설정 이후에만 영구 플래그를 설정하여 기기를 리플래싱하도록 할 수 있습니다.

fastboot flashing lock 명령어는 기기를 다시 잠그고 재설정하여 향후 플래싱/잠금 해제 시도 시 데이터 재설정을 또 한 번 거치도록 합니다.

아직 덮어쓰지 않은 모든 RAM은 fastboot flashing unlock 처리 중에 재설정되어야 합니다. 이 측정을 통해 이전 부팅 시 남은 RAM 콘텐츠를 읽는 공격을 방지합니다. 이와 유사하게, 잠금 해제된 기기는 허용되지 않는 지연이 발생되지 않는 경우 부팅될 때마다 RAM을 삭제해야 하지만, 커널의 ramoops에 사용되는 부분은 삭제하지 않아도 됩니다.

매장 판매용 기기는 잠금 상태 및 '0'을 반환하는 get_unlock_ability로 배송되어야 합니다. 이는 공격자가 자체 시스템 또는 부팅 이미지를 설치하여 기기를 손상하지 못하도록 하기 위함입니다.

속성

ro.oem_unlock_supported 속성은 기기가 플래싱 잠금 해제를 지원하는지의 여부에 따라 빌드 시점에 설정해야 합니다. 기기에서 플래싱 잠금 해제가 지원되지 않는 경우 ro.oem_unlock_supported를 0으로 설정하고, 플래시 잠금 해제가 지원되는 경우 '1'로 설정해야 합니다.

기기가 플래싱 잠금 해제(예: ro.oem_unlock_supported = 1)를 지원한다면 부트로더는 커널 명령줄 변수 androidboot.flash.locked(또는 /firmware/android/flash.locked DT 속성)를 잠금 상태인 경우 '1'로, 잠금 해제 상태인 경우 '0'으로 설정하여 잠금 상태를 나타냅니다.

참고: dm-verity를 지원하는 기기의 경우 ro.boot.verifiedbootstate를 대신 사용하여 자체 검사 부팅 상태가 주황색일 때 값이 '0'(잠금 해제)인 ro.boot.flash.locked 값을 설정할 수 있습니다.

Flashing lock/unlock_critical

기기는 중요 섹션의 잠금 및 잠금 해제를 지원해야 합니다. 중요 섹션은 부트로더로 기기를 부팅하는 데 필요한 모든 것으로 정의됩니다. 여기에는 퓨즈, 센서 허브용 가상 파티션, 1단계 부트로더 등이 포함될 수 있습니다.

중요 섹션의 잠금은 기기에서 실행중인 모든 코드(커널, 복구 이미지, OTA 코드 등)가 중요 섹션을 의도적으로 수정하는 것을 방지하는 것으로 정의됩니다. 이는 기기가 잠금 중요 상태인 경우 OTA가 중요 섹션을 업데이트하지 못함을 의미합니다. 잠금 상태에서 잠금 해제 상태로 전환하려면 기기와의 물리적 상호작용이 필요합니다.

물리적 상호작용은 fastboot flashing unlock으로 발생하는 것과 유사하며, 사용자는 기기의 일부 실제 버튼을 눌러야 합니다. 설계는 물리적 상호작용 없이 프로그래매틱 방식으로 lock critical에서 unlock critical 으로 전환하는 것을 허용해서는 안 됩니다. 기기는 unlock critical 상태로 배송되어야 합니다.

중요 파티션/데이터 지정

기기를 실행하는 데 필요한 파티션이나 데이터는 다음 중 하나여야 합니다.

  • 다시 빌드할 수 있거나 제공되거나 fastboot oem 명령어를 통해 추출할 수 있기 때문에 다시 플래싱할 수 있습니다.
  • 완전히 보호됩니다(즉, 이전 섹션마다 중요한 것으로 간주됨).

여기에는 기기당 공장별 설정, 일련번호, 보정 데이터 등이 포함됩니다.

오프 모드 충전

기기가 '오프 모드 충전'을 지원하거나 전원이 공급될 때 특수 모드로 자동 부팅되는 경우 fastboot oem off-mode-charge 0은 사용자가 전원 버튼을 누른 것처럼 특수 모드를 우회하여 부팅해야 합니다.

Trusty용 부트로더

Trusty는 Android와 함께 실행되는 신뢰할 수 있는 실행 환경(TEE) OS를 Google에서 구현한 것입니다. ARM TrustzoneTM 기술을 사용하여 TEE를 제공하는 기기의 사양입니다.

Trusty가 ARM 기기의 보안 OS 솔루션으로 사용되는 경우 부트로더는 다음 섹션에 설명된 대로 구현되어야 합니다.

초기화

Trusty OS(TOS)를 로드하고 초기화하려면 부트로더가 다음을 실행해야 합니다.

  • 사용 가능한 모든 RAM을 설정 및 구성합니다.
  • 하나 이상의 직렬 포트를 초기화합니다.
  • TOS 이미지의 서명을 확인합니다.
  • TOS를 RAM에 로드합니다(플래시 또는 TCM에서의 실행은 지원되지 않음).
  • 다음 섹션에 설명된 대로 상태 및 레지스터를 설정한 후 TOS 이미지의 첫 번째 명령어로 이동합니다.

TOS 이미지로 호출

entry에서 다음 상태를 구성해야 합니다.

  • MMU가 사용 중지되었습니다.
  • 데이터 캐시가 플러시되고 사용 중지되었습니다(안내 캐시는 사용되거나 사용 중지될 수 있음).
  • 모든 인터럽트(IRQ 및 FIQ)가 사용 중지되었습니다.
  • CPU가 ARM v7에서는 SVC 모드이고 ARM v8에서는 EL3입니다.
  • 레지스터가 다음과 같은 상태입니다.
    • r0/x0: TOS에 할당된 메모리의 크기입니다.
    • r1/x1: 플랫폼별 부팅 매개변수가 포함된 메모리의 연속된 블록의 실제 주소입니다. 이 블록의 레이아웃은 플랫폼에 따라 다릅니다.
    • r2/x2: 위 메모리 블록의 크기입니다.
    • r14/x30: TOS가 초기화된 후 비보안 모드로 이동할 주소를 반환합니다.

참고: r0-r3/x0-x3 또한 TOS의 스크래치 레지스터 역할을합니다. 반환 시 값이 보존되지 않을 수 있습니다.

64비트 플랫폼의 경우 다음과 같습니다.

  • w0-w2는 매개변수에만 사용되므로 x0-x2는 32비트 값만 포함해야 합니다.
  • x30은 64비트 값을 포함할 수 있습니다.
  • x0의 값이 TOS 진입점의 기본 주소에 추가될 때 32비트 값이 생성됩니다. 이 사항은 레지스터 x2가 x1의 부팅 매개변수 블록 주소에 추가될 때 x2 레지스터의 크기에 동일하게 적용됩니다.

TOS에서 반환

초기화가 완료되면 TOS가 비보안 모드의 부트로더로 반환되고 SCR.NS는 '1'로 설정되어 부트로더가 기본 운영체제(예: Android) 계속 로드할 수 있도록 합니다.