Android系统的安全问题 - Android的启动时验证

Android 启动时验证(Verified Boot)

Android 的 启动时验证(Verified Boot) 是一项关键安全机制,用于确保设备启动过程中加载的所有系统镜像(如 Bootloader、内核、系统分区)未被篡改,防止恶意软件植入或 Root 攻击。其核心思想是 逐级验证,从硬件信任根开始,直到 Android 系统完全启动。
参考:Google官方文档 Android的启动时验证


1. Verified Boot 的核心目标

  • 完整性检查:验证每个启动阶段的固件和系统镜像是否未被修改。
  • 防回滚保护:防止攻击者降级系统到存在漏洞的旧版本。
  • 可信链建立:从硬件信任根(Root of Trust)到 Android 系统,形成完整的信任链。

2. Verified Boot 的信任链(Chain of Trust)

Android 的启动验证是一个 逐级验证 的过程,依赖以下关键组件:

启动阶段验证内容验证方式
硬件 Root of Trust设备唯一密钥(如熔断式密钥)由芯片厂商固化,不可更改
Bootloader验证 boot.img(内核 + initramfs)使用设备密钥签名验证(如 AVB)
内核验证 systemvendor 等分区DM-verity(基于哈希的验证)
Android 系统检查系统完整性(如 SELinux、APK 签名)通过 initfs_mgr 实现

3. Verified Boot 的关键技术

(1)Android Verified Boot (AVB)

  • 作用:Google 设计的标准验证协议,用于 Bootloader 验证 boot.img 和系统分区。
  • 主要机制
    • 分区哈希验证vbmeta 分区存储各分区的哈希值或签名。
    • 公钥验证:Bootloader 使用设备内置公钥验证 vbmeta 签名。
    • A/B 无缝更新支持:确保系统更新后仍能通过验证。
  • 三种验证模式
    • enforcing(严格模式):验证失败则拒绝启动。
    • logging(日志模式):仅记录验证错误,仍允许启动(用于调试)。
    • disabled(禁用模式):不验证(仅用于开发设备)。

(2)DM-verity

  • 作用:在内核层验证 systemvendor 等只读分区的完整性。
  • 原理
    • 分区被划分为多个 4KB 块,每个块对应一个哈希值(存储在 hashtree 中)。
    • 启动时内核验证哈希树,运行时按需检查访问的块是否被篡改。
  • 防篡改能力:如果攻击者修改系统文件,DM-verity 会检测到哈希不匹配并拒绝读取。

(3)Bootloader 锁定(Locked Bootloader)

  • 作用:防止未签名的镜像被刷入设备(如自定义 ROM)。
  • 用户影响
    • 锁定状态:仅允许加载官方签名镜像(OEM 密钥)。
    • 解锁状态:可刷入第三方镜像(但会触发 Verified Boot 失败警告)。

4. Verified Boot 的启动流程

  1. Power-On → ROM Bootloader

    • 芯片内置的只读代码(如高通 PBL)加载并验证 Bootloader(如 abl.elf)。
  2. Bootloader → vbmeta 验证

    • Bootloader 读取 vbmeta 分区,验证其签名(使用设备公钥)。
    • 检查 boot.imgsystem 等分区的哈希是否匹配。
  3. 内核启动 → DM-verity 初始化

    • 内核挂载 system 分区时,加载 hashtree 并启用实时验证。
  4. Android 启动 → init 检查

    • init 进程验证关键文件(如 selinux 策略)的完整性。
    • 如果使用 fs-verity(文件级验证),进一步检查 APK 签名。

5. 安全增强:Android 13+ 的改进

  • Init Boot 验证:在 init 阶段验证启动脚本和关键配置文件。
  • Fs-verity:文件级完整性验证(用于 APK、系统配置文件等)。
  • 动态分区验证:支持动态分区的哈希验证(如 super 分区)。

6. 开发者相关

(1)调试 Verified Boot

  • 查看验证状态

    adb shell getprop ro.boot.verifiedbootstate
    
    • 返回 green(验证通过)、yellow(解锁 Bootloader)、red(验证失败)。
  • 强制进入 logging 模式(仅调试):

    fastboot set_active other
    

