本blog初看比较杂乱,对于不熟悉的人来说需要看的网址较多,这里主要是我的调试总结,原理和流程在每个小节都有贴地址,要熟悉肯定是要一个一个去看的(自己再写原理流程误读可能更多,官网有相关内容以官网为准,------没错我懒!)。

Android安全内容非常多,可以登录https://source.android.com/security查看。这里以刷机的角度去看相关的安全措施。日志里可以看到设备从上电开机就有保护手段了,这里依次简述secure boot、verify boot、dm-verity、SELinux,看它们如何保证设备刷机烧录镜像、所有运行的程序都是OEM自己的。

目录

1、secure boot

2、verify boot

3、dm-verity

4、SELinux


1、secure boot

原理https://blog.csdn.net/blue_rush/article/details/55047082

实现步骤https://blog.csdn.net/tq501501/article/details/94719382

以硬件验证MP大部分镜像,和aboot的镜像emmc_appsboot.mbn。如果看到secure boot:yes请不要随意刷aboot了。利用aboot的修改破解需谨慎,刷错的话,设备会挂掉而且无法挽回的哦。硬件加密对于设备安全是质的提升,看到上面原理和实现步骤,OEM应该保护好自己的签名。目前这种情况只有硬件短接,QFIL刷原签名的版本能恢复。

2、verify boot

这个验证在aboot中,验证vbmeta公钥,并立即验证boot和dtbo的hash,进入kernel后,挂载时dm-verity验证比较大的分区system和vendor。

原理https://source.android.com/security/verifiedboot/verified-boot

流程和各种验证状态还是看官网https://source.android.com/security/verifiedboot/boot-flow,这里不补充了。

以前调试研究步骤:

unlock:orange状态1.1、vbmeta.img镜像验证system vendor dtbo boot 分区。 替换vbmeta.img后,系统起不来。日志[  107.567167] device-mapper: verity-fec: 259:5: FEC: recursion too deep1.2、system和vendor 在adb disable-verity并修改后,再adb enable-verity无法启动2.1、替换dtbo和boot能够起来2.2、替换vendor后起不来,关闭dm-verity后起来fastboot --disable-verity --disable-verification flash vbmeta D:\download\hon450-fastboot-214.02.00.0001E\AP\vbmeta.img分析:vbmeta.img与vendor system分区hash校验不对。替换的dtbo与boot为未替换密钥的dtbo与boot并且为lockLock:green状态1、替换boot与dtbo正常启动2、替换使用device/honeywell/common/security/verity.pk8密钥编译的vbmetaimage后未启动。[1170] avb_vbmeta_image.c[1170] :[1170] 226[1170] : ERROR: [1180] Hash does not match![1180] avb_slot_verify.c[1180] :[1180] 539[1180] : ERROR: [1180] vbmeta_a[1180] : Error verifying vbmeta image: [1190] HASH_MISMATCH[1190][1190] ERROR: Device State Locked, AvbSlotVerify returned ERROR_VERIFICATION[1200] ERROR: Unable to find any bootable slot[1200] No bootable slots found enter fastboot mode[1210] VB2: boot state: red(3)[1210] Boot State is : 3[1220] Your device is corrupt. It can't be trusted and will not boot.3、替换原dtbo与boot,依然无法启动,日志同上4、擦除devinfo(目的是解锁)后启动,日志Error verifying vbmeta image:依然存在5、锁住后替换原vbmetaimagefastboot --disable-verity --disable-verification flash vbmeta D:\download\*\AP\vbmeta.img 依然无法启动fastboot  flash vbmeta D:\download\*\AP\vbmeta.img 正常启动分析:替换的dtbo与boot为未替换密钥的dtbo与boot,替换的vbmeta签名不对,换原dtbo与boot无影响,擦除devinfo后解锁设备,不验证vbmeta,锁住后,关闭dm-verity替换原vbmeta依然不启动是hash值不对。擦除devinfo后,解决开机跳转EIO问题。

O我是参照Verified Boot | 罗明貌的博客来设置,P有些不同,下面是P使用的总结:

