文章正文
Android与selinux
前两天写demo的时候碰到一个问题,一个app怎么才能访问proc目录的一个自己新建的节点,下面以/proc/zachary为例。通过把zachary文件访问权限设置为777,还是不能fopen(“/proc/zachary”,”w”),经过一番google,原来是selinux的关系。
为了使得app能够访问上面的节点,需要几个步骤,记录下来给需要的同学。
1、 获取进程的分类,以com.android.setting为例。将该应用启动,后通过ps –Z获取分类
可以看到这个进程的分类为system_app。
2、在file.te中加入
type zachary_file, fs_type;
用于定义类型,zachary_file就是我们自定义的类型,查看file.te中,linux有很多的类型,包括
fs_type, sysfs_type, dev_type, file_type, data_file_type, mlstrustedobject等
对于proc的虚拟目录来说需要定义为fs_type,另外,除了这个,还需要在genfs_contexts对文件作申明
例如:要控制的文件为/proc/zachary,那就在文件的末尾加入
genfscon proc /zachary u:object_r:zachary_file:s0
zachary_file要与在file.te中申明的类型是一样的。
对于其他的文件,在对应的contexts文件(file_contexts, property_contexts)中,模仿加入对应语句就可以了。
3、最后需要在对应的文件中控制权限,对应的文件可以在system_app.te中也可以在其他文件中,例如我要使得com.android.setting的进程可以访问
allow com.android.setting zachary_file:file rw_file_perms;
或者
allow system_app zachary_file:file rw_file_perms;
如果是com.android.setting则只有com.android.setting才能访问这个虚拟文件,如果是system_app则所有的system app都可以访问这个文件。
这样做了之后,重新编译secbootimage,发现/proc/zachary已经变成了下面的样子。
本来以为可以访问了,试了一下还是不行,原来还需要最后一步。
4、在刚才的文件中加入下面的权限,使得init进程也能够访问/proc/zachary文件。
allow init zachary_file:file rw_file_perms;
然后再/system/core/rootdir/init.rc中,在early-init中加入下面的语句,将权限改为system,因为com.android.setting是属于system用户的。
在这以后重新编译secbootimage就能够在com.android.setting这个app中成功的访问/proc/zachary这个节点了。
Oct. 13, 2016, 1:08 p.m. 作者:zachary 分类:Android 阅读(2136) 评论(0)