DM-VERITY流程分析

news2024/11/27 6:31:54

DM-Verity分析报告

 

0.问题的表现形式

1.dm-verity的初始化及验证流程

1.1 dm-verity的初始化

初始化dm的log:

[    3.579718] md: Waiting for all devices to be available before autodetect

[    3.586549] md: If you don't use raid, use raid=noautodetect

[    3.594550] md: Autodetecting RAID arrays.

[    3.598761] md: autorun ...

[    3.601609] md: ... autorun DONE.

[    3.604970] device-mapper: init: attempting early device configuration.

[    3.614256] device-mapper: init: adding target '0 5255168 verity 1 /dev/mmcblk0p9 /dev/mmcblk0p9 4096 4096 656896 656896 sha256 0f8f00f5bf0797addffd383983ec81f1293ee90a0c0afb02adb2fbcdfff93ffd f4b71f5526c591e1d9fbc943b7e503846b4724a9ebf6d57820c2caf3cc631585 10 restart_on_corruption ignore_zero_blocks use_fec_from_device /dev/mmcblk0p9 fec_roots 2 fec_blocks 662070 fec_start 662070'

具体的调用函数栈如下:

系统中的初始化函数是

int verity_ctr(),调用堆栈如下所示:

[    3.648189] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 4.14.61 #1

[    3.654207] Hardware name: Semidrive v9 REF Board (DT)

[    3.659353] Call trace:

[    3.661815] [<ffff00000808bd38>] dump_backtrace+0x0/0x230

[    3.667224] [<ffff00000808bf8c>] show_stack+0x24/0x30

[    3.672287] [<ffff000008ea6040>] dump_stack+0xbc/0xf4

[    3.677350] [<ffff000008a8b104>] verity_ctr+0x2c/0xa28

[    3.682499] [<ffff000008a7a928>] dm_table_add_target+0x128/0x318

[    3.688518] [<ffff0000093b26e8>] dm_run_setup+0x480/0x570

[    3.693927] [<ffff0000093b169c>] prepare_namespace+0x58/0x190

[    3.699682] [<ffff0000093b0f70>] kernel_init_freeable+0x264/0x288

[    3.705787] [<ffff000008eb9eb0>] kernel_init+0x18/0x110

[    3.711022] [<ffff0000080852ac>] ret_from_fork+0x10/0x1c

[    3.727681] device-mapper: init: dm-0 is ready

根据系统传入的参数,初始化dm-verity的功能,参数的含义如下:

1)Verity target version(verity target 版本号)

版本号:1

2)Data block device(存储实际待校验数据的块设备)

存储数据的块设备:/dev/mmcblk0p9

3)Hash block device(存储校验使用到hash的块设备,一般情况跟data block device是同一个)

存储校验hash的块设备:/dev/mmcblk0p9

4)Data block size(数据块设备的每块存储size)

4096,即为4k

5)Hash block size(hash块设备的每块存储size)

4096, 即为4k

6)Num data block(数据块设备占用的块数量)

数据块数量656896, 即0-656895

7)Hash start block(hash设备在存储设备的起始位置)

656896

8)Hash algo(hash算法)

Sha256

9)root digest(对应上面说的 root hash)

0f8f00f5bf0797addffd383983ec81f1293ee90a0c0afb02adb2fbcdfff93ffd

10)Salt(用于计算hash的盐值)

f4b71f5526c591e1d9fbc943b7e503846b4724a9ebf6d57820c2caf3cc631585

在内核中加入的打印:

  printk("v->hash_start = %d\n", v->hash_start);

    printk("v->data_start = %d\n", v->data_start);

       printk("v->data_blocks = %d\n", v->data_blocks);

       printk("v->hash_start =%d\n", v->hash_start);

       printk("v->hash_blocks = %d\n",v->hash_blocks);

       printk("v->data_dev_block_bits=%d\n", v->data_dev_block_bits);

       printk("v->hash_dev_block_bits=%d\n", v->hash_dev_block_bits);

       printk("v->hash_per_block_bits=%d\n", v->hash_per_block_bits);

       printk("v->levels=%d\n", v->levels);

       printk("v->version =%d\n",v->version);

       printk("v->digest_size=%d\n",v->digest_size);

[    3.954883] hash level block[2]= 656896

[    3.958759] hash level block[1]= 656897