--------------------------------------------------------------LK Replace the verification key.                                               //aboot里面替换验证密钥,同时AVB的签名需要改为自己的密钥verity.pem1、Extract the private key from the pk8 certificate  //pk8证书生成私钥openssl pkcs8 -inform DER -nocrypt -in verity.pk8 -out verity.pem2、Private key to binary file                                                   //私钥转二进制文件avbtool extract_public_key --key verity.pem --output verity.bin3、Convert binary file contents into header file array         //二进制文件转头文件,工具bin2CHeader制作参考https://blog.csdn.net/morixinguan/article/details/53700698./bin2CHeader verity.bin OEMPublicKey.h4、copy and replacecp -f OEMPublicKey.h $(ANDROID_BUILD_TOP)/bootable/bootloader/lk/platform/msm_shared/avb/OEMPublicKey.h5、replace AVB keyBOARD_AVB_ALGORITHM := SHA256_RSA2048BOARD_AVB_KEY_PATH := device/***/common/security/verity.pem--------------------------------------------------------------User use or replace key.                                                           //使用和替换//如何输入用户密钥(以支持其它密钥签名的镜像,实例就是GSI测试刷入google镜像)Original key fileexternal/avb/test/data/testkey_rsa4096.pemdevice/***/common/security/sourcekey_rsa4096.binLK command eg:fastboot flash avb_custom_key sourcekey_rsa4096.binfastboot erase avb_custom_key--------------------------------------------------------------Reference website                                                        //相关网站AVB2.0:https://source.android.com/security/verifiedboothttps://android.googlesource.com/platform/external/avb/+/master/README.mdhttps://blog.csdn.net/rikeyone/article/details/80606147Signature, encryption, certificate:https://www.cnblogs.com/Caersi/p/6720789.htmlhttps://www.jianshu.com/p/15b1d935a44bbin2CHeader:https://blog.csdn.net/morixinguan/article/details/53700698

可以使用fastboot flashing unlock来解锁设备,然后该设备可以刷入其它签名的boot.img,注意解锁和锁定都会恢复出厂。android上层开发者选项还有oem unlock控制栏,其作用是来控制是否允许输入fastboot flashing unlock来解锁,小米和华为有通过lisence控制该选项。

深入下,如果设备没有开启RPMB,设备锁状态的信息将存在devinfo分区中,其结构见devinfo.h文件。

struct device_info{unsigned char magic[DEVICE_MAGIC_SIZE];bool is_unlocked;bool is_tampered;bool is_unlock_critical;bool charger_screen_enabled;char display_panel[MAX_PANEL_ID_LEN];char bootloader_version[MAX_VERSION_LEN];char radio_version[MAX_VERSION_LEN];bool verity_mode; // 1 = enforcing, 0 = logginguint64_t rollback_index[MAX_VB_PARTITIONS];uint32_t user_public_key_length;uint8_t user_public_key[MAX_USER_KEY_SIZE];};

下图是读取的devinfo分区的bin文件

设备锁定状态is_unlocked在第17位字节,hexedit可修改该字节,通过QFIL或fastboot刷入devinfo分区来解锁设备,这种骚操作可以跳过恢复出厂(开启了RPMB将不能修改,可加打印输出rpmb存储的devinfo结构体数据)。提示下,release版本应该关闭fastboot和紧急下载。

如果secure boot 是enable,AVB>=2.0; 设备的相关信息会存储到emmc的安全区域(RPMB区域),其功能与devinfo一样,能够存储设备状态信息、rollback回滚信息、avb的key,但是设备全擦也清除不了RPMB内数据,无法再使用上述方法去破解。avb的key的写入方式fastboot flash avb_custom_key sourcekey_rsa4096.bin, 作用是增加自己的key,可以刷这个key的boot镜像。如果使用自己key的boot镜像,设备锁定状态开机状态是黄 。

如果要刷镜像调试,QFIL刷与出厂一致的secure boot签名的特定aboot即可,特定aboot的修改参考如下:

void read_device_info(device_info *dev)write_device_info(info);}
+               info->is_unlocked = 1;
+               write_device_info(info);memcpy(dev, info, sizeof(device_info));free(info);}

3、dm-verity

