码迷,mamicode.com
首页 > 移动开发 > 详细

扩展Linux完整性度量IMA/EVM到Android

时间:2016-05-12 22:36:17      阅读:1461      评论:0      收藏:0      [点我收藏+]

标签:

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串,判断文件是否被离线篡改过。

EVM

  • EVM用来检测文件的属性(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

扩展Linux完整性度量IMA/EVM到Android

标签:

原文地址:http://blog.csdn.net/laviolette/article/details/51351672

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!