위버

Android 8.1에 도입된 Weaver 하드웨어 추상화 계층 (HAL)(IWeaver.aidl)은 PIN, 패턴, 비밀번호와 같은 잠금 화면 지식 요소 (LSKF)를 사용한 사용자 인증을 위한 보안 인터페이스를 제공합니다.

위버는 Gatekeeper의 LSKF 확인 기능을 대체합니다. 하지만 게이트키퍼는 여전히 하드웨어 인증 토큰을 생성하는 데 사용됩니다.

Android 9 이상에서 CDD 9.11.2는 StrongBox를 지원하는 기기가 보안 사용자 인증을 지원하는 전용 보안 하드웨어를 제공해야 한다고 요구합니다. 이 보안 하드웨어를 사용하여 위버 HAL을 구현하면 '보안 사용자 인증' 요구사항이 충족됩니다.

전용 보안 요소 (SE)가 없는 기기에서도 Weaver는 Trusty와 같은 신뢰할 수 있는 실행 환경 (TEE)에 구현할 수 있습니다.

Android 17 이상에서는 전용 보안 요소가 없는 기기에서도 Weaver를 구현할 것을 적극 권장합니다.

구성요소

위버는 다음 세 가지 구성요소로 구성됩니다.

  • 위버 AIDL 인터페이스 (IWeaver): HAL의 공식 사양입니다. Android 13 이하에서는 AIDL 대신 HIDL을 사용했습니다.
  • 위버 하드웨어 추상화 계층 (HAL) 서비스: IWeaver 인터페이스를 구현하는 공급업체별 Android 프로세스입니다.
  • Weaver 신뢰할 수 있는 애플리케이션 (TA): 안전한 환경에서 실행되는 핵심 로직입니다. LSKF 확인을 실행하고 비율 제한을 적용합니다. HAL 서비스는 구현별 보안 채널을 사용하여 TA와 통신합니다.

인터페이스

위버의 인터페이스는 고정 크기 키와 고정 크기 값을 각각 포함하는 고정 크기 영구 슬롯 배열을 제공합니다. 각 슬롯은 ID([0, numSlots - 1] 간격의 정수)로 식별됩니다. 슬롯의 값은 저장된 키와 일치하는 키가 제공된 경우에만 액세스할 수 있습니다.

위버의 인터페이스는 주로 다음으로 구성됩니다.

  • getConfig(): 구현에서 지원하는 슬롯 수, 키 크기, 값 크기를 가져옵니다.
  • write(): 지정된 슬롯을 새 키-값 쌍으로 덮어씁니다. 이 작업은 원자적이며 이전 데이터를 영구적으로 복구할 수 없게 만듭니다 (보안 삭제).
  • read(): 지정된 슬롯의 값을 가져오려고 시도합니다. 이는 비율 제한 시간 제한 (TA에 의해 적용됨)이 활성화되어 있지 않고 제공된 키가 저장된 키와 정확히 일치하는 경우에만 성공합니다.
  • warmUp(): Android 17 이상에서 읽기 또는 쓰기가 곧 발생할 수 있다는 힌트를 전달합니다.

전체 인터페이스 사양은 IWeaver.aidl을 참고하세요.

Android에서 사용

Weaver 구현을 사용할 수 있는 경우 Android 시스템 서버의 LockSettingsService가 이를 사용하여 사용자 데이터를 보호합니다. 기기의 모든 사용자에 대해 LockSettingsService는 Weaver 슬롯을 관리합니다.

  • 슬롯 키 (weaverKey): 사용자의 LSKF 해시입니다. 사용자에게 화면 잠금이 없는 경우 기본 문자열이 사용됩니다.
  • 슬롯 값 (weaverSecret): 엔트로피가 높고 무작위로 생성된 암호화 보안 비밀입니다.

