Уровень аппаратной абстракции Weaver (HAL) ( IWeaver.aidl ), представленный в Android 8.1, обеспечивает безопасный интерфейс для аутентификации пользователя с помощью фактора знаний экрана блокировки (LSKF), такого как PIN-код, графический ключ и пароль.
Weaver заменяет функциональность проверки LSKF, используемую Gatekeeper . Однако Gatekeeper по-прежнему используется для генерации аппаратных токенов аутентификации .
В Android 9 и более поздних версиях CDD 9.11.2 требует, чтобы устройства, поддерживающие StrongBox, имели выделенное защищенное оборудование, обеспечивающее безопасную аутентификацию пользователей. Реализация Weaver HAL с использованием этого защищенного оборудования удовлетворяет требованию «безопасной аутентификации пользователей».
На устройствах без выделенного защищенного элемента (SE) Weaver по-прежнему может быть реализован в доверенной среде выполнения (TEE), такой как Trusty .
Компоненты
Система Weaver состоит из трех компонентов:
- Интерфейс Weaver AIDL (
IWeaver) : формальная спецификация HAL. В Android 13 и более ранних версиях вместо AIDL использовался HIDL. - Сервис Weaver Hardware Abstraction Layer (HAL) : специфический для производителя процесс Android, реализующий интерфейс
IWeaver. - Weaver Trusted Application (TA) : основная логика, работающая в защищенной среде. Она выполняет проверку LSKF и обеспечивает ограничение скорости запросов. Служба HAL взаимодействует с TA, используя защищенный канал, специфичный для данной реализации.
Интерфейс
Интерфейс Weaver предоставляет массив постоянных слотов фиксированного размера, каждый из которых содержит ключ фиксированного размера и значение фиксированного размера. Каждый слот идентифицируется своим ID, целым числом в интервале [0, numSlots - 1] . Значение слота доступно только при наличии ключа, соответствующего сохраненному ключу.
Интерфейс Weaver состоит из:
-
getConfig(): Извлекает количество слотов, размер ключа и размер значения, поддерживаемые реализацией. -
write(): Перезаписывает указанный слот новой парой ключ-значение. Эта операция является атомарной и делает предыдущие данные безвозвратно невосстановимыми (безопасное удаление). -
read(): Пытается получить значение указанного слота. Это удается только в том случае, если таймаут ограничения скорости (устанавливаемый TA) не активен и предоставленный ключ точно совпадает с сохраненным ключом.
Полную спецификацию интерфейса см. в файле IWeaver.aidl .
Использовать на Android
Если доступна реализация Weaver, LockSettingsService в системном сервере Android использует её для защиты пользовательских данных. Для каждого пользователя на устройстве LockSettingsService управляет слотом Weaver:
- Ключ слота (
weaverKey): Хэш LSKF пользователя. Если у пользователя нет блокировки экрана, используется строка по умолчанию. - Значение слота (
weaverSecret): Высокоэнтропийный, случайно сгенерированный криптографический секрет.
Объект weaverSecret предназначен для получения только одним из следующих способов:
- Предоставление корректного
weaverKeyтехническому представителю Weaver в рамках его политики ограничения скорости запросов. - Компрометация безопасной среды, в которой работает Weaver TA. Это должно быть очень сложно.
LockSettingsService использует weaverKey и weaverSecret для шифрования синтетического пароля пользователя. Поскольку синтетический пароль защищает хранилище учетных данных пользователя (Credential-Encrypted, CE) для шифрования на основе файлов (File-Based Encryption, FBE) и ключи аутентификации пользователя в хранилище ключей Android , данные остаются недоступными до тех пор, пока Weaver не освободит секрет.
Ткач против Привратника
Исторически сложилось так, что HAL-интерфейс Gatekeeper выполнял две различные роли в рамках одного вызова функции verify() :
- Проверка : Проверка LSKF с ограничением скорости, обеспечиваемым TEE.
- Аттестация : Выдача
HardwareAuthTokenдля уведомления KeyMint (ранее Keymaster) об успешном завершении аутентификации LSKF.
Почему произошел переход на Weaver?
С появлением защищенных токенов сброса пароля в Android 8.1 «синтетический пароль» стал основным криптографическим секретом. Две описанные выше роли теперь обрабатываются отдельными регистрациями Gatekeeper: одна для LSKF под userId + 100000 , а другая для синтетического пароля под userId .
Для выполнения первой роли был создан Weaver, использующий более простой интерфейс HAL с поддержкой реализаций на основе Secure Element (SE).
| Особенность | Ткач | Привратник |
|---|---|---|
| Безопасное удаление | Необходимо обеспечить безопасное удаление, и это легко реализовать, поскольку интерфейс использует фиксированное количество слотов фиксированного размера. | Безопасное удаление не требуется, и его сложно реализовать, поскольку интерфейс поддерживает неограниченное количество регистраций. |
| Аппаратное обеспечение | Оптимизировано для систем с эпителиальной дисплазией, но также работает и в трансэзофагеальной эхокардиографии. | По сути, это только TEE. Внедрение его в SE не обеспечивает преимуществ в плане безопасности при текущей конструкции. |
| Обработка ошибок | Более понятные коды ошибок | Неоднозначные коды ошибок. В результате экран блокировки не различает некорректные LSKF и несвязанные с ними сбои. |
| Атомность | Код в LockSettingsService , использующий Weaver, выполняет изменения LSKF атомарно. Новые данные записываются в новый слот Weaver, а старый слот удаляется только тогда, когда это безопасно. | Код в LockSettingsService , использующий Gatekeeper, не выполняет атомарные изменения LSKF. В случае возникновения проблем во время изменения LSKF все пользовательские данные могут быть потеряны. |
Справочный код
Справочный код для реализаций Weaver в защищенных элементах, совместимых с ISO/IEC7816-4, доступен в AOSP: external/libese/ .
Тестирование
Для проверки реализации Weaver используйте VtsHalWeaverTargetTest :
atest VtsHalWeaverTargetTest
или:
vts-tradefed run vts -m VtsHalWeaverTargetTest