android dm-verity 功能
思維導圖:
dm-verity說明:原始碼基於 SC20 平臺 Android5.1
Android dm-verify overview
目錄
Android dm-verify overview.. 1
一、原理… 1
與Verified Boot關係… 1
dm-verity. 1
作用分割槽… 2
二、模組結構… 2
1.簽名… 2
生成OEM自己的金鑰對… 4
驗籤… 5
使用者空間,android 部分… 5
核心空間… 5
三、如何啟用… 5
四、測試… 6
測試樣例1. 無法 remount, 無法 push 檔案… 6
測試樣例2. 6
五、存在風險… 6
物理塊出現壞塊… 6
六、其他… 6
七、參考文件… 6
一、原理
與Verified Boot關係
Verified Boot 是 Android 4.4 開始引入的一個新特性,配合可選的 dm-verify 功能,可以檢測系統是否被篡改,以此儲存系統的完整性。
dm-verity
dm-verity 基於kernel 的 Device mapper 框架,Device mapper 是 Linux 2.6 核心中提供的一種從邏輯裝置到物理裝置的對映框架機制,在該機制下,使用者可以很方便的根據自己的需要制定實現儲存資源的管理策略。關於 Device mapper,可以參考此文獻
https://www.ibm.com/developerworks/cn/linux/l-devmapper/
dm-verity 用一個 hash 樹來描述整個 system 映象。這種機制允許 system 分割槽在讀寫的時候進行校驗,而不是一次性將整個 system 映象進行校驗。當校驗 hash 值不一致的時候,返回 IO 錯誤
框架示意圖:
dm-verity-hash-tree作用分割槽
system
vendor
OEM
其他只讀分割槽
二、模組結構
1.簽名
如何生成用於dm-verity 校驗的映象,可以參考一下主流程:
主流程,Android 官方文件如下:
– Generate an ext4 system image.
– Generate a hash tree for that image.
– Build a dm-verity table for that hash tree.
– Sign that dm-verity table to produce a table signature.
– Bundle the table signature and dm-verity table into verity metadata.
– Concatenate the system image, the verity metadata, and the hash tree.
即
- 生成 ext4 格式的 system 映象
- 生成 system 映象的 hash 樹
- 根據 hash 樹生成 dm-verity table
- 對 dm-verity 進行簽名,得到簽名檔案
- 將簽名、dm-verity table 打包到 metadata 映象
- 將 verity metadata,hash 樹 新增到 system 映象末尾
- 生成 ext4 格式的 system 映象
build/tools/releasetools/build_image.py BuildImage 函式 中
通過 prop_dict 屬性,判斷是否啟用 verity 功能,啟用的話,調整 system 分割槽大小,以便後面新增相關檔案到 system.img 末尾,然後 RunCommand(build_command) 生成初始的 system.img。
prop_dict 檔案路徑:
out/target/product/msm8909/obj/PACKAGING/systemimage_intermediates/system_image_info.txt
prop_dict 檔案內容:
fs_type=ext4
system_size=1288491008
userdata_size=4831838208
cache_fs_type=ext4
cache_size=268435456
extfs_sparse_flag=-s
selinux_fc=out/target/product/msm8909/root/file_contexts
verity=true
verity_key=build/target/product/security/verity
verity_signer_cmd=out/host/linux-x86/bin/verity_signer
system_verity_block_device=/dev/block/bootdevice/by-name/system
skip_fsck=true
- 生成 system 映象的 hash 樹
BuildVerityTree 函式生成 hash tree (verity_image)
步驟3,4,5在BuildVerityMetadata中實現,BuildVerityMetadata 呼叫build_verity_metadata.py 來實現
BuildVerityMetadata 生成 metadata (metadata_image),
跳轉到 system/extras/verity/build_verity_metadata.py
- 根據 hash 樹生成 dm-verity table
build_verity_table 生成 dm-table
dm-table 其實就是一個字串
- 對 dm-verity 進行簽名,得到簽名檔案
sign_verity_table 將 dm-table 簽名
signer_key = build/target/product/security/verity.pk8
- 將簽名、dm-verity table 打包到 metadata 映象
build_metadata_block 將 dm-table 和 簽名信息打包,寫入 datameta.img
- 將 verity metadata,hash 樹 新增到 system 映象末尾
build/tools/releasetools/build_image.py BuildVerifiedImage 生成最終的可以用於 dm-verity 校驗的映象
Append2Simg 新增 verity_image 和 datameta.img 到 system.img 末尾
其他
FIXED_SALT 可以修改為自己的 salt
如何生成自己的oem key
dm-verity 相關的金鑰
build/target/product/security/ build/target/product/verity.mk verity.pk8 – 私鑰,用於簽名 boot.img 和 system.img
verity.x509.pem – 包含公鑰的證書
verity_key – 公鑰,dm verity 中用於驗籤 system 分割槽
生成OEM自己的金鑰對
- HSM(Hardware Security Module)
- OpenSSL tool
- 生成新得金鑰對 >openssl version OpenSSL 1.0.2d 9 Jul 2015 >development/tools/make_key mykey ‘/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/[email protected]’
- 為DM-Verity 功能生成 verity key
- 使用下面的命令來生成 verity key 的工具 generate_verity_key: source build/envsetup.sh choosecombo make generate_verity_key (mmm system/extras/verity/)
- 將 *.x509.pem 轉換成 verity key generate_verity_key 的程式碼位於:system/extra/verity/generate_verity_key.c generate_verity_key 的用法:generate_verity_key | -convert 例項: out/host/linux-x86/bin/generate_verity_key -convert mykey.x509.pem verity_key
- 拷貝並重命名
- 拷貝pk8,mykey.x509.pem,verity_key.pub 至 build/target/product/security/ 目錄,將其重新命名: verity.pk8, verity.x509.pem,verity_key ,並替換預設的開發 key。
- 生成 keystore
- 執行下面的兩個命令,生成img openssl rsa -in mykey.pk8 -inform DER -pubout -outform DER -out mypub.der java -Xmx512M -jar out/host/linux-x86/framework/KeystoreSigner.jar mykey.pk8 mykey.x509.pem keystore.img mypub.der
- 通過下面的指令碼將img生成oem_keystore.h檔案,shell 輸入: function generate_oem_keystore_h() { echo \#ifndef __OEM_KEYSTORE_H echo \#define __OEM_KEYSTORE_H xxd -i $1 | sed -e ‘s/unsigned char .* = {/const unsigned char OEM_KEYSTORE[] = {/g’ -e ‘s/unsigned int .* =.*;//g’ echo \#endif }
- generate_oem_keystore_h keystore.img > oem_keystore.h
- 將該h檔案拷貝到:bootable/bootloader/lk/platform/msm_shared/include
- 驗籤
使用者空間,android 部分
相關檔案:
system/core/fs_mgr/fs_mgr_verity.c
使用者空間對 dm-verity 進行初始化,驗籤 hash_table 的簽名,傳入 hash_table 等引數
核心空間
相關檔案:
KERNEL_SRC/driver/md/dm-verity.c 相關程式碼
核心空間根據使用者空間傳入的引數,進行初始化
當有 IO 操作時,對相應 data block 進行驗籤。
data block 讀取時,不僅當前 data block 需要 hash 校驗,上一層的 hash block 也需要進行校驗,直到root hash。
每一個 data block 如果已經驗簽過,再次讀取時就不用進行層層的校驗,只校驗當前 data block 的 hash 是否正確即可。
三、如何啟用
- kernel 配置檔案使能 CONFIG_DM_VERITY
kernel/arch/arm/configs/msm8909-1gb_defconfig
- Android 相關 mk 檔案配置
device/qcom/msm8909/msm8909.mk PRODUCT_SUPPORTS_VERITY := true PRODUCT_SYSTEM_VERITY_PARTITION := /dev/block/bootdevice/by-name/system
- 更新 fstab,system 分割槽新增 verify 標誌
/dev/block/bootdevice/by-name/system /system ext4 ro,barrier=1 wait,verify
- 編譯 userdebug 或者 user 版本 boot.img 以及 system.img,燒錄
四、測試
測試樣例1. 無法 remount, 無法 push 檔案
Mount | grep system /dev/block/dm-0 /system ext4 ro, seclable, relatime, data=ordered 0 0
adb pull /fstab.qcom c:\temp\fstab, 檢查 verify 標誌: /dev/block/bootdevice/by-name/system /system ext4 ro,barrier=1 wait, verify
adb remount Use “adb disable-verity” to disable verity. If you do not, remount may succeed, however, you will still not be able to write to these volumes. remount of system failed: Read-only file system remount failed
測試樣例2.
(1).先燒錄啟用 verity 功能的 boot.img 和 system.img
(2). 然後燒錄未啟用 verity 功能的 boot.img,重啟後 push 一個 apk 到 /system/app/ 目錄
(3). 重新燒錄啟用了 verity 功能的 boot.img,重啟後,機器無法開機,kernel log 可以看到 data block xxx is corrupted
五、存在風險
物理塊出現壞塊
- 開機檢驗出錯,無法開機
- 開機檢驗沒問題,讀取檔案出錯,返回 Error IO
六、其他
軟體整合和 OTA 升級,必須使用 block 方式生成 OTA 升級包,需要注意適配。
七、參考文件
Verified Boot
https://source.android.com/security/verifiedboot/index.html
Verifying Boot
https://source.android.com/security/verifiedboot/verified-boot.html
Implementing dm-verity
https://source.android.com/security/verifiedboot/dm-verity.html
Dmverity
https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity
dm-table format
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/device-mapper/verity.txt
Device mapper
https://www.ibm.com/developerworks/cn/linux/l-devmapper/
相關推薦
android dm-verity 功能【轉】
轉自:https://blog.csdn.net/ee230/article/details/73348344 Android dm-verity 實現原理深入研究 思維導圖: dm-verity 說明:原始碼基於 SC20 平臺 Android5.1Android dm-
android dm-verity 功能
思維導圖: dm-verity 說明:原始碼基於 SC20 平臺 Android5.1 Android dm-verify overview 目錄 Android dm-verify overview.. 1 一、原理… 1 與Verified Boot關係… 1 dm-verity. 1 作用分割槽…
Android 中的dm-verity原理分析
Android 中的Verified Boot之dm-verity 之前做了一個Verified Boot模組相關的工作,但是在網上只有找到google的文件和一個nexus的patch。雖然有patch,但在不同版本的程式碼上實現起來卻可能有一些bug,所以特此記錄一下debug這個東西的過程
Android安全之DM-verity中的Device Mapper機制分析
我們想法: 能不能將多個硬碟,對映成一個邏輯的硬碟,那樣我們程式就不用關心複雜的地址問題了,也不用關係是哪個device了? DM-raid技術RAID全稱為獨立磁碟冗餘陣列(Redundant Array of Independent Disks) 將某個地址段的資料進行加密,只有授權方式才可訪問,比
Android開發分享功能實現步驟
集成 sha har sse 分享 功能 秘鑰 步驟 過去 參考mob官網(http://www.mob.com/) 分享實現步驟:1.mob官網賬號註冊登錄2.進入後臺,進入ShareSDK,添加應用,生成秘鑰3.參照mob官網集成文檔,下載SDK,進入ShareSDK
Android 帶清除功能的輸入框控件EditTextWithDel
content rect() date textutils cbo class http ng- bottom 記錄下一個非常有用的小控件EditTextWithDel。就是在Android系統的輸入框右邊增加一個小圖標。點擊小圖標能夠清除輸入框裏面的內
Android Activity 常用功能設定 全屏 橫豎屏等
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Android工程師開發iOS之與Android中對應功能的控制元件
iOS中和安卓控制元件應用還是差不的,從控制元件的命名上我們就能看出來,下面來介紹一下吧: ios中UILabel 對應Android 中TextView ios中UIImage對應Android 中ImageView 圖片控制元件 ios中UIButton對應An
Android Studio搜尋功能(查詢功能)及快捷鍵圖文詳解
1、在當前視窗查詢文字【Ctrl+F】 F3 向下查詢關鍵字出現位置 Shift+F3 向上一個關鍵字出現位置 2、在當前工程內查詢文字【Ctrl+Shift+F】 先會彈出一個對話方塊,直接點選【find】,開始在整個工程內查詢該字串 &nbs
Google 將於年底關閉 Android 附近通知功能
三年前, 我們向 Android 平臺引入了附近通知 (Nearby Notifications) 功能,它能根據周邊設施和服務資訊,為使用者推薦應用和內容。我們推出該功能的初衷是為了向用戶主動提供有用的資訊,比如說開發者可以利用這項技術告知使用者附近可用的免費 Wi-Fi, 博物館講解和公交車
【轉】Android-Accessibility(輔助功能/無障礙,自動安裝APP)
參考: http://www.infoq.com/cn/articles/android-accessibility-installing https://developer.android.com/guide/topics/ui/accessibility/services https://devel
【Android】【功能設計】儲存帳號密碼,自動登入,離線登入實現方案
勾選【記住密碼】【自動登入】複選框時: 什麼也不做,所有操作放在點選【登入】按鈕時執行 點選【登入】按鈕時: 為了簡化程式碼和實現邏輯,不管密碼對錯,登入資訊統一儲存到【上次登入帳號】【上次登入密碼】【是否儲存密碼】【是否自動登入】配置 登入成功
Android 9.0 功能和 API概覽(中文版)
Android 9 功能和 API 官方搬運: Android 9(API 級別 28)為使用者和開發者引入了眾多新特性和新功能。 本文重點介紹面向開發者的新功能。 利用 Wi-Fi RTT 進行室內定位 Android 9 添加了對 IEEE 802.1
Android回聲消除功能實現(原始碼、編譯)
好久沒寫部落格了,今天抽空把這段時間對Android平臺回升消除模組的研究進行一下總結。不要心急哦,下面我會把這個專案的原始碼都開放出來的。 一、回聲消除介紹 傳統的回聲消除都是採用硬體方式,在硬體電路上整合DSP處理晶片,如我們常用的固定電話、手機等都有專門的迴音消除處
Android9.0 P 電源管理(android電量優化功能改進)
Android 9(API 28)電源管理 在最近幾個android版本中已存在的電量優化功能基礎上,Android 9 引入了一些新功能來持續改進裝置電源管理,以確保將系統資源提供給最需要它們的應用
Android 支援庫功能指南
原文地址 https://developer.android.com/topic/libraries/support-library/features.html 支援庫為構建應用程式提供了廣泛的類,從基本應用程式元件,使用者介面小部件,媒體處理到電視應用程式元件。許多類是向後相
android 支援庫功能
Android 支援庫軟體包含可以新增至應用的多個庫。每個庫均支援特定範圍的 Android 平臺版本和功能。 本指南介紹了各支援庫提供的重要功能和版本支援,從而幫助您決定在應用中新增哪些支援庫。一般而言,我們建議新增 v4 支援庫和 v7 appcompat 庫,因為它
Android彈幕功能實現,模仿鬥魚直播的彈幕效果
記得之前有位朋友在我的公眾號裡問過我,像直播的那種彈幕功能該如何實現?如今直播行業確實是非常火爆啊,大大小小的公司都要涉足一下直播的領域,用鬥魚的話來講,現在就是千播之戰。而彈幕則無疑是直播功能當中最為重要的一個功能之一,那麼今天,我就帶著大家一起來實現一個簡單的Androi
Android Studio MQTT功能
使用的Android Studio版本為3.0.1,沒辦法,升級到3.2.1後弄不出來了,又下了個3.0的綠色版,反正自己用又不考慮使用者感受啥的,能實現我想要的功能能在我手機上跑就OK。 首先是APP下build.grdle檔案: apply plugin:
android 投票百分比功能
近來公司有個新功能就是投票功能,在網上找了一圈,沒看到怎麼完全適合的,自己和童鞋搞了個,在此記錄下。 UI是這樣的; 一開始打算用ProgressBar實現,做出來的效果不是完全符合需求有點小Bug,然後自定義了一個。 首先是drawable樣式left_blue_ra