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、典型加密算法
MD5、sha.1,主要特點密文固定長度、稍有改變密文完全不同、無法數據還原。所以用於驗證數據的完整性。android中的使用例子OTA包傳輸使用的MD5,OTA差分升級使用的SHA256,DM-verity使用的HASH算法。
MD5算法原理https://blog.csdn.net/sinat_27933301/article/details/79538169
對稱算法: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加密工具
全盤加密
全盤加密工具使用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 //以文件加密方式掛載文件
- 文件名加密的空間概念,
- 密鑰管理機制,
- 疊加加密。
查看keys
cat /proc/keys | grep 【sig】
個人總結全盤加密和文件系統加密區別:
1、全盤加密只有一個密碼,該密碼正確解密後纔可使用。文件級加密密碼或參數不正確時也能掛載,如果之前加密的keyring存在,則可以讀取文件,不存在則不能讀取;寫入時以新參數加密方式寫入;
2、全盤加密磁盤上是已加密數據,看不到文件系統的,流程上是就需要先創建解密映射,然後掛載出文件系統(如果該磁盤不存在文件系統,只是bin文件就不需要再掛載了)。文件級加密已經存在文件系統,直接映射解密。
3、全盤加密與文件級加密都是透明加密,用戶感覺不到加密;但文件級加密管理keyring,已經存在的解密keyring可以解密其它掛載地方;
4、文件級加密當使用Enable filename encryption (y/n) [n]: y可以達到使用不同空間的效果
5、文件級加密可以疊加加密。Ecryptfs工具可以疊加6次;
簽名加密工具 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、啓動設有密碼的已加密設備:啓動設置了密碼的已加密設備。
流程關鍵點:
- 未解密時最小框架需要 /data 才能運行,所以tmpfs臨時掛載;
- 未解密時不能裝載/data,需要最小框架顯示界面;UI主要作用是顯示加密進度、輸入密碼、提示恢復出廠,因此其必須包括keymaster,恢復出廠,輸入法,UI,加密庫等東西。
- 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 - vold.encrypt_progress加密進度。加密出錯情況可通過此屬性查看狀態;
- 加密/解密工具,使用的密鑰,密鑰的存儲。
主要函數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加密流程與理解
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密鑰。
能夠直接掛載使用/data,DE密鑰啓動前就加入,可以直接啓動
利用空間概念支持多位用戶,並且能夠互動
3.4、Android 加密的使用
FDE:ro.crypto.state = encrypted 和ro.crypto.type = block
FBE:ro.crypto.state = encrypted 和ro.crypto.type = file
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
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都是臨時密鑰,取出來也不能用。