모든 KeyMint 키는 기기의 신뢰할 수 있는 루트에 바인딩되어야 합니다. 신뢰할 수 있는 루트는 부팅 이미지의 서명을 확인하는 데 사용되는 공개 키에서 파생된 비트 문자열로, 부트로더 잠금 상태와 함께 제공됩니다.
KeyMint 키는 기기의 운영체제 버전 및 패치 수준에도 결합되어야 합니다. Treble의 모듈식 구조를 지원하기 위해 이 버전 결합에는 각 파티션(boot
, system
, vendor
)에 관한 별도의 패치 수준이 포함됩니다. 이렇게 하면 롤백 보호 기능을 계속 제공하면서 각 파티션을 독립적으로 업데이트할 수 있습니다.
이 버전 결합을 구현하려면 KeyMint 신뢰할 수 있는 앱 (TA)에 현재 OS 버전 및 패치 수준을 안전하게 수신하고 수신하는 정보가 실행 중인 시스템에 관한 모든 정보와 일치하는지 확인하는 방법이 필요합니다.
- Android 자체 검사 부팅 (AVB)이 있는 기기:
- 패치 수준과 OS 버전은
vbmeta.img
에 포함할 수 있으므로 부트로더가 KeyMint에 제공할 수 있습니다. - 연결된 파티션의 경우 파티션의 버전 정보는 연결된 VBMeta에 저장됩니다.
- 일반적으로 버전 정보는 지정된 파티션의 검증 데이터 (해시 또는 해시트리)를 포함하는
VBMeta struct
에 있어야 합니다.
- 패치 수준과 OS 버전은
- AVB가 없는 기기:
- 자체 검사 부팅 구현은 부트로더가 KeyMint에 해시를 제공할 수 있도록 버전 메타데이터의 해시를 부트로더에 제공해야 합니다.
boot.img
는 패치 수준을 헤더에 계속해서 저장할 수 있습니다.system.img
는 패치 수준 및 OS 버전을 읽기 전용 속성에 계속해서 저장할 수 있습니다.vendor.img
는 읽기 전용 속성ro.vendor.build.version.security_patch
에 패치 수준을 저장합니다.- 부트로더는 자체 검사 부팅으로 확인된 모든 데이터의 해시를 KeyMint에 제공할 수 있습니다.
다음 태그는 관련 파티션의 버전 정보를 설명합니다.
Tag::VENDOR_PATCHLEVEL
:vendor
파티션Tag::BOOT_PATCHLEVEL
:boot
파티션Tag::OS_PATCHLEVEL
및OS_VERSION
:system
파티션 (OS_VERSION
은boot.img
헤더에서 삭제됩니다.)
KeyMint 구현은 모든 패치 수준을 독립적으로 취급해야 합니다. 모든 버전 정보가 키와 연결된 값과 일치하면 키를 사용할 수 있습니다. 현재 기기 버전이 키와 연결된 값보다 최신 버전인 경우 키를 사용하려고 하면 KeyMint에서 KEY_REQUIRES_UPGRADE
오류를 반환합니다. 그런 다음 키 저장소는 IKeyMintDevice::upgradeKey()
를 실행하여 현재 패치 수준에 바인딩된 새 키 blob을 생성합니다. 이후 키 저장소는 IKeyMintDevice::deleteKey()
호출을 통해 이전 키 blob을 삭제합니다.