linux的全盤加密與文件系統加密在android中的應用

1、本文檔簡述

1.1、定義:

Full-disk encryption (FDE) 全盤加密android4.0引入

File-based encryption (FBE) 文件級加密 android7.0引入

1.2、學習目標:

1、熟悉android加密流程,掛載。

2、格式化加密userdata的部分數據。

3、假如user版本設備剛進入system就死機/重啓,無法dump關鍵數據和信息進行分析。是否能夠dump userdata分區並解密掛載分析。如果不能,爲什麼?(待深入研究)

 

2、預備知識

2.1、加密技術

https://www.cnblogs.com/redcoatjk/p/3822585.html按作用不同,文件加密和數字簽名技術主要分爲數據傳輸、數據存儲、數據完整性的鑑別以及密鑰管理技術4種。

1、數據傳輸加密技術是對傳輸中的數據流加密,常用的方法有線路加密和端對端加密兩種。

2、數據存儲加密技術目的是防止在存儲環節上的數據失密,可分爲密文存儲和存取控制兩種。

3、數據完整性鑑別技術是對介入信息的傳送、存取、處理的人的身份和相關數據內容進行驗證,達到保密的要求。

4、密鑰管理技術是數據的加密技術通常是運用密鑰對數據進行加密,這就涉及到了密鑰的管理問題。

2.2、典型加密算法

2.2.1、基於“消息摘要”的主要算法

MD5、sha.1,主要特點密文固定長度、稍有改變密文完全不同、無法數據還原。所以用於驗證數據的完整性。android中的使用例子OTA包傳輸使用的MD5,OTA差分升級使用的SHA256,DM-verity使用的HASH算法。

MD5算法原理https://blog.csdn.net/sinat_27933301/article/details/79538169

2.2.2、“對稱/非對稱密鑰”加密算法

對稱算法:DES算法,RC算法,AES算法,主要特點加密可逆,加密解密使用相同密鑰。全盤加密,文件級加密使用的一般是AES算法。

非對稱算法:RSA算法,主要特點是加密解密使用不同密鑰。

公鑰加密,私鑰解密(加密傳輸);私鑰簽名,公鑰驗籤(確認發送方,也可驗證完整性,可以用於OTA包簽名,secure boot,Verify boot,應用簽名)。

https://www.jianshu.com/p/3331467d139f

簽名、加密、證書的基本原理和理解

https://www.cnblogs.com/Caersi/p/6720789.html

AES算法原理https://blog.csdn.net/gulang03/article/details/81175854

RSA算法原理https://blog.csdn.net/u014044812/article/details/80866759

2.3、Linux加密工具

2.3.1對稱算法

全盤加密

全盤加密工具使用https://blog.csdn.net/zhongbeida_xue/article/details/78550712#t18

示例

fallocate -l 64G /root/luks.vol   //創建大文件

cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 luksFormat /root/luks.vol //加密

cryptsetup luksOpen /root/luks.vol xxx //創建解密映射連接

ls /dev/mapper/

mkfs.ext4 /dev/mapper/xxx //給該塊/文件創建文件系統

mkdir /mnt/xxx

mount /dev/mapper/xxx /mnt/xxx //掛載文件系統

df -hT

修改文件

umount /mnt/xxx //卸載

cryptsetup close xxx //關閉映射連接

 

文件系統加密

原理https://www.kernel.org/doc/html/latest/filesystems/fscrypt.html

文件級加密工具使用https://blog.csdn.net/zm_jack/article/details/78894980

示例3-2、dump dm-0後,使用該文件塊直接掛載。 -

sudo apt-get install ecryptfs-utils //安裝控件

sudo mount -t ecryptfs real_path ecryptfs_mounted_path //以文件加密方式掛載文件

修改文件

sudo umount -t ecryptfs ecryptfs_test //卸載

以不同方式再掛載並修改文件

sudo mount -t ecryptfs real_path ecryptfs_mounted_path //以文件加密方式掛載文件

  1. 文件名加密的空間概念,
  2. 密鑰管理機制,
  3. 疊加加密。

查看keys

cat /proc/keys | grep 【sig】

 

個人總結全盤加密和文件系統加密區別:

