关于selinux的详细资料,请查阅http://blog.youkuaiyun.com/innost/article/details/19299937
通过如下命令:
adb shell
logcat | grep 'avc:'
查看内核log打印的权限错误提示:
avc: denied { search } for name="/" dev="tmpfs" ino=9626 scontext=u:r:dumpfile:s0 tcontext=u:object_r:tmpfs:s0 tclass=dir permissive=0
我们可以遵循这个方法,从头开始寻找关键对象,然后调整一下顺序,生成一条语句,最后将该语句填写到.te文件(
device\mediatek\common\sepolicy\basic/*.te)中即可
denied { search } u:r:dumpfile:s0 u:object_r:tmpfs:s0 tclass=dir
A B C D
B C D A
allow dumpfile tmpfs: dir {search}
这条语句表示允许dumpfile域中的tmpfs进程搜索文件夹
当然,在调试阶段,可在终端上运行如下命令获取SELinux的状态和临时关闭SELinux
setenforce 0 #设置SELinux 成为Permissive模式(SELinux开启,但对违反SELinux规则的行为只记录,不会阻止)
setenforce 1 #设置SELinux 成为Enforcing模式 (SELinux开启)
getenforce #获取SELinux状态(Permissive,Enforcing,Disabled)
测试的时候也可以在cmdline中加入androidboot.selinux=disabled来关闭SELinux
或者到Android源码的根目录下,直接修改system/core/init/init.c文件
static void selinux_initialize(bool in_kernel_domain) {
Timer t;
selinux_callback cb;
cb.func_log = selinux_klog_callback;
selinux_set_callback(SELINUX_CB_LOG, cb);
cb.func_audit = audit_callback;
selinux_set_callback(SELINUX_CB_AUDIT, cb);
if (in_kernel_domain) {
INFO("Loading SELinux policy...\n");
if (selinux_android_load_policy() < 0) {
ERROR("failed to load policy: %s\n", strerror(errno));
security_failure();
}
bool kernel_enforcing = (security_getenforce() == 1);
bool is_enforcing = selinux_is_enforcing();
if (kernel_enforcing != is_enforcing) {
if (security_setenforce(is_enforcing)) {
ERROR("security_setenforce(%s) failed: %s\n",
is_enforcing ? "true" : "false", strerror(errno));
security_failure();
}
}
if (write_file("/sys/fs/selinux/checkreqprot", "0") == -1) {
security_failure();
}
NOTICE("(Initializing SELinux %s took %.2fs.)\n",
is_enforcing ? "enforcing" : "non-enforcing", t.duration());
} else {
selinux_init_all_handles();
}
}
修改security_getenforce()的值(0或者1)。