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

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

时间: 2024-08-08 05:27:50

扩展Linux完整性度量IMA/EVM到Android的相关文章

完整性度量架构(IMA)介绍与分析

前言: 2004年,IBM在13th USENIXSecurity Symposium上发表文章<Design and Implementation of a TCG-based Integrity MeasurementArchitecture>,第一次提出了IMA架构.该架构通过在内核中进行patch,实现当应用程序运行.动态链接库加载.内核模块加载时,将用到的代码和关键数据(如配置文件和结构化数据)做一次度量,将度量结果扩展到PCR10,并创建与维护一个度量列表ML.当挑战者发起挑战时,

VMware 下扩展linux硬盘空间

linux下扩展硬盘有很多种方式,在扩展之前,尽量看看自己的空间存在的有哪些盘,然后再进行扩展.如果是扩展的话,磁盘的符号和已经有的符号一样,比如都是sda的设备,知识分区不同,可能是sda3 sda4 如果是添加的话,相对于一个新的硬盘,可能是sdb  sdc 很多人在学习Nutch.Hadoop或者熟悉Linux操作系统时都会选择在VMWare上安装Linux虚拟机,而又往往不想分配给Linux虚拟机足够大的硬盘空间,这就容易导致使用Linux一段时间后,发现虚拟机上的硬盘空间不够了,此时怎

linux.linuxidc.com - /2011年资料/Android入门教程/

本文转自 http://itindex.net/detail/15843-linux.linuxidc.com-%E8%B5%84%E6%96%99-android Shared by Yuan 用户名与密码都是www.linuxidc.com linux.linuxidc.com - /2011年资料/Android入门教程/ [转到父目录] 2011年7月16日 21:33 <目录> Android 3D 游戏开发教程 2011年8月18日 13:26 <目录> Android

在Linux下adb连接不上android手机的终极解决方案

转自: http://blog.csdn.net/liuqz2009/article/details/7942569 1.做android开发的过程,碰到了Linux下adb识别不了android设备的问题,刚开始在网上google下,发现都是针对ubuntu下的一些说明:如google提供的方法:http://developer.android.com/tools/device.html,但发现通过做这些还是有些android设备连接不上,于是通过阅读adb源码,得出了一些方法,和大家一起共勉

Linux C++工程师2小时了解Android记录

(一)Android? Andoid是一个在linux上的,多用于移动终端的操作系统,不是类似redhat的服务器OS,也不是类似Windows的标准桌面OS,只是一种手持设备的较为简单的图形OS,Android应用程序使用Java开发.Android从linux kernel开出的分支,比如我的华为手机android是4.3,使用的linux kernel是3.4. android代码已经被linux kernel社区剔除.android由于继承了linux kernel代码,根据linux

Linux下命令行安装配置android sdk

首先, 你得有个VPN 参考以下三篇完成Android SDK的安装 https://www.digitalocean.com/community/tutorials/how-to-build-android-apps-with-jenkins http://stackoverflow.com/questions/4681697/is-there-a-way-to-automate-the-android-sdk-installation http://developer.android.com

编译 Linux 3.5 内核烧写 Android 4.2.2 到 Tiny4412 开发板

. . . . . 昨天已经编译了 Android 4.2.2 的源码,详见<Ubuntu 14.04 编译 Android 4.2.2 for Tiny4412>一文. 今天我们继续剩下的工作,让我们的 android 系统可以跑在 Tiny4412 开发板上. Android 和 Linux 是两码事,Android 系统是基于 Linux 内核的.我们编译的 Android 源码是 Android 系统本身的源码,而内核是指通过原生 Linux 源码一直过来的内核源码,所以它们需要我们分

php添加pcntl扩展(Linux)

pcntl扩展可以支持php的多线程操作(仅限linux)原本需要重新编译PHP的后面configrue提示加上--enable-pcntl 由于我的php是采用yum安装的,所以不能采用上面的方式下面介绍一个php动态添加扩展的方式 phpize 1.首先看下 phpize命令 所在的目录  (ps:我的目录/usr/bin/phpize)如果没有找到的话 执行安装yum install php53_devel   (ps:请注意自己的版本)安装完毕后.会生成phpize命令 2.去php.n

Linux(十三)centos 7 VMware下扩展linux硬盘空间

1.启动VMWare程序,点击硬盘,弹出虚拟机设置窗口,选择硬盘,点击右下方的扩展,输入扩展后期望的容量,点击扩展即可: 2.启动linux,以root身份登录,执行 fdisk -l 查看磁盘信息: 删除逻辑分区:fdisk /dev/sda -> d -> 4 创建逻辑分区:fdisk /dev/sda -> n -> 回车(起始扇区选默认) -> 回车(结束扇区选默认) 在逻辑分区上新建分区:fdisk /dev/sda -> n -> 回车(起始扇区选默认