启动验证:
android4.4使用device-mapper-verity(dm-verity)提供启动验证,对透明的设备提供完整性检查其特性是在浏览到设备模块的同时看到是否存在一些文件或者程序,并其确定是否符合预期的配置。
使用的是加密哈希树,每一块都有一个SHA256哈希
只需要保证顶级的根节点哈希可信
引导分析的公共密钥必须经过OEM验证,用来验证签名的哈希以确认设备的系统分区是否被篡改
磁盘加密:
加密模式:
使用dm-crypt、使用随机生成的AES CBC模式的128位的密钥
每一个单元会被非顺序访问,使得每个扇区都要有独立的IV
安卓对每个扇区加密是用加盐向量初始化(ESSIV),使用SHA256算法进行哈希ESSIV:SHA256,从而生成每个扇区的IV
IV(SN)=AESs(SN),其中s=SHA256(K),K为用散列算法加密的二次密钥s密钥K,SN为扇区号
由于ESSIV不改变CBC的延展性,也不能保证加密块的完整性,因此攻击者仍可通过磁盘上的密钥明文对加密磁盘进行攻击。
密钥生成:
磁盘加密密钥通过与另一个128位的AES密钥加密,由用户提供的密码衍生出来的。
使用PBKDF2和128位随机盐值作为密钥导出方式,将得到的master ley和盐值存储到磁盘上,占整个分区的最后16KB,被称为加密页脚。
屏幕安全:
滑动解锁、密码锁、PIN锁、图形锁
屏幕锁:
所有的屏幕锁密码存储在/data/system/gesture.key
具体加密代码LockSettingsService中的patternToHash
可以尝试用字典与该密码对比从而得出答案,但是我们也可以直接用adb命令删除掉对应文件。此时,系统将认为不存在密码
rm /data/system/gesture.key
这是针对root过的系统,如果没有root权限,我们可以在recovery模式下清除掉所有系统中的数据也能删除掉屏幕锁。如果没有打开usb调试模式的设备,则无法使用adb shell模式,也就无法解除屏幕锁。
密码锁:
类似屏幕锁,也只需要将/data/system/gesture.key文件删除
PIN锁:
相对以上两种方式比较安全,但是密码忘记后难以查询,输入错误到一定次数会销毁SIM卡
USB调试安全
adb组成:
ADB Server 、ADB Deamon、ADB Command-line。
android客户端是通过TCP协议保持与ADB Server进行会话,通常为localhost:5037
adb认证密钥:
私钥文件adbkey--存在主机上,是标准的OpenSSL PEM格式
公钥文件adbkey.pub--包含公钥基础64编码标准RSA PUBLIC KEY结构
增强型内核SELinux/SEAndroid
SELinux组成部分:对象管理器(OM)、访问权限缓存(AVC)、安全服务和安全策略
SEAndroid是一种基于安全策略的强制访问控制允许加载新的访问控制模块(MAC)安全机制。
传统Linux的不足:
存在特权用户root
对于文件的访问权划分不够细
SUID程序的权限升级
DAC问题
SELinux特点:
MAC对访问的控制强制化
TE对于进程只赋予最小权限
domain迁移、防止权限升级
RBAC对用户只赋予最小权限
SELinux运行模式:
SELinux通过MAC的方式来控管程序,控制的主体是程序,而目标是文件
SEAndriod主要采用了两种强制访问方法:TE(对于进程只赋予最小权限)、MLS(多等级权限安全)
SEAndroid的上下文由四个组成部分user、role、type、sensitivity。即为身份识别、角色、安全类型、安全等级(其中最重要的是安全类型,所有policy都围绕安全类型展开)
SEAndroid中user为u、role有两个为r和object_r。关于安全上下文配置的核心文件主要是file_contexts
文件、seapp_contexts文件和ocontexts文件。多等级安全的安全等级分为s0~sn,s0为最低。
SELinux启动、关闭和观察:
3中模式:Enforcing(强制模式)、Permissive(宽容模式)、Disable(关闭模式)