(2)自定义 ROM 兼容性

  • 如果设备启用 AVB,刷入第三方 ROM 需满足:
    • 使用设备支持的签名密钥(如社区签名密钥)。
    • 或解锁 Bootloader(但会降低安全性)。

7. 攻击与防护

已知攻击方式

  • Bootloader 漏洞:利用未修补的漏洞跳过验证(如 CVE-2022-20452)。
  • 物理攻击:通过 JTAG 或芯片拆解绕过验证(需高端设备)。

防护措施

  • 防回滚(Anti-Rollback):熔断计数器阻止降级到旧版本。
  • 安全芯片(如 Titan M):存储根密钥,防止软件层攻击。

8. 总结

关键点说明
硬件信任根芯片厂商固化密钥,确保 Bootloader 可信。
AVB(Verified Boot)Bootloader 验证 vbmeta,确保内核和系统分区未被篡改。
DM-verity内核实时验证 system 分区的完整性。
用户可见影响解锁 Bootloader 会触发警告,部分功能(如银行应用)可能禁用。

Verified Boot 是 Android 设备安全的基石,与 TEE(如 Trusty)、加密(如 FBE)共同构建了从启动到运行的完整防护体系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【操作系统】(四)体系结构

(一)大内核与微内核 把橘色部分划分到内核中的操作系统属于大内核,不把橘色划到内核中的操作系统属于微内核 大内核与微内核的具体区别: (二)计算机的层次结构 (三)操作系统内核非内…

Kotlin 协程官方文档知识汇总(一)

1、协程基础 Kotlin 是一门仅在标准库中提供最基本底层 API 以便其他库能够利用协程的语言。与许多其他具有类似功能的语言不同,async 与 await 在 Kotlin 中并不是关键字,甚至都不是标准库的一部分。此外,Kotlin 的挂起函数概念为异步操作提…

MySQL 的 JSON 查询

MySQL 的 JSON 路径格式 MySQL 使用特定的 JSON 路径表达式语法来导航和提取 JSON 文档中的数据 基本结构 MySQL 中的 JSON 路径遵循以下通用格式 $[路径组件]路径组件详解 | 操作符 | 描述 | 示例 | | ----------- | --------- | ----------…

Wi-SUN技术,强势赋能智慧城市构筑海量IoT网络节点

在智慧城市领域中,当一个智慧路灯项目因信号盲区而被迫增设数百个网关时,当一个传感器网络因入网设备数量爆增而导致系统通信失效时,当一个智慧交通系统因基站故障而导致交通瘫痪时,星型网络拓扑与蜂窝网络拓扑在构建广覆盖与高节…

Leetcode13-罗马数字转整数

题目链接&#xff1a;13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 如同上一题&#xff0c;直接用暴力法破解&#xff0c;简单好理解 int romanToInt(char* s) {int len strlen(s);int res 0;for(int i 0; i < len; i) {switch(s[i]) {case M:res 1000…

Linux系统加固笔记

检查口令为空的账户 判断依据&#xff1a;存在则不符合 特殊的shell a./bin/false:将用户的shell设置为/bin/false&#xff0c;用户会无法登录&#xff0c;并且不会有任何提示信息b./sbib/nologin&#xff1a;nologin会礼貌的向用户发送一条消息&#xff0c;并且拒绝用户登录…

23种设计模式-责任链(Chain of Responsibility)设计模式

责任链设计模式 &#x1f6a9;什么是责任链设计模式&#xff1f;&#x1f6a9;责任链设计模式的特点&#x1f6a9;责任链设计模式的结构&#x1f6a9;责任链设计模式的优缺点&#x1f6a9;责任链设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

【宇宙回响】从Canvas到MySQL:飞机大战的全栈交响曲【附演示视频与源码】

🌟 这是星际大战系列的第三篇,感谢一路以来支持和关注这个项目的每一位朋友! 💡 文章力求严谨,但难免有疏漏之处,欢迎各位朋友指出,让我们一起在交流中进步。 🎁 项目代码、文档和相关资源都可以免费获取,希望能帮助到更多对游戏开发感兴趣的朋友。 💌 如果您有任…

MyBatis-Plus(Ⅵ)插件

