Android手机可信引导解决方案

2023-05-16

1. 概述

 

        Android手机的可信引导过程,主要分为三部分,lk的可信,boot的可信,和system的可信;系统上电到lk的启动过程验证,因为和硬件联系紧密,基本都由各自硬件厂商完成.

        lk就是bootloader,它由Pre-loader 启动,该模块在android手机中只可由fastboot工具刷入设备,它的大小一般在1M以下,那么lk的可信就由Pre-loader定义,但是Pre-loader的可信有谁定义呢?为了让android手机有一个公认的可信根,综合考虑可移植性、开发难度、成本等因素,决定定制fastboot工具,android手机如果需要刷入bootloader、Pre-loader等模块,必须使用特制的fastboot工具,用户一旦使用该工具刷入lk模块,fastboot工具就对其进行摘要运算,并且将摘要值传递给远程服务器,服务器通过比较得出lk是否可信的结论,回传给fastboot工具,fastboot工具根据结论是否刷入lk;通过这个办法基本解决lk的可信。

        Boot分区包括了kernel、init、healthd等操作系统必须的文件,它由bootloader启动,该模块在android手机中可由fastboot、ota方式刷入设备,它的大小一般在30M以下,那么kernel的可信就由bootloader定义,由于bootloader是可信的,因此在bootloader中增加校验boot.img的功能,就能解决boot分区的可信。

        System分区包括了vold、surfaceflinger、servicemanager、camera等系统核心进程,里面的核心进程基本都由init进程启动,该模块在android手机中可由fastboot、ota方式刷入,该分区里面的单个文件可由adb工具上传和下载,它的大小一般在1G上下,system.img校验的任务就交给了操作系统,由于system分区的容量,不太适合使用校验boot.img的办法,通常的办法有两个:dm-verity和ima;dm-verity采用的是块校验技术,android原生采用的是该办法;ima采用的是运行时实时校验技术,ima是linux内置的可用模块。

2. 安全引导流程图

        

3. 摘要算法与签名算法

        在安全引导过程中经常要使用摘要算法和签名算法,在此介绍几种常用的算法,供参考:

        摘要算法:把任意长度的输入柔和成固定长度的伪随机输出,其具有无论输入消息长度、消息摘要是’随机’的、无陷门单向函数等特点,一般应用于提取数据’指纹’信息和数据完整性校验场景,常用的摘要算法有hmac、sha1、sha256.

        SHA1:以分组为单位处理数据输入,生成一个长度为160比特的消息摘要,应用比较广泛,SHA256是其变种版本.

        HMAC:以一个密钥和一个消息为输入,生成一个长度为128~512比特的消息摘要,它是一个典型的’挑战/响应’身份认证算法.

        签名算法:可以看作是带有密钥的消息摘要算法,并且这个密钥包括公私钥,它是非对称加密算法和消息摘要算法的结合体,具有抗否认的功能,广泛应用于公钥基础设施(PKI),以及许多网络安全机制中,典型的签名算法有RSA、DSA、ECDSA

        RSA:加密是对明文的E次方后除以N后求余的过程,验证的过程与加密的过程一致,不过加密使用私钥,验证使用公钥,目前为止地球上还没有破解方法.

4. 硬件平台安全引导机制概述

        硬件平台安全引导是指系统上电到lk的引导过程,由于该过程与硬件联系紧密,基本都由手机所使用的硬件平台完成,其核心原理同样是验证签名摘要,典型案例有高通平台的secure boot方案,需要了解可去其官网.

