Weaver

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 IWeaver interfaz.
  • 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 weaverKey correcto 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():

  1. Verificación: Comprobación del LSKF, con limitación de frecuencia aplicada por TEE
  2. Certificación: Emisión de un HardwareAuthToken para 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