问题描述
在Android Nougat及更高版本中,系统的安装分为两个完整的分区:当前使用的和用于升级的次要分区。当进行软件更新时,新数据会加载到次要分区,待成功更新后,次要分区会被激活成为主分区并执行新的操作系统。然而,在系统启动过程中如何防止从原始未升级的分区启动问题仍然存在。本文将详细解释相关机制,并提供解决方案。
解决方案
1. bootloader层级控制
在Android系统的升级过程中,需要使用update_engine
工具来加载最新的更新包。一旦更新成功,update_engine
会告知bootloader下次重启时应从哪个分区启动新系统。
$ update_engine --url https://example.com/path/to/update/package
因此,信息决定了哪个分区将被用来进行系统的启动是由bootloader层级管理的。
2. dm-verity机制保护
在Android设备中,dm-verity
是一种内核级别的保护机制,该机制确保了分区数据的真实性。一旦系统出厂后,这个机制就变得无法篡改。
如果校验失败,则系统会生成I/O错误,使得文件看起来如损坏一样,这是预料中的行为。
需要注意的是,在某些情况下通过自定义恢复环境可以使dm-verity
可以被禁用,但此时OTA更新将会失败。
3. 安全机制防篡改
由于dm-verity
无法在网络攻击中被轻易改变,因此即使拥有root权限也无法修改启动信息。一旦自定义恢复分区的信息发生变化或系统未能通过校验,则整个系统将停止启动并报错。这也意味着,在这个阶段,任何试图侵入系统的行为都将被自动封堵。
4. 总结
综上所述,Android系统在设备出厂后就将dm-verity内置于底层以提供硬件级别的数据保护,从而防止其他未经升级的分区进行未经授权的启动活动。若要绕过系统防护机制,必须首先通过bootloader或恢复模式来篡改这些固件设置;但这将触发dm-verity
校验失败,导致系统无法正常进入。
参考资料
通过上述措施和相关技术,我们可以有效预防未经授权的分区被用于启动设备。但需要注意的是,一旦自定义恢复系统改变了原厂设置或固件,则系统原有的安全机制将不再生效,这也是目前需要考虑的一个风险点。