Android Safety 系列专题【总篇:安全机制汇总】
目录
一、密码学基本概念
1、编码&散列算法
2、加密算法
3、数字证书
二、镜像签名
1、启动流程
2、AP & BP镜像
3、Secure Boot机制
4、Aosp AVB机制
三、运行时安全机制
1、安全架构
2、DAC机制
3、Selinux机制
4、应用签名
Android系统的安全方面其实是非常复杂,繁多,添加了很多套机制,在android五层架构中,用于解决不同的安全问题。因此这里整体梳理一下android在安全方面做的一系列事情。本系列主要围绕如下几个主体全面了解Android系统在安全方面做了哪些努力:
- 第一章:针对密码学的基本概念,主要介绍一些基础的密码学相关术语,对一些基本概念有所了解
- 第二章:引入镜像签名,为了防止刷机过程中软件被篡改,从镜像的编译、平台工具刷机、系统启动过程中对分区的校验,来保证整个流程是安全的
- 第三章:建立在系统成功启动之后,如何保证应用的信息安全,服务进程的安全,等维度来拆机AOSP引入了哪些机制
一、密码学基本概念
要理解android的安全机制,肯定少不了各种key,公钥、私钥、证书、签名等东西,但是这些如果没有系统的了解过密码学基础知识,可能会觉得一脸懵逼。这里就来进行一个简单和基础概念的梳理。
1、编码&散列算法
在研究密码学之前,先进行一个热身,介绍两种算法:编码算法和散列算法,他们都不是加密算法,同时也存在一些本质的区别。
1)编码算法
- 概念:编码算法是可逆的格式转换,目的是让数据能在特定系统中安全传输或存储(如文本环境传二进制),不提供任何安全性。
- 示例:
明文字符串"hello"可以通过编码算法转换为"aGVsbG8=",又可以通过编码算法回到"hello",中间没有任何安全性可研,所以根本无法用来当成加密算法进行使用。 子集:常见的算法有Base64、Base32 / Base58 / Base85、URL 编码(Percent-encoding)、HTML 实体编码、Hex 编码(十六进制)- base64:作为最常见的编码算法,可研将任意二进制数据转为 ASCII 字符串(使用 A–Z, a–z, 0–9, +, /, =)。常用于:邮件附件、HTML/CSS 内嵌图片(
data:image/png;base64,...)、JWT Token 载荷
2)散列算法
- 概念:不可逆!输出固定长度“指纹”,用于校验完整性、生成唯一标识等。安全性差异大,需按场景选择。
- 示例:明文字符串"xxxxyyyy....",都可以获取他固定长度的hash值,但是无法通过这个hash值还原之前的明文,因此它是不可逆,通常用于校验完整性,或者生成唯一标识。因为安全性差异较大,通常也无法用来作为密码算法。
MD5(Message-Digest 5):输出128 位(32 位 hex),特点是快,但已被攻破(碰撞攻击可行),仅限非安全场景(如文件快速校验、ETag)
CRC32(Cyclic Redundancy Check):输出32 位整数(常转为 hex);不是密码学哈希!仅用于错误检测(如网络包、ZIP 文件校验);速度快,但极易碰撞,不能用于安全场景
SHA 系列(Secure Hash Algorithm):其中SHA-256比较场景,输出长度256位
| 算法 | 输出长度 | 安全性 | 说明 |
|---|---|---|---|
| SHA-1 | 160 位(40 hex) | ❌ 不安全(Google 已实现碰撞) | 曾用于 Git、证书,现逐步淘汰 |
| SHA-256 | 256 位(64 hex) | ✅ 安全 | 最广泛使用的安全哈希(区块链、TLS、JWT) |
| SHA-224 / SHA-384 / SHA-512 | 各不同 | ✅ 安全 | SHA-2 家族成员 |
| SHA-3 | 可配(如 256/512) | ✅ 安全 | 结构不同于 SHA-2,抗未来攻击更强 |
2、加密算法
1)对称加密
对称加密就是通信双方使用相同的秘钥加密解密。
对称加密算法有DES、3DES(TripleDES),DESede、AES、Blowfish,以及RC2和RC4算法,还有其他第三方提供的软件包提供的Bouncy Castle 提供的IDEA算法。这里面DES算是最经典的算法,DESede是DES算法的变种,AES算是DES算法的替代者。
流程图如上,详细理解可以参考:https://www.jianshu.com/p/3840b344b27c
2)非对称加密
非对称加密使用一对密钥:公钥(public key)和私钥(private key)。
- 私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。
- 公钥和私钥是成对出现的,它们可以互相解密。公钥加密的内容,只有私钥可以解密。私钥加密的内容,只有公钥可以解密。
流程图如上,介绍的两个场景:
- 第一个场景是,原内容被公钥加密之后,公钥无法解密只有私钥才能进行解密,例如对方想给我发送一段密文,那么他可以使用我的公钥进行加密,然后吧密文发给我,因为私钥只在我手上,我不担心其他人收到密文,因为他们没有私钥无法解密,只有我才能。
- 第二个场景是,我把我的信息通过私钥进行加密,加密之后的密文发布出去,只要拿到我的公钥就可以解密这段密文内容,通常用于身份认证的场景,包括发布签名证书。
主要的非对称加密算法有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。使用最广泛的是RSA算法,Elgamal是另一种常用的非对称加密算法.
3)加密算法如何选择?
如上为我们最佳使用场景,因为对称加密算法速度比较快,通常会把传输内容进行对称加密,例如AES,为了保证我们的安全性,我们可以对这里比较重要的AES秘钥进行第二次加密,那么如何加密呢?使用非对称加密方式,例如RSA,虽然RSA比较慢,但是这里的数据量小。
这样有效的吧非对称和对称加密算法,结合起来,构建成了如今大多数场景。
3、数字证书
证书这个理解起来有些懵逼,不过可以参考https://blog.csdn.net/adeyi/article/details/8556170
描述的非常形象,截一段他的图:
因此数字证书其实就是一个文件,或者一段字符串,这段数据中包含了我们的持有者姓名,持有者的公钥。讲到这里是否恍然大悟,其实就是非对称加密的第二个场景的适用:
举个例子:我要发布SHEN的数字证书,首先我需要生成公钥和私钥,我把我的名字SHEN和生成的公钥,还有其他信息放到一起,并做成如上的名片,这个就是我的数字证书,并发放给我的粉丝,我的粉丝拿到我这张名片之后,就能够知道我的公钥和我的名字,我把我的名字SHEN通过我的私钥进行加密,我的粉丝收到这些密文之后,通过我的证书中的公钥解密,解密出来是我的名字SHEN,并和我的数字证书进行验证,看我数字证书的持有者也是SHEN,匹配成功,就知道这是本人发布的签名,是真实的。
二、镜像签名
在了解了密码学的一些基本概念之后,我们来看看android是如何利用这些加密算法,来保证我们android架构的安全呢?
首先面临的问题就是,我们如何保证镜像编译和刷机的过程是安全的,例如厂商生成的镜像经过厂商自己的私钥签名,就可以保证此镜像是由厂商编译生成,厂商生成的设备,如果发现镜像的签名不匹配,那么就禁止启动。
在研究这个话题之前,我们先看看在不同平台的android系统启动流程:
1、启动流程
1)Boot ROM 阶段
设备上电后,CPU从固定地址(通常是0x0)开始执行固化在芯片内部ROM中的Boot ROM代码(也称BL1)。
这一阶段不可修改,是整个启动链的信任根,主要任务包括:
- 初始化CPU核心、时钟、L2 Cache(临时作为SRAM使用)等基础硬件;
- 检测启动设备(如eMMC、SD卡);
- 加载下一阶段的Preloader到内部SRAM并跳转执行。
- MTK: 称为 BL1,固化在芯片 ROM 中,负责初始化 CPU、时钟、L2 Cache,并加载 Preloader 到 SRAM。
- 高通: 称为 PBL(Primary Boot Loader),功能类似,负责从存储设备加载 SBL 镜像。
2)Bootloader 阶段
boot rom阶段还是执行的固化在芯片内部rom中的代码,这段代码通常不会被篡改,由芯片平台厂商进行设计,并且闭源,我们无法修改代码。
boot rom负责加载启动引导程序bootloader,而bootloader就是常规的引导程序,这部分代码在不同平台设计也有所不一样,不同的这段代码我们可以拿到并进行修改。
A 高通平台
高通平台主要设计如下:
Primary Bootloader (PBL) 阶段:PBL 是 Boot ROM 后续执行的第一个引导加载程序,通常由高通的 SoC 芯片内置,不可更改。它的主要任务包括:
- 初始化基本硬件环境(如时钟、内存控制器等)。
- 加载次级引导程序(Secondary Bootloader, SBL)。
- 在某些情况下,可能会加载 SBL1 到 L2 Cache 或 RPM 处理器的 RAM 中。
Secondary Bootloader (SBL) 阶段:SBL 继续进行更深入的硬件初始化工作,例如:
- 初始化 DDR 内存控制器。
- 加载安全组件(如 TrustZone/QSEE)。
- 加载后续阶段的引导程序(如 XBL 或 UEFI)。
UEFI 或 XBL 阶段:在较新的高通平台(如 MSM8998 及以上),使用 UEFI 替代了传统的 LK Bootloader。UEFI 包括多个阶段,如 SEC、PEI、DXE、BDS 等,负责加载内核镜像和 ramdisk。而在旧平台中,XBL(eXtensible Boot Loader)可能替代 SBL 作为主要的引导加载程序。
B MTK平台
MTK平台主要设计如下:
Preloader 阶段(BL2):Preloader是MTK平台特有的引导程序,运行在SRAM中(BL2阶段),负责进一步初始化硬件环境。其关键功能包括:
- 初始化外部DRAM控制器;
- 设置UART、USB等调试接口;
- 执行安全验证(仅加载MTK签名的镜像);
- 加载LK(Little Kernel)到DRAM中。
- 此阶段还支持多种启动模式检测,如是否进入Fastboot或Recovery模式。
Little Kernel(LK)阶段(BL33):LK是MTK平台的主引导加载程序,主要分为BL2(在SRAM中运行,进行最小化初始化)阶段;和BL33(在DRAM中运行,执行完整功能)阶段。LK的主要职责包括:
- 显示开机Logo(初始化LCD);
- 检测启动模式(正常启动、Fastboot、Recovery等);
- 校验并加载
boot.img(包含Linux内核和ramdisk)到内存;- 将控制权交给Linux内核。
3)Linux 内核阶段
MTK 与高通:均加载 Linux 内核镜像(如 zImage),内核会执行以下操作:
- 初始化设备驱动和子系统。
- 挂载根文件系统。
- 加载必要的内核模块。
- 启动用户空间的第一个进程
init。
4)System分区进程
当linux内核被启动之后,就会依次启动如下进程:
- 启动
init进程,解析init.rc,启动系统服务(如ueventd、logd)和 Zygote。 - Zygote 创建 ART 虚拟机并预加载类库,System Server 启动核心服务,最终启动 Launcher。
因为这些进程大部分都在system分区,即android原生流程,这就是所谓的AP侧。
2、AP & BP镜像
从启动流程都可以看出来,有很多阶段是由google aosp设计,但是一些和硬件强相关的阶段其实是由厂商自己设计,例如高通一大堆子系统,例如MTK自己研发的modem子系统,包括boot rom和bootloader阶段所需要的一些分区。
从这个维度可以简单的进行区分?android原生的镜像/分区叫做AP侧镜像,非android的进行/分区叫做BP侧镜像。
AP侧和BP侧通过共享内存进行通信,BP侧主要负责语音通话、短信等数据通信以及SIM卡管理功能。AP侧通过标准的接口TAPI(Telephony API)调用BP侧的功能。
这种设计使得AP侧的软件变化不会影响BP侧的通信功能,同时保证了系统的稳定性和安全性。
1)AP侧镜像(Application Processor Side)
AP侧镜像主要运行在应用处理器上,负责操作系统、用户界面和应用程序的执行。这些镜像通常包括:
- boot.img: 包含Linux内核镜像和ramdisk,用于启动Android系统
- system.img: 系统分区镜像,包含Android框架、核心应用和系统库
- vendor.img: 厂商特定组件,如驱动程序和专有软件
- recovery.img: 恢复模式镜像,用于系统恢复和更新
- cache.img: 缓存分区镜像,存储临时文件
- userdata.img: 用户数据分区镜像,存储用户文件和应用数据
AP侧镜像通过Google的AVB(Android Verified Boot)机制进行安全验证,确保系统启动的完整性和真实性。
2)BP侧镜像(Baseband Processor Side)
BP侧镜像运行在基带处理器上,主要负责射频通信控制和相关的硬件功能。这些镜像包括:
- modem: 基带固件,处理通信协议和无线信号
- dsp: 数字信号处理器镜像,处理音频和视频信号
- adsp: 高通音频数字信号处理器镜像,处理音频相关任务
- wcnss: WiFi和蓝牙基带镜像,处理无线通信功能
- venus: 视频编解码器镜像,处理视频解码和编码
- mss: Modem SubSystem镜像,基带子系统
- pronto: WiFi基带镜像,处理WiFi通信
- rpm: 资源电源管理固件,管理低功耗状态
- tz: TrustZone安全环境,提供安全启动环境
- sbl: 基带处理器初级引导加载程序,负责初始化硬件
BP侧镜像需要通过厂商的安全启动机制进行签名验证,确保通信功能的安全性。
3)MTK&高通 AP侧镜像
AP侧分区主要由应用处理器管理,包含操作系统、应用程序和用户数据等,这些分区通常通过Google的AVB(Android Verified Boot)机制进行安全验证。
- boot: 包含内核镜像和ramdisk,用于启动Android系统。
- system: 系统分区,存储Android框架、核心应用和系统库。
- vendor: 厂商特定组件,如驱动程序和专有软件。
- recovery: 恢复模式分区,用于系统恢复和更新。
- cache: 缓存分区,存储临时文件以加快系统运行速度。
- userdata: 用户数据分区,存储用户文件、应用数据和设置。
- dtbo: 设备树blob分区,用于设备树描述。
- product: 产品特定分区,包含厂商定制的应用和配置。
- odm: OEM设备模块,用于特定设备的驱动和配置。
- metadata: 存储元数据信息,如分区表和安全参数。
- NVRAM: 包含Modem NVRAM数据,如RF校准数据等。(MTK特有?)
4)高通 BP侧镜像
BP侧分区由基带处理器管理,包含基带固件和安全相关的镜像,这些分区通常需要高通的安全启动机制和签名验证。
- modem: 基带固件,处理通信协议和无线信号。
- dsp: 数字信号处理器镜像,处理音频和视频信号。
- adsp: 高通音频数字信号处理器镜像,处理音频相关任务。
- wcnss: WiFi和蓝牙基带镜像,处理无线通信功能。
- venus: 视频编解码器镜像,处理视频解码和编码。
- mss: Modem SubSystem,基带子系统镜像。
- pronto: WiFi基带镜像,处理WiFi通信。
- rpm: 资源电源管理固件,管理低功耗状态。
- tz: TrustZone安全环境,提供安全启动环境。
- aboot: Android引导加载程序,负责加载内核。
- sbl: 基带处理器初级引导加载程序,负责初始化硬件。
- non-hlos: 包含多个BP侧镜像的复合分区,如modem、ADSP、Wcnss、Venus等,通过NON-HLOS.bin文件加载。
5)MTK BP侧镜像
BP侧分区由基带处理器管理,包含基带固件和安全相关的镜像,这些分区通常需要MTK的安全启动机制和签名验证。
- modem: 基带固件,处理通信协议和无线信号。
- dsp: 数字信号处理器镜像,处理音频和视频信号。
- adsp: 高通音频数字信号处理器镜像,处理音频相关任务。
- wcnss: WiFi和蓝牙基带镜像,处理无线通信功能。
- venus: 视频编解码器镜像,处理视频解码和编码。
- mss: Modem SubSystem,基带子系统镜像。
- pronto: WiFi基带镜像,处理WiFi通信。
- rpm: 资源电源管理固件,管理低功耗状态。
- tz: TrustZone安全环境,提供安全启动环境。
- sbl: 基带处理器初级引导加载程序,负责初始化硬件。
- aboot: Android引导加载程序,负责加载内核。
- non-hlos: 包含多个BP侧镜像的复合分区,如modem、ADSP、Wcnss、Venus等,通过NON-HLOS.bin文件加载。
3、Secure Boot机制
针对BP侧镜像的安全校验和镜像签名,就是所谓的Secure Boot机制。
因为这些都是厂商自己设计,通常的做法是这些厂商在自己的芯片内部是有一个硬件单元的,只能一次烧录,是不可逆的,烧录的东西和root key密切相关,efuse被熔断了,那么root key就不能改变,同时这块芯片只能运行和root key相关的key签名的镜像。
通常secure boot也是非对称式加密算法,因此也会有公钥和私钥
详细参考https://blog.csdn.net/qq_27672101/article/details/156652434
4、Aosp AVB机制
针对AP侧镜像的安全校验和镜像签名,就是所谓的google avb机制。
因为AP侧镜像基本上都是由Google AOSP设计,因此需要使用Google的AVB(Android Verified Boot)特性来保证镜像的完整性和真实性。
详细参考https://blog.csdn.net/qq_27672101/article/details/150934415
三、运行时安全机制
本篇不再是围绕镜像分区的编译、镜像分区的校验的维度来进行说明。本篇主要站在系统已经成功启动之后,aosp使用了哪些机制来保证我们的系统是安全的,系统运行的应用程序是安全的,例如支付宝这类应用的密钥数据是安全的。
1、安全架构
首先要介绍的就是android安全架构,这不是一个机制,这是一套架构,贯穿整个android始终,先提供如下一张架构图。
详细的可以参考https://blog.csdn.net/qq_27672101/article/details/156652343
