HIDL de autenticación facial

Descripción general

La autenticación facial permite a los usuarios desbloquear su dispositivo con solo mirar la parte frontal. Android 10 agrega compatibilidad para una nueva pila de autenticación facial que puede procesar marcos de cámara de forma segura, lo que preserva la seguridad y privacidad durante la autenticación facial en hardware compatible. Android 10 también facilita que las implementaciones que cumplen con la seguridad permitan la integración de aplicaciones para transacciones, como la banca en línea y otros servicios.

La pila de autenticación facial de Android es una implementación nueva en Android 10. La nueva implementación presenta las interfaces IBiometricsFace.hal, IBiometricsFaceClientCallback.hal y types.hal.

Arquitectura

La API de BiometricPrompt incluye toda la autenticación biométrica, como el rostro, el dedo y el iris. La HAL de Face interactúa con los siguientes componentes.

Pila biométrica

Figura 1: Pila biométrica.

FaceManager

FaceManager es una interfaz privada que mantiene una conexión con FaceService. El protector de pantalla lo usa para acceder a la autenticación facial con una IU personalizada. Las apps no tienen acceso a FaceManager y deben usar BiometricPrompt.

FaceService

Esta es la implementación del framework que administra el acceso al hardware de autenticación facial. Contiene máquinas de estado de inscripción y autenticación básicas, así como varios otros asistentes (por ejemplo, enumeración). Debido a problemas de estabilidad y seguridad, no se permite que se ejecute ningún código de proveedor en este proceso. Se puede acceder a todo el código del proveedor a través de la interfaz HIDL de Face 1.0.

se enfrentó

Este es un ejecutable de Linux que implementa la interfaz HIDL de Face 1.0 que usa FaceService. Se registra como IBiometricsFace@1.0 para que FaceService pueda encontrarlo.

Implementación

HIDL de Face

Para implementar el HIDL de Face, debes implementar todos los métodos de IBiometricsFace.hal en una biblioteca específica del proveedor.

Mensajes de error

Una devolución de llamada envía los mensajes de error y devuelve la máquina de estados al estado inactivo después de que se envían. La mayoría de los mensajes tienen una cadena correspondiente para el usuario que le informa sobre el error, pero no todos los errores tienen esta cadena. Para obtener más información sobre los mensajes de error, consulta types.hal. Todos los mensajes de error representan un estado terminal, lo que significa que el framework supone que el HAL vuelve a un estado inactivo después de enviar un mensaje de error.

Mensajes de adquisición

Los mensajes de adquisición se envían durante la inscripción o la autenticación y su objetivo es guiar al usuario para que realice una inscripción o autenticación correctas. Cada ordinal tiene un mensaje asociado del archivo FaceAuthenticationManager.java. Se pueden agregar mensajes específicos del proveedor, siempre que se proporcionen las cadenas de ayuda correspondientes. Los mensajes de adquisición no son estados de la terminal en sí mismos; se espera que la HAL envíe todos los que sean necesarios para completar la inscripción o autenticación actual. Si un mensaje de adquisición genera un estado terminal en el que no se puede avanzar, el HAL debe seguir los mensajes de adquisición con un mensaje de error, por ejemplo, cuando la imagen es demasiado oscura y permanece demasiado oscura para que se pueda avanzar. En este caso, es razonable enviar UNABLE_TO_PROCESS después de varios intentos, pero no se puede avanzar más.

Hardware

Para que los dispositivos cumplan con los requisitos de datos biométricos seguros de Android 10, deben tener hardware seguro para garantizar la integridad de los datos faciales y la comparación de autenticación definitiva. En el Documento de definición de compatibilidad de Android (CDD), se describe el nivel de seguridad requerido y la tasa de aceptación de falsificación (SAR) aceptable. Se requiere un entorno de ejecución confiable (TEE) para el procesamiento y reconocimiento seguros. Además, se requiere hardware de cámara seguro para evitar ataques de inyección en la autenticación facial. Por ejemplo, las páginas de memoria asociadas para los datos de imagen podrían tener privilegios y estar marcadas como de solo lectura para que solo el hardware de la cámara pueda actualizarlas. Idealmente, ningún proceso debería tener acceso, excepto el TEE y el hardware.

Debido a que el hardware de autenticación facial varía considerablemente, es necesario desarrollar controladores específicos de hardware para habilitar la autenticación facial, según la arquitectura específica del dispositivo. Por lo tanto, no hay una implementación de referencia para faced.

Métodos

Los siguientes métodos son todos asíncronos y deben volver inmediatamente al framework. De lo contrario, el sistema será lento y es posible que se produzcan posibles reinicios de Watchdog. Se recomienda tener una cola de mensajes con varios subprocesos para evitar bloquear al llamador. Todas las solicitudes GET deben almacenar en caché la información siempre que sea posible para que el emisor se bloquee durante un período mínimo.

Método Descripción
setCallback() FaceService lo llama para que todos los mensajes se reenvíen a sí mismos.
setActiveUser() Establece el usuario activo, al que se aplican todas las operaciones de HAL posteriores. La autenticación es siempre para este usuario hasta que se vuelva a llamar a este método.
revokeChallenge() Para finalizar la transacción segura, invalida el desafío que genera generateChallenge().
enroll() Inscribe el rostro de un usuario.
cancel() Cancela la operación actual (por ejemplo, inscripción, autenticación, eliminación o enumeración) y devuelve faced al estado inactivo.
enumerate() Enumera todas las plantillas de rostro asociadas con el usuario activo.
remove() Quita una plantilla de rostro o todas las plantillas de rostros asociadas con el usuario activo.
authenticate() Autentica al usuario activo.
userActivity() Este método solo debe usarse cuando el sistema HAL está en el estado de autenticación o en espera. El uso de este método cuando la HAL no está en uno de estos estados muestra OPERATION_NOT_SUPPORTED. Llamar a este método mientras la HAL ya se está autenticando puede extender el tiempo que el sistema busca un rostro.
resetLockout() Cuando se rechazan demasiadas caras, faced debe ingresar a un estado de bloqueo (LOCKOUT o LOCKOUT_PERMANENT). Cuando lo hace, debe enviar el tiempo restante al framework para que pueda mostrarlo al usuario. Al igual que con setFeature(), este método requiere un token de autenticación de hardware (HAT) activo para restablecer de forma segura el estado interno. Restablece el bloqueo solo para el usuario actual.

Los tres métodos restantes son síncronos y deben bloquearse durante el tiempo mínimo para evitar detener el framework.

Método Descripción
generateChallenge() Genera un token aleatorio único y seguro a nivel criptográfico que se usa para indicar el inicio de una transacción segura.
setFeature() Habilita o inhabilita una función para el usuario actual. Por motivos de seguridad, esto requiere que un HAT verifique el PIN, el patrón o la contraseña del usuario en función del desafío anterior.
getFeature() Recupera el estado de habilitación actual de la función, según lo indique la configuración predeterminada o una llamada a setFeature() anterior. Si el Face ID no es válido, la implementación debe mostrar ILLEGAL_ARGUMENT
getAuthenticatorId() Muestra un identificador asociado con el conjunto de rostros actual. Este identificador debe cambiar cada vez que se agrega un rostro

Diagrama de estado

El framework espera que faced siga el siguiente diagrama de estado.

Diagrama de estado

Figura 2: Flujo de estado de la autenticación facial.