Android SELinux avc denied解决
参考:Android SELinux avc dennied权限问题解决方法
https://blog.csdn.net/tung214/article/details/72734086
解决原则:缺什么权限补什么,直到没有avc denied为止。
解决方法:在对应的.te中增加allow语句。
格式一般如下:
avc: denied { 操作权限 } for pid=7201 comm=“进程名” scontext=u:r:源类型:s0 tcontext=u:r:目标类型:s0 tclass=访问类型 permissive=0
案例:
audit: type=1400 audit(1113.763:288): avc: denied { write } for pid=328 comm="fastbootd" name="mmcblk0p29" dev="tmpfs" ino=7915 scontext=u:r:fastbootd:s0 tcontext=u:object_r:mmcblk_device:s0 tclass=blk_file permissive=1
scontext和tcontext都是安全上下文,分别称为主体和客体,主体一般都是进程,客体则是主体访问的资源。
缺少什么权限: { write }权限,
谁缺少权限: scontext=u:r:fastbootd:s0
对哪个资源缺少权限: tcontext=u:object_r:mmcblk_device:s0
什么类型的资源: tclass=blk_file
完整的意思: fastbootd进程对mmcblk_device类型的blk_file缺少write权限。
解决方法:在fastbootd.te文件(若没有则添加)加入内容:
allow fastbootd mmcblk_device:blk_file { read write getattr open ioctl };
即允许fastbootd对mmcblk_device类型的blk_file进行read/write/ioctl等操作。
————————————————
版权声明:本文为CSDN博主「wuzoujing」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wuzoujing/article/details/89562505
这篇文字本人原创于2015年,并作为原厂发布文档release,当时并未上传博客,估计已经被很多网友发表了。
1. 概述
SELinux是Google从android 5.0开始,强制引入的一套非常严格的权限管理机制,主要用于增强系统的安全性。
然而,在开发中,我们经常会遇到由于SELinux造成的各种权限不足,即使拥有“万能的root权限”,也不能获取全部的权限。本文旨在结合具体案例,讲解如何根据log来快速解决90%的SELinux权限问题。
2. 调试确认SELinux问题
为了澄清是否因为SELinux导致的问题,可先执行:
setenforce 0 (临时禁用掉SELinux)
getenforce (得到结果为Permissive)
如果问题消失了,基本可以确认是SELinux造成的权限问题,需要通过正规的方式来解决权限问题。
遇到权限问题,在logcat或者kernel的log中一定会打印avc denied提示缺少什么权限,可以通过命令过滤出所有的avc denied,再根据这些log各个击破:
cat /proc/kmsg | grep avc
或
dmesg | grep avc
例如:
audit(0.0:67): avc: denied { write } for path="/dev/block/vold/93:96" dev="tmpfs" ino=1263 scontext=u:r:kernel:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=0
可以看到有avc denied,且最后有permissive=0,表示不允许。
3. 具体案例分析
解决原则是:缺什么权限补什么,一步一步补到没有avc denied为止。
解决权限问题需要修改的权限文件如下位置,以.te结尾
A:Android/devicesoftwinner/astar-common/sepolicy/*.te
B:Android/external/sepolicy/*.te
其中,A是对B的overlay(覆盖),能在A修改的尽量在A修改,尽量避免修改B,修改B可能会导致CTS fail问题,修改A不会影响CTS测试。
(如果不需要深入了解,请直接跳到万能公式这一章阅读更简洁)
下面给出四个案例:
案例1
audit(0.0:67): avc: denied { write } for path="/dev/block/vold/93:96" dev="tmpfs" ino=/1263 scontext=u:r:kernel:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=0
分析过程:
缺少什么权限: { write }权限,
谁缺少权限: scontext=u:r:kernel:s0
对哪个文件缺少权限:tcontext=u:object_r:block_device
什么类型的文件: tclass=blk_file
完整的意思: kernel进程对block_device类型的blk_file缺少write权限。
解决方法:在上文A位置,找到kernel.te这个文件,加入以下内容:
allow kernel block_device:blk_file write;
make installclean后重新编译,刷boot.img才会生效。
案例2
audit(0.0:53): avc: denied { execute } for path="/data/data/com.mofing/qt-reserved-files/plugins/platforms/libgnustl_shared.so" dev="nandl" ino=115502 scontext=u:r:platform_app:s0 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=0
分析过程:
缺少什么权限: { execute}权限,
谁缺少权限: scontext = u:r:platform_app:s0
对哪个文件缺少权限:tcontext = u:object_r:app_data_file
什么类型的文件: tclass= file
完整的意思: platform_app进程对app_data_file类型的file缺少execute权限。
解决方法:在上文A位置,找到platform_app.te这个文件,加入以下内容:
allow platform_app app_data_file:file execute;
make installclean后重新编译,刷boot.img才会生效。
案例3
audit(1444651438.800:8): avc: denied { search } for pid=158 comm="setmacaddr" name="/" dev="nandi" ino=1 scontext=u:r:engsetmacaddr:s0 tcontext=u:object_r:vfat:s0 tclass=dir permissive=0
解决方法 :engsetmacaddr.te
allow engsetmacaddr vfat:dir { search write add_name create }; 或者
allow engsetmacaddr vfat:dir create_dir_perms;
(create_dir_perms包含search write add_name create可参考external/sepolicy/global_macros的定义声明)
案例4
audit(1441759284.810:5): avc: denied { read } for pid=1494 comm="sdcard" name="0" dev="nandk" ino=245281 scontext=u:r:sdcardd:s0 tcontext=u:object_r:system_data_file:s0 tclass=dir permissive=0
解决方法 :sdcardd.te
allow sdcardd system_data_file:dir read; 或者
allow sdcardd system_data_file:dir rw_dir_perms;
(rw_dir_perms包含read write,可参考external/sepolicy/global_macros的定义声明)
4. 万能公式
通过这四个案例,我们可以总结出一般规律,
以第案例4为例:
audit(1441759284.810:5): avc: denied { read } for pid=1494 comm="sdcard" name="0" dev="nandk" ino=245281 scontext=u:r:sdcardd:s0 tcontext=u:object_r:system_data_file:s0 tclass=dir permissive=0
某个scontext对某个tclass类型的tcontext缺乏某个权限,我们需要允许这个权限:
我们的log重新排列一下,
scontext = u:r:sdcardd
tcontex t= u:object_r:system_data_file:s0
tclass = dir
avc: denied { read }
得到万能套用公式如下:
在scontext所指的.te文件(例如sdcardd.te)中加入类似如下allowe内容:
5. TIPS
1. 以上以.te为后缀的文件都在以下位置:
A:Android/devicesoftwinner/astar-common/sepolicy/*.te
B:Android/external/sepolicy/*.te
其中,A是对B的overlay(覆盖),能在A修改的尽量在A修改,修改B可能会导致CTS fail问题,修改A不会影响CTS测试。修改之后,为了节约验证时间,只重刷boot.img即可看效果;
2. 有时候avc denied的log不是一次性暴露所有权限问题,要等解决一个权限问题之后,才会暴露另外一个权限问题。比如提示缺少某个目录的read权限,加入read之后,才显示缺少write权限,要一次次一次试,一次一次加,时间成本极大。
针对dir缺少的任何权限,建议赋予create_dir_perms,基本涵盖对dir的所有权限,比如:
{ open search write read rename create rmdir getattr }等等。
针对file缺少的任何权限,建议赋予rwx_file_perms,基本涵盖对file的所有权限,比如:
包含{ open read write open execute getattr create ioctl }等等。
更多内容请参考external/sepolicy/global_macros来了解更多权限声明。
3. 要加入的权限很多时,可以用中括号,比如:
allow engsetmacaddr vfat:dir { search write add_name create};
4. 修改A位置的.te文件遇到编译错误怎么办?
(首先请排除拼写错误)说明此项权限是SELinux明确禁止的,也是Google CTS禁止的,如果产品不需要过CTS,可以修改。一般来说,编译出错的log会提示相关哪个文件哪一行出错,文件位置一定会在B里的.te文件。比如B规定了以下neverallow,
neverallow system_server sdcard_type:dir { open read write };
那么system_server是不能拥有这些权限的,如果赋予这些权限就编译报错,解决方法是根据编译错误提示的行号,把这一句注释掉即可。
6. 高级进阶
6.1. 新建.te安全策略文件方法
以上基本是对已经存在的进程增加权限,但对第三方进程改如何新增一个全新的te文件并赋予权限呢?
以写mac地址的setmacaddr执行文件为例(这个执行档android原生不存在,自行添加的):
在init.xxx.rc中如下服务:
service engsetmacaddr /system/bin/setmacaddr /data/misc/wifi/wifimac.txt
class main
disabled
oneshot
1. 在device/softwinner/astar-common/sepolicy/file_contexts中,参考其他进程声明一个scontext:
……
/system/bin/install-recovery.sh u:object_r:install_recovery_exec:s0
/system/bin/dex2oat u:object_r:dex2oat_exec:s0
/system/bin/patchoat u:object_r:dex2oat_exec:s0
/system/bin/setmacaddr u:object_r:engsetmacaddr_exec:s0
指定setmacaddr的路径,并指定一个名字,一定要以service名+_exec结尾
2.参考其.te文件在device/softwinner/astar-common/sepolicy/file_contexts 创建engsetmacaddr.te文件,内容如下:
type engsetmacaddr, domain;
type engsetmacaddr_exec, exec_type, file_type;
init_daemon_domain(engsetmacaddr)
allow engsetmacaddr vfat:dir { search write add_name create};
allow engsetmacaddr vfat:file { create read write open };
allow engsetmacaddr engsetmacaddr:capability dac_override;
allow engsetmacaddr shell_exec:file { execute read open execute_no_trans};
allow engsetmacaddr system_data_file:dir { write add_name remove_name };
allow engsetmacaddr system_data_file:file { create execute_no_trans write open setattr};
allow engsetmacaddr system_file:file { execute_no_trans};
以上赋予的权限全部是根据avc denied的log缺什么一步一步补什么来的。
6.2. 新设备节点增加访问权限
驱动创建了一个新的设备节点,即使权限是777,android层也是没有访问权限的。
下面以一个/dev/wifi_bt节点为示范,让此节点被用户空间的system_server进程访问。
1. 编辑devicesoftwinner/astar-common/sepolicy/device.te,仿照这个文件里的写法,定义一个dev_type类型的wifi_bt_device设备:
type misc_block_device, dev_type;
type private_block_device, dev_type;
……
type wf_bt_device, dev_type;
2. 编辑file_contexts.te,将/dev/wf_bt节点声明为第1步定义的wf_bt_device:
/dev/block/by-name/misc u:object_r:misc_block_device:s0
/dev/block/by-name/alog u:object_r:log_block_device:s0
/dev/block/by-name/private u:object_r:private_block_device:s0
# We add here
/dev/wf_bt u:object_r:wf_bt_device:s0
3. 在system_server.te,根据dmesg | grep avc允许system_server对wf_bt_device这个节点可读可写:
# Read/Write to /proc/net/xt_qtaguid/ctrl and and /dev/xt_qtaguid.
allow system_server qtaguid_proc:file rw_file_perms;
allow system_server qtaguid_device:chr_file rw_file_perms;
……
allow system_server wf_bt_device:chr_file rw_file_perms;
其他进程如需访问/dev/wf_bt节点,依样画葫芦,增加对wf_bt_device的权限即可。
————————————————
版权声明:本文为CSDN博主「缥缈孤鸿影_love」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tung214/article/details/72734086
Android SELinux avc denied解决相关推荐
- Android Selinux avc报错分析
avc权限报错 E SELinux : avc: denied { find } for interface=vendor.qti.hardware.perf::IPerf sid=u:r:media ...
- 2022-07-20 Android 11 SELinux avc 修改sys目录下面某个节点的权限
一.我这里有/sys/devices/platform/thermal-camera-control/powerenable 这样一个节点,用命令ls -Z 查看该文件的域. 二.我现在在一个普通ap ...
- Android SELinux开发入门指南之正确姿势解决访问data目录权限问题
Android SELinux开发入门指南之正确姿势解决访问data目录权限问题 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之SELinux ...
- Android SELinux Enforcing 模式下问题及解决
平台: RK3288 + android 5.11 修改selinux模式为enforcing (默认为 permissive) 主要修改parameter: FIRMWARE_VER:5.1.1 M ...
- Service xxx does not have a SELinux domain defined.amp;amp;avc denied权限问题
init: Service xxx does not have a SELinux domain defined. 该提示说明没有定义SELinux domain,导致服务xxx无法自启动.为了解决这 ...
- Android 修改 SELinux avc 权限的方法
系统版本:Android 11.0 平 台:RK3568 在 Android 系统的开发及适配过程中,我们常常需要对 SELinux avc 权限进行修改,以下是我对 SEL ...
- Android SELinux开发入门指南之如何增加Native Binder Service权限
Android SELinux开发入门指南之如何增加Native Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指 ...
- Android SELinux开发入门指南之如何增加Java Binder Service权限
Android SELinux开发入门指南之如何增加Java Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之 ...
- 详解Android Selinux 权限及问题
由于现做的是MTK平台,源码路径基于MTK, 不过高通大同小异 说明 Android 5.0以后完全引入了 SEAndroid/SELinux 安全机制,这样即使拥有 root 权限或 chmod 7 ...
- Android Selinux权限问题
1.1:log提示: type=1400 audit(1262304982.420:57113): avc: denied { sys_ptrace } for pid=1 comm="in ...
最新文章
- 模仿人脑视觉处理,助力神经网络应对对抗性样本
- SQLite数据库管理工具(SQLiteStudio)v3.1.1
- 171. Leetcode 406. 根据身高重建队列 (贪心算法-两个维度权衡题目)
- aspnet_regiis.exe -i 执行报错
- Java——设计模式(简单工厂模式)
- 使用react开发管理后台
- mySQL无锁队列_使用 MySQL 实现无锁任务队列(using MySQL as a job queue)
- BC95-G NB-IOT 模块使用
- Hackingteam Galileo RCS安装详细绕坑指南
- HEVC/H.265理论知识(2)——profile、level、tier
- Linux Shell重定向 管道命令 grep搜索 awk编程 sed文件操作高阶函数
- 微信小程序之网易云音乐小案例
- 23种设计模式-个人笔记(二)
- 清华计算机专业考研经验分享
- saas系统分几种类型
- play home android,playhome
- 惠普HP dc7900的BIOS如何开启虚拟化VT设置
- 云讯健身管理系统-11--NUXT和Redis
- Bootstrap部分案例
- 如何签订合同中的不可抗力条款
热门文章
- 《代码整洁之道》第14章 逐步改进 的代码片段
- 基于豆瓣影评数据的文本分析系统【数据爬取+数据清洗+数据库存储+LDA主题挖掘+词云可视化】
- cdh安装hadoop组件后一些常用设置
- Mentor HDL Designer Series 2010.2a Linux 1CD
- 86五笔输入法教程详解
- Dockerfile文件:使用脚本文件生成镜像
- 超级全面的MySQL优化面试解析
- 格兰杰检验的基本步骤_Toda-Yamamoto 格兰杰因果检验 TY-Granger方法
- Mac下GitHub安装及使用教程
- linux github安装 Pytorch