dm-verity功能实现在kernel中,hash树在vbmeta中,启动到kernel在挂载system/vendor时同步验证,所以验证耗时可忽略。具体实现见官网 https://source.android.com/security/verifiedboot/dm-verity

要使用verify boot和dm-verity安全功能,编译时只需要开启相关配置,如果深入还需要使用avbtool工具

https://android.googlesource.com/platform/external/avb/+/master/README.md#Using-avbtool

本想举例,发现官网上都有,build/make/core/Makefile里面也有,查看编译输出更直观,下面是编译输出的。

添加hash

avbtool add_hash_footer --image /tmp/tmpDSOYl_ --partition_size 67108864 --partition_name boot --salt 035d39c3a91730f4b0ae97452d28798e502b696247b56758d4062956720e492d

添加hash

avbtool add_hashtree_footer --partition_size 2820669440 --partition_name system --image /media/sdd/home/dongyi/source_code/***/out/target/product/***/obj/PACKAGING/target_files_intermediates/***/IMAGES/system.img --key external/avb/test/data/testkey_rsa2048.pem --algorithm SHA256_RSA2048 --salt 035d39c3a91730f4b0ae97452d28798e502b696247b56758d4062956720e492d --prop com.android.build.system.security_patch:2019-11-05 --rollback_index 0 --setup_as_rootfs_from_kernel

证书取公钥

avbtool extract_public_key --key external/avb/test/data/testkey_rsa2048.pem --output /tmp/avbpubkey-46XJqd/system.avbpubkey

制作vbmeta镜像

avbtool make_vbmeta_image --output /media/sdd/home/dongyi/source_code/***/out/target/product/***/obj/PACKAGING/target_files_intermediates/***/IMAGES/vbmeta.img --key device/honeywell/common/security/verity.pem --algorithm SHA256_RSA2048 --include_descriptors_from_image /media/sdd/home/dongyi/source_code/***/out/target/product/***/obj/PACKAGING/target_files_intermediates/***/IMAGES/vendor.img --include_descriptors_from_image /media/sdd/home/dongyi/source_code/***/out/target/product/**/obj/PACKAGING/target_files_intermediates/***/IMAGES/boot.img --chain_partition system:2:/tmp/avbpubkey-46XJqd/system.avbpubkey --include_descriptors_from_image /media/sdd/home/dongyi/source_code/***/out/target/product/***/obj/PACKAGING/target_files_intermediates/***/IMAGES/dtbo.img --padding_size 4096

查看vbmeta信息

avbtool info_image --image vbmeta.img

vbmeta.img镜像结构分析可以参照https://www.jianshu.com/p/a2542426bdde。

fastboot --disable-verity --disable-verification flash vbmeta vbmeta.img和adb disable-verity都是关闭dm-verity,实际是改变其中标志位。BC查看vbmeta.img镜像,其中下图左边是开启dm-verity,右边是关闭dm-verity。GSI中带的vbmeta.img就是关闭了dm-verity,关闭后其它分区的hash校验信息就无所谓了。

这里添加hash衍生一个问题,$OUT底下的system镜像与target-file里面的system镜像不一致,导致fastboot刷$OUT底下的system镜像无法OTA差分升级(可能只是高通平台存在该问题)。建议OTA包编译后target-file里面的system镜像替换$OUT底下的system镜像。制作OTA里面加上下面这句解决,其中BUILT_TARGET_FILES_DIR为target_file文件夹。

$(shell cp -f $(BUILT_TARGET_FILES_DIR)/IMAGES/system.img $(INSTALLED_SYSTEMIMAGE))

android Q版本新增APEX模块,该模块将支持google部分应用或者模块的快速更新(不用全包或差分包的升级),这些模块/应用的签名也保存在vbmeta中,详细参考官网网址https://source.android.com/devices/tech/ota/apex#vbmeta_signing。也就是vbmeta在启动流程中,在安全方面起到承上启下作用外,还会存储google/oem的证书密钥。换句话说存储证书密钥的功能,实现了dm-verity和应用快速更新。

前面提到过,这几个验证开启后,aboot,boot,dtbo,vbmeta,system,vendor分区都保护到了,很难破解。

4、SELinux

