关于selinux的详细资料,请查阅http://blog.csdn.net/innost/article/details/19299937
在Android开发的过程中,遇到关于selinux相关的东西,当时还一下子看不懂,现在好像有点眉目了。
比如,内核打印这个提示
type=1400 audit(32.939:25): avc: denied { open } for pid=2592 comm="chmod" path="/dev/block/mmcblk0p25" dev="tmpfs" ino=6494 scontext=u:r:init_shell:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=1
我们可以遵循这个方法,从头开始寻找关键对象,然后调整一下顺序,生成一条语句,最后将该语句填写到.te文件(external/sepolicy/*.te)中即可。
denied { open } u:r:init_shell:s0 u:object_r:block_device:s0 tclass=blk_file
A B C D
B C D A
allow init_shell block_device:blk_file open;
这条语句表示允许init_shell域中的block_device进程打开block_device类型的块设备文件。
有时候会遇到编译该规则失败,这也许就是neverallow语句做怪了。
neverallow用来检查安全策略文件中是否有违反该项规则的allow语句
如external/sepolicy/netd.te文件中,语句
neverallow netd dev_type:blk_file { read write };
表示永远不允许netd域中的进程读写dev_type类型的块设备文件,这时只需屏蔽该语句即可。
当然,在调试阶段,可在终端上运行如下命令获取SELinux的状态和临时关闭SELinux
setenforce 0 ##设置SELinux 成为permissive模式(SELinux开启,但对违反selinux规则的行为只记录,不会阻止)
setenforce 1 ##设置SELinux 成为enforcing模式 (SELinux开启)
getenforce ##获取SELinux状态(permissive,enforcing,disabled)
当然,对于安全系数要求不高的产品,可以在cmdline中加入androidboot.selinux=0来关闭selinux
或者到Android源码的根目录下,直接修改system/core/init/init.c文件。
static void selinux_initialize(void)
{
if (selinux_is_disabled()) {
return;
}
INFO("loading selinux policy\n");
if (selinux_android_load_policy() < 0) {
ERROR("SELinux: Failed to load policy; rebooting into recovery mode\n");
android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
while (1) { pause(); } // never reached
}
selinux_init_all_handles();
bool is_enforcing = selinux_is_enforcing();
INFO("SELinux: security_setenforce(%d)\n", is_enforcing);
security_setenforce(is_enforcing);
}
修改is_enforcing的值为0。
当然,最好的修改方法可参考http://blog.csdn.net/u013983194/article/details/50462694
修改后,然后编译mmm system/sepolicy -j30,会将devices下的selinux文件包含进去,生成的文件在system/etc/selinux/或vendor/etc/selinux/下,然后用grep进行字符串进行检索,确保修改成功,最后把相应的文件push到机器上验证。