android SELinux 问题解决-如何用工具生成相关权限配置文件?

本文介绍SELinux的基本概念及其三种操作模式,并详细解析如何为特定服务配置SELinux权限,包括创建domain、修改文件上下文及使用audit2allow工具自动生成te语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




转自http://blog.youkuaiyun.com/mcgrady_tracy/article/details/53217982

        SELinux是什么?即Security-Enhanced Linux,是由美国国家安全局(NSA)发起,基于Linux开发的一个安全增强系统,旨在提高系统的安全性。


而SEAndroid基于SELinux,在Android5.0上被正式启用。

SELinux有3种操作模式,分别是Disabled、Permissive、Enforcing,在android中可以通过输入adb命令getenforce来获取当前系统的SELinux状态。Disabled表示SELinux是被禁止的,Permissive只发出警告但不拒绝访问,而Enforcing在发出警告的同时会拒绝访问。自Android5.0开始,默认模式为Enforcing,很多时候会带来一些权限问题。

那么怎么来确认是不是SELinux带来的权限问题呢?当Kernel log出现"avc: denied"这些字段时,那么这些问题都是这一类问题。

如何进一步确认呢,可以输入adb命令setenforce 0来改变当前SELinux的工作模式为Permissive,然后再重启相关服务,看是否还有这种问题,如果没有,说明的确是SELinux带来的问题。

如何编写te文件呢?

假设我有一个服务key,需要读取/dev/input/event0这个input设备,代码如下:
[cpp]  view plain  copy
  1. int main(void)  
  2. {  
  3.     int fd;  
  4.     struct input_event event;  
  5.   
  6.     fd = open("/dev/input/event0", O_RDONLY);  
  7.     if (fd < 0) {  
  8.         exit(1);  
  9.     }  
  10.   
  11.     while (1) {  
  12.         if (read(fd, &event, sizeof(struct input_event)) > 0) {  
  13.             if (event.type == EV_KEY) {  
  14.                 printf("key %d %s\n", event.code,  
  15.                         event.value ? "down" : "up");  
  16.             }  
  17.         }  
  18.     }  
  19. }  

最终这段代码将被编译生成一个bin文件,在/system/bin/目录下。

那么首先是需要在init.rc里面启动这个服务:

[cpp]  view plain  copy
  1. service key /system/bin/key  
  2.     class core  

服务启动之后,我们还需要为改服务创建一个domain。
[cpp]  view plain  copy
  1. # key.te  
  2. type key, domain;  
  3. type key_exec, exec_type, file_type;  
  4.   
  5. init_daemon_domain(key)  

修改file_contexts,将key加入到新创建的domain中。
[cpp]  view plain  copy
  1. /system/bin/key u:object_r:key_exec:s0  

我们可以通过ls -Z命令查看一下/system/bin/key文件的安全上下文:
[cpp]  view plain  copy
  1. -rwxr-xr-x root     shell             u:object_r:key_exec:s0 key  

现在key这个service还不能访问event0这个设备,甚至都影响到了service的启动,提示的错误信息如下:
[cpp]  view plain  copy
  1. avc: denied { search } for pid=269 comm="key" name="input" dev="tmpfs" ino=176 scontext=u:r:key:s0 tcontext=u:object_r:input_device:s0 tclass=dir permissive=0  

这类问题就是SELinux权限问题,那么怎么添加权限呢?

本来我们可以通过ps -Z命令来查看key这个service的安全上下文,但是现在由于权限问题service这个服务都不能启动,只能分析一下错误log了。

根据log来看,安全上下文为"u:r:key:s0"这个进程对安全上下文为"u:object_r:input_device:s0"的文件没有访问权限,我们通过ls -Z命令看一下/dev/input/event0这个文件:
[cpp]  view plain  copy
  1. crw-rw---- root     input             u:object_r:input_device:s0 event0  

它的安全上下文的确为"u:object_r:input_device:s0",再结合代码来看,也的确是这样的,再通过log来看,是没有search权限,那么我们把这个权限先加进去(加入到key.te文件中):
[cpp]  view plain  copy
  1. allow key input_device:dir { search };  

Ok,报的没有search权限问题没有,但是又报了新的权限问题:
[cpp]  view plain  copy
  1. avc:  denied  { read } for  pid=270 comm="key" name="event0" dev="tmpfs" ino=2352 scontext=u:r:key:s0 tcontext=u:object_r:input_device:s0 tclass=chr_file permissive=0  

也的确是这样,代码里面对event0设备还有open、read操作,报权限问题是很正常的,加入open、read权限:
[cpp]  view plain  copy
  1. allow key input_device:chr_file { open read };  