1、全盤加密只有一個密碼,該密碼正確解密後纔可使用。文件級加密密碼或參數不正確時也能掛載,如果之前加密的keyring存在,則可以讀取文件,不存在則不能讀取;寫入時以新參數加密方式寫入;

2、全盤加密磁盤上是已加密數據,看不到文件系統的,流程上是就需要先創建解密映射,然後掛載出文件系統(如果該磁盤不存在文件系統,只是bin文件就不需要再掛載了)。文件級加密已經存在文件系統,直接映射解密。

3、全盤加密與文件級加密都是透明加密,用戶感覺不到加密;但文件級加密管理keyring,已經存在的解密keyring可以解密其它掛載地方;

4、文件級加密當使用Enable filename encryption (y/n) [n]: y可以達到使用不同空間的效果

5、文件級加密可以疊加加密。Ecryptfs工具可以疊加6次;

2.3.2 非對稱算法

簽名加密工具 openssl https://www.jianshu.com/p/2ac9ae269920

生成私鑰

openssl genrsa -out privkey.pem 2048

生成公鑰

openssl rsa -in privkey.pem -pubout -out pubkey.pem

 

echo [email protected] > info.txt

 

公鑰加密/私鑰解密

使用公鑰對明文進行加密

直接使用公鑰加密

openssl rsautl -encrypt -in info.txt -inkey pubkey.pem -pubin -out info.txt.enc

使用證書中的公鑰加密

openssl rsautl -encrypt -in info.txt -inkey pubkey.pem -certin -out info.txt.enc

使用私鑰解密

openssl rsautl -decrypt -in info.txt.enc -inkey privkey.pem -out info_decrypt.txt

 

私鑰簽名/公鑰驗籤

使用私鑰對明文進行簽名

openssl rsautl -sign -in info.txt -inkey privkey.pem -out info.txt.sign

使用公鑰驗簽得到明文

openssl rsautl -verify -in info.txt.sign -inkey pubkey.pem -pubin -out info_verify.txt

 

3、Android 系統的加密應用

3.1、原理與流程

高通原理流程文檔

80-PN330-9 Rev. A  、 80-NU861-1 J

3.2、FDE加密流程理解

Google官方文檔

https://source.android.com/security/encryption/full-disk

若要加密、解密或清除 /data,/data 不得處於裝載狀態。但若要顯示任何界面,框架都必須啓動,而框架需要 /data 才能運行。爲了解決這一衝突,/data 上會裝載一個臨時文件系統。通過該文件系統,Android 可以提示輸入密碼、顯示進度或根據需要建議清除數據。

四種情況的流程:

A、使用 forceencrypt 加密新設備:首次啓動時強制加密(從 Android L 開始)。

B、加密現有設備:由用戶啓動加密(Android K 及更低版本)。

C、啓動無密碼的已加密設備:啓動未設置密碼的已加密設備(適用於運行 Android 5.0 及更高版本的設備)。

D、啓動設有密碼的已加密設備:啓動設置了密碼的已加密設備。

 

圖表 全盤加密流程圖

流程關鍵點:

  1. 未解密時最小框架需要 /data 才能運行,所以tmpfs臨時掛載
  2. 未解密時不能裝載/data,需要最小框架顯示界面;UI主要作用是顯示加密進度、輸入密碼、提示恢復出廠,因此其必須包括keymaster,恢復出廠,輸入法,UI,加密庫等東西。
  3. vold通過設置vold.decrypt狀態,來觸發init各類操作;vold 和 init 之間通過設置屬性進行通信,vold.decrypt的狀態如下:
    trigger_encryption
    trigger_restart_min_framework
    trigger_default_encryption
    trigger_shutdown_framework
    trigger_post_fs_data
    trigger_restart_framework
    trigger_reset_main
  4. vold.encrypt_progress加密進度。加密出錯情況可通過此屬性查看狀態;
  5. 加密/解密工具,使用的密鑰,密鑰的存儲。

主要函數system/vold/cryptfs.cpp/cryptfs_enable_internal(加密類型,密碼,是否有UI)

decrypt_master_key //解密主鑰

create_crypto_blk_dev //創建映射

create_encrypted_random_key   //創建主鑰

