A camada de abstração de hardware (HAL) do Weaver
(IWeaver.aidl),
introduzida no Android 8.1, oferece uma interface segura para autenticação do usuário
com o fator de conhecimento da tela de bloqueio (LSKF), como PIN, padrão e senha.
O Weaver substitui a funcionalidade de verificação LSKF do Gatekeeper. No entanto, o Gatekeeper ainda é usado para gerar tokens de autenticação de hardware.
No Android 9 e versões mais recentes, o CDD 9.11.2 exige que os dispositivos compatíveis com o StrongBox ofereçam hardware seguro dedicado que faça backup da autenticação segura do usuário. A implementação da HAL do Weaver usando esse hardware seguro atende ao requisito de "autenticação segura do usuário".
Em dispositivos sem um elemento seguro (SE) dedicado, o Weaver ainda pode ser implementado em um ambiente de execução confiável (TEE), como o Trusty.
No Android 17 e em versões mais recentes, é altamente recomendável implementar o Weaver, mesmo em dispositivos sem um Elemento de segurança dedicado.
Componentes
O Weaver consiste em três componentes:
- Interface AIDL do Weaver (
IWeaver): a especificação formal da HAL. O Android 13 e versões anteriores usavam HIDL em vez de AIDL. - Serviço da camada de abstração de hardware (HAL) do Weaver:um processo do Android específico do fornecedor que implementa a
interface
IWeaver. - Aplicativo confiável (TA) do Weaver: a lógica principal executada em um ambiente seguro. Ele faz a verificação do LSKF e aplica a limitação de taxa. O serviço HAL se comunica com a TA usando um canal seguro específico da implementação.
Interface
A interface do Weaver apresenta uma matriz de tamanho fixo de slots persistentes, cada um
contendo uma chave e um valor de tamanho fixo. Cada slot é identificado pelo ID, um número inteiro no intervalo [0, numSlots - 1]. O valor de um slot só fica acessível quando uma chave correspondente à armazenada é fornecida.
A interface do Weaver consiste principalmente em:
getConfig(): recupera o número de slots, o tamanho da chave e o tamanho do valor compatíveis com a implementação.write(): substitui o slot especificado por um novo par de chave-valor. Essa operação é atômica e torna os dados anteriores permanentemente irrecuperáveis (exclusão segura).read(): tenta recuperar o valor do slot especificado. Isso só vai funcionar quando o tempo limite de limitação de taxa (aplicado pela TA) não estiver ativo e a chave fornecida corresponder exatamente à chave armazenada.warmUp(): no Android 17 e versões mais recentes, transmite uma dica de que uma leitura ou gravação pode ocorrer em breve.
Para a especificação completa da interface, consulte
IWeaver.aidl.
Uso pelo Android
Quando uma implementação do Weaver está disponível, o LockSettingsService no
servidor do sistema Android a usa para proteger os dados do usuário. Para cada usuário no
dispositivo, o LockSettingsService gerencia um slot do Weaver:
- Chave do slot (
weaverKey): um hash do LSKF do usuário. Se o usuário não tiver um bloqueio de tela, uma string padrão será usada. - Valor do slot (
weaverSecret): um segredo criptográfico de alta entropia gerado aleatoriamente.
O weaverSecret foi projetado para ser recuperado apenas por:
- Fornecendo o
weaverKeycorreto para o TA do Weaver na política de limitação de taxa. - Comprometer o ambiente seguro em que o Weaver TA é executado. Isso é intencionalmente muito difícil.
O LockSettingsService usa weaverKey e weaverSecret para criptografar a senha sintética do usuário. Como a senha sintética protege o armazenamento criptografado por credenciais (CE) do usuário para criptografia baseada em arquivos (FBE) e as chaves vinculadas à autenticação do usuário no Android Keystore, os dados permanecem inacessíveis até que o Weaver libere o segredo.
No Android 17 e versões mais recentes, o LockSettingsService chama o método warmUp() do Weaver
quando a LSKF começa a ser inserida. As implementações do Weaver podem usar esse indicador
para fazer a transição do hardware seguro de um estado de baixo consumo de energia e reduzir a latência de uma
próxima solicitação de read().
Weaver x Gatekeeper
Historicamente, o
Gatekeeper HAL
desempenhava duas funções distintas em uma única chamada verify():
- Verificação:verificação do LSKF com limitação de taxa imposta pelo TEE.
- Atestado:emissão de um
HardwareAuthTokenpara notificar o KeyMint (antigo Keymaster) de que a autenticação LSKF foi concluída.
Por que a mudança para o Weaver?
Com a introdução dos tokens de redefinição segura de senha no Android 8.1, a senha sintética se tornou o segredo criptográfico principal. As duas funções descritas acima são processadas por
registros separados do Gatekeeper, um para o LSKF em userId + 100000
e outro para a senha sintética em userId.
O Weaver foi introduzido para assumir a primeira função, usando uma interface HAL mais simples com suporte a implementações baseadas em elemento seguro (SE, na sigla em inglês).
| Recurso | Weaver | Gatekeeper |
|---|---|---|
| Exclusão segura | A exclusão segura é necessária e fácil de implementar porque a interface usa um número fixo de slots de tamanho fixo. | A exclusão segura não é necessária e é difícil de implementar porque a interface aceita um número ilimitado de inscrições. |
| Hardware | Otimizado para SEs, mas também funciona em TEEs. | Efetivamente apenas TEE. A implementação em um SE não oferece um benefício de segurança com o design atual. |
| Tratamento de erros | Códigos de erro mais claros. | Códigos de erro ambíguos. Como resultado, a tela de bloqueio não diferencia entre LSKFs incorretos e falhas não relacionadas. |
| Atomicidade | O código em LockSettingsService que usa o Weaver realiza
mudanças de LSKF de forma atômica. Os novos dados são gravados em um novo slot do Weaver, e
o slot antigo é apagado somente quando é seguro fazer isso. |
O código em LockSettingsService que usa o Gatekeeper
não realiza mudanças de LSKF de forma atômica. Todos os dados do usuário podem ser perdidos se
algo der errado durante a mudança da LSKF. |
Código de referência
O AOSP contém duas implementações de referência do Weaver:
-
No Android 17 e versões mais recentes,
system/weaver/contém uma implementação do Weaver para ambientes seguros gerais. -
No Android 8.1 e versões mais recentes,
external/libese/contém uma implementação do Weaver para elementos seguros compatíveis com ISO/IEC7816-4.
Teste
Para validar uma implementação do Weaver, use
VtsHalWeaverTargetTest:
atest VtsHalWeaverTargetTest
ou
vts-tradefed run vts -m VtsHalWeaverTargetTest