selinux dac_override/dac_read_search问题处理思路

dac_override/dac_read_search问题处理思路
1. 修改被访问文件权限
2. 调整访问者权限
3. 注意文件目录权限控制,调整被访问文件路径

 dac_override和dac_read_search是我们偶尔会遇到的一类selinux warning,不同于其他大部分denied可以直接加对应权限修正,这类warning则需要通过改code或修改文件权限来处理,谷歌官方文档在 SELinux政策 中有如下一段说明:
dac_override 拒绝事件意味着违规进程正在尝试使用错误的 unix user/group/world 权限访问某个文件。正确的解决方案几乎从不授予 dac_override 权限,而是更改相应文件或进程的 unix 权限。有些域(例如init、vold 和 installd)确实需要能够替换 unix 文件权限才能访问其他进程的文件。要查看更深入的讲解,请访问 Dan Walsh 的博客。
— — 来自 google官方文档 <授予 dac_override 权限 >

因此,修正如上问题的解法就是让进程以正确的身份通过正确的权限访问文件。为此,我将通过如下三个案例来分享下,一般如何修这类warning。

1. 修改被访问文件权限
第一个例子的selinux warning如下。通过log,我们可以看到3685进程AAAA_Callback,在kernel space访问文件被selinux拦。

avc: denied { dac_override } for pid=3685 comm="AAAA_Callback" capability=1 scontext=u:r:kernel:s0 tcontext=u:r:kernel:s0 tclass=capability permissive=1

首先确认被访问文件的权限情况,通过ls命令可以看到,system group和system user是具有读写权限,others没有任何权限。

console:/ $ ls -l /dev/DevNode
crw-rw---- 1 system system 186,   0 2000-01-01 08:00 /dev/DevNode

通过ps命令,我们可以看到3685进程AAAA_Callback是kthreaddd产生的kernel线程,是root user,结合2)中权限管控,root属于others,因而出现dac_override问题,无法访问

console:/ # ps 3685
USER           PID  PPID     VSZ    RSS WCHAN            ADDR S NAME
root          3685     2       0      0 msleep_interruptible 0 S [AAAA_Callback]

评估/dev/DevNode会被多个进程访问,而这些进程都是system group,都可以访问到,因此可以通过uevent.rc中改节点的owner为root user,这样就可以让AAAA_Callback访问到;同时考虑到客户未来可能在用户空间中访问这个设备节点,一并将others的权限改为rw,方便客户开发。
最终修改就是将ueventd.rc中,/dev/localdimming 0660 system system改为 /dev/localdimming 0666 root system

2 调整访问者权限
 这个问题是在开发一个新功能时遇到的,对应服务运行时报无法访问块设备,从selinux rules看,需要添加如下规则。

allow kernel self:capability { dac_override dac_read_search };

通过ls命令可以看到被访问文件权限如下,考虑到安全性问题,不可调整文件权限,那也就是需要调整访问者的身份和权限了。

console:/ # ls -lZ /dev/block/mmcblk0p2
brw-rw---- 1 root drmrpc u:object_r:aaaa_bbbb_block_device:s0 179,   2 2020-09-23 02:58 /dev/block/mmcblk0p2

文件对应的访问者是init.rc启动的一个服务,从1可以看出文件的drmrpc group有读写权限,因此我们可以通过给对应服务加权限组,即可使之正常访问文件,即如下group的配置中,添加drmpc权限组即可。


# service for cc
service ccdaemon /vendor/bin/ccdaemon
    setenv LD_LIBRARY_PATH /vendor/lib
    class core
    console
    oneshot
    group system audio drmrpc
    seclabel u:r:ccdaemon:s0

3. 注意文件目录权限控制,调整被访问文件路径 
上面两个例子都隐含一个文件夹权限问题,由于访问者恰好有文件夹访问权限或新加修改刚好能cover到该权限,所以调整完即可正常访问。但实际上,当出现dac_read_search这个warning的时候,我们是要注意下访问者是否有文件夹的访问权限的。
我在设计一个功能的时候,有个环节就是将相关中间文件存储在/cache/recovery下,并赋予666权限,保障所有用户都能访问到,但实际运行时,在kernel space访问文件还是报了如下错误。


[   17.536854] <ERR>task_UpgradeAaaaFw[10956]: Open /cache/recovery/AaaaUpgrade.bin Failed
[   17.537386] type=1400 audit(1600844272.283:25): avc: denied { dac_read_search } for comm="Upgrade_Aaaa_FW" capability=2 scontext=u:r:kernel:s0 tcontext=u:r:kernel:s0 tclass=capability permissive=0
[   17.537407] type=1400 audit(1600844272.283:26): avc: denied { dac_override } for comm="Upgrade_Aaaa_FW" capability=1 scontext=u:r:kernel:s0 tcontext=u:r:kernel:s0 tclass=capability permissive=0

通过一级一级检查文件夹权限,我们可以看到,文件夹都是system:cache,因此即便文件是root:root且为666权限,kernel进程仍无法访问到文件。

console:/cache/recovery # ls -lZ
-rw-rw-rw- 1 root   root   u:object_r:cache_recovery_file:s0 1071594 2020-09-23 02:54 AaaaUpgrade.bin
console:/ # ls -lZ
drwxrwx---   6 system cache  u:object_r:cache_file:s0                 4096 1999-12-31 19:00 cache
console:/cache # ls -lZ
drwxrwx--- 2 system cache  u:object_r:cache_recovery_file:s0        4096 2020-09-23 02:54 recovery
console:/cache/recovery # ls -lZ
-rw-rw-rw- 1 root   root   u:object_r:cache_recovery_file:s0 1071594 2020-09-23 02:54 AaaaUpgrade.bin

众所周知,/cache/recovery是系统目录,其目录权限是在/init.rc中设定,如下。这个目录不仅涉及到多个功能,且init.rc属于framework的code,故不建议修改init.rc来调整其权限。那对应的修改方式也就是在自行实现的功能代码上下手,后面我换了一个符合权限需求的路径,正常调通了功能。

console:/cache/recovery # ls -lZ
-rw-rw-rw- 1 root   root   u:object_r:cache_recovery_file:s0 1071594 2020-09-23 02:54 AaaaUpgrade.bin
console:/ # ls -lZ
drwxrwx---   6 system cache  u:object_r:cache_file:s0                 4096 1999-12-31 19:00 cache
console:/cache # ls -lZ
drwxrwx--- 2 system cache  u:object_r:cache_recovery_file:s0        4096 2020-09-23 02:54 recovery
console:/cache/recovery # ls -lZ
-rw-rw-rw- 1 root   root   u:object_r:cache_recovery_file:s0 1071594 2020-09-23 02:54 AaaaUpgrade.bin


参考网址:

https://source.android.com/security/selinux/device-policy?hl=zh-cn
https://danwalsh.livejournal.com/69478.html

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值