Для корректной загрузки (Verified Boot) требуется криптографическая проверка всего исполняемого кода и данных, входящих в состав загружаемой версии Android, перед их использованием. Это включает ядро (загружаемое из boot раздела), дерево устройств (загружаемое из раздела dtbo ), system раздел, раздел vendor и так далее.
Небольшие разделы, такие как boot и dtbo , которые считываются только один раз, обычно проверяются путем загрузки всего содержимого в память и последующего вычисления его хеша. Полученное значение хеша затем сравнивается с ожидаемым значением хеша . Если значения не совпадают, Android не загрузится. Для получения более подробной информации см. Boot Flow .
Для больших разделов, которые не помещаются в память (например, файловые системы), может использоваться хеш-дерево, где проверка является непрерывным процессом, происходящим по мере загрузки данных в память. В этом случае корневой хеш хеш-дерева вычисляется во время выполнения и сравнивается с ожидаемым значением корневого хеша . Android включает драйвер dm-verity для проверки больших разделов. Если в какой-то момент вычисленный корневой хеш не совпадает с ожидаемым значением корневого хеша , данные не используются, и Android переходит в состояние ошибки. Для получения более подробной информации см. раздел «Повреждение dm-verity» .
Ожидаемые хеши обычно хранятся либо в конце, либо в начале каждого проверяемого раздела, в выделенном разделе или и там, и там. Важно отметить, что эти хеши подписываются (прямо или косвенно) корнем доверия. Например, реализация AVB поддерживает оба подхода; подробности см. в разделе «Проверенная загрузка Android» .
защита от отката
Даже при полностью безопасном процессе обновления существует вероятность того, что с помощью эксплойта, не обеспечивающего постоянный доступ к ядру Android, злоумышленник сможет вручную установить более старую, более уязвимую версию Android, перезагрузиться в эту уязвимую версию, а затем использовать её для установки эксплойта, обеспечивающего постоянный доступ к устройству. После этого злоумышленник навсегда получает контроль над устройством и может делать всё, что угодно, включая отключение обновлений.
Защита от этого класса атак называется защитой от отката (Rollback Protection) . Защита от отката обычно реализуется с помощью защищенного от несанкционированного доступа хранилища, в котором записывается самая последняя версия Android, и запрещается загрузка Android, если она ниже записанной версии. Версии обычно отслеживаются для каждого раздела.
Более подробную информацию о том, как AVB обрабатывает защиту от отката, см. в файле README AVB.
Обработка ошибок проверки
Проверка может завершиться неудачей либо во время загрузки (например, если вычисленный хеш в boot разделе не совпадает с ожидаемым хешем), либо во время выполнения (например, если dm-verity обнаружит ошибку проверки в system разделе). Если проверка завершается неудачей во время загрузки, устройство не может загрузиться, и пользователю необходимо выполнить действия по восстановлению устройства.
Если проверка не удается во время выполнения, процесс становится несколько сложнее. Если устройство использует dm-verity, его следует настроить в режиме restart . В режиме restart , если возникает ошибка проверки, устройство немедленно перезапускается со специальным флагом, указывающим причину. Загрузчик должен заметить этот флаг и переключить dm-verity в режим обработки ошибок ввода-вывода ( eio ), оставаясь в этом режиме до установки нового обновления.
При загрузке в режиме eio устройство отображает экран ошибки, информирующий пользователя об обнаружении повреждения данных и возможной некорректной работе устройства. Экран отображается до тех пор, пока пользователь его не закроет. В режиме eio драйвер dm-verity не перезапустит устройство при возникновении ошибки проверки; вместо этого возвращается ошибка EIO, и приложение должно обработать эту ошибку самостоятельно.
Цель состоит в том, чтобы либо запустилось обновление системы (чтобы можно было установить новую ОС без ошибок повреждения данных), либо пользователь смог скопировать как можно больше своих данных с устройства. После установки новой ОС загрузчик распознает ее и переключается в режим restart .