目录

一、AVB 技术背景

二、代码实现逻辑


一、AVB 技术背景

Android O/P 版本以来,谷歌加入了system-as-root的特性,此时ramdisk和system是一起放在同一个system.img镜像中的。而系统起来之后也就不存在system分区了,而是直接把system镜像挂载到/根目录上。那么这个操作是怎么进行的呢?
system.img默认是需要使能dm-verity来挂载的,那么这就涉及到如何使能dm-verity来挂载/根分区。还有一个重要的点,如果我们想要禁用dm-verity功能又要如何操作,这又涉及更深的层次,如果可配置/根分区的挂载方式为dm-verity或者非dm-verity方式

根目录的挂载必须要由kernel去完成了。因为根目录挂载是先于init的运行的,没有根目录就不会有init。那么如何由kernel去挂载system.img镜像呢?

二、代码实现逻辑

由此我们就通过传入不同的cmdline的方式来启动kernel,进而挂载根目录,也就是system.img镜像。

 Kernel command line: console=tty0 console=ttyS0,921600n1 vmalloc=496M slub_max_order=0 slub_debug=OFZPU androidboot.hardware=mt6771 firmware_class.path=/vendor/firmware loop.max_part=7 has_battery_removed=0 maxcpus=8 androidboot.verifiedbootstate=green skip_initramfs rootwait ro init=/init root=/dev/dm-0 dm="system none ro,0 1 android-verity PARTUUID=a4da8f1b-fe07-433b-95cb-84a5f23e477b " androidboot.veritymode=enforcing bootopt=64S3,32N2,64N2 buildvariant=user veritykeyid=id:e58276dac7669ff2e60185d6763d16bf6d898136 androidboot.atm=disabled androidboot.meta_log_disable=0 androidboot.dtbo_idx=0 lpddr_used_index=0

1、   分别查找内核代码关键字:

dm=        veritykeyid=
[    2.883032] <7>.(4)[1:swapper/0]device-mapper: init: attempting early device configuration.
[    2.883764] <7>.(5)[1:swapper/0]device-mapper: init: adding target '0 1 android-verity PARTUUID=a4da8f1b-fe07-433b-95cb-84a5f23e477b '

[    2.883783] <7>.(5)[1:swapper/0]device-mapper: android-verity: key:id:7e4333f9bba00adfe0ede979e28ed1920492b40f dev:PARTUUID=a4da8f1b-fe07-433b-95cb-84a5f23e477b
[    2.893211] <7>.(0)[1:swapper/0]device-mapper: android-verity: bio magic_number:2952900609 protocol_version:0 table_length:254

[    2.893223] <7>.(0)[1:swapper/0]device-mapper: android-verity: verity_table: 1 /dev/block/platform/bootdevice/by-name/system /dev/block/platform/bootdevice/by-name/system 4096 4096 903183 903183 sha256 01d43da3f751712bd6c7a105a2a65e9cc6575b5658e1d00fea90b8c83c5257f3 aee087a5be3b982978c923f566a94613496b417f2af592639bc80d141e34dfe7

[    2.894313] <7>.(0)[1:swapper/0]device-mapper: android-verity: Signature verification success
[    2.894327] <7>.(0)[1:swapper/0]device-mapper: android-verity: Data sectors 7225464

[    2.895497] <7>.(5)[1:swapper/0]device-mapper: android-verity: android-verity mounted as verity target
[    2.895650] <7>.(4)[1:swapper/0]device-mapper: init: dm-0 is ready

kernel-4.4\drivers\md\dm-android-verity.c

__setup("veritykeyid=", verity_keyid_param);

kernel-4.4\init\do_mounts_dm.c

__setup("dm=", dm_setup);

static int __init dm_setup(char *str)

2、   verity pub key

kernel-4.4/certs$ ls
            Kconfig  ko_test_prvk.pem

Makefile   system_keyring.c

          system_certificates.S    verity.x509.pem

这里将Puk 编译进内核,并挂载在 /目录下, 但system验签时,使用的是代码段里的。

key_ref = keyring_search(make_key_ref(system_trusted_keyring, 1),
        &key_type_asymmetric, key_id);

key = key_ref_to_ptr(key_ref);

3、   veritykeyid=  来源

build/make/tools/releasetools/sign_target_files_apks.py

# Extract keyid using openssl command.
    p = common.Run(["openssl", "x509", "-in", key_path, "-text"],
                   stdout=subprocess.PIPE, stderr=subprocess.PIPE)

keyid, stderr = p.communicate()

keyid = re.search(
        r'keyid:([0-9a-fA-F:]*)', keyid).group(1).replace(':', '').lower()
    print("Replacing verity keyid with {}".format(keyid))

