欧美网址在线观看-亚洲最新毛片-国产成人免费爽爽爽视频-亚洲一区在线影院-日韩欧美在线观看视频网站-男女激情四射-成人一区二区免费看-欧美亚洲综合在线-日韩一级视频在线播放-国产成人三级视频在线播放-亚洲中文字幕日产无码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免费播放在线观看-欧美在线观看视频免费-日韩天天操

        亚洲第一天堂久久| 男女爱爱视频网站| 久久手机在线视频| 一区二区三区网址| 日韩欧美国产免费| 国产成人一区二区三区别| 久久婷婷中文字幕| 亚洲欧美另类动漫| 99蜜桃臀久久久欧美精品网站| 超碰在线免费观看97| 99九九精品视频| 性欧美1819| 99re精彩视频| 亚洲综合色在线观看| 99草草国产熟女视频在线| 狠狠爱免费视频| 91免费视频网站在线观看| www.99热这里只有精品| 黄色大片中文字幕| 一区二区传媒有限公司| 日本欧美黄色片| 欧美视频在线观看网站| 日韩亚洲欧美一区二区| www.亚洲一区二区| 一二三四中文字幕| 日韩视频免费播放| 一二三级黄色片| 蜜桃视频成人在线观看| 波多野结衣三级在线| 国产一区一区三区| 2019日韩中文字幕mv| 欧美日韩激情四射| 六月婷婷在线视频| 欧美一级在线看| 欧美黑人又粗又大又爽免费| 亚洲色图久久久| 青娱乐精品在线| 青青草综合在线| 男人天堂网视频| 久久久久久三级| 亚洲国产欧美91| 国产青草视频在线观看| 久久久一本二本三本| 日韩 欧美 高清| 在线一区二区不卡| 韩日视频在线观看| av五月天在线| 97在线免费视频观看| 日韩中字在线观看| 小泽玛利亚视频在线观看| 欧美日韩在线免费观看视频| 日本中文字幕亚洲| 国产成人黄色网址| 国产a级黄色大片| 精品久久久久av| 国产一区一区三区| 99热手机在线| 国产一级不卡视频| 欧美大尺度做爰床戏| 2021狠狠干| 无码少妇一区二区三区芒果| 天天想你在线观看完整版电影免费| 亚洲欧洲日产国码无码久久99| 久久人人爽av| 国产精品自拍片| 欧美成人手机在线视频| 国精产品一区一区三区视频| 欧美又黄又嫩大片a级| 欧美日韩在线视频一区二区三区| av在线播放天堂| 色哟哟精品视频| 97超碰在线人人| 成人av毛片在线观看| 久久婷婷国产精品| 99热亚洲精品| 偷拍盗摄高潮叫床对白清晰| 男女啪啪网站视频| 日韩精品视频一区二区在线观看| 久久久国产精华液999999 | 国模无码视频一区二区三区| 手机免费看av网站| 国产九九九九九| 91免费国产精品| 超碰在线免费观看97| 午夜啪啪小视频| 欧美伦理片在线看| 粉嫩虎白女毛片人体| 日本不卡在线观看视频| 免费在线看黄色片| 香港三级日本三级a视频| 999在线精品视频| 岛国av免费在线| 中文字幕av专区| 无码少妇一区二区三区芒果| 成人一级片网站| 那种视频在线观看| 日韩在线xxx| 国产成人久久777777| 国产精品第12页| 国产免费视频传媒| 狠狠操精品视频| 国产精品免费成人| 国产精品久久a| 国产精欧美一区二区三区白种人| 三年中国国语在线播放免费| 99久久激情视频| 美女黄色片视频| av在线网址导航| 免费网站在线观看黄| 青青草原播放器| 好吊色视频988gao在线观看| www婷婷av久久久影片| 野外做受又硬又粗又大视频√| 蜜臀精品一区二区| 国产黄色片免费在线观看| av在线播放亚洲| 亚洲熟妇无码另类久久久| 欧美精品一区免费| 久久精品香蕉视频| 激情五月俺来也| 日本a级片在线播放| 缅甸午夜性猛交xxxx| 国产激情在线观看视频| 一区二区三区 日韩| 青草全福视在线| 日韩精品一区二区免费| 日韩欧美一区二| 国产高清视频网站| 欧洲美女和动交zoz0z| 欧美一区二区激情| 国产一级不卡毛片| 9l视频自拍9l视频自拍| 亚洲一区二区三区av无码| 免费日韩视频在线观看| 性生活免费在线观看| 韩国黄色一级大片| 国产精品wwwww| 4444在线观看| 国产三级三级看三级| 欧美做受777cos| 国产欧美在线一区| 亚洲77777| 国产成人无码精品久久久性色| www.超碰97.com| 精品少妇一区二区三区在线| 岛国av免费在线| 国产二区视频在线播放| 久久人人爽人人片| 免费观看日韩毛片| 亚洲国产一二三精品无码| 黄色aaa级片| 日b视频免费观看| 97超碰成人在线| 任你操这里只有精品| 国产成人一二三区| 久久综合在线观看| 久久精品视频91| 日韩精品在线观看av| 欧美三级理论片| 97国产在线播放| 久久天天东北熟女毛茸茸| 成年人免费在线播放| 人人干视频在线| 糖心vlog在线免费观看| 黄色手机在线视频| 精品视频一区二区在线| 成年人视频网站免费| 亚洲在线观看网站| 一区二区三区 欧美| 蜜臀精品一区二区| 久久精品在线免费视频| 亚洲男人天堂av在线| www.xxx亚洲| 成人久久久久久久久| 国产天堂视频在线观看| 国产一区二区三区在线免费| av免费一区二区| 国产一区二区在线观看免费视频| 欧美 日韩 激情| 欧美日韩中文在线视频| 少妇性l交大片| 黄页网站在线观看视频| www.xxx麻豆| 超碰人人爱人人| 国产在线视频综合| 欧洲xxxxx| 第九区2中文字幕| 400部精品国偷自产在线观看| 免费成人深夜夜行网站视频| 在线观看免费成人av| 妞干网在线免费视频| 九九九九免费视频| 青青青国产在线视频| 三年中国国语在线播放免费| 在线视频日韩一区| 中文字幕中文在线| 香蕉视频xxxx| 国产欧美综合一区| 水蜜桃色314在线观看| 91日韩精品视频|