Google 致力于为黑人社区推动种族平等。查看具体举措
Эта страница переведена с помощью Cloud Translation API.
Switch to English

Проверка загрузки

Подтвержденная загрузка требует криптографической проверки всего исполняемого кода и данных, которые являются частью загружаемой версии Android, перед ее использованием. Сюда входят ядро ​​(загружаемое из boot раздела), дерево устройств (загружаемое из раздела dtbo ), system раздел, раздел vendor и т. Д.

Небольшие разделы, такие как boot и dtbo , которые читаются только один раз, обычно проверяются путем загрузки всего содержимого в память и последующего вычисления его хэша. Затем это вычисленное значение хеш-функции сравнивается с ожидаемым значением хеш-функции . Если значение не совпадает, Android не загрузится. Дополнительные сведения см. В разделе « Процесс загрузки» .

Большие разделы, которые не помещаются в память (например, файловые системы), могут использовать хеш-дерево, где проверка - это непрерывный процесс, происходящий по мере загрузки данных в память. В этом случае корневой хэш хеш-дерева вычисляется во время выполнения и сравнивается с ожидаемым корневым хеш-значением . Android включает драйвер dm-verity для проверки больших разделов. Если в какой-то момент вычисленный корневой хэш не соответствует ожидаемому значению корневого хеша , данные не используются, и Android переходит в состояние ошибки. Для получения дополнительных сведений см. Повреждение dm-verity .

Ожидаемые хэши обычно хранятся либо в конце, либо в начале каждого проверенного раздела, в выделенном разделе или в обоих. Важно отметить, что эти хэши подписаны (прямо или косвенно) корнем доверия. Например, реализация AVB поддерживает оба подхода, подробности см. В разделе Android Verified Boot .

Защита от отката

Даже при полностью безопасном процессе обновления непостоянный эксплойт ядра Android может вручную установить старую, более уязвимую версию Android, перезагрузиться в уязвимую версию и затем использовать эту версию Android для установки постоянного эксплойта. Оттуда злоумышленник постоянно владеет устройством и может делать что угодно, включая отключение обновлений.

Защита от этого класса атак называется « Защита от отката» . Защита от отката обычно реализуется путем использования хранилища с защитой от несанкционированного доступа для записи самой последней версии Android и отказа в загрузке Android, если она ниже, чем записанная версия. Версии обычно отслеживаются для каждого раздела.

Дополнительные сведения о том, как AVB обрабатывает защиту от отката, см. В AVB README .

Обработка ошибок проверки

Проверка может завершиться ошибкой либо во время загрузки (например, если вычисленный хэш на boot разделе не соответствует ожидаемому хешу), либо во время выполнения (например, если dm-verity обнаруживает ошибку проверки в system разделе). Если проверка не удалась во время загрузки, устройство не может загрузиться, и конечный пользователь должен выполнить действия по восстановлению устройства.

Если проверка не выполняется во время выполнения, поток немного сложнее. Если устройство использует dm-verity, его следует настроить в режиме restart . В режиме restart , если обнаружена ошибка проверки, устройство немедленно перезапускается с установленным флагом, указывающим причину. Загрузчик должен заметить этот флаг и переключить dm-verity на использование режима ошибок ввода-вывода ( eio ) и оставаться в этом режиме до тех пор, пока не будет установлено новое обновление.

При загрузке в режиме eio устройство показывает экран ошибки, информирующий пользователя о том, что обнаружено повреждение и что устройство может работать некорректно. Экран отображается, пока пользователь его не закроет. В режиме eio dm-verity не перезапускает устройство при обнаружении ошибки проверки, вместо этого возвращается ошибка EIO, и приложение должно обработать ошибку.

Предполагается, что либо запустится средство обновления системы (чтобы можно было установить новую ОС без ошибок повреждения), либо пользователь сможет получить как можно больше своих данных с устройства. После установки новой ОС загрузчик замечает новую установленную ОС и переключается обратно в режим restart .