Android 8.1에 도입된 Weaver 하드웨어 추상화 계층 (HAL)
(IWeaver.aidl)은 PIN, 패턴, 비밀번호와 같은 잠금 화면 지식 요소 (LSKF)를 사용한 사용자 인증을 위한 보안 인터페이스를 제공합니다.
Weaver는 게이트키퍼의 LSKF 확인 기능을 대체합니다. 하지만 게이트키퍼는 여전히 하드웨어 인증 토큰을 생성하는 데 사용됩니다.
Android 9 이상에서 CDD 9.11.2 는 StrongBox를 지원하는 기기가 보안 사용자 인증을 지원하는 전용 보안 하드웨어를 제공하도록 요구합니다. 이 보안 하드웨어를 사용하여 Weaver HAL을 구현하면 '보안 사용자 인증' 요구사항이 충족됩니다.
전용 보안 요소 (SE)가 없는 기기에서도 Weaver는 Trusty와 같은 신뢰할 수 있는 실행 환경 (TEE)에서 구현될 수 있습니다.
구성요소
Weaver는 세 가지 구성요소로 이루어져 있습니다.
- Weaver AIDL 인터페이스 (
IWeaver): HAL의 공식 사양입니다. Android 13 이하에서는 AIDL 대신 HIDL 을 사용했습니다. - Weaver 하드웨어 추상화 계층 (HAL) 서비스:
IWeaver인터페이스를 구현하는 공급업체별 Android 프로세스입니다. - Weaver 신뢰할 수 있는 애플리케이션 (TA): 보안 환경에서 실행되는 핵심 로직입니다. LSKF 확인을 실행하고 비율 제한을 적용합니다. HAL 서비스는 구현별 보안 채널을 사용하여 TA 와 통신합니다.
인터페이스
Weaver의 인터페이스는 고정 크기 키와 고정 크기 값을 각각 포함하는 고정 크기 영구 슬롯 배열을 제공합니다. 각 슬롯은 [0, numSlots - 1] 간격의 정수인 ID로 식별됩니다. 슬롯의 값은 저장된 키와 일치하는 키가 제공된 경우에만 액세스할 수 있습니다.
Weaver의 인터페이스는 다음으로 구성됩니다.
getConfig(): 구현에서 지원하는 슬롯 수, 키 크기, 값 크기를 가져옵니다.write(): 지정된 슬롯을 새 키-값 쌍으로 덮어씁니다. 이 작업은 원자적이며 이전 데이터를 영구적으로 복구할 수 없게 만듭니다 (보안 삭제).read(): 지정된 슬롯의 값을 가져오려고 시도합니다. 이는 비율 제한 시간 제한 (TA에서 적용) 이 활성 상태가 아니고 제공된 키가 저장된 키와 정확히 일치하는 경우에만 성공합니다.
전체 인터페이스 사양은
IWeaver.aidl을 참고하세요.
Android에서 사용
Weaver 구현을 사용할 수 있는 경우 Android 시스템 서버의 LockSettingsService는 이를 사용하여 사용자 데이터를 보호합니다. 기기의 모든 사용자를 위해 LockSettingsService는 Weaver 슬롯을 관리합니다.
- 슬롯 키 (
weaverKey): 사용자의 LSKF 해시입니다. 사용자에게 화면 잠금이 없는 경우 기본 문자열이 사용됩니다. - 슬롯 값 (
weaverSecret): 엔트로피가 높고 무작위로 생성된 암호화 보안 비밀입니다.
weaverSecret은 다음 중 하나에 의해서만 가져오도록 설계되었습니다.
- 비율 제한 정책 내에서 Weaver TA에 올바른
weaverKey를 제공합니다. - Weaver TA가 실행되는 보안 환경을 손상시킵니다. 이는 매우 어렵도록 설계되었습니다.
LockSettingsService 는 weaverKey와 weaverSecret을 모두 사용하여 사용자의 합성 비밀번호를 암호화합니다. 합성 비밀번호는 파일 기반 암호화 (FBE)를 위한 사용자의 사용자 인증 정보 암호화 (CE) 스토리지와 Android 키 저장소의 사용자 인증 바인딩 키를 보호하므로 Weaver가 보안 비밀을 해제할 때까지 데이터에 액세스할 수 없습니다.
Weaver와 게이트키퍼
이전에는
게이트키퍼 HAL
이 단일 verify() 호출에서 두 가지 고유한 역할을 실행했습니다.
- 확인: TEE에서 적용하는 비율 제한으로 LSKF를 확인합니다.
- 증명: LSKF 인증이 성공했음을 KeyMint(이전의 Keymaster)에 알리기 위해
HardwareAuthToken을(를) 발급합니다.
Weaver로 전환하는 이유는 무엇인가요?
Android 8.1에서 보안
비밀번호 재설정 토큰이 도입됨에 따라 "합성 비밀번호"가
기본 암호화 보안 비밀이 되었습니다. 위에서 설명한 두 가지 역할은 이제
별도의 게이트키퍼 등록으로 처리됩니다. 하나는 LSKF용이고 다른 하나는 합성 비밀번호용입니다.userId + 100000userId
Weaver는 보안 요소 (SE) 기반 구현을 지원하는 더 간단한 HAL 인터페이스를 사용하여 첫 번째 역할을 맡기 위해 도입되었습니다.
| 기능 | Weaver | 게이트키퍼 |
|---|---|---|
| 보안 삭제 | 보안 삭제가 필요하며 인터페이스가 고정 크기 슬롯을 고정된 수만큼 사용하므로 구현하기 쉽습니다. | 보안 삭제가 필요하지 않으며 인터페이스가 등록 수를 무제한으로 지원하므로 구현하기 어렵습니다. |
| 하드웨어 | SE에 최적화되어 있지만 TEE에서도 작동합니다. | TEE 전용입니다. SE에서 구현해도 현재 설계에서는 보안 이점이 없습니다. |
| 오류 처리 | 더 명확한 오류 코드 | 모호한 오류 코드 따라서 잠금 화면은 잘못된 LSKF와 관련 없는 실패를 구분하지 않습니다. |
| 원자성 | Weaver를 사용하는 LockSettingsService의 코드는 LSKF 변경을 원자적으로 실행합니다. 새 데이터는 새 Weaver 슬롯에 작성되고
이전 슬롯은 안전한 경우에만 지워집니다. |
게이트키퍼를 사용하는 LockSettingsService의 코드는 LSKF 변경을 원자적으로 실행하지 않습니다. LSKF가 변경되는 동안 문제가 발생하면 모든 사용자 데이터가 손실될 수 있습니다. |
참조 코드
ISO/IEC7816-4 호환 보안 요소의 Weaver 구현을 위한 참조 코드는 AOSP에서 확인할 수 있습니다:
external/libese/.
테스트
Weaver 구현을 검증하려면
VtsHalWeaverTargetTest를 사용하세요.
atest VtsHalWeaverTargetTest
또는:
vts-tradefed run vts -m VtsHalWeaverTargetTest