首页 > 其他分享 >Android 启动流程 fastboot flashing unlock

Android 启动流程 fastboot flashing unlock

时间:2023-12-01 14:14:00浏览次数:41  
标签:fastboot 启动 验证 unlock 按钮 屏幕 Android 设备

 

启动流程  |  Android 开源项目  |  Android Open Source Project https://source.android.google.cn/docs/security/features/verifiedboot/boot-flow?hl=zh-cn

启动时验证

启动时验证会尽力确保所有已执行代码均来自可信来源(通常是设备的原始设备制造商 [OEM]),以防受到攻击或损坏。它可建立一条从受硬件保护的信任根到引导加载程序,再到 boot 分区和其他已验证分区(包括 systemvendor 和可选的 oem 分区)的完整信任链。在设备启动过程中,无论是在哪个阶段,都会在进入下一个阶段之前先验证下一个阶段的完整性和真实性。

除了确保设备运行的是安全的 Android 版本外,启动时验证还会检查 Android 版本是否为具有回滚保护的正确版本。回滚保护可确保设备只会更新到更高的 Android 版本,从而帮助避免可能的漏洞持续存在。

除了验证操作系统外,启动时验证还允许 Android 设备将其完整性状态传达给用户。

背景

Android 4.4 增加了对启动时验证和 dm-verity 内核功能的支持。这种验证功能组合就是启动时验证 1。

以前的 Android 版本会在发现设备损坏时向用户发出警告,但仍然允许他们启动设备;从 Android 7.0 开始,系统会严格强制执行启动时验证,从而使已破解的设备无法启动。Android 7.0 还增加了对前向纠错功能的支持,有助于更可靠地防范非恶意数据损坏。

Android 8.0 及更高版本包含 Android 启动时验证 (AVB),AVB 是启动时验证的一个参考实现,可与 Project Treble 配合使用。除了与 Treble 配合使用外,AVB 还对分区脚本格式进行了标准化并增添了回滚保护功能。

启动流程

建议的设备启动流程如下所示:

启动时验证流程图 1. 启动时验证流程

适用于 A/B 设备的流程

如果设备使用的是 A/B 系统,则启动流程略有不同。必须先使用启动控件 HAL 将要启动的槽位标记为 SUCCESSFUL,然后再更新回滚保护 (Rollback Protection) 元数据。

如果平台更新失败(未标记为 SUCCESSFUL),A/B 堆栈便会回退至仍具有先前 Android 版本的另一槽位。不过,如果已设置回滚保护元数据,之前的版本会因回滚保护而无法启动。

将启动时验证状态传达给用户

确定设备的启动状态后,您需要将该状态传达给用户。如果设备没有任何问题,则会继续运行,而不显示任何内容。启动时验证问题分为以下几类:

  • 黄色:针对设有自定义信任根的已锁定设备的警告屏幕
  • 橙色:针对未锁定设备的警告屏幕
  • 红色 (eio):针对 dm-verity 损坏的警告屏幕
  • 红色 (no os found):未找到有效的操作系统

具有自定义信任根的已锁定设备

黄色屏幕示例:

黄色设备警告屏幕

如果设备处于已锁定状态,已设置自定义的信任根,并且映像已使用该自定义信任根进行签名,则会在每次启动时显示黄色屏幕。黄色屏幕会在 10 秒钟后关闭,并且设备会继续启动。如果用户按下电源按钮,“按电源按钮即可暂停”文字便会更改为“按电源按钮即可继续”,并且该屏幕永远都不会关闭,但设备可能会调暗或关闭显示屏以防烧屏。如果再次按下按钮,该屏幕便会关闭,并且手机会继续启动。

对于hex-number,请使用用于验证的 libavb 表示形式公钥的 sha256 的前 8 位数字,例如 d14a028c

建议采用的文本:

您的设备加载了不同的操作系统。

请在其他设备上访问此链接以了解详情:

g.co/ABH

ID:hex-number

power_settings_new 按电源按钮即可暂停

已解锁的设备

橙色屏幕示例:

橙色设备警告屏幕

