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

原文 https://blog.csdn.net/kc58236582/article/details/51752765

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

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

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

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

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

[cpp]  view plain  copy
  1. /data(/.*)?     u:object_r:system_data_file:s0  

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

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

[html]  view plain  copy
  1. /data/download(/.*)?           u:object_r:download_data_file:s0  

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

[html]  view plain  copy
  1. type download_data_file, file_type;   
然后在recovery.te中增加对download_data_file的权限
[html]  view plain  copy
  1. allow recovery download_data_file:dir { write search remove_name };  
  2. allow recovery download_data_file:file { read getattr unlink };  

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

[html]  view plain  copy
  1. allow system_app download_data_file:dir { search write add_name getattr remove_name };  
  2. allow system_app download_data_file:file { create read write open getattr unlink };  


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

[html]  view plain  copy
  1. mkdir /data/download 0771 system system  

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

[html]  view plain  copy
  1. allow uncrypt download_data_file:dir { search getattr };  
  2. allow uncrypt download_data_file:file { getattr read open };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值