欧美网址在线观看-亚洲最新毛片-国产成人免费爽爽爽视频-亚洲一区在线影院-日韩欧美在线观看视频网站-男女激情四射-成人一区二区免费看-欧美亚洲综合在线-日韩一级视频在线播放-国产成人三级视频在线播放-亚洲中文字幕日产无码2020-99久久久国产精品免费无卡顿-av在线观看地址-果冻传媒mv免费播放在线观看-欧美在线观看视频免费-日韩天天操

聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

dm-verity-ramdisk文件系統校驗的解決方法

來源:CSDN 時間:2023-02-15 11:20:40

近期做的一個項目,由于客戶對安全性要求比較高,涉及到文件系統校驗的問題,起初是在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燒進去即可。

最終實現的效果如下:

責任編輯:

標簽: 文件系統

相關推薦:

精彩放送:

新聞聚焦
Top 欧美网址在线观看-亚洲最新毛片-国产成人免费爽爽爽视频-亚洲一区在线影院-日韩欧美在线观看视频网站-男女激情四射-成人一区二区免费看-欧美亚洲综合在线-日韩一级视频在线播放-国产成人三级视频在线播放-亚洲中文字幕日产无码2020-99久久久国产精品免费无卡顿-av在线观看地址-果冻传媒mv免费播放在线观看-欧美在线观看视频免费-日韩天天操

        国风产精品一区二区| 久久综合久久色| 四虎4hu永久免费入口| 91网址在线观看精品| 久久午夜夜伦鲁鲁一区二区| 一区二区三区免费播放| 潘金莲激情呻吟欲求不满视频| 亚洲午夜精品一区| 老汉色影院首页| 国产精品久久..4399| 亚洲视频在线a| 97在线免费视频观看| 极品粉嫩国产18尤物| 激情图片qvod| 青青青在线观看视频| 国产免费黄色av| 青青青免费在线| 日韩无套无码精品| 亚洲一二三区av| 男生操女生视频在线观看| 亚洲天堂av免费在线观看| 日韩欧美中文视频| 欧美日韩福利在线| 欧美一级在线看| 日韩一区二区三区久久| 黄页免费在线观看视频| 亚洲第一狼人区| 成人性生活视频免费看| 免费成人午夜视频| 孩娇小videos精品| 国产欧美日韩网站| 午夜在线观看av| 在线观看污视频| 国产精品无码一本二本三本色| aaa免费在线观看| 中文字幕在线导航| 黄黄视频在线观看| 黄色影院一级片| 好吊色这里只有精品| www.国产在线视频| 91网址在线观看精品| 欧美三级午夜理伦三级| 日本一区二区三区四区五区六区| 好男人www社区| 人人妻人人澡人人爽欧美一区双| 亚洲精品自拍网| 日本美女爱爱视频| www.亚洲成人网| 日日噜噜噜夜夜爽爽| 久久久久人妻精品一区三寸| av影院在线播放| jizzzz日本| 国产免费成人在线| 日韩人妻一区二区三区蜜桃视频| 免费看a级黄色片| 日本一区午夜艳熟免费| 成年人三级黄色片| 毛片在线视频播放| 老司机av福利| 超碰在线97免费| 国产免费黄色av| 99中文字幕在线观看| www.欧美黄色| 天堂av免费看| 天天干天天色天天干| 99精品一级欧美片免费播放| 美女在线视频一区二区| 91免费黄视频| 国产精品igao激情视频 | 日本高清一区二区视频| 簧片在线免费看| av免费中文字幕| 中文字幕网av| 香蕉视频网站入口| 天堂…中文在线最新版在线| 国产一二三四区在线观看| 伊人成人222| 冲田杏梨av在线| 超碰网在线观看| 黄大色黄女片18第一次| 九热视频在线观看| 久久久久久香蕉| 男女男精品视频站| 日本激情综合网| 国产奶头好大揉着好爽视频| 日韩欧美猛交xxxxx无码| www.-级毛片线天内射视视| 亚洲黄色av片| 日本丰满大乳奶| 日本爱爱免费视频| 欧美激情第四页| 国产一区二区在线视频播放| 国产最新免费视频| 丰满人妻中伦妇伦精品app| 国产视频在线视频| www午夜视频| 欧洲xxxxx| 欧美人与动牲交xxxxbbbb| 69堂免费视频| 在线观看免费不卡av| 北条麻妃亚洲一区| 99亚洲国产精品| 欧美成人黑人猛交| 国产真人无码作爱视频免费| 国产视频一区二区视频| 亚洲av无日韩毛片久久| cao在线观看| 日韩欧美国产综合在线| 熟女人妇 成熟妇女系列视频| 国产免费黄色av| 91蝌蚪视频在线观看| 国产欧美综合一区| 日本老太婆做爰视频| 中文字幕精品在线播放| 一二三四视频社区在线| 精品久久久噜噜噜噜久久图片| 亚洲欧美天堂在线| 国产精品夜夜夜爽张柏芝| 国产91对白刺激露脸在线观看| 黄色av免费在线播放| 亚洲综合激情五月| 黄色大片在线免费看| avav在线看| 欧美大片久久久| 青青草精品视频在线观看| 7777在线视频| 国产在线观看福利| 日本福利视频在线观看| 一区二区免费av| 少妇高潮毛片色欲ava片| 色噜噜狠狠一区二区三区狼国成人| 日本日本19xxxⅹhd乱影响| 一区二区久久精品| bt天堂新版中文在线地址| 久久久精品麻豆| 国产美女主播在线| 在线不卡一区二区三区| 男人天堂网视频| 一级黄色大片儿| 欧美伦理片在线观看| 国产99久久九九精品无码| 熟女少妇在线视频播放| 日韩在线视频在线| 久久精品亚洲天堂| 国产 福利 在线| 妺妺窝人体色www在线小说| 日本免费色视频| 黄www在线观看| 大胆欧美熟妇xx| 制服丝袜中文字幕第一页 | 亚洲国产成人精品无码区99| 欧美一级裸体视频| 日批视频在线免费看| 中文av字幕在线观看| 蜜臀av午夜一区二区三区| 女人被男人躁得好爽免费视频 | 特级西西444www| 亚洲AV无码成人精品一区| 一道本在线观看视频| 日本不卡一区二区在线观看| 久久久久久久久久久福利| 国产精品视频网站在线观看| 欧美aaa在线观看| 污污视频在线免费| 九九爱精品视频| 久久婷婷国产91天堂综合精品| 亚洲日本黄色片| 拔插拔插海外华人免费| 免费一级淫片aaa片毛片a级| 国产精品69页| 激情五月五月婷婷| 欧美在线观看成人| 手机av在线免费| 久久久久免费看黄a片app| 一级黄色录像在线观看| 屁屁影院ccyy国产第一页| 污污视频网站免费观看| 黄色特一级视频| 九热视频在线观看| 男人添女人下部视频免费| 日韩不卡一二三| 久艹视频在线免费观看| 小早川怜子一区二区三区| 免费观看精品视频| 99热一区二区三区| 久久无码高潮喷水| 免费的一级黄色片| 亚洲一区在线不卡| 亚洲熟妇无码一区二区三区| 视频区 图片区 小说区| 日韩av资源在线| 成人毛片100部免费看| 超碰在线公开97| 久久久免费视频网站| 免费视频爱爱太爽了| 亚洲综合伊人久久| 亚洲黄色小视频在线观看| 久久久亚洲精品无码| 六月婷婷激情网| 欧美性受xxxx黒人xyx性爽|