5. 安全引导机制实现细节

        一. BOOTLOADER安全引导实现细节 
             1、PC端 USB连接android
             2、PC端Fastboot刷入lk
             3、PC端Fastboot利用hmac算法对lk做信息摘要
             4、PC端将摘要发送给远程服务器
             5、远程服务器校验摘要信息,返回lk是否被篡改的结果
             6、PC端Fastboot根据远程服务器的结果决定是否刷入lk
             7、Lk可信引导完成
        注:LK的可信认证是在‘体外’完成的,主要开发任务在于定制fastboot刷机工具,不影响手机功能实现。

        二. KERNEL 安全引导实现细节
        Boot.img的可信认证由两部分组成:编译阶段签名和运行时阶段校验
        HOST编译阶段:
             1、正常将boot.img编译出来
             2、利用openssl dgst 提取boot.img的摘要信息
             3、利用openssl工具对摘要信息做签名
             4、将boot.img和签名摘要信息重新打包成新的boot.img
        Bootloader运行时阶段:
             1、正常流程运行于启动boot_linux之前
             2、利用openssl dgst提取缓存于emmc中的kernel镜像文件的摘要信息
             3、利用openssl模块解密附加于boot.img中的签名摘要信息
             4、将2、3步骤中的结果对比,相同则证明boot.img可信

        三. SYSTEM 分区安全引导实现细节
        System.img的认证目前有两种办法:ima(运行时细粒度校验)和dm-verity(挂载时粗粒度校验+运行时细粒度)


        Ima:将文件的内容和文件的属性/扩展属性,通过加密哈希生成对应的ima/evm串,以扩展属性的方式保存在文件系统节点中;系统运行时在文件被访问之前,内核            IMA/EVM模块通过校验文件的ima/evm串,来判断文件是否被离线篡改过;该流程分为两部分:编译阶段签名和运行时阶段校验
        HOST编译阶段:
             1、利用openssl dgst 提取文件的摘要信息
             2、将摘要信息串保存于文件的扩展属性security.ima中
             3、利用openssl dgst 提取文件所有扩展属性的摘要信息
             4、利用openssl工具对扩展属性的摘要信息做签名
             5、将签名摘要信息串保存于文件的扩展属性security.evm中
       运行时阶段:
             1、运行于文件被打开前
             2、校验文件的security.evm属性
             3、校验文件的security.ima属性
             4、2、3过程都通过则证明文件没有被离线篡改过
       注:系统启动阶段需要导入签名公钥、文件校验策略,便于内核IMA模块校验文件,此外该方法是细粒度的分区校验,它会在系统运行时对系统产生影响.

        

        

       Dm-verity: 分区映射校验是一种针对分区进行完整性检查的安全机制。它利用哈希树结构去构建整个分区目录的签名信息。系统在启动挂载分区时,内核对挂载的分区进行 签名验证,验证成功则进行挂载操作;同时这种机制允许system分区在读写的时候分块校验,而不是一次性校验整个分区;该过程同样分为两部分: 编译阶段签名和运行时阶段校验,过程与ima类似,但与ima不同的是,dm-verity校验过程在系统启动阶段还拦截了mount操作,且是粗粒度的校验过程, 采用该办法后系统无法使用普通的差分包进行升级,且对系统的启动有一定影响.

        
 

        

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android手机可信引导解决方案 的相关文章

