selinux(案例) recovery删除data目录下的文件

来源:互联网 发布:centos 7 iso文件太大 编辑:程序博客网 时间:2024/06/03 23:40

在recover升级的时候,我们有个需要从服务器上下载升级包,然后放在data/download,这部分工作是放在一个systemapp中完成的。

然后重启进入recoveyr模式,在recovery升级完之后,我们需要在recovery中删除这个文件,这部分是在recovery中完成。

功能很简单,但是在android6.0上碰到selinux的问题。

我们先来看recovery.te中是不允许recovery操作data下面的目录,也就是下面这个neverallow原则

# Recovery should never touch /data.## In particular, if /data is encrypted, it is not accessible# to recovery anyway.## For now, we only enforce write/execute restrictions, as domain.te# contains a number of read-only rules that apply to all# domains, including recovery.## TODO: tighten this up further.neverallow recovery data_file_type:file { no_w_file_perms no_x_file_perms };neverallow recovery data_file_type:dir no_w_dir_perms;
我们再来看下system_data_file在file_contexts.te中的定义

/data(/.*)?u:object_r:system_data_file:s0

而在file.te定义了system_data_file文件属于data_file_type类型,因此recovery也是不能操作data下面的文件
./file.te:56:type system_data_file, file_type, data_file_type;

在我们可以自己定义自己的file类型,我们可以定义data/download属于download_data_file类型

/data/download(/.*)?           u:object_r:download_data_file:s0

然后在file.te中定义download_data_file类型, 注意是只属于file_type类型的。

type download_data_file, file_type; 
然后在recovery.te中增加对download_data_file的权限
allow recovery download_data_file:dir { write search remove_name };allow recovery download_data_file:file { read getattr unlink };

另外我们还需在一个systemapp中先下载升级包,所以需要在system_app.te中增加对如下权限:

allow system_app download_data_file:dir { search write add_name getattr remove_name };allow system_app download_data_file:file { create read write open getattr unlink };


但是最后还是失败了,为什么呢,因为一开始没有data/download这个目录,而是我们再app中自己下载的时候创建的目录,所以是system_data_file类型的。那么我们就需要在一开始就有data/download目录,所以在init.rc中添加如下代码:

mkdir /data/download 0771 system system

最后我们还需要在uncrypt.te中增加如下,因为data目录有可能需要进行加密处理。

allow uncrypt download_data_file:dir { search getattr };allow uncrypt download_data_file:file { getattr read open };


最后这个问题就解决了。


1 0
原创粉丝点击