到dm-verity,所有需要保护的镜像都已经连起来了,应用层则需要东西限制关键文件的读写。SELinux是Linux的一个安全子系统,制定SELinux规则,在OTA升级中(recovery和update-engine可执行程序升级)只有指定类型工具才能读写数据块,保护设备安全。

SELinux的android官网概览https://source.android.com/security/selinux,可查看子链接获取更多内容。SELinux的bolg

https://blog.csdn.net/Innost/article/details/19299937#/notebooks/29547787/notes/_blank https://www.cnblogs.com/gailuo/p/5041034.html

SELinux使用https://www.jb51.net/article/128214.htm。Google源码自带相关工具或命令,例如sepolicy-analyze,audit2allow,seinfo,sediff,sesearch,ls -Z,make precompiled_sepolicy。

获取日志和规则文件adb shell dmesg | findstr avc: > tmp\avc.txtadb pull /sys/fs/selinux/policy tmp\policyadb pull /vendor/etc/selinux/precompiled_sepolicy  tmp\precompiled_sepolicy(在O之前,SELinux规则文件是放在boot.img 的根目录中,当然现在更合理)sepolicy-analyze tmp/precompiled_sepolicy dups                          查看规则sepolicy-analyze tmp/policy dups                                              查看规则cat tmp/avc.txt |audit2allow -p tmp/policy > tmp/tmp.te   根据日志生成规则设备中ls -Z查看文件selinux的类型SELinux快速调试替换关键文件,此方法适用于allow条目修改添加。如果有type新定义或修改,需要替换/sys/fs/selinux/policy,建议全刷。make precompiled_sepolicy  //高通 vendor的规则 单编
make selinux_policy_system    //google system的规则 单编
make sepolicy.recovery    //recovery的规则 单编
make selinux_policy     //单编
更多请在源码aosp/system/sepolicy文件夹中搜索LOCAL_MODULEadb root;adb remount;adb push S:\source_code\***\out\target\product\***\vendor\etc\selinux\precompiled_sepolicy /vendor/etc/selinuxneverallow处理方法,查看\system\sepolicy\public,节点或者程序缩小权限,再就是改类型。seinfo sediff sesearch工具这里不介绍了。

5、其它安全

重要事说三遍,日志里可以看到设备从上电开机就有保护手段了,按照开机流程,secure boot保护aboot、verify boot保护boot和vbmeta、dm-verity保护system和vendor、SELinux只允许OTA工具才能操作这些关键分区,这就保证刷入设备的镜像、关键分区的程序都是OEM自己的。 release版本使用上面提到的这几个安全措施,加上userdata加密、防回滚、平台签名等等,设备很难破解。
            但是,对于有心破解的人来说,任何一个安全BUG,都可以归类,然后按照类别扩大漏洞,一步一步攻克。加上android的开源,任何一个漏洞,利用得当都能致命。

所以软件上安全都打开并不够,这时再来看google安全方案https://source.android.com/security/best-practices,里面包括了运营、网络、硬件等等安全建议。

相关内容网上到处都是,再有问题可以留言讨论。

