Android Security boot

本文介绍移动设备安全启动过程中的关键技术,包括使用Blake2哈希算法保护固件完整性和采用ED25519数字签名算法确保软件来源可靠。详细阐述了安全启动流程及其实现细节。


一般来讲,移动设备主要用来实现以下安全特性:

1.      禁止烧写未经授权的官方固件;

2.      禁止运行非经授权的官方固件;

3.      禁止非法追踪和调试代码;

4.      对单个芯片设定IMEISIM保护和其他特性证书;

5.      禁止设备固件降级,禁止诸如A设备的固件烧写到B设备的交叉写入;

6.      运行时候,无法被观测的可信运行环境;

7.      安全测试和调试功能;

8.      DRM

       一般安全启动都会实现了上述的123457项安全特性。



    在实现安全特性时候,不能把大量数据解压缩到RAM,不应产生大的延迟。所以,

一般来说,对image等文件进行保护时候,一般会首先用hash算法,把image文件生成固定bit的信息摘要,然后使用数字签名技术对摘要进行签名,从而防止大量数据加密耗费时间。此步骤需要在pc端提供工具,比如sign,用来生成公钥和私钥,使用生成的私钥文件进行签名,最终生成image+签名+证书的image文件。其中,证书包括客户的公钥信息以及是否开启debug功能的字段。

对于特定客户来说,客户使用sign工具生成公私密钥对后,试用版hash算法把公钥信息hash化,然后发送给芯片公司,芯片公司在芯片出厂时候,把公钥或者其hash信息写入efuse相应字段。

上述加密工作是在pc端编译生成image文件的时候完成,一般在Makefile中调用命令实现。

一般芯片内部含有rom,开机启动时候自动运行,主要是把二级boot-loader(本文档中用SPL image代替)加载到内部ram运行。

    大数据的情况下,生成信息摘要的哈希算法耗费时间较多,所以应该选择安全性好,速度快,消耗内存少的hash算法,hash算法经过了MD5,SHA0, SHA1,SHA2等算法,目前已经进化到了BLAKE2 算法,此处使用Blake2 hash 算法。

    数字签名算法,应该选择安全性能高,速度快,所需内存少的算法,目前数字签名算法正越来越多的按照RSA->DSA->ECDSA->ED25519的顺序演进,诸如苹果等公司,在保护手机的私人数据时候,同样采用了ED25519算法,ssh也开始转向安全性能更高的ED25519。基于此,数字签名算法选择了ED25519.


在生成image文件的时候,使用sign工具,会生成包含公钥和安全debug标志的证书,证书同样会使用私钥进行加密,然后把证书添加在SPL image后面。

Secure boot步骤如下:

1.   Rom code读取SPL image;

2.   Rom code读取Efuse secure bit,如果不采用secure boot,则直接运行读取的SPL image(注意:安全模式选择不能通过pin管脚,因为太容易被改写);

3.   Rom code 读取附加在image后面的证书,然后通过证书的magic判断证书是否存在,如果不存在的话,直接返回错误,否则使用pub keyhash,和efuse中读取的hash值判断,如果不一致,返回错误,一致的话,使用证书中的pub key 验证证书是否位有效证书;

4.   如果证书无效,返回错误,否则使用证书中的pub key验证SPL image是否有效。如果有效,则运行。

secure boot流程如图所示:


安全启动芯片设计涉及多个关键方面,从信任基础构建到各组件间的安全交互都至关重要。 在信任机制方面,安全处理涉及加解密和验签,其中信任根和信任链是核心概念。信任根是芯片中可始终信任的来源,通常为BootRom,基于BootRom和efuse构建信任链,信任链上包含芯片boot所需的各种镜像文件,以此确保系统启动的安全性和可靠性[^2]。 以展锐平台为例,安全部署的设备会在AP Soc的ROTPK efuse区域写入用于验证spl镜像签名的第一级公钥(rsa2048_0_pub.bin)的哈希。Romcode作为信任根的一部分,不可被重写(篡改),是安全启动的基础。上电后,Romcode加载spl镜像,从spl分区读取第一级公钥,并计算其哈希和ROTPK记录的公钥哈希进行比较,只有一致时才能使用该公钥来验证spl镜像的数字签名,这一过程体现了信任根对启动流程的初始验证作用[^3]。 在启动流程上,SPL镜像作为secureboot loader运行在Secure IRAM,负责初始化DRAM并将sml(Arm Trusted firmware)、tos(trusty os)和uboot(REE bootloader)加载到DRAM,同时校验这三个系统镜像的合法性,校验通过后执行sml。sml运行tos,tos运行内置的TA,之后tos返回到sml,sml再返回到uboot执行。Uboot运行在Hypervisor模式,负责检查设备状态,加载和校验dtbo和boot/recovery镜像的内容,并准备验证启动Android系统的内核参数。Uboot引导内核启动后,内核负责验证Android系统分区,验证通过后将其挂载为只读的系统分区。Android启动后,modem_control服务负责校验和加载modem子系统的固件,整个流程环环相扣,通过层层验证保障系统安全启动[^3]。 ### 代码示例 以下是一个简单的伪代码示例,用于说明公钥哈希比较的过程: ```python # 假设这是从ROTPK efuse区域读取的公钥哈希 stored_public_key_hash = "abcdef123456" # 从spl分区读取第一级公钥 first_level_public_key = read_public_key_from_spl_partition() # 计算读取的公钥的哈希 calculated_hash = calculate_hash(first_level_public_key) # 比较哈希值 if calculated_hash == stored_public_key_hash: print("公钥哈希匹配,可以验证spl镜像签名") # 调用验证spl镜像签名的函数 verify_spl_image_signature(first_level_public_key, spl_image) else: print("公钥哈希不匹配,启动失败") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值