博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何排查并解决SEAndroid 的审计不通过
阅读量:5745 次
发布时间:2019-06-18

本文共 4433 字,大约阅读时间需要 14 分钟。

转载:

 

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 即可
你可能感兴趣的文章
TiDB 源码阅读系列文章(七)基于规则的优化
查看>>
面试中会遇到的正则题
查看>>
Spring之旅第八站:Spring MVC Spittr舞台的搭建、基本的控制器、请求的输入、表单验证、测试(重点)...
查看>>
数据结构与算法——常用排序算法及其Java实现
查看>>
你所不知的Webpack-多种配置方法
查看>>
React.js 集成 Kotlin Spring Boot 开发 Web 应用实例详解
查看>>
webpack+typescript+threejs+vscode开发
查看>>
python读excel写入mysql小工具
查看>>
如何学习区块链
查看>>
搜索问题的办法
查看>>
微信分销系统商城营销5大重点
查看>>
求职准备 - 收藏集 - 掘金
查看>>
htm5新特性(转)
查看>>
Linux-Centos启动流程
查看>>
php 设计模式
查看>>
后端技术精选 - 收藏集 - 掘金
查看>>
Laravel 服务容器
查看>>
mac安装kubernetes并运行echoserver
查看>>
多页架构的前后端分离方案(webpack+express)
查看>>
算法(第4版) Chapter 1
查看>>