链式验证

Linux 安全启动基于 ROM/KM0/KM4 安全启动。Linux 部分的安全启动流程如下所示。

../../_images/verified_boot_sw_arch.svg

备注

通常情况下,内核命令行将是 Kernel command line: console=ttyS0,1500000 earlycon psci=enable ubi.mtd=8 ubi.block=0,0 ubi.mtd=9 dm-mod.create="system,,0,ro, 0 55928 verity 1 /dev/ubiblock0_0 /dev/ubiblock0_0 4096 4096 6991 6991 sha512 <salt> <hash> 2 ignore_corruption ignore_zero_blocks" root=/dev/dm-0 rootfstype=squashfs 。 内核初始化时会显示命令行,其内容由 <sdk>/sources/boot/uboot/cmd/realtek_avb.c 提供。 函数 realtek_organize_cmdline() 将提取关键信息并组织一个新的命令行用于安全启动。

  • ubi.mtd=8 表示 mtd 中 rootfs 块的索引,它用于将 mtd8 设为字符设备 ubi0。

  • ubi.block=0,0 表示将字符设备 ubi0 设为块设备 ubiblock0,因为 dm verity 只能对块设备进行操作。

  • dm-mod.create 参数是由 dm-verity 驱动程序定义的。这些参数包括要验证的块设备、哈希块的大小、哈希块的数量、rootfs 哈希树的起始地址、验证所需的盐值和摘要等。摘要是指在 uboot 中已经被 VBmeta 验证过的 rootfs 的根哈希值。

  • ubi.block0_0 被附加到 dm-0 上。 root=/dev/dm-0 将 dm-0 挂载为根文件系统,这也意味着将 mtd8 区域的信息设为 rootfs。当用户访问 rootfs 中的某些块时,dm-verity 会对任何块及其相关块进行动态哈希计算。

有关 dm-verity 的更多细节,请参考 dm verify

本节介绍构造参数、操作原理、哈希树、磁盘格式以及一些示例。内核命令行是 rootfs 哈希树验证的唯一起点,哈希树的根哈希摘要将被插入 VBmeta,其有效性已通过之前的流程确认。

上述框架的代码可以分为三个部分: Flash 区域、 U-Boot 区域和 kernel 区域。下面仅列出每个部分的核心代码目录。

区域

路径

介绍

Flash

<sdk>/sources/yocto/meta-realtek/tools/verified_boot

制作安全相关固件的脚本

U-Boot

<uboot>/cmd/mtd.c

读取 NAND 闪存的操作步骤

<uboot>/cmd/realtek-avb.c

vbmeta/公钥/内核/设备树的验证

Kernel

<linux>/drivers/md/*

此目录由名为 dm-verity 的 GPI Linux 内核提供,用于验证 rootfs 的哈希树

更多关于安卓验证启动的信息,请参考 android avb