encrypt_master_key //加密主鑰

put_crypt_ftr_and_key //放置密鑰

init_empty_persist_data //初始化數據

save_persistent_data //保存

3.3、FBE加密流程與理解

FBE加密

https://source.android.com/security/encryption/file-based.html#fscrypt-encryption

 

Andorid 使用的是fscrypt文件系統加密工具。該工具最詳細使用在github中。

https://github.com/google/fscrypt#getting-encryption-not-enabled-on-an-ext4-filesystem 但是還是資料太少,個人使用依然不方便。
Fscrypt使用需要注意:

1、sudo apt installl fscrypt libpam-fscrypt安裝的沒有lock命令,最好下載編譯;

2、三種加密方式(隨用戶登陸,新密碼,密鑰文件),同時也有/proc/keys管理證書;在多用戶情況,/proc/keys內有相關管理證書即可透明訪問;

3、在目錄底下會創建.fscrypt文件夾保存policies和protectors信息;

4、不用掛載映射,但只能加密空目錄,開機方便了開機。(假如已有文件,需要重新去寫入。或存在參數我還是不知道);

android文件系統加密流程關鍵在fscrypt工具的理解,這裏還是建議使用ecryptfs來理解文件系統加密,雖然ecryptfs 目前沒有再維護,但資料比較多,使用方便,在理解文件系統加密方面更好用。

而android的調用流程起點是init.rc裏的init_user0,調用vold的load_all_de_keys加載DE密鑰,fscrypt_unlock_user_key加載CE密鑰。

FBE優點

能夠直接掛載使用/data,DE密鑰啓動前就加入,可以直接啓動
利用空間概念支持多位用戶,並且能夠互動

3.4、Android 加密的使用

3.4.1、查看設備加密方式:

        FDE:ro.crypto.state = encrypted 和ro.crypto.type = block

        FBE:ro.crypto.state = encrypted 和ro.crypto.type = file

3.4.2、源碼配置:

MTK參考文檔
[FAQ22664] [Encryption] How to configure FDE/FBE/FDE_TO_FBE
MTK相關變量

MTK_ENCRYPTION_DEFAULT_OFF

MTK_ENCRYPTION_FDE_TO_FBE

MTK_ENCRYPTION_TYPE_FILE

 

3.4.3、掛載表屬性

fileencryption=contents_encryption_mode[:filenames_encryption_mode[:flags]]

//文件加密格式 內容加密方式,文件名加密方式 密鑰標記

/dev/block/by-name/userdata /data f2fs nodev,noatime,nosuid,errors=panic,inlinecrypt wait,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized

forceencrypt=footer //FDE加密

fileencryption=ice //FBE加密 指定使用FSCRYPT_MODE_PRIVATE,文件內容加密模式,供應商實現。

fileencryption=adiantum

inlinecrypt_optimized //用戶標記僅爲每個 CE 或 DE 密鑰派生一個文件內容加密密鑰

inlinecrypt  //裝載選項

 

4、調試

問題1、已解

 

問題2、格式化加密userdata的部分數據

FDE

在解密後,裝載/data前進行清除userdata的部分數據。最好在最小框架有個UI顯示確認和進度。

FBE

該問題不存在難度,只需要在開機時刪除目錄,清除密鑰。

 

問題3、是否能夠dump userdata分區並解密掛載分析。如果不能,爲什麼?假如user版本設備剛進入system就死機/重啓,無法dump關鍵數據和信息進行分析。(待深入研究)

FDE

3-1、嘗試直接使用cryptsetup 和密碼解密。-------失敗  

cryptsetup luksOpen userdata userdata失敗, 可能加密類型與方式,加密工具,以及密鑰問題。是否必須要keymaster?

3-2、dump dm-0後,使用該文件塊直接掛載。 ----------成功   

但是設備必須能夠使用adb,必須root(當確定是userdata問題,可刷入userdebug版本來dump userdata分區),並且設備不會重啓來打斷dump(userdebug版本設置在adb和/data掛載後,定個停止啓動)。

 

FBE

如果DE與CE策略搞混,高概率出問題。

再就是硬件加密的話碰到該問題無解。Proc/keys都是臨時密鑰,取出來也不能用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章