Подтвержденная загрузка требует криптографической проверки всего исполняемого кода и данных, являющихся частью загружаемой версии Android, перед ее использованием. Сюда входят ядро (загружаемое из boot
раздела), дерево устройств (загружаемое из раздела dtbo
), system
раздел, раздел vendor
и т. д.
Небольшие разделы, такие как boot
и dtbo
, которые считываются только один раз, обычно проверяются путем загрузки всего содержимого в память и последующего вычисления его хэша. Это рассчитанное значение хеш-функции затем сравнивается с ожидаемым значением хеш -функции. Если значение не совпадает, Android не загрузится. Дополнительные сведения см. в разделе Процесс загрузки .
Большие разделы, которые не помещаются в память (например, файловые системы), могут использовать хеш-дерево, где проверка представляет собой непрерывный процесс, происходящий по мере загрузки данных в память. В этом случае корневой хэш хеш-дерева вычисляется во время выполнения и сверяется с ожидаемым корневым хеш-значением . Android включает драйвер dm-verity для проверки больших разделов. Если в какой-то момент рассчитанный корневой хэш не соответствует ожидаемому значению корневого хэша , данные не используются, и Android переходит в состояние ошибки. Дополнительные сведения см. в разделе о повреждении dm-verity .
Ожидаемые хэши обычно хранятся либо в конце, либо в начале каждого проверенного раздела, в выделенном разделе или в обоих случаях. Важно отметить, что эти хэши подписаны (прямо или косвенно) корнем доверия. Например, реализация AVB поддерживает оба подхода, подробности см. в разделе « Проверенная загрузка Android ».
Защита от отката
Даже при полностью безопасном процессе обновления непостоянный эксплойт ядра 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
.