随机推荐

  • 告别我的2016

    又过了一年 xff01 xff01 xff01 每一年都会因为所经历的不同 xff0c 收获也不同 在过去的2016年 xff0c 回想自己在工作上好像没有做多少事情 xff0c 却也有不一样的收获 2016年2月份 xff0c 刚过来春节
  • 判断某个月份是否在给定的月份区间内

    判断某个月份是否在给定的月份区间内 输入 指定月份 xff1a m m m 月份区间 xff1a m 1 m 1
  • 数据清洗

    1 概念 数据清洗 xff1a 把脏数据清洗掉 xff0c 提高数据质量 Data cleansing Data cleaning Data scrubbing三种表达方式都可以 xff0c 意思都是检测和去除数据集中的噪声数据和无关数据
  • 联想H61主板升级BIOS,支持nvme硬盘

    本教程升级有一定风险 xff1a 请阅读文章最后的 遗憾 部分接受再升级 最近因为手上有一台联想的i7 2600主机 xff0c 他的主板是H61的 xff0c 正好看见pcie接口空着 xff0c 在网上看见有人用它升级了拜滕的存储芯片
  • armv8 摘要

    作者 xff1a 蜗蜗 发布于 xff1a 2015 7 7 22 31 分类 xff1a ARMv8A Arch 1 前言 ARMv8 xff08 当前只有A系列 xff0c 即ARMv8 A xff09 架构 xff0c 是ARM公司为
  • android 绘制过程摘要

    1 没有硬件加速的UI绘制过程 xff1a 在Android应用程序进程这一侧 xff0c 每一个窗口都关联有一个Surface 每当窗口需要绘制UI时 xff0c 就会调用其关联的Surface的成员函数lock获得一个Canvas xf
  • opengl 摘要

    一 创建opengl工程 1 第一步设置像素格式 如支持双缓冲 xff0c 设置颜色模式 xff0c 如是rgba xff0c 还是颜色索引 xff08 需调色板 xff09 xff0c 设置模板缓冲区的特征值 2 第二步创建绘制环境 且自
  • Watchdog

    一 简介 软件狗 类似硬件狗 xff0c 硬件狗是被动等 喂 xff0c 系统主要线程主动调用硬件接口 xff0c 告诉系统本线程是正常的 但android 这种framework层中的软件狗本身是一个线程 xff0c 会主动询问系统关键线
  • android Binder 学习

    一 面向过程调用与面向对象调用的区别 1 面向过程调用同一时刻只能服务一个客户 xff0c 而且该过程必须具有锁功能 xff0c 如果有其他客户想要访问 xff0c 则需要等待前一客户完成操作 2 面向对象则能同时服务多个客户 xff0c
  • QEMU KVM 虚拟机移植之性能提高篇小结(android 虚拟机双系统方案)

    一 提升性能核心要素 1 将 OPENGL 接口进行穿透调用 xff0c 下面对opengl穿透做个小结 2 在arm开发板上打开kvm特性 xff0c 这个qcom amp mtk都是实现了的 xff0c 只需要打开开关即可 二 ANDR
  • android 系统基础知识

    一 Activity 启动模式 Activity有四种启动模式 xff1a standard singleTop singleTask singleInstance 可以在AndroidManifest xml中activity标签的属性a
  • android 内存管理概要

    一 zram zram swap 主要原理就是从内存分配一块区域出来用作 swap 分区 xff0c 每次如果内存空间不够了 xff0c 不是把应用程序杀掉 xff0c 而是把应用程序所占用的内存数据复制到 swap 分区 xff0c 等切
  • python统计从1970/1/1 08:00:00到某个时刻的总秒数

    使用场景 xff0c 比如需要从一堆文件中 xff0c 选出时间属性在2017年12月13日00 00 00以后的所有文件 span class token keyword import span os statinfo span clas
  • art知识简要概括

    一 GC分类 1 kGcCauseForAlloc 当没有足够的内存分配时触发 2 kGcCauseBackground 当已使用的内存超过最大值时触发 3 kGcCauseExplicit 当使用System GC时触发 二 GC守护线程
  • SEAndroid 知识点

    一 DAC 1 自主访问控制 Linux上的安全模型叫DAC xff0c 进程的权限与执行它的用户的权限一致 xff0c file针对所有者 所有者组 其他用户制定相关权限 二 MAC 1 强访问控制 SELinux上的安全模型叫MAC x
  • Cgroup 理解

    一 综述 1 cgroup 可以控制进程组的资源 xff08 cpu memory i o等 xff09 2 cgroup 采用树型结构来控制进程组的资源 3 cgroup 利用资源子系统来分割资源 4 cgroup 是lxc xff0c
  • namespace 理解

    当调用clone时 xff0c 设定了CLONE NEWPID xff0c 就会创建一个新的PID Namespace xff0c clone出来的新进程将成为Namespace里的第一个进程 一个PID Namespace为进程提供了一个
  • Bionic 学习

    一 基本概况 1 不与其他libc库兼容 xff0c 有自己的动态链接器 linker 2 不支持c 43 43 异常抛出 3 一共有libc xff08 c基础库 xff09 libm xff08 数学库 xff09 libdl xff0
  • 基于容器原理(docker、lxc、cells)的Android 双系统设计概要

    写在前面 前几年预研加开发android双系统 xff0c 中途用过不少开源代码或者研读过大牛BLOG xff0c 现开放双系统设计原理来回报社区 android容器技术已在android 6 7 8 9 10 11 12 13版本中分别实
  • Android手机可信引导解决方案

    1 概述 Android手机的可信引导过程 xff0c 主要分为三部分 xff0c lk的可信 xff0c boot的可信 xff0c 和system的可信 xff1b 系统上电到lk的启动过程验证 因为和硬件联系紧密 xff0c 基本都由