刷机相关的Android的安全相关推荐

  1. 小米5android p,久违的刷机 小米MIX Android P DP5 上手体验

    久违的刷机 小米MIX Android P DP5 上手体验 2018-07-30 20:15:44 29点赞 60收藏 34评论 前言 随着国产定制安卓系统越来越完善,刷机正在从安卓机的主要特征中逐 ...

  2. android 4.3 刷机,金立GN9005 Android 4.3-4.4 (S5.1 移动4G)一键救砖教程,轻松刷回官方系统...

    金立GN9005 Android 4.3-4.4 (S5.1 移动4G)手机变砖了怎么办?对于经常刷机的安卓玩家来说,碰到刷机失败导致金立GN9005 Android 4.3-4.4 (S5.1 移动 ...

  3. 华为荣耀 4x 刷机体验 直奔 Android 6.0

    序 手机是 华为荣耀 4X Android 4.4.4 最近手机运行缓慢,卡顿明显.需要清理一下手机, 主要的垃圾来自于微信,占用的空间太多了,使用360手机助手 + 360卫士将微信内以及系统的的垃 ...

  4. Samsung Galaxy S5(G9006V)刷机降级(Android 6.0.1-Android 4.4.2)(MD)

    1 设备信息 型号:Samsung Galaxy S5 Android版本:6.0.1 基带版本:G9006VZNU1CPJ2 内核版本:3.4.0 2 下载并使用第三方ROM包(卡刷) 第三方ROM ...

  5. android 固件管理器,刷机精灵(原Android固件管理器桌面版)

    详细介绍 刷机精灵的前身是固件管理器桌面版.目前刷机精灵已全面重写,它将是一个更为温馨易用和强大的刷机工具.待近期开发完毕后即可开始发布测试,届时希望各位机友持续给力哦! 刷机精灵是一款运行于PC端的 ...

  6. android10官方刷机包下载,Android 11 喜讯!小米 10 率先尝鲜,官方刷机包发布下载...

    原标题:Android 11 喜讯!小米 10 率先尝鲜,官方刷机包发布下载 6月15日消息,小米 MIUI 官方今天宣布 Android 11 Beta1 来了,小米 10 系列手机率先尝鲜体验,M ...

  7. 刷机后mi android不动,小米MIflash平台刷机报错问题解决方案小米刷机错误解决方法...

    小米MIflash平台刷机报错问题解决方案小米刷机错误解决方法,如果你不会就看看刷机帮小编是怎么来解决的吧,相信这也是你常遇到的问题. [1.未指定错误(device ls locked)] 小米MI ...

  8. galaxy s4刷机相关说明

    最近发现本人的S4突然电池耗电很快,一开始以为是app原因,故卸载了大部分app只保留了常用的几个,发现问题仍没有解决.接着,推测电池是否坏了, 但充电很正常,还是先从软件方面找原因.虽然本人手机是行 ...

  9. 安卓刷机相关,你想知道的都这这里!个人问题汇总!有问题留言

    小米解锁绑定说明 去开发者那里绑定之后,不要重复绑定,会重新计算时间的,解锁时会等待168个小时(即一周) 错误7 通常造成错误 7的原因有以下几点: 刷机包与设备的版本.名称不匹配. 刷机前没有将手 ...

最新文章

  1. 学习API网关遇到的名词
  2. Python使用pandas保存csv文件:如果文件存在则只添加内容(append),如果无表则同时写入表头和内容(write)
  3. MVC模式与三层架构的区别
  4. 笔记-中项案例题-2018年下-采购管理
  5. 让人惊叹的Johnson-Lindenstrauss引理:理论篇
  6. hdu 2275 Kiki Little Kiki 1
  7. C#配置及使用log4net
  8. 使用 ohmyzsh 打造 windows、ubuntu、mac 系统高效终端命令行工具
  9. NLP复习资料(1)-绪论、数学基础
  10. debian下使用dpkg来安装/卸载deb包 (转载)
  11. Android性能优化:使用Lint优化代码、去除多余资源
  12. 2021-2025年中国点状插头装置行业市场供需与战略研究报告
  13. 为什么python除法结果会有小数点0_22. 为什么 Python 中的整除是向下取整?
  14. 使用猴子测试工具(1)
  15. server 2008r2 rabbitmq 安装web管理
  16. Java进行音视频转码
  17. Dota2 比赛匹配
  18. windows 软件界面跑出屏幕外的处理方法
  19. 基于SWT组件的IE内核Java简易浏览器
  20. ktt算法 约化_答:那些深度学习《面试》你可能需要知道的

热门文章

  1. Linux配置SAP JCO驱动
  2. 计算机拆机步骤图解,我的电脑戴尔vostro1088拆机过程图解
  3. 华为服务器怎么恢复系统,服务器恢复系统
  4. day02 设计模式-外观模式
  5. Microsoft Visual Studio 13强力卸载
  6. 找男朋友软件测试大乐,抖音2020男朋友测试题答题
  7. isotropy与anisotropy?各向同性与各向异性滤波?
  8. 深入理解如何不费吹灰之力搭建一个无人驾驶车(二)2D-小车其他部分(独创导航各参数解析)
  9. 字体文件反反爬-- 起点中文网
  10. DDR 内存 ECC 纠错