La capa de abstracción de hardware (HAL) de Weaver
(IWeaver.aidl),
que se introdujo en Android 8.1, proporciona una interfaz segura para la autenticación del usuario
con el factor de conocimiento de la pantalla de bloqueo (LSKF), como el PIN, el patrón y la contraseña.
Weaver reemplaza la funcionalidad de verificación de LSKF de Gatekeeper. Sin embargo, Gatekeeper aún se usa para generar tokens de autenticación de hardware.
En Android 9 y versiones posteriores, la CDD 9.11.2 requiere que los dispositivos compatibles con StrongBox proporcionen hardware seguro dedicado que respalde la autenticación segura del usuario. La implementación de la HAL de Weaver con este hardware seguro satisface el requisito de "autenticación segura del usuario".
En dispositivos sin un elemento seguro (SE)dedicado, Weaver aún se puede implementar en un entorno de ejecución confiable (TEE), como Trusty.
Componentes
Weaver consta de tres componentes:
- Interfaz AIDL de Weaver (
IWeaver): Es la especificación formal de la HAL. Android 13 y versiones anteriores usaban HIDL en lugar de AIDL. - Servicio de la capa de abstracción de hardware (HAL) de Weaver:
Es un proceso de Android específico del proveedor que implementa la
IWeaverinterfaz. - Aplicación confiable (TA) de Weaver: Es la lógica central que se ejecuta en un entorno seguro. Realiza la verificación de LSKF y aplica la limitación de frecuencia. El servicio HAL se comunica con la TA mediante un canal seguro específico de la implementación.
Interfaz
La interfaz de Weaver presenta un array de tamaño fijo de ranuras persistentes, cada una de las cuales contiene una clave y un valor de tamaño fijo. Cada ranura se identifica con su ID, un número entero en el intervalo [0, numSlots - 1]. El valor de una ranura solo es accesible cuando se proporciona una clave que coincide con la clave almacenada.
La interfaz de Weaver consta de lo siguiente:
getConfig(): Recupera la cantidad de ranuras, el tamaño de la clave y el tamaño del valor que admite la implementación.write(): Sobrescribe la ranura especificada con un nuevo par clave-valor. Esta operación es atómica y hace que los datos anteriores sean irrecuperables de forma permanente irrecuperables (eliminación segura).read(): Intenta recuperar el valor de la ranura especificada. Esto solo se realiza correctamente cuando el tiempo de espera de limitación de frecuencia (aplicado por la TA) no está activo y la clave proporcionada coincide exactamente con la clave almacenada.
Para obtener la especificación completa de la interfaz, consulta
IWeaver.aidl.
Uso por parte de Android
Cuando hay una implementación de Weaver disponible, LockSettingsService en el servidor del sistema Android la usa para proteger los datos del usuario. Para cada usuario del dispositivo, LockSettingsService administra una ranura de Weaver:
- Clave de ranura (
weaverKey): Es un hash del LSKF del usuario. Si el usuario no tiene un bloqueo de pantalla, se usa una cadena predeterminada. - Valor de ranura (
weaverSecret): Es un secreto criptográfico de alta entropía generado de forma aleatoria.
El weaverSecret está diseñado para recuperarse solo de una de las siguientes maneras:
- Proporcionar el
weaverKeycorrecto a la TA de Weaver dentro de su política de limitación de frecuencia - Comprometer el entorno seguro en el que se ejecuta la TA de Weaver (se supone que es muy difícil)
LockSettingsService usa weaverKey y weaverSecret para encriptar la contraseña sintética del usuario. Debido a que la
contraseña sintética protege el almacenamiento encriptado con credenciales (CE) del usuario para la
encriptación basada en archivos (FBE)
y las
claves vinculadas a la autenticación del usuario en Android Keystore,
los datos permanecen inaccesibles hasta que Weaver libera el secreto.
Weaver vs. Gatekeeper
Históricamente, la
HAL de Gatekeeper
desempeñaba dos funciones distintas en una sola llamada verify():
- Verificación: Comprobación del LSKF, con limitación de frecuencia aplicada por TEE
- Certificación: Emisión de un
HardwareAuthTokenpara notificar a KeyMint (anteriormente Keymaster) que la autenticación de LSKF se realizó correctamente.
¿Por qué se cambió a Weaver?
Con la introducción de tokens de restablecimiento de código de acceso
seguros en Android 8.1, la "contraseña sintética" se convirtió en el
secreto criptográfico principal. Las dos funciones descritas anteriormente ahora se controlan con
registros de Gatekeeper separados, uno para el LSKF en userId + 100000
y otro para la contraseña sintética en userId.
Se introdujo Weaver para asumir la primera función, usando una interfaz HAL más simple con compatibilidad para implementaciones basadas en elementos seguros (SE).
| Función | Weaver | Gatekeeper |
|---|---|---|
| Eliminación segura | Se requiere la eliminación segura, y es fácil implementarla porque la interfaz usa una cantidad fija de ranuras de tamaño fijo. | No se requiere la eliminación segura, y es difícil implementarla porque la interfaz admite una cantidad ilimitada de registros. |
| Hardware | Está optimizado para SEs, pero también funciona en TEEs. | Es solo para TEE. La implementación en un SE no proporciona un beneficio de seguridad con el diseño actual. |
| Manejo de errores | Códigos de error más claros | Códigos de error ambiguos. Como resultado, la pantalla de bloqueo no diferencia entre LSKFs incorrectos y fallas no relacionadas. |
| Atomicidad | El código en LockSettingsService que usa Weaver realiza cambios de LSKF de forma atómica. Los datos nuevos se escriben en una ranura de Weaver nueva, y
la ranura anterior se borra solo cuando es seguro hacerlo. |
El código en LockSettingsService que usa Gatekeeper
no realiza cambios de LSKF de forma atómica. Es posible que se pierdan todos los datos del usuario si
algo sale mal mientras se cambia el LSKF. |
Código de referencia
El código de referencia para las implementaciones de Weaver en elementos seguros compatibles con ISO/IEC7816-4 está disponible en AOSP:
external/libese/.
Prueba
Para validar una implementación de Weaver, usa
VtsHalWeaverTargetTest:
atest VtsHalWeaverTargetTest
o:
vts-tradefed run vts -m VtsHalWeaverTargetTest