1、背景:最近修改一些与Selinux权限相关东西,比如说录屏,通过apk调用system/bin/screenrecord 脚本命令去执行 录屏,具体原因是因为下面这张图报错信息。
2、复制avc报错信息日志 如下图所示(不知道avc权限控制是什么东西,请看这篇文章准确添加AVC权限_avc权限添加-CSDN博客)
2024-05-29 15:07:31.931 23875-23875
Thread-284 pid-23875 I type=1400 audit(0.0:5842): avc: denied { execute_no_trans } for path="/system/bin/screenrecord" dev="overlay" ino=318007 scontext=u:r:system_server:s0 tcontext=u:object_r:system_file:s0 tclass=file permissive=1
3、套用公式
allow [scontext] [tcontext]:[tclass] [denied];
4、翻译上面dmesg avc报错修改如下所示
allow system_server system_file:file{execute_no_trans} ;
更多示例参考如下,这里不再赘述哈。
allow shell default_android_service:service_manager find;
avc: denied { find } for pid=10761 uid=2000 name=xxx_test scontext=u:r:shell:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=1
allow shell installd_service:service_manager find;
avc: denied { find } for pid=10761 uid=2000 name=installd scontext=u:r:shell:s0 tcontext=u:object_r:installd_service:s0 tclass=service_manager permissive=1
5、在system/sepolicy/private/system_server.te文件中添加 上面allow权限规则,另外不要忘记,/system/sepolicy/prebuilts/api/32.0/private/system_server.te也要添加同样信息,否则编译报错。切记一定要同步,包括添加位置要一模一样,参考第4点,报错信息如下所示。
6、修改之后进行编译固件Rom验证
7、selinux问题快速验证
SELinux权限
场景:avc问题快速调试
1)adb shell getenforce //查询selinux运行模式
2)adb shell setenforce 0 //切换成permissive(宽容模式),需先adb root
3)adb shell setenforce 1 //切换成enforcing(强制模式)
这里可以改成宽容模式,然后查看info类型的日志来查看是否还需要添加权限。
8、audit2allow -i logcat_avc.txt # -i指定avc报错日志文件
到这里基本结束,这里只是简单记录下,抛砖引玉,关于Selinux权限不是一二篇文章就能讲完的,具体问题具体分析,但是公式都是差不多的哈,学会举一反三,转载请注明出处高通Selinux权限规则-CSDN博客,谢谢!
感谢
推荐工具 audit2allow 路径external/selinux/prebuilts/bin/audit2allow
最后再留一个AVC报错问题给大家练习,知道大家可以在评论中打出你的答案。showtime
I Thread-2: type=1400 audit(0.0:53): avc: denied { search } for name="leds" dev="sysfs" ino=26711 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:sysfs_leds:s0 tclass=dir permissive=1