在新增一个HIDL Service后,需要对其进行权限配置,不然通过
adb shell ps -A|grep NAService
会发现该service无法启动,也会通过抓取log发现一堆的avc: denied
权限问题。关于SELinux可以推荐文档:https://www.pianshen.com/article/6549296922/, 非常详细,本文只是作为记录部分常用的笔记。
Android sepolicy
,SEAndroid是一种基于安全策略的MAC安全机制。SEAndroid安全机制中的安全策略就是在安全上下文的基础上进行描述的,也就是说,它通过主体和客体的安全上下文,定义主体是否有权限访问客体。
例如添加一个service,在
.rc
文件定义了service,还需要在sepolicy
的file_context
中添加权限。
selinux相关命令
1 | // 查看进程的sContext |
查看selinux开关状态:adb shell getenforce
可能返回结果有三种:Enforcing、Permissive 和 Disabled。Disabled 代表 SELinux 被禁用,Permissive 代表仅记录安全警告但不阻止可疑行为,Enforcing 代表记录警告且阻止可疑行为。
一般调试通过以下命令关闭SELinux权限(需重启生效):
1 | adb root |
抓取SELinux Log
- 抓kernel log,
adb shell dmesg
- 抓kernel log,使用命令,可以直接提出avc的log:
adb shell "cat /proc/kmsg | grep avc" > avc_log.txt
adb logcat –b events
,搜索关键字:avc: denied
File_contexts
用于声明文件的安全上下文,plat前缀的文件用于声明system、rootfs、data等与设备无关的文件。Nonplat 用于声明vendor、data/vendor等文件。
domain.te
该策略文件会限制一些特征文件的权限,一般不建议修改。
selinux没有对某个文件的权限(有neverAllow)处理方法
1 | 01-01 08:03:22.410000 217 217 W applypatch: type=1400 audit(0.0:16): avc: denied { read } for name="mmcblk0p15" dev="tmpfs" ino=3364 scontext=u:r:install_recovery:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=0 |
意思是说明install_revovery
没有block_device的权限
只要在install_recovery.te中加入下面权限就可以了。
allow install_recovery recover_block_device:blk_file { open read write };
Service_contexts
用于声明java service 的安全上下文, O上将该文件拆分为
plat
和nonplat
前缀的两个文件,但nonplat前缀的文件并没有具体的内容(vendor和system java service不允许binder操作)。
Property_contexts
用于声明属性的安全上下文,plat 前缀的文件用于声明system属性,nonplat前缀的文件用于声明vendor 属性。ril.开头的属性的安全上下文为
u:object_r:radio_prop:s0
,这意味着只有有权限访问Type为radio_prop的资源的进程才可以访问这些属性。
Hwservice_contexts
新增文件,用于声明HIDL service 安全上下文。
1 | android.hardware.vibrator::IVibrator u:object_r:hal_vibrator_hwservice:s0 |
te语法
allow signal
:
1 | allow domain domain : process signal; # 每个进程都能向它自己和其它进程发送signal |
参考文档: