Smack在Android内核的编译

首先 Smack适合嵌入式设备--请阅读 sm ack in Embedded Computing --Casey Schaufler
  这一篇文章来揭秘如何将smack编译到Android内核中,
  首先,smack是Linux上的一个安全补丁,如果下载Linux-2.6.38内核后,会发现在shell中输入make menuconfig会有简单访问控制smack这一项,选中它,则smack被配置到Linux内核中,然后执行编译即可,编译完毕后, 在shell中输入 cd /smack,会切换到smack的虚拟文件系统(假文件系统)中,里面有load,cipso,ambient等几个虚拟的文件(其实这些文件以链表形式存在于内核空间),在shell中输入 cd /etc/smack,会发现有accesses文件,vim accesses,我们可以输入一行 aa(主体标签) bb(客体标签) w(访问模式),这样这一行被smack代码解析成规则,以结构体的形式加入到存放于内核的规则链表/smack/load ,这比selinux的复杂的TE简单太多了,稍后我会详细揭秘smack技术
其次,如何将smack编译到android内核中去呢?android内核中有个 /security的子目录,存放着与安全有关的模块,其中就 包含了LSM,Selinux,Smack等模块。 Google并没有把LSM移除Android内核。那么这就为我们编译smack提供了有利的条件。
那么怎样编译smack?我们可以看下/security/smack中的文件,我们发现,casy已经把smack的配置文件Kconfig和makefile文件都写好了,Kconfig文件很重要,它是关于模块配置的,在编译时需要用到,其中就有一项 bool "simplified ...." depend on  NETLABEL & SECURITY_NETWORK, 要想编译出smack,首先我们必须让android内核的配置文件能够支持NETLABEL和SECURITY_NETWORK,那么具体怎么做呢?
我们首先选择panda内核,解压后会有panda/kernel-ics-chipsee-panda,我们在shell中进行操作,

cd panda/kernel-ics-chipsee-panda

cd arch/arm/configs/
找到该目录下的缺省配置文件 vim panda_chinese_def
观察下发现NETLABEL和SECURITY_NETWORK都没有配置,我们进行配置, CONFIG_NETLABEL=y,CONFIG_SECURITY_NETWORK=y
然后配置 CONFIG_SECURITY_SMACK=y CONFIG_DEFAULT_SECURITY_SMACK=y CONFIG_DEFAULT_SECURITY="smack"
这样我们已经把smack需要的配置都写好了
回到内核主目录kernel-ics-chipsee-panda/,执行

     cd kernel-ics-chipsee-panda/
    export PATH=/usr/local/arm-2010q1/bin:$PATH
    export CROSS_COMPILE=arm-none-linux-gnueabi-
    export ARCH=arm
    make distclean
    make panda_chipsee_defconfig

  这样我们在shell中输入make menuconfig,会有惊喜的发现


这样smack就被配置到android内核中了


接下来要编译内核,make uImage
输入上面命令后,编译一会就有错误提示,没关系,我们可以按照提示的错误,重新修改配置文件(就像上述做法),就行了
编译成功会如下图:



新编译好的内核是uImage
那么怎么运行内核呢?我之前也纳闷了很久,当时下载android 4.0.3源码时,就已经有内核,但此内核是编译好的内核,即巨大的二进制镜像文件,存放于android源码的/prebuilt目录下,应该是bzImage(具体我记不得了),我们想让android运行在我们编译好的内核panda上,输入命令:
emulator -kernel /host/panda3/kernel-ics-chipsee-panda/arch/arm/boot/uImage
但是会有错误提示:



此时我怀疑是内存空间问题,因为android4.0.3的模拟器不能在我们新编译的内核上运行。不管怎样,我们已经能够将smack编译到android内核中了
还有一点要说明下,我们知道LSM是对一些内核对象进行改造,加入了一些安全字段,代表主客体的安全属性,为此,要想利用LSM的特性,就要求文件系统支持文件的扩展属性,扩展属性可以表示文件的安全属性,我们可以利用getfattr和setfattr两个命令获取和设置文件的扩展属性,
请参见:http://blog.csdn.net/ganggexiongqi/article/details/7661024
我们知道android是利用了yaffs2文件系统,它适合NAND嵌入式设备,但它不支持文件的扩展属性,那么问题就来了,我们知道smack核心机制是利用Linux 的LSM,这就要求Android的文件系统必须支持扩展属性, SEAndroid团队修改了yaffs2的制作yaff2镜像文件--mkyaffs2image.c,在yaffs2的文件对象头加入了安全上下文--char *secontext,它代表了主客体的安全属性。其实问题很简单,新版本的Android已经采用了ext4文件系统,它支持文件的扩展属性,
ext4:http://www.baidu.com/link?url=nyUYGJqjJ4zBBpC8yDF8xDhiqDSn1JZjFWsHhEoSNd85PkV8Xil7rskjOH3ijGKNNq
我们再次在回到shell,cd kernel-ics-chipsee-panda,输入make menuconfig,找到文件相关配置选项,我们惊奇得发现:





也就是说panda内核已经配置了ext4,并且支持扩展属性,太好了,接下来的问题是怎么让此内核在panda开发板上跑起来?

本文由 土豆粉培训网转载发布,转载请注明,谢谢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值