weaverSecret은 다음 중 하나로만 검색되도록 설계되었습니다.

  • 비율 제한 정책 내에서 Weaver TA에 올바른 weaverKey 제공
  • Weaver TA가 실행되는 보안 환경이 손상됩니다. 이는 매우 어렵도록 의도되었습니다.

LockSettingsServiceweaverKeyweaverSecret를 모두 사용하여 사용자의 종합 비밀번호를 암호화합니다. 합성 비밀번호는 파일 기반 암호화 (FBE)를 위한 사용자의 사용자 인증 정보 암호화 (CE) 저장소와 사용자의 Android 키 저장소에 있는 인증 바인딩 키를 보호하므로 Weaver가 보안 비밀을 해제할 때까지 데이터에 액세스할 수 없습니다.

Android 17 이상에서 LSKF가 입력되기 시작하면 LockSettingsService이 Weaver의 warmUp() 메서드를 호출합니다. 위버 구현은 이 신호를 사용하여 보안 하드웨어를 저전력 상태에서 전환하여 예정된 read() 요청의 지연 시간을 줄일 수 있습니다.

위버 대 게이트키퍼

이전에는 Gatekeeper HAL이 단일 verify() 호출에서 두 가지 별개의 역할을 실행했습니다.

  1. 확인: TEE 시행 비율 제한을 사용하여 LSKF를 확인합니다.
  2. 증명: HardwareAuthToken를 발행하여 KeyMint(이전 Keymaster)에 LSKF 인증이 성공했음을 알립니다.

Weaver로 전환하는 이유는 무엇인가요?

Android 8.1에서 보안 비밀번호 재설정 토큰이 도입되면서 합성 비밀번호가 기본 암호화 보안 비밀이 되었습니다. 위에서 설명한 두 역할은 별도의 Gatekeeper 등록으로 처리됩니다. 하나는 userId + 100000 아래의 LSKF용이고 다른 하나는 userId 아래의 합성 비밀번호용입니다.

위버는 보안 요소 (SE) 기반 구현을 지원하는 더 간단한 HAL 인터페이스를 사용하여 첫 번째 역할을 인계받기 위해 도입되었습니다.

기능 위버 게이트키퍼
보안 삭제 보안 삭제가 필요하며 인터페이스가 고정 크기 슬롯을 고정된 수만큼 사용하므로 구현하기 쉽습니다. 보안 삭제는 필요하지 않으며 인터페이스가 무제한 등록을 지원하므로 구현하기 어렵습니다.
하드웨어 SE에 최적화되어 있지만 TEE에서도 작동합니다. 사실상 TEE 전용입니다. SE에서 구현해도 현재 설계에서는 보안 이점이 없습니다.
오류 처리 더 명확한 오류 코드 모호한 오류 코드입니다. 따라서 잠금 화면은 잘못된 LSKF와 관련 없는 실패를 구분하지 않습니다.
원자성 Weaver를 사용하는 LockSettingsService의 코드는 LSKF 변경사항을 원자적으로 실행합니다. 새 데이터는 새 Weaver 슬롯에 기록되고 이전 슬롯은 안전한 경우에만 삭제됩니다. Gatekeeper를 사용하는 LockSettingsService의 코드는 LSKF 변경을 원자적으로 실행하지 않습니다. LSKF가 변경되는 동안 문제가 발생하면 모든 사용자 데이터가 손실될 수 있습니다.

참조 코드

AOSP에는 Weaver의 참조 구현이 두 개 포함되어 있습니다.

  • Android 17 이상에서 system/weaver/에는 일반 보안 환경용 Weaver 구현이 포함되어 있습니다.
  • Android 8.1 이상에서 external/libese/에는 ISO/IEC7816-4 호환 보안 요소의 Weaver 구현이 포함됩니다.

테스트

Weaver 구현을 검증하려면 VtsHalWeaverTargetTest를 사용하세요.

atest VtsHalWeaverTargetTest

또는:

vts-tradefed run vts -m VtsHalWeaverTargetTest