dm-verity原理剖析

本文详细介绍了Android平台上的dm-verity技术,用于镜像启动时的完整性检查,防止恶意篡改。dm-verity利用哈希树实现数据校验,通过在启动时验证系统镜像的哈希值,确保设备状态与上次使用时一致。在内核和应用层分别阐述了其实现原理,包括设备创建、表加载和激活等步骤,以及数据流的处理过程。此外,还探讨了dm-verity提高校验效率的哈希树设计。

一、技术模块简介

Dm-verity 是 device-mapper 架构下的一个目标设备类型, 通过它来保障设备或者设备分区的完整性。

 

Dm-verity类型的目标设备有两个底层设备,一个是数据设备(data device), 是用来存储实际数据的,另一个是hash设备(hash device), 用来存储hash数据的,这个是用来校验data device数据的完整性的。

简单的架构图如下:

图中映射设备(Mapper Device)和目标设备(Target Device)是一对一关系,对映射设备的读操作被映射成对目标设备的读操作,在目标设备中,dm-verity又将读操作映射为数据设备(Data Device)的读操作。但是在读操作的结束处,dm-verity加了一个额外的校验操作,对读到的数据计算一个hash值,用这个哈希值和存储在哈希设备(Hash Device)

二、设计原理

对于本文要介绍的dm-verity功能模块,笔者选择在当前移动终端应用的角度来展开讲解,也就是Android平台在dm-verity的应用。

Android 端主要是在镜像启动时验证这个功能场景上使用到了 dm-verity 技术,该技术可以对块存储设备进行完整性检查,有助于阻止某些恶意程序对镜像的修改,有助于Android用户在启动设备时确认设备状态与上次使用时是否相同。在系统镜像(比如 system、vendor等)启动时以及运行时可以实时性监测当前镜像是否被篡改。

通过dm-verity技术,可以确认块设备内容是否跟预期一致,具体的实现原理是利用哈希树(hashtree)做到的。用以下图来形象说明

(图来自:https://source.android.com/security/verifiedboot/dm-verity)

简单说明一下这个插图背后的原理:

在编译阶段,首先会对系统镜像(比如system.img、vendor.img)按照每4k大小计算对应hash,将这些hash信息存起来,形成上面图中的layer 0层,紧接着会对 layer 0 层同样按照每4k大小计算hash,并将这层的hash信息存起来,形成layer 1层,以此类推,直至最后的hash信息存放在一个4k大小的块中(未填满使用0填充),这里边存储的hash信息称为 root hash。

在运行阶段,对于镜像里的文件进行访问时,操作对应所在块设备的存储区域时,会计算当前存储块(按4k大小)的hash值,然后会跟存储在哈希树上对应块的hash值进行比较,如果匹配不上,则认为当前该文件在底层存储被篡改或是损坏了。

 

为了更形象的描述下镜像运行时如何利用哈希树做校验的,下面以一个1G大小的镜像为例,来说明一下这个过程:

根据 hashtree 的生成方式,以 1G 的镜像为例:

1)按照 4K 大小划分,将1G 大小的镜像依顺序划分可得到 262144 个 4k 大小的块

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OPPO内核工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值