[    3.962625] hash level block[0]= 656938

[    3.796016] v->hash_start = 656896

[    3.799467] v->data_start = 0

[    3.802485] v->data_blocks = 656896

[    3.806021] v->hash_start =656896

[    3.809367] v->hash_blocks = 662070   (662070-656896=5174)

[    3.812900] v->data_dev_block_bits=12

[    3.816608] v->hash_dev_block_bits=12

[    3.820279] v->hash_per_block_bits=7   (4096/32 = 128, 指一个4K块上有128个哈希值)

[    3.823888] v->levels=3

[    3.826380] v->version =1

[    3.829033] v->digest_size=32

数据块有656896X4X1024  (超过了2G)

Level 0 :  656896/128 = 5132个4k块

Level 1 :  5132/128= 41个4k块

Level 2:  40 /128 = 0,即1个4k块

共 5132+41+1 = 5174 个块

 

1.2 dm-verity的文件系统访问流程

verity_map()中打包bio,  注册回调函数bio->bi_end_io = verity_end_io;

然后向驱动层发出请求:   generic_make_request(bio);在文件系统总读完数据后,会有执行注册的回调函数,在回调函数Verity_end_io中会验证hash;

1.2.1申请文件系统访问,及注册回调函数

访问文件系统总的函数调用堆栈如下所示:

[   17.596778] [<ffff00000808368c>] el0_ia+0x1c/0x20

[   17.606073] CPU: 0 PID: 1 Comm: systemd Not tainted 4.14.61 #1

[   17.611963] Hardware name: Semidrive v9 REF Board (DT)

[   17.617110] Call trace:

[   17.619570] [<ffff00000808bd38>] dump_backtrace+0x0/0x230

[   17.624979] [<ffff00000808bf8c>] show_stack+0x24/0x30

[   17.630043] [<ffff000008ea6040>] dump_stack+0xbc/0xf4

[   17.635107] [<ffff000008a8aca8>] verity_map+0x28/0x240   //dm-verity封装了一层

[   17.640257] [<ffff000008a74d58>] __map_bio+0x98/0x350

[   17.645318] [<ffff000008a7533c>] __split_and_process_non_flush+0x12c/0x328

[   17.652203] [<ffff000008a76410>] __split_and_process_bio+0x1a8/0x388

[   17.658567] [<ffff000008a76ec4>] dm_make_request+0x7c/0x110

[   17.664151] [<ffff00000857200c>] generic_make_request+0xcc/0x290 //发出bio请求

[   17.670168] [<ffff00000857228c>] submit_bio+0xbc/0x1f0

[   17.675318] [<ffff00000833b70c>] submit_bh_wbc+0x17c/0x1d8

[   17.680813] [<ffff00000833c384>] ll_rw_block+0xf4/0xf8

[   17.685963] [<ffff0000083ba7dc>] ext4_bread_batch+0x134/0x1d0

[   17.691720] [<ffff0000083d8fe4>] ext4_find_entry+0x124/0x3f8

[   17.697389] [<ffff0000083d9324>] ext4_lookup+0x6c/0x210

[   17.702626] [<ffff0000082fcb9c>] lookup_slow+0xc4/0x1b0     //文件路径查找

[   17.707861] [<ffff000008300684>] walk_component+0x204/0x318

[   17.713443] [<ffff00000830107c>] path_lookupat+0x8c/0x1f0

[   17.718852] [<ffff0000083025d8>] path_openat+0x8a0/0xb98

[   17.724173] [<ffff000008303b58>] do_filp_open+0x70/0xe8

[   17.729408] [<ffff0000082ec960>] do_sys_open+0x178/0x260

[   17.734730] [<ffff0000082ecacc>] SyS_openat+0x3c/0x50   //系统调用打开某个文件

 

 

1.2.2 dm-verity回调函数的验证hash的过程

 

上图中,是判断数据块是否被验证过了,下文中会提到hash树的块被验证过了,在缓存中保留着。

 

 

 

 

 

2.问题的分析方法

2.1 方法

 

打印出当前出错块的

1.want_digest,保存在hash树中的该验证块的hash值;

                   2.real_digest,根据实际读到的块中的数据,计算出来的hash值;

                   3.打印出数据块;

                   4.用dd命令直接把某块数据拿出来,比对3中的数据块是否正确;

