SELinux 即Security-Enhanced Linux,由美国国家安全局(NSA)发起,Android 4.4引入,L相对较为全面成熟,具体的信息如博客:
https://blog.csdn.net/bsxiaomage/article/details/51126826 作者 lansehai2014
Selinux的两种模式分别为:1.Enforcing表示seLinux已经打开;.Permissive表示seLinux已经关闭;可以通过adb命令查看设备Selinux权限:
1.查看Selinux的打开状态
adb shell getenforce
2.Permissive模式关闭Selinux
adb shell setenforce 0
3.Enforcing模式打开Selinux
adb shell setenforce 1
再进行一些读写操作时候,可能出现报错停运的问题,抓取log可以发现类似下面信息:
01-01 07:03:04.176 4545 4545 E libc : Access denied finding property "logd.logpersistd.enable" 01-01 07:03:04.175 4545 4545 W ndroid.settings: type=1400 audit(0.0:505): avc: denied { open } for path="/dev/__properties__/u:object_r:logpersistd_logging_prop:s0" dev="tmpfs" ino=293 scontext=u:r:system_app:s0 tcontext=u:object_r:logpersistd_logging_prop:s0 tclass=file permissive=0 01-01 07:03:04.178 4545 4545 W libc : Unable to set property "persist.logd.logpersistd.buffer" to "": error code: 0x18 01-01 07:03:04.179 4545 4545 D AndroidRuntime: Shutting down VM --------- beginning of crash 01-01 07:03:04.184 4545 4545 E AndroidRuntime: FATAL EXCEPTION: main 01-01 07:03:04.184 4545 4545 E AndroidRuntime: Process: com.android.settings, PID: 4545
主要权限相关的信息,主要查找标红位置:
avc: denied { open } for path="/dev/__properties__/u:object_r:logpersistd_logging_prop:s0" dev="tmpfs" ino=293 scontext=u:r:system_app:s0 tcontext=u:object_r:logpersistd_logging_prop:s0 tclass=file permissive=0
相关信息代表的含义如下:
avc: denied { 操作权限 } for pid=7201 comm=“进程名” scontext=u:r:源类型:s0 tcontext=u:r:目标类型:s0 tclass=访问类别 permissive=0
可以发现是有关system_app的权限问题,此时可以查看设备的selinux权限是否打开?如果未打开可以用adb shell setenforce 1设置权限再去验证是否报错
代码端修改:
1.提取log信息:allow 源类型 目标类型:访问类别 {权限};
2.在文件alps/device/mediatek/sepolicy/basic/non_plat/system_app.te里添加对应的selinux权限:
allow system_app logpersistd_logging_prop:file { open };
获取权限的代码容易出错,可以使用audit2allow生成。
3.audit2allow使用
1).新建文档Myselinux,并将权限log复制进去(两次,一般第一次识别不了)
avc: denied { open } for path="/dev/__properties__/u:object_r:logpersistd_logging_prop:s0" dev="tmpfs" ino=293 scontext=u:r:system_app:s0 tcontext=u:object_r:logpersistd_logging_prop:s0 tclass=file permissive=0 avc: denied { open } for path="/dev/__properties__/u:object_r:logpersistd_logging_prop:s0" dev="tmpfs" ino=293 scontext=u:r:system_app:s0 tcontext=u:object_r:logpersistd_logging_prop:s0 tclass=file permissive=0
2).命令生成代码
audit2allow -i Myselinux
3).重新打开Myselinux就可以拿到生成的代码
allow system_app logpersistd_logging_prop:file { open };