没有再报权限问题了,key这个service也能够启动了,通过ps -Z命令可以看到这个service的安全上下文的确为"u:r:key:s0":
[cpp]  view plain  copy
  1. u:r:key:s0                     root      272   1     /system/bin/key  

自己手动编写te语句有点麻烦,没关系,可以根据log然后通过工具自动生成te语句,这个工具就是audit2allow。

在ubuntu上,输入下面的命令来安装这个工具:
[cpp]  view plain  copy
  1. sudo apt-get install policycoreutils  

那么这个工具怎么使用呢,例子:
[cpp]  view plain  copy
  1. adb shell dmesg | audit2allow  

或者我还可以把前面的抓的错误信息单独拿出来,然后通过audit2allow工具来生成:
[cpp]  view plain  copy
  1. echo "avc:  denied  { read } for  pid=270 comm="key" name="event0" dev="tmpfs" ino=2352 scontext=u:r:key:s0 tcontext=u:object_r:input_device:s0 tclass=chr_file permissive=0" | audit2allow  

生成的te语句如下:
[cpp]  view plain  copy
  1. #============= key ==============  
  2. allow key input_device:chr_file read;  

语句是能够生成的,只是不全,手动补全就可以了。


参考:
https://source.android.com/security/selinux/validate.html
https://source.android.com/security/selinux/device-policy.html
### AndroidSELinux 权限配置教程 #### 1. SELinux 基础概念 SELinux 是一种强制访问控制 (MAC) 安全机制,它补充了传统的基于用户 ID 和组 ID 的自主访问控制 (DAC)[^2]。在 Android 系统中,SELinux 提供了一种更细粒度的安全模型来保护设备免受潜在威胁。 当遇到 `permission denied` 错误时,通常是因为某些操作违反了 SELinux 的策略规则。这可能涉及文件、目录或其他资源的访问尝试被拒绝的情况[^5]。 --- #### 2. 配置 SELinux 权限时的关键步骤 ##### 2.1 查看日志并定位问题解决 SELinux 导致的权限问题,第一步是查看系统日志以获取详细的错误信息。可以通过以下命令捕获相关日志: ```bash dmesg | grep avc ``` 这些日志记录了哪些操作因 SELinux 被阻止以及具体的上下文信息。例如,如果某个二进制文件无法执行,则可能是由于其安全标签不匹配或缺少必要的权限[^4]。 ##### 2.2 使用 audit2allow 工具分析和生成新规则 为了快速修复缺失的权限,可以利用工具 **audit2allow** 自动生成所需的 policy 文件片段。具体流程如下所示: 1. 收集 AVC 拒绝消息; 2. 运行下面这条指令来自动生成对应的 rule: ```bash cat /path/to/denied_log.txt | audit2allow -M mymodule ``` 3. 将生成好的 module 加载至当前运行环境之中测试效果; 需要注意的是,这种方法虽然便捷高效,但也有可能引入新的安全隐患因此需谨慎对待新增加的内容是否合理合法合规[^1]。 ##### 2.3 手动调整 SEPolicy 规则 对于复杂场景或者不适合自动化的修改需求来说,还需要手动编辑 sepolicy 文件来进行精确控制。一般情况下需要遵循以下几个原则: - 添加适当类型的转换规则(type_transition); - 授权特定主体(subject) 对象(object) 实施动作(action); 示例代码展示如何允许某服务读取指定路径下的数据文件夹内容: ```sepol allow myservicedomain file:dir {read getattr}; allow myservicedomain file:file {open read write append lock ioctl}; ``` 完成编写之后记得重新编译整个 selinux framework 并刷入目标设备验证最终成果[^3]. --- #### 3. 特殊情况处理 – 关闭 Enforcing Mode 作为最后手段,在调试阶段也可以考虑暂时禁用 enforce mode 来绕过所有限制条件从而确认是否有其他因素干扰正常工作流。不过强烈建议仅用于短期排查目的而非长期解决方案因为这样会使系统暴露于极大风险之下失去应有的安全保障功能. 临时关闭方法如下: ```bash setenforce 0 ``` 永久更改则需要修改 `/sepolicy` 或者通过 OTA 更新推送更新后的版本给终端用户应用生效. --- ### 总结 通过对上述几个方面的深入探讨可以看出, 正确合理的设置 android 下面得 selinux 参数是一项既技术性强又责任重大的任务. 不但要求开发者具备扎实的操作系统理论基础还要熟悉实际产品架构特点才能做到游刃有余妥善处置各类突发状况.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值