目录 一、分页插件 1.添加配置类 2.在测试类测试 结果 二、xml实现分页的自定义 1.UserMapper中定义接口方法 2.创建UserMapper.xml文件 3.在测试类测试 结果 三、乐观锁 1.场景 2.乐观锁与悲观锁 3.模拟修改冲突 数据库中添加商品表 添加数据 添加实体类 添加map…

火山引擎云上实战: DeepSeek R1 大模型(全尺寸)

本文将介绍两种在火山引擎云上部署 DeepSeek-R1 全尺寸模型服务的方案&#xff0c;涵盖大模型推理服务的 Terraform 一键部署、容器化部署、资源弹性伸缩和模型可观测。 来源 | 火山引擎云基础 在 AI 大模型日新月异的当下&#xff0c;企业在使用大模型时往往面临着数据隐私保…

vue遗漏的知识点(动态组件.)

----动态组件&#xff08;vue2vue3通用&#xff09; <component :is"..."> 的作用 <component> 是 Vue 的内置组件&#xff0c;用于动态渲染其他组件。:is 属性 用于指定要渲染的组件。它的值可以是&#xff1a; 组件的名称&#xff08;字符串&#xf…

工作流引擎Flowable介绍及SpringBoot整合使用实例

Flowable简介 Flowable 是一个轻量级的业务流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;基于 Activiti 项目发展而来&#xff0c;专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。 Flowable 的核心…

【uni-app】引用公共组件

目录 一、建立公共组件 1.1新建vue文件 1.2编写公共文件代码 1.3使用 注意事项 一、建立公共组件 1.1新建vue文件 在公共组件文件目录下新建所需要的功能文件 1.2编写公共文件代码 按需求写对应功能的代码 1.3使用 在需要使用的文件下引用公共组件 注意事项 想要使用s…

STL中vector模拟实现

vector各个接口函数 //构造函数 vector() vector(size_t n,const T& valT()) vector(int n,const T& val T()) //拷贝构造函数 vector(const vector<T>& v) //迭代器版本的 vector(inputiterator first, inputiterator end) //赋值运算符重载 vector<T&…

DML 数据操纵语言学习笔记

一、DML 核心概念体系 1.1 语言定位与边界 DML&#xff08;Data Manipulation Language&#xff09;作为 SQL 三大核心语言之一&#xff0c;专注于数据行级操作&#xff0c;区别于 DDL&#xff08;结构定义&#xff09;和 DCL&#xff08;权限控制&#xff09;。其核心指令包…

springboot的跨域是什么?遇到跨域问题如何解决?

在Spring Boot中&#xff0c;跨域是指当浏览器中的前端应用&#xff08;如运行在某个域名和端口下的前端页面&#xff09;请求后端接口时&#xff0c;如果后端接口所在的域名、端口或协议与前端应用不一致&#xff0c;浏览器会阻止这种跨域请求。这是由于浏览器的同源策略&…

啸叫抑制(AFS)从算法仿真到工程源码实现-第八节-系统搭建

一、概述 系统分为录音模块、数据处理模块、播音模块。录音模块和播音模块使用alsa库进行读写数据。各模块为独立进程处理&#xff0c;模块之间使用命名管道进行数据的传输。数据处理模块我们使用基于频域的自适应滤波去啸叫算法。 二、工程实现 2.1 系统流程图 2.2 录音模块…

HTML——什么是块级元素,什么是内联元素,有何区别

在 HTML 中&#xff0c;块级元素&#xff08;Block-level element&#xff09;和内联元素&#xff08;Inline element&#xff09;是两种不同类型元素&#xff0c;它们在页面布局和样式应用方面有不同的行为和特性。 块级元素&#xff08;Block-level element&#xff09; 块级…

01 设计模式和设计原则

类设计原则&#xff1a; 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;&#xff1a;实现类要职责单一开闭原则&#xff08;Open Close Principle&#xff0c;OCP&#xff09;&#xff1a;对扩展开放&#xff0c;对修改关闭里氏替换原则…

【踩坑日记】springboot 打包后实现类无法找到

试过了所有改什么目录 依赖 clean都以失败告终 最后将实现类的文件名从Impl改成impl宣布成功 记得使用idea自带的重构