如果设备处于已解锁状态,则会在每次启动时显示橙色屏幕。橙色屏幕会在 10 秒钟后关闭,并且设备会继续启动。如果用户按下电源按钮,“按电源按钮即可暂停”文字便会更改为“按电源按钮即可继续”,并且该屏幕永远都不会关闭(设备可能会根据需要调暗和/或关闭显示屏,以防出现烧屏或类似问题)。如果再次按下按钮,该屏幕便会关闭,并且手机会继续启动。

对于hex-number,请使用用于验证的 libavb 表示形式公钥的 sha256 的前 8 位数字,例如 d14a028c

建议采用的文本:

引导加载程序已解锁,无法保证软件完整性。攻击者可能可以获取设备上存储的所有数据。请勿在此设备上存储任何敏感数据。

请在其他设备上访问此链接以了解详情:

g.co/ABH

ID:hex-number

power_settings_new 按电源按钮即可暂停。

dm-verity 损坏

红色 eio 屏幕示例:

红色 eio 设备警告屏幕

如果找到 Android 的有效版本,并且设备当前处于 eio dm-verity 模式,则会显示红色 eio 屏幕。用户需要按电源按钮才能继续。如果用户未在 30 秒内确认警告屏幕,设备将关机(以防烧屏并节省电量)。

注意:系统可能会在显示此屏幕后显示其他警告屏幕。例如,如果设备处于 UNLOCKED 状态,则之后会显示橙色屏幕。

建议采用的文本:

您的设备已损坏。该设备不可信任,并且可能无法正常工作。

请在其他设备上访问此链接以了解详情:

g.co/ABH

power_settings_new 按电源按钮即可继续。

找不到有效的操作系统

红色屏幕示例:

红色损坏设备警告屏幕

如果找不到有效的 Android 版本,屏幕会显示红色。设备无法继续启动。如果用户未在 30 秒内确认警告屏幕,设备将关机(以防烧屏并节省电量)。

对于hex-number,请使用用于验证的 libavb 表示形式公钥的 sha256 的前 8 位数字,例如 d14a028c

建议采用的文本:

找不到有效的操作系统。设备无法启动。

请在其他设备上访问此链接以了解详情:

g.co/ABH

ID:hex-number

power_settings_new 按电源按钮即可关机。

解锁确认

屏幕示例:

解锁设备警告屏幕

显示一个解锁确认屏幕,以响应通过 fastboot 接口执行的 fastboot flashing unlock 命令。初始选中的是“不解锁”选项。如果用户未在 30 秒内与警告屏幕互动,屏幕会消失并且该命令会失败。

建议采用的文本:

如果您解锁引导加载程序,则可以在此手机上安装自定义操作系统软件。自定义操作系统未经过与原始操作系统相同级别的测试,可能会导致您的手机和已安装的应用停止正常工作。使用自定义操作系统无法保证软件完整性,因此在引导加载程序处于解锁状态时存储在手机上的所有数据都可能面临风险。

为防止他人未经授权访问您的个人数据,解锁引导加载程序还将删除您手机上的所有个人数据。

按音量调高按钮/音量调低按钮可选择是否解锁引导加载程序,然后按电源按钮即可继续。

解锁

解锁引导加载程序。

不解锁

不解锁引导加载程序并重启手机。

锁定确认

显示一个锁定确认屏幕,以响应通过 fastboot 接口执行的 fastboot flashing lock 命令。初始选中的是“不锁定”选项。如果用户未在 30 秒内与警告屏幕互动,屏幕会消失并且该命令会失败。

文本:

如果您锁定引导加载程序,则无法在此手机上安装自定义操作系统软件。为防止他人未经授权访问您的个人数据,锁定引导加载程序还将删除您手机上的所有个人数据。

按音量调高按钮/音量调低按钮可选择是否锁定引导加载程序,然后按电源按钮即可继续。

锁定

锁定引导加载程序。

不锁定

不锁定引导加载程序并重启手机。

将启动时验证状态传达给 Android

屏幕示例:

锁定确认设备警告屏幕

引导加载程序通过内核命令参数或 bootconfig(从 Android 12 开始)将启动时验证状态传达给 Android。它会将 androidboot.verifiedstate 选项设置为以下其中一个值:

  • green:如果设备处于 LOCKED 状态且未使用可由用户设置的信任根
  • yellow:如果设备处于LOCKED状态且使用了可由用户设置的信任根
  • orange:如果设备处于UNLOCKED状态

