dm-verity是如何保证安全的?dm-verity-ramdisk文件系统校验的解决方法:今日关注
近期做的一个项目,由于客户对安全性要求比较高,涉及到文件系统校验的问题,起初是在ramdisk中挂载rootfs后对所有重要的文件检查sha256,但是随着rootfs的逐步增大,发现校验花费的时间太长,竟然达到十几秒,于是就想改用一种方案,首先想到的是整个rootfs校验后在挂载,这样肯定是比一个文件一个文件校验要来得快些,但是项目中用的是nandflash,并不是EMMC,所以文件系统只能采用支持坏块管理的ubifs,于是这里就存在问题了,ubi层负责逻辑块到物理块的映射,也就是说在物理存储上块不一定是逻辑连续的,这样在ubifs还没有挂载之前读取整个镜像然后整体校验肯定是行不通的,一个解决办法是读取ubi卷设备而不是mtd设备,这样的话是可行的,但是一种更好的办法是采用dm-verity,但是这个是Linux项目,并不是Android项目,通过对dm-verity移植,这里记录一下对dm-verity的理解。
dm-verity是什么?
它是dm(device mapper)的一个target,是一个虚拟块设备,专门用于文件系统的校验
(资料图)
+------------------------------+
| fs |
+------------------------------+
|
↓
+-------------------------------+
| dm-verity |
+-------------------------------+
|
↓
+-------------------------------+
| block driver |
+--------------------------------+
|
↓
+-------------------------------+
| block device |
+-------------------------------+
fs在挂载的时候直接指定dm-verity设备,也就是fs直接交互的设备是dm-verity,dm-verity调用真正的块驱动去读取对应的块,并计算hash值和hash-tree中对应的hash值进行比较,如果相等,则说明块没有被篡改,返回块数据给fs,如果不相等,则说明块被篡改,根据mode是返回EIO,或者直接重启。
首先通过ioctl去crt(create)一个dm-verity设备,通过传入参数指定这个创建的dm-verity设备的一些特性,传入的参数包括verity-table,当然也可以使用命令直接创建:
Set up a device: # dmsetup create vroot --readonly --table \ "0 2097152 verity 1 /dev/sda1 /dev/sda2 4096 4096 262144 1 sha256 "\ "4392712ba01368efdf14b05c76f9e4df0d53664630b5d48632ed17a137f39076 "\ "1234000000000000000000000000000000000000000000000000000000000000"
verity-table的内容如下:
40 def build_verity_table(block_device, data_blocks, root_hash, salt):41 table = "1 %s %s %s %s %s %s sha256 %s %s"42 table %= ( block_device,43 block_device,44 BLOCK_SIZE,45 BLOCK_SIZE,46 data_blocks,47 data_blocks + (METADATA_SIZE / BLOCK_SIZE),48 root_hash,49 salt)50 return table
block_device描述了该dm-verity设备对应了那个底层的块设备,第二个block_device指定了hash-tree存在于哪个块设备上,对于我这个项目就是/dev/ubiblock0_0,BLOCK_SIZE描述了多大一个块对应一个hash,一般都4k, data_blocks描述了有多少个4k的块,data_blocks + (METADATA_SIZE / BLOCK_SIZE)表示hash-tree在对应块设备上的偏移,由此来找到hash-tree,root_hash为hash-tree的根hash。
dm-verity工作在块设备之上,所以这里是/dev/ubiblock0_0,于是就不能再用ubifs 了,因为ubifs工作在卷设备之上,而/dev/ubi0_0是一个字符设备,所以只能采用工作在块设备之上的文件系统,我这里采用了squashfs,因为它比较简单。
dm-verity的工作原理
通过前面的描述,很容易理解dm-verity的工作过程,就拿我这个项目来说,squashfs需要读取某个块时,调用dm-verity读取对应的块,dm-verity根据verity-table中block_device,调用block_device读取对应的块,读取到块的内容后dm-verity会算出块的sha256,然后跟verity-hash-tree中相对应的hash值进行比较,如果相等,则说明该块没有被修改过,一切正常。
为何dm-verify支持所有的文件系统?
该项目在选用dm-verity之前,我一直都在怀疑dm-verity是否支持ubifs,通过前面的描述,如果你对dm-verity的工作原理足够理解的话,你就会发现,dm-verity跟文件系统是无关的,只要文件系统是工作在块设备之上的,所以ubifs是不可以的,工作在块设备之上的文件系统都是可以的,dm-verity是对逻辑块校验hash值,产生hash-tree的时候也是根据文件系统镜像来产生的(然后除ubifs之外,不存在逻辑块的概念,但是可以类似将它看出逻辑块直接等于物理块),至于逻辑块到物理块直接是怎样映射,dm-verity根本就不需要关心。
dm-verity为何这么快?
了解了原理之后这个就很好回答了,因为dm-verity并不需要在挂载前对所有的块进行校验,而是在使用的过程中用到哪个块就校验哪个块的hash值,这样对于像android一个分区几个G来说优势就显得更加明显了。
dm-verity是如何保证安全的?
前面说过每个block都在hash-tree中记录了对应的hash值,这样就能防止别人篡改block的内容了,但是如果黑客把block改了之后,重新计算hash把hash-tree中对应的hash值也改了呢,这样就能神不知鬼不觉了,所以必须要有一种机制防止hash-tree被篡改,hash-tree是这样一种结构,所有的block对应的hash值放在最底层,也就是第0层,如下图:
第1层的hash值由下面一层的hash值计算得到,除了第0层,其他的层hash值都不对应物理上block的hash值,它们存在的意义只是为了构建hash链,防止hash篡改,这样第0层的hash值改变了的话,上层对应的hash值也需要修改,也就是说根hash也需要修改,所以只需要一种机制能保证root-hash不被篡改就行了。
Android中采用的方法是算root-hash的签名,verity-table中保存了root-hash,对verity-table进行签名,它们的存储分布如下:
在Android中,系统进入ramdisk后,由/system/core/fs_mgr/ 负责dm-verity设备的创建,verity-table的校验,这里涉及到的一些知识是:
1.如何知道哪些分区需要校验?
fs_mgr通过读取fstab文件,其中记录了哪些分区需要校验
2.如何知道需要校验的分区中verity-table的位置?
这是用户空间(/system/core/fs_mgr/ )的工作,android的做法是通过读取文件系统的超级块(Superblock,简称SB),里面记录了文件系统的大小,verity-table紧挨着文件系统镜像之后
3.签名的key存放在哪里?
这里指的是public key
verity-table-metadata主要是为了校验verity-table的合法性,android的格式为:
def build_metadata_block(verity_table, signature): table_len = len(verity_table) block = struct.pack("II256sI", MAGIC_NUMBER, VERSION, signature, table_len) block += verity_table block = block.ljust(METADATA_SIZE, "\x00") return block
verity-table的校验是在用户空间(/system/core/fs_mgr/ )中完成的,校验合法之后会将verity-table传给kernel使用。
上面说的这些只是Android的一套,自己实现的话没必要完全按照它的来,比如说verity-table和hash-tree没有必要放在分区中,可以放在ramdisk中,签名和校验RSA2014可以自己实现,public key存放的位置可以自己决定,如放在ramdisk中或放在OTP中。
dm-verity异常处理
dm-verity签名校验失败后会怎么做呢?下面是Android的做法:
在metadata分区中会记录dm-verity的状态,提示是否挂载,同时在dm-verity设备创建时也会指定mode,dm-verity在内核中块hash校验失败后不同的mode表现的行为不一样。
// Verity modesenum verity_mode { VERITY_MODE_EIO = 0, VERITY_MODE_LOGGING = 1, VERITY_MODE_RESTART = 2, VERITY_MODE_LAST = VERITY_MODE_RESTART, VERITY_MODE_DEFAULT = VERITY_MODE_RESTART};static int load_verity_table(struct dm_ioctl *io, char *name, uint64_t device_size, int fd, char *table,int mode){ ... if (mode == VERITY_MODE_EIO) { //对于比较老的内核dm-verity驱动,是不支持mode的,当block hash校验不过时总是cause an I/O error for corrupted blocks // allow operation with older dm-verity drivers that are unaware // of the mode parameter by omitting it; this also means that we // cannot use logging mode with these drivers, they always cause // an I/O error for corrupted blocks strcpy(verity_params, table); } else if (snprintf(verity_params, bufsize, "%s %d", table, mode) < 0) { return -1; } ... ioctl(fd, DM_TABLE_LOAD, io);}
指定mode后,kernel中碰到校验不过的块的处理:
/* * Handle verification errors. */static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, unsigned long long block){ ... out: if (v->mode == DM_VERITY_MODE_LOGGING) return 0; if (v->mode == DM_VERITY_MODE_RESTART) kernel_restart("dm-verity device corrupted"); return 1;}
记录一下移植的过程中踩过的坑:
在移植的过程中发现Android6.0是有bug的,在产生hash-tree的时候:
image_size = os.stat(out_file).st_size
由于img是sparse过后的,所以这里的大小肯定是不对的,正确的做法应该是先unsparse,然后再计算大小。
另外这里采用的是ubiblock:
ubiblock --create /dev/ubi0_0
mtd--->ubi------>ubi vol----->ubiblock
另外还可以采用gluebi:
mtd---->ubi---->ubi vol--->mtd--->mtdblock
ubiblock比较简单,缺点是只读,在挂载时必须指定为只读:
mount -t squashfs /dev/ubiblock0_0 /mnt -o ro
生成烧录镜像的过程:
rootfs dir---------mksquash------------>rootfs.squashfs-----------ubinize-------------->rootfs.ubi
把rootfs.ubi烧进去即可。
最终实现的效果如下:
标签: 文件系统
相关推荐:
最新新闻:
- dm-verity是如何保证安全的?dm-verity-ramdisk文件系统校验的解决方法:今日关注
- 《孤岛惊魂6》将于2月16日在全平台开启免费试玩
- 【环球报资讯】RAM展示概念图 或推出电动皮卡
- 环球观速讯丨RTX4060!机械革命游戏本只要6199
- 基于体温监测 三星手表将推出经期管理功能
- 健康度掉太快 三星升级990Pro固件-最新资讯
- 2022年度智能穿戴设备创新排行榜发布 智能健康穿戴驶入快车道
- 兄弟管道官网发现《超级马里奥兄弟大电影》隐藏海报 全球快消息
- 渠道商预售 AMD游戏神U锐龙7000 144MB缓存版:每日消息
- 南宁一男子商场内刺伤一女子后投江!警方通报
- 死亡空间重制版欧洲前两周销量不及木卫四协议_快看点
- 《大富翁11》现已完全支持Steam Deck-焦点热议
- 超狂身材曲线太过分 印尼电竞女选手火辣至极
- 世界快资讯丨索尼FE 50mm F1.4 GM镜头外观曝光
- 情人节惊喜福利:购影驰RTX 30显卡,送穿越火线大礼包 天天快看点
- 环球观察:潮邦集成灶怎么样?真实用户有话说!
- 优化碰撞监测 苹果iOS16更新再次尝试-今亮点
- 更新iOS 谷歌服务大范围无法访问
- 全球快资讯:2020最新新年对联大全_春节对联集锦大全
- 看视频软件app排行榜_看视频软件
- 2019立秋为什么吃饺子 立秋适合吃饺子吗
- 2023年情人节单日票房破两亿 《满江红》领跑|当前速递
- 每日速看!永安林业违反会计准则 被出具警示函
- 《战神》总监承认同伴破坏解谜体验:做的时候没想到-每日速递
- 世界最资讯丨XGPU和EA Play会员已可试玩《狂野之心》 时长约10小时
- 【世界热闻】上海迪士尼度假区与三星电子达成推广合作, 庆祝三星新品手机发布
- 索尼正在研究如何把PS5塞进桌斗里:抱着送人太沉了|资讯
- 程序员的好帮手?网友开始尝试用ChatGPT开发游戏
- 天天要闻:早期版的《战神5》 奎爷曾被雷神杀死
- “超时空办公”时代已来 联想发布智慧办公白皮书 每日时讯
- 【聚看点】拓界影像稳劲性能 三星Galaxy S23系列旗舰手机国内发布
- 速递!“逆城市”建设类游戏《伊始之地》宣传片公开
- 即时:外国女孩穿汉服COS东方美人 网友感慨:这波中华文化输出赢麻了
- 滤镜景点诈骗又来了!7朵郁金香撑起上海武康路流量
- 伊朗外交部发言人:总统莱希访华将加强伊中关系
- 当前关注:关于国际市场营销案例分析
- 暗影精灵9Plus高能版预售 酷睿i7+RTX 4070 10999元
- 世界观热点:爸爸因姜姓难取名给孩子叫去寒 网友吐槽略随意
- 当前看点!剧版《最后生还者》致敬游戏第二部彩蛋:乔尔同款背包
- 以爱为名 浪漫相伴 尼康精选挚爱佳作献礼甜蜜情人节
- 情人节好礼! 购映众显卡赠《穿越火线》限定豪礼
- 焦点速递!不止情人节,三星BESPOKE缤色铂格系列家电守护浪漫每一天
- 情人节送什么礼物? 购铭瑄RTX3060及以上显卡获赠《穿越火线》稀有礼包
- 环球快看点丨CT检查激增,海信智慧阅片室助力三甲医院“阅图”效率提升
- 首批生态合作伙伴!太平洋网络宣布接入百度“文心一言”|焦点热门
- 环球资讯:《霍格沃茨之遗》御剑飞行:这才是飞行扫帚正确用法
- 恐怖电影《梅根》定档3月17日:“窒友”AI娃娃来了!|今日观点
- 每日观点:桌面版RTX 4060将使用完整版AD107核心
- 播报:北京门头沟区明天停电!这些地区将受影响
- 快看:快来游玩《PGA TOUR 2K23》在Tony Finau的梦幻球场上尽情挥杆
- 苹果iOS 16.3.1正式推送:优化车祸检测功能 减少误判
- 曝魅族20内部代号凤凰 双版本机型 起售价3500元 世界播资讯
- 小岛秀夫晒与《死亡搁浅2》两位女主合影:左拥右抱美得很:全球新要闻
- 23999元起 雷蛇新款灵刃18上架:可选RTX4060/70
- 全球观速讯丨贾跃亭FF91首款准量产车运抵中国 进行测试和验证
- 《流浪地球2》导演郭帆:我们在这方面弯道超车好莱坞|最资讯
- 环球今日讯!《仙剑奇侠传7》DLC上线 N卡光追开启/关闭对比图
- 国家药监局发布15批次化妆品检出禁用原料的通告|聚看点
- XPE有哪些安全特性?XPE的安全特性介绍|全球新要闻
- isp接口IP地址均为公有地址该如何配置?R6teInetR5公有IP地址的使用方法|世界百事通
- 安卓开发Android studio学习笔记 利用SQLiteDatabase操作数据表
- 浮点保留两位小数 R语言初级教程 每日热门
- 小米Connectify无法连接xp怎么办?解决方法步骤|天天快报
- 观速讯丨英伟达RTX4060桌面显卡曝光,移动版新品已上架开售
- 魅族20 Pro外观曝光:竖排三摄、采用直角边框:全球热讯
- 小米激光打印一体机 K100 发布:首发 849 元-环球速看料
- 全球首发240W快充!realme真我GT Neo5今晚零点正式开售
- 【全球独家】最新证书挂靠价格行情表
- 天天即时:周黑鸭今年利润大幅下滑!下跌超90%
- 世界热头条丨画质拉满 油管博主用虚幻5制作《地铁跑酷》
- 世界今亮点!东映社长手冢治逝世 享年62岁
- 什么值得买首发科学消费纪录片,呈现优质内容价值
- 集成灶10大品牌帅丰“全渠道新增长 开新局”经销商会议精彩回顾_环球报道
- 颜值担当,航天动力,小刀电动车朋克成Z世代新宠-今日播报
- 势不可挡,小贝先行,新华三小贝2023全国合作伙伴大会圆满召开