转载:
Android 5.0 之后,SEAndroid所有的部分均为Enforcing模式;如果当某个操作不被SEAndroid允许时,例如对文件进行write,该如何排查出信息,同时,在sepolicy中,添加上相应的allow语句,将权限开放出去;
1:SEAndroid不允许时,log记录在哪里?
SEAndroid的审计不通过时,log记录在dmesg 中,dmesg是kernel的log,如果想要获取该log,可以使用如下命令:
adb shell su -c dmesg ----- 获取kernel log
2: 查看SEAndroid 不允许的log
SEAndroid 审计不通过的log,带有"avc:" 所以,用如下命令即可搜集到审计不同的log:
adb shell su -c dmesg | grep 'avc:' ---- 得到审计不通过的log信息
如果有审计不通过的,会得出如下类似的信息:
5> type=1400 audit: avc: denied { read write } for pid=177 comm="rmt_storage" name="mem" dev="tmpfs" ino=6004 scontext=u:r:rmt:s0 tcontext=u:object_r:kmem_device:s0 tclass=chr_file不被允许的操作是:read 和write
访问者是:u:r:rmt:s0
被访问者是:u:object_r:kmem_device:s0
操作对象是:chr_file
相当于在sepolicy 策略语言中,缺乏这样的语句allow rmt kmem_device:chr_file {read write}
TIP:
pid=177 表示访问者所在的进程,comm中给的是一个提示,表示当这个denial发生时,什么正在运行;
3:如何消除这样的不通过
很简单,可以直接在sepolicy中加上这样的策略语句;
例如上处avc不通过,可以在/external/sepolicy/ 目录下,新建一个test.te
在test.te 中写入,allow rmt kmem_device:chr_file {read write},
重新编译策略语言,刷机即可;
但是当avc很多时,人工去看容易出错且慢,我们可以使用工具来完成这项工作;
selinux/policycoreutils/audit2allow环境搭建:
测试电脑的配置是:unbutu 12.04
step 1:在 ubuntu中安装policycoreutils
sudo apt-get install policycoreutils
step 2 : 使用audit2allow 工具完成策略语言的添加:
adb shell su -c dmesg | audit2allow
例如上诉avc语句就会输出:
#============= rmt ==============allow rmt kmem_device:chr_file { read write };
TIP:
1: 要知道,audit2allow是policycoreutils中的工具之一
2:如果在ubuntu 14.04 或者更新的版本中,可以直接将策略语句插入到编译好的sepolicy中
命令如下:
device>/root/sepolicy
而对于如何解决该类权限问题,一般的做法是,缺少什么就补什么,先介绍一下简化方法:
简化方法:
1、 提取所有的avc LOG. 如 adb shell "cat /proc/kmsg | grepavc" > avc_log.txt
2、 使用 audit2allow tool 直接生成policy. audit2allow -i avc_log.txt 即可自动输出生成的policy
3、将对应的policy 添加到selinux policy 规则中。 SELinux 的 audit2allow 工具程序 The command audit2allow can receive input via three methods. Default is from standard input (STDIN). Using the -i option reads input from /var/log/messages, and the -d option reads input from dmesg output.
也就是说 audit2allow 有三种接收输入的方法: 1.预设是由标准输入 STDIN 接收 2.使用 -i 选项,如 -i /var/log/messages or -i /var/log/audit/audit.log (若有启动 auditd 时) 3.使用 -d 选项,可以接收 dmesg 的讯息 例如: [root@candyz:/var/log] audit2allow -i /var/log/messages allow getty_t var_log_t:file write; [root@candyz:/var/log] audit2allow -d allow getty_t var_log_t:file write; 当看到一堆如下的 avc denied 之类的讯息时,要怎么解决? audit(1146842928.277:2): avc: denied { getattr } for pid=3357 comm="httpd" name="test.php" dev=hda6 ino=137349 scontext=root:system_r:httpd_t tcontext=root:object_r:var_t tclass=file * 在 RHEL4 或 FC3 上的解决方式: $ cd /etc/selinux/targeted/src/policy/ 使用 -d 从 dmesg 读取 avc messages $ audit2allow -d -o domain/misc/local.te or 使用 -l -i /var/log/messages 读取 /var/log/messages 的 avc messages # 若有启动 auditd 则要改读 /var/log/audit/audit.log $ audit2allow -l -i /var/log/messages -o domain/misc/local.te or 直接从 STDIN 读取 avc messages, 如 /tmp/avcs 里面放的就是储存好的 avc messages $ audit2allow -o domain/misc/local.te 最后再执行 make load 即可 $ make load 然后就会看到如 avc granted 之类的讯息了 * 在 FC5 上的解决方式: [root@candyz:~] cd /etc/selinux/targeted/modules/ [root@candyz:/etc/selinux/targeted/modules] audit2allow -M local -d Generating type enforcment file: local.te Compiling policy checkmodule -M -m -o local.mod local.te semodule_package -o local.pp -m local.mod ******************** IMPORTANT *********************** In order to load this newly created policy package into the kernel, you are required to execute semodule -i local.pp 同样的,除了用 audit2allow -M local -d 从 dmesg 读取讯息外 也可以用 audit2allow -M local -l -i /var/log/messages 或是 audit2allow -M local -i /var/log/audit/audit.log 或是 audit2allow -M local 最后记得要执行 semodule -i local.pp 来 load new policy to kernel,这点很重要 [root@candyz:/etc/selinux/targeted/modules] semodule -i local.pp 另外也可以用 audit2allow 来产生 local.te 档案,然后可以去编辑或修改 local.te [root@candyz:~] cd /etc/selinux/targeted/modules/ [root@candyz:/etc/selinux/targeted/modules] audit2allow -m local -l -i /var/log/messages > local.te # 然后再执行 checkmodule 指令来产生 local.mod [root@candyz:/etc/selinux/targeted/modules] checkmodule -M -m -o local.mod local.te # 然后再执行 semodule_package 指令来产生 local.pp [root@candyz:/etc/selinux/targeted/modules] semodule_package -o local.pp -m local.mod 同样的,最后记得要执行 semodule -i local.pp 来 load new policy to kernel,这点很重要 [root@candyz:/etc/selinux/targeted/modules] semodule -i local.pp 或是产生 local.te 档后,直接执行: [root@candyz:/etc/selinux/targeted/modules] make -f /usr/share/selinux/devel/Makefile 这样等于是执行 checkmodule + semodule_package 最后记得再 semodule -i local.pp 即可