androidboot.veritymode 选项设置为 eio 或 restart,具体取决于启动加载程序在处理 dm-verity 错误时所处的状态。如需了解详情,请参阅处理验证错误

 

 

锁定/解锁引导加载程序  |  Android 开源项目  |  Android Open Source Project https://source.android.google.cn/docs/core/architecture/bootloader/locking_unlocking?hl=zh-cn

翻译

搜索

复制

标签:fastboot,启动,验证,unlock,按钮,屏幕,Android,设备
From: https://www.cnblogs.com/papering/p/17869551.html

相关文章

  • 直播网站源码,写一个android底部导航栏框架
    直播网站源码,写一个android底部导航栏框架import'package:flutter/material.dart'; voidmain(){ runApp(MyApp());} classMyAppextendsStatelessWidget{ @override Widgetbuild(BuildContextcontext){  returnMaterialApp(   title:'BottomNaviga......
  • 让人头皮发麻的Android 性能优化版块,这样简单就学会了?
    前言对现如今的Android开发来讲,不管是在面试还是在日常工作中,性能优化都是一个绕不开的话题。以下这些场景,大家或多或少都有遇见过:当你很努力地优化了应用的性能后,用户依然不断抱怨应用卡顿、启动速度慢等问题。当老大给到你性能优化的KPI,内存要降多少,包体积要减多少时,直接头痛到......
  • 记账宝,Android应用开发
    A.项目描述《记账宝》app是一款专注于个人理财管理的应用程序,其主要功能为用户提供简便易用的记账、分类、统计等功能,帮助用户更好地掌握自己的财务状况。《记账宝》app操作简单方便,支持多种记账方式和帐目类型。通过详细的记账,用户可以更好地了解自己的消费习惯和理财规划,从而做......
  • Android面试被锤记:一面一个不吱声
    前言在老东家干了6年,发展一般,很想出去,但是一直没有合适的机会,只好一边准备面试一边学习。让我没有想到的是,突然收到了“毕业”通知,当然,不光是我,而是整个团队。毕业,对于我这样的老员工来说是不错的结果,因为正好我也想出去,而且这次公司还能给不少补贴。回家住了一段时间后,我开始......
  • Android Watchdog 原理分析
    一、使用通过watchdog的启动以及系统服务注册watchdog等入手来看一下它是如何运作的。启动watchdogprivatevoidstartBootstrapServices(@NonNullTimingsTraceAndSlogt){t.traceBegin("startBootstrapServices");//Startthewatchdogasearlyaspossiblesowe......
  • Android的内部存储和外部存储怎么区分?
    1.定义内部存储:内部存储位于Android手机系统的data/data/<包名>这个目录下,内部存储是私有的,主要用于存储系统和应用程序的某些数据,对于其他应用程序来说是不可见的,并且会随着应用程序的卸载而被删除。外部存储:外部存储可以分为外部私有存储和外部公有存储。外部私有存储......
  • Android-ActivityResultAPI
    Android-ActivityResultAPI1.推出目的如果你将项目中的appcompat库升级到1.3.0或更高的版本,你会发现startActivityForResult()方法已经被废弃了。现在更加建议使用ActivityResultAPI来实现在两个Activity之间交换数据的功能。2.传统写法-在两个Activity之间交换数据如......
  • Android踩坑小记-在onResume中申请权限
    Android踩坑小记-在onResume中申请权限最近遇见一个问题,在onResume中申请权限,比如申请定位权限,如下所示:@OverrideprotectedvoidonResume(){super.onResume();requestPermission();}@TargetApi(Build.VERSION_CODES.M)privatevoidr......
  • Android 两种方获取U盘的挂载路径
    第一种publicStringgetUsbPath(){try{StorageManagersm=(StorageManager)MyApplication.getContext().getSystemService(STORAGE_SERVICE);MethodgetVolumePathsMethod=StorageManager.class.getMethod("getVolumePaths&qu......
  • Android项目实战(六十七):自定义圆形进度条
    圆形进度条支持设置:1、圆环背景颜色2、圆管背景宽度3、进度圆环颜色4、进度圆环宽度5、圆环进度6、开始角度7、动画执行时间 自定义类:packagecom.example.mainactivty;importandroid.content.Context;importandroid.content.res.TypedArray;importandroid.......