common.ZipWriteStr(output_zip, "BOOT/cmdline", out_cmdline)

 编译log(可手动敲下命令):veritykeyid=id:\`openssl x509 -in build/target/product/security/verity.x509.pem -text | grep keyid

X509v3 Authority Key Identifier: 
                keyid:7E:43:33:F9:BB:A0:0A:DF:E0:ED:E9:79:E2:8E:D1:92:04:92:B4:0F

4. 生成自定义的key

直接执行development/tools/make_key releasekey  '/C=CN/ST=BeiJing/L=HaiDian View/O=JiuZhou/OU=PingTai/CN=lran/emailAddress=lran@jzby.com'生成releasekey.pk8和releasekey.x509.pem。其中releasekey  是指最后的加密方式为release方式,执行后显示如下:
development/tools$ sh make_key releasekey '/C=CN/ST=JiangSu/L=NanJing/O=Company/OU=Department/CN=YourName/emailAddress=YourE-mailAddress'
Enter password for 'releasekey' (blank for none; password will be visible): mypassword

build/make/target/product/security/README      development/tools/make_key media    '/C=

生成私钥 releasekey.pk8
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
把的格式转换成PKCS #8,这里指定了-nocryp,表示不加密,所以签名时不用输入密码

 5、下一篇,补充 system 到底是如何去dm验证的。

Android Verified Boot dm-verity 优化和实战相关推荐

  1. Magisk root 原理分析之二 :Android Verified Boot (AVB)

    1. Android Verified Boot (AVB) 或称 Verified Boot 2.0 简介 官方解释:验证用户设备上运行的软件完整性.它通常从设备固件的只读部分开始,该部分加载代码并 ...

  2. Android Verified Boot 2.0 最新安卓P AVB详解

    什么是AVB 验证启动是确保用户设备运行软件完整性的一整套流程. 它通常从设备固件的只读部分启动,使用加密方式验证代码是可靠且没有任何已知的安全缺陷之后才会执行. AVB是验证启动的一种实现. VBM ...

  3. AVB校验微观版本:android avb(Android Verified Boot)验证

    前辈原文:https://blog.csdn.net/weixin_43836778/article/details/90400147 其实可能有人会说,怎么整这么多重复的,其实不是的.这是为了不断地 ...

  4. 深入解析:Android卡顿检测及优化项目实战经验总结,任君白嫖

    前言 之前在项目中做过一些Android卡顿以及性能优化的工作,但是一直没时间总结,趁着这段时间把这部分总结一下. GitHub系统教程学习地址:https://github.com/Timdk857 ...

  5. Android/Linux boot time分析优化

    如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...

  6. Android安全启动学习(五):Android Verified Boot 2.0

    1.AVB概要 AVB2.0被用于启动引导,此用法添加一个"vbmeta.img"镜像. public key被编译到bootloader中用于校验vbmeta数据,vbmeta. ...

  7. MTK Android 9.0(Android P) + kernel-4.9 默认关闭DM Verity 和secure boot 解决无法adb remount的问题

    在android P版本上执行adb remount会提示以下错误: remount of the / superblock failed: Permission denied remount fai ...

  8. Spring Boot进阶:原理、实战与面试题分析

    在当下的互联网应用中,业务体系日益复杂,业务功能也在不断地变化.以典型的电商类应用为例,其背后的业务功能复杂度以及快速迭代要求的开发速度,与5年前的同类业务系统相比,面临着诸多新的挑战. 这些挑战中核 ...

  9. 《Spring Boot+Vue全栈开发实战》读书笔记

    写在前面 嗯,回家处理一些事,所以离职了,之前的公司用开源技术封装了一套自己的低代码平台,所以之前学的spring Boot之类的东西都忘了很多,蹭回家的闲暇时间复习下. 笔记整体以 Spring B ...

最新文章

  1. VM结构、GC工作机制详解
  2. STC89C52单片机 数码管静态显示
  3. Mysql5.7读写分离
  4. CVPR2015深度学习回顾
  5. python multiprocessing 和tcp
  6. 聚类算法:K-Means
  7. python while true_Python天坑系列(一):while 1比while True更快?
  8. 最近打算学习windows核心编程
  9. azure devops中文显示乱码_Azure DevOps Server:Git权限设置
  10. VMware SDS 之一:什么是VSAN??
  11. mysql 8.0以上 新版本账号密码策略修改和密码修改
  12. SQL Server 设计开发系列(文章索引)
  13. ios模拟器安装app
  14. 遇见更好的自己 -- 90后农村姑娘非洲四年驻外生涯,和她的学渣“逆袭”川大的人生故事
  15. 这三款小巧好用的APP,请务必收下
  16. window.parent.open弹出多个界面,界面间互相传值
  17. mysql jdbc url 时间_mysqlJDBC连接池url时区陷阱
  18. 【知识点】(三)连续与导数
  19. c# 火狐浏览器怎么嵌入窗体中_正在学c# winform,问各位前辈一下 能调用火狐或者其他的浏览器吗?...
  20. electerm可用的 类termius风格主题

热门文章

  1. 所有的时间伟大的好莱坞电影大片
  2. ssh连接服务器FTP传不了文件,ssh连接服务器FTP传不了文件
  3. 亚马逊云主机linux密钥登陆改为密码登陆
  4. bq3060电池控制芯片使用笔记
  5. Redis 基础知识点总结
  6. 7.Python 文件I/O
  7. NVIDIA:应将USD作为3D互联网的HTML标准语言
  8. 大家常见的以ESP32为代表的WIFI、蓝牙双模模块,今天启明云端带来了一款低功耗、距离远的LoRa+蓝牙无线通讯模块WT5105-L1,我们一起看看这款模块在功能上有哪些优势?
  9. ⑨tiny4412 Linux驱动开发之1-wire子系统(DS18B20)驱动程序
  10. 《MATLAB语音信号分析与合成(第二版)》:第10章 语音信号的合成算法