1.
完整性度量概述運行時的系統完整性由系統的訪問控制機制保證,如DAC(Discrete Access Control, 間接訪問控制)/MAC(Mandatory Access Control, 強制訪問控制,如SELinux, Smack)。
DAC/MAC無法檢測文件的離線修改;加密文件系統可以保護非法訪問,但開銷大,效率相對較低。
完整性度量,將文件內容和文件的屬性/擴展屬性,通過加密哈希生成對應的ima/evm串,以擴展屬性方式保存在文件系統節點中;系統運行時在文件被訪問前,內核IMA/EVM模塊通過校驗文件的ima/evm串,判斷文件是否被離線非法篡改過;如果有,返回非法結果給selinux,從而阻止訪問或運行該文件。
Linux的完整性子系統(引自Dmitry的PPT):
IMA對文件內容做加密哈希(HMAC),將結果存在文件的擴展屬性security.ima,並以此校驗文件內容是否被非法篡改過。
創建並自動更新一個所有被訪問文件的完整性度量表(/sys/kernel/security/ima/ascii_runtime_measurements),遠程或本地讀取該表可以判斷哪些文件被改過。
如果系統中有TPM硬件模塊,IMA會將度量表擴展到TPM中,以保證度量表本身無法被篡改。
支持本地評估(IMA Appraisal),即系統運行時在文件被訪問前,內核IMA模塊通過校驗文件的ima串,判斷文件是否被離線篡改過。
EVMEVM用來檢測文件的屬性(ino/uid/gid/mode)/擴展屬性(security.ima/selinux/smack64)是否被離線篡改過。
被保護的屬性,被EVM模塊以加密哈希(HMAC)的形式依次加密,最終保存成security.evm。
EVM串支持HMAC或數字簽名兩種方式生成。
2. 將IMA/EVM擴展到Android要在Android上支持完整性度量IMA/EVM,以實現對文件級的篡改檢測和訪問控制,主要包括以下幾部分:
內核中使能IMA/IMA-Appraise/EVM
編譯時,生成system.img前,隨機生成一對RSA密鑰對,將私鑰存在編譯目錄下以備後面簽名使用,將公鑰放到system根文件系統特定目錄下(每次開機時用以驗證系統文件的ima/evm簽名)。
集成開源的EVMCTL,一個用來生成IMA/EVM簽名的工具。
集成開源的attr,至少將其中的getfattr和setfattr交叉編譯進來。
修改system/extras/ext4_utils/make_ext4fs.c,使得在build_directory_structure時,用RSA私鑰+EVMCTL,為所有system分區下的文件生成ima/evm簽名,並將簽名寫入文件的擴展屬性security.ima/.evm。
加載system分區前,內核要先獲得EVM key(無論是從TEE生成並獲取,或從文件系統中讀取指定的)和RSA的公鑰,以便驗證IMA/EVM的HMAC或簽名。
TEE中由device ID派生evm key,好處是key會每個設備唯一。可以使用device ID + 固定字符串,通過加密哈希生成的串作為密鑰。
內核evm module中,加入從TEE讀取evm key的代碼,key讀出後可以存為全局變量,即運行時只存在於內存中。
聯合調試
3. 調試總結這裡只列出調試過程中,一些需要注意的點:
ima/evm使能後,通過getfattr工具,可以讀取文件的擴展屬性(getfattr -m . -d filename):
短的是HMAC生成的串,長的是簽名生成的串。
完整性度量表可以讀出(cat /sys/kernel/security/ima/ascii_runtime_measurements),在文件變化後,度量表會自動更新。格式類似於:
開始時,IMA/EVM所需密鑰可以放到文件系統中,明文讀取出來用做加密哈希HMAC的密鑰,先調通IMA/EVM基本功能;後續可以實現從TEE獲取EVM密鑰,而IMA/EVM簽名可以使用RSA非對稱密鑰,分別在編譯時私鑰簽名,啟動時內核使用公鑰校驗簽名文件。
內核的IMA/EVM模塊,可以自動識別IMA/EVM串是HMAC還是簽名,因為串的前半部分,包含有type串。
EVM模塊對ino/uid/gid/mode/security.ima/security.evm/security.selinux/security.capability這些字段做HMAC校驗的順序,一定要與EVMCTL生成簽名時做HMAC的順序一致,否則簽名校驗會出錯;還有很重要的一點,一定要注意32位/64位的區別,因為這會影響以上字段的HMAC結果,也很容易導致簽名驗證失敗。
簽名時用到EVMCTL,需要對這個命令的參數非常了解,比如如何指定密鑰,如何指定32/64位,等等;而且,也需要對這個工具做一些修改,比如支持使用傳入的ino、uid、gid、mode、security.selinux/.ima/.evm等。
ima_appraise有三種模式:off, enforce, fix。開發時先設為fix模式,如果度量出錯,能在kernel log裡看到error。開發完成後,設為enforce模式,如果系統能起來,並且kernel log中沒有error,表示使能成功。
4. 最終可以實現system只讀分區下所有文件受簽名保護,enforce模式下被離線篡改的文件無法被執行和訪問。注:離線篡改可以用setfattr來模擬測試。
data可讀寫分區下所有文件受HMAC保護,enforce模式下離線篡改的文件無法被訪問和執行;運行時變化的文件,在下次被訪問前,ima/evm串會自動更新。
完整性度量表可以讀出,文件變化時,內核會隨時更新度量表。
5. 參考資料什麼是Linux完整性度量:http://events.linuxfoundation.org/sites/events/files/slides/Integrity_Protection_LinuxCon_Europe_2013_0.pdf
如何在桌面Linux上使能IMA/EVM:
https://sourceforge.net/p/linux-ima/wiki/Home/#extending-trusted-and-secure-boot-to-the-os https://wiki.gentoo.org/wiki/Integrity_Measurement_Architecture
Tizen上的IMA/EVM:https://wiki.tizen.org/wiki/Security:IntegrityMeasurement
Meego上的IMA/EVM:http://www.webcitation.org/6AqsXTUx0
EVMCTL:https://sourceforge.net/p/linux-ima/ima-evm-utils/ci/master/tree/ ATTR:http://git.savannah.gnu.org/cgit/attr.git