根据log分析,打印出来的数据,与用dd命令直接取出来的数据块数据是一样的,可以证明送入hash计算的原始数据是正确的,不存在内存踩踏。

    所以有可能是hash运算中本身出现了问题。

2.2 工具

char *bin2hex(char *dst, const void *src, size_t count)

dd if=文件系统路径 of=输出路径 bs=4096 count=1 skip=块号

例如:dd if=/dev/sda1 of=/root/out.txt bs=4096 count=1 skip=6752256

/root/out.txt文件内容就是从块号中读到的内容    bs是块大小(这里为4K) count表示连续读几块   skip是从第几块开始读

dd if=/dev/mmcblk0p9 of=/media/user/ddtest.bin bs=4096 count=1 skip=657824

3.附录

参考的博客:dm-verity原理剖析_内核工匠的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Allegro如何录制SCR快捷键操作指导

Allegro如何录制SCR快捷键操作指导 Allegro可以录制SCR快捷键,里面记录了一些操作,类似一个插件,使用的时候可以直接调用,节省时间。下面介绍如何录制 选择file-Script 会出现一个对话框,任意输入一个名字,比如666 然后点击record 比如录制一个打开层面的scr,操作如…

基于matlab的排队系统仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 排队系统是基本的离散事件系统&#xff0c;了解掌握离散事件系统是研究排队系统仿真不可或缺的前提。离散事件系统是指其状态变量只在某些离散时…

SAP-FICO概览培训 的PPT 文档

目录 SAP ERP 系统功能模块概览 财务会计&#xff08;FI&#xff09;、管理会计&#xff08;CO&#xff09; 财务会计&#xff08;FI&#xff09;、管理会计&#xff08;CO&#xff09;需求出发点 FI 与CO灵活性对比 财务会计&#xff08;FI&#xff09; 财务业务一体化平台示…

JSP概述

JSP JSP是Sun为了解决动态生成HTML文档的技术&#xff0c;通过Servlet输出简单html页面信息都非常不方便。如果要输出一个复杂页面的时候&#xff0c;就更加的困难&#xff0c;而且不利于页面的维护和调试。所以sun公司推出一种叫做jsp的动态页面技术来实现对页面的输出繁锁工…

四维轻云地理空间数据协作管理平台的使用流程介绍

倾斜摄影模型和点云数据采集制作完成后&#xff0c;很多行业在进行数据查看管理和共享时具有很大的不便&#xff0c;通常需要依赖专业软件才能在电脑上进行浏览&#xff0c;倘若想将数据分享给他人查看&#xff0c;则需要进行大文件传输以及让对方安装专业软件。现如今&#xf…

年薪百万的程序员,上网都在看什么?

这个问题相信不少人都好奇&#xff0c;我揪出一位年薪百万的程序员老友&#xff0c;翻遍他的收藏夹&#xff0c;总结整理了6个网站&#xff0c;甩出来给大家。 有几个干货网站大家记得当场保存&#xff0c;要不然划过就忘了&#xff01;&#xff01; 国际各行业报告&#xff1…

python 异步线程 实现 异步生产 同步通信

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

傅里叶变换的四种形式

此文转自知乎的jinjin 傅里叶变换的四种形式 - 知乎 傅里叶变换是信号的一种描述方式&#xff0c;通过增加频域的视角&#xff0c;将时域复杂波形表示为简单的频率函数&#xff0c;获得时域不易发现的与信号有关的其他特征。 根据时间域信号x自变量的不同&#xff0c;可以将信号…

sqli-labs/Less-45

这一关有没有报错信息 所以我们不能从报错信息中得知注入类型 我们只能通过登陆成功或者失败去辨别我们判断的注入类型正确与否 然后我们也不懂注入点 所以只能进行尝试了 如果两个参数在SQL语句中都被单引号包裹住 那么假设username为注入点输入如下 username admin# pass…

【强大的数据迁移和恢复解决方案】KernelApps及其产品介绍

KernelApps是 范围广泛的强大的数据迁移和 恢复解决方案 可以根据用户的需求提供多种采购方案 KernelApps提供 交换服务器、Office 365、 电子邮件迁移、Outlook等方面工具 其产品包括数据恢复、文件修复、 数据迁移、电子邮件迁移、 媒体恢复、云备份、云迁移等解决方…

