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

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

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

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

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

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

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

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

Более подробную информацию о том, как AVB обеспечивает защиту от отката, см. в AVB README .

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

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

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

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

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