Android Safety 系列专题【总篇:安全机制汇总】

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值还原之前的明文因此它是不可逆通常用于校验完整性或者生成唯一标识。因为安全性差异较大通常也无法用来作为密码算法。MD5Message-Digest 5输出128 位32 位 hex特点是快但已被攻破碰撞攻击可行仅限非安全场景如文件快速校验、ETagCRC32Cyclic Redundancy Check输出32 位整数常转为 hex不是密码学哈希仅用于错误检测如网络包、ZIP 文件校验速度快但极易碰撞不能用于安全场景SHA 系列Secure Hash Algorithm其中SHA-256比较场景输出长度256位算法输出长度安全性说明SHA-1160 位40 hex❌ 不安全Google 已实现碰撞曾用于 Git、证书现逐步淘汰SHA-256256 位64 hex✅ 安全最广泛使用的安全哈希区块链、TLS、JWTSHA-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/3840b344b27c2非对称加密非对称加密使用一对密钥公钥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、启动流程1Boot 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‌ 镜像。2Bootloader 阶段‌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。而在旧平台中XBLeXtensible Boot Loader可能替代 SBL 作为主要的引导加载程序。B MTK平台MTK平台主要设计如下Preloader 阶段BL2‌Preloader是MTK平台特有的引导程序运行在SRAM中BL2阶段负责进一步初始化硬件环境。其关键功能包括初始化外部DRAM控制器设置UART、USB等调试接口执行安全验证仅加载MTK签名的镜像加载LKLittle Kernel到DRAM中。此阶段还支持多种启动模式检测如是否进入Fastboot或Recovery模式。Little KernelLK阶段BL33‌LK是MTK平台的主引导加载程序主要分为BL2在SRAM中运行进行最小化初始化阶段和‌BL33在DRAM中运行执行完整功能阶段。LK的主要职责包括显示开机Logo初始化LCD检测启动模式正常启动、Fastboot、Recovery等校验并加载boot.img包含Linux内核和ramdisk到内存将控制权交给Linux内核。3Linux 内核阶段MTK 与高通‌均加载 Linux 内核镜像如 zImage内核会执行以下操作初始化设备驱动和子系统。挂载根文件系统。加载必要的内核模块。启动用户空间的第一个进程init。4System分区进程当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侧通过标准的接口TAPITelephony API调用BP侧的功能。这种设计使得AP侧的软件变化不会影响BP侧的通信功能同时保证了系统的稳定性和安全性。1AP侧镜像Application Processor SideAP侧镜像主要运行在应用处理器上负责操作系统、用户界面和应用程序的执行。这些镜像通常包括‌boot.img‌: 包含Linux内核镜像和ramdisk用于启动Android系统‌system.img‌: 系统分区镜像包含Android框架、核心应用和系统库‌vendor.img‌: 厂商特定组件如驱动程序和专有软件‌recovery.img‌: 恢复模式镜像用于系统恢复和更新‌cache.img‌: 缓存分区镜像存储临时文件‌userdata.img‌: 用户数据分区镜像存储用户文件和应用数据AP侧镜像通过Google的AVBAndroid Verified Boot机制进行安全验证确保系统启动的完整性和真实性。2BP侧镜像Baseband Processor SideBP侧镜像运行在基带处理器上主要负责射频通信控制和相关的硬件功能。这些镜像包括‌modem‌: 基带固件处理通信协议和无线信号‌dsp‌: 数字信号处理器镜像处理音频和视频信号‌adsp‌: 高通音频数字信号处理器镜像处理音频相关任务‌wcnss‌: WiFi和蓝牙基带镜像处理无线通信功能‌venus‌: 视频编解码器镜像处理视频解码和编码‌mss‌: Modem SubSystem镜像基带子系统‌pronto‌: WiFi基带镜像处理WiFi通信‌rpm‌: 资源电源管理固件管理低功耗状态‌tz‌: TrustZone安全环境提供安全启动环境‌sbl‌: 基带处理器初级引导加载程序负责初始化硬件BP侧镜像需要通过厂商的安全启动机制进行签名验证确保通信功能的安全性。3MTK高通 AP侧镜像AP侧分区主要由应用处理器管理包含操作系统、应用程序和用户数据等这些分区通常通过Google的AVBAndroid 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文件加载。‌5MTK 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/1566524344、Aosp AVB机制针对AP侧镜像的安全校验和镜像签名就是所谓的google avb机制。因为AP侧镜像基本上都是由Google AOSP设计因此需要使用Google的AVBAndroid Verified Boot特性来保证镜像的完整性和真实性。详细参考https://blog.csdn.net/qq_27672101/article/details/150934415三、运行时安全机制本篇不再是围绕镜像分区的编译、镜像分区的校验的维度来进行说明。本篇主要站在系统已经成功启动之后aosp使用了哪些机制来保证我们的系统是安全的系统运行的应用程序是安全的例如支付宝这类应用的密钥数据是安全的。1、安全架构首先要介绍的就是android安全架构这不是一个机制这是一套架构贯穿整个android始终先提供如下一张架构图。详细的可以参考https://blog.csdn.net/qq_27672101/article/details/1566523432、DAC机制3、Selinux机制4、应用签名