基于32单片机的多功能电子语音时钟

本设计是32单片机的多功能电子语音时钟设计&#xff0c;主要实现以下功能&#xff1a; 1.通过OLED显示时间&#xff0c;日期&#xff0c;温度&#xff0c;湿度等信息 2.到达整点时能够语音播报时间和温湿度 3.可通过按键使语音模块播报时间和温湿度 4.可通过按键调整当前时间&…

Mac M1安装Centos8

M1 芯片 Centos8 百度网盘下载的慢&#xff0c;大家可以直接给我留言&#xff0c;我用奶牛快传分享给大家 链接: https://pan.baidu.com/s/1gT7TnBk5HnT27F82FGht7w?pwd1234 提取码: 1234 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 安装 第一次输入 r 依…

推荐一款高效率前端开发神器,功能太强大了

当前端收到一张设计稿的时候&#xff0c;他们需要考虑非常多的问题。 而第一个摆在面前的问题就是 - 切图。作为连接设计师和前端的重要“纽带”&#xff0c;如果切图不准确&#xff0c;很容易导致最终的产品呈现与设计稿大相径庭。 随之而来的第二个问题就是 - 设计还原。页面…

荧光标记转铁蛋白-(FITC, cy3, cy5, cy7, 香豆素, 罗丹明)

转铁蛋白&#xff08;Tf&#xff09;结合铁是通过与其受体&#xff0c;即Transferrin Receptor 1(TfR1)相互作用而实现的。TfR1 是一种表达于细胞表面的糖蛋白&#xff0c;由两个同源二聚体的亚基通过二硫键连接而成。在细胞表面&#xff0c;Tf与Fe3相互作用形成全铁-Tf&#x…

ESP32 入门笔记07: ESP-NOW (ESP32 for Arduino)

【B站乐鑫】 ESP-NOW 无线通信方案简介 ESP-NOW 是一种快速、无连接的通信技术&#xff0c;具有短数据包传输的特点。 ESP-NOW 是乐鑫开发的一种“协议”&#xff0c;它使多个设备无需使用 Wi-Fi 即可相互通信。该协议类似于低功耗 2.4GHz 无线连接 。在通信之前需要设备之间…

什么是数字孪生?数字孪生技术有没有真正的实用价值?

可以很确定地说&#xff0c;数字孪生技术为我们的生活与工作都提供了巨大的价值。过去几年&#xff0c;在经历了”三起三落”之后&#xff0c;数字孪生再次成为资本和舆论关注的焦点。“数字孪生就像是给你了一个水晶球&#xff0c;能够根据过去和当下发生的事情来预测并模拟未…

HDMI接口类型种类区分图(高清图)

HDMI接口类型这么多种啊&#xff0c;主要有A、B、C、D、E五种类型。 1、A类&#xff08;Type A&#xff09; HDMI A Type是使用最广泛的HDMI线缆&#xff0c;HDMI A接口共有19pin&#xff0c;宽度为13.9毫米&#xff0c;厚度为4.45毫米。 2、B类&#xff08;Type B&#xff…

【SpringCloud】04 网关springcloud gateway

网关springcloud gateway 上面的架构&#xff0c;会存在着诸多的问题&#xff1a; 客户端多次请求不同的微服务&#xff0c;增加客户端代码或配置编写的复杂性 认证复杂&#xff0c;每个服务都需要独立认证。 存在跨域请求&#xff0c;在一定场景下处理相对复杂。 网关可以做…

【QT】编译QtWebEngine(Build QtWebEngine from source)Win10+QT5.7.1_x64+VS2015

1、前言 关于QtWebEngine是干什么的&#xff0c;怎么用的&#xff0c;不在此赘述。 1.1、为什么要编译QtWebEngine QT默认的QtWebEngine是不支持mp3、mp4解码的&#xff0c;也就是说&#xff0c;如果想要在QT浏览网页的时候支持在线播放音视频&#xff0c;就需要让QtWebEngi…

前端品优购项目准备工作

网站制作流程&#xff1a; 初稿审核&#xff1a;网页美工会制作原型图和psd效果图 品优购项目规划&#xff1a; 1 品优购项目整体介绍 描述&#xff1a;电商网站&#xff0c;要完成PC端首页&#xff0c;列表页&#xff0c;注册页面的制作 2 品优购项目学习目的 电商类网站比…