android7.1增加一个开机自启动的bin应用遇到的权限问题

1.    增加开机自启动的bin应用

1.1  增加的源代码

新建external\study,编译生成study,编译方式有两种

(1)  mmm external/study

(2)  make systemimage,在 device/qcom/common/base.mk下增加LIBCAMERA += study

1.2  增加开机自启动study

device/qcom/msm8937_64/init.target.rc的

on boot

service study /system/bin/study

class main

user  root

oneshot

第1个study是service名称,第2个study是可执行应用名称。

1.3  增加study的权限

(1)  device/qcom/sepolicy/common/file_contexts下增加study

# System files

stem/bin/study                       u:object_r: study_exec:s0

file_contexts文件保存系统中所有文件的安全上下文定义,每行前半部分是文件的路径,后面是它的安全上下文的定义(study_exec)。

安全上下文的格式:USER:ROLE:TYPE[LEVEL],在安全上下文规则中最主要的定义是type,这里是study_exec。TYPE是定义主体和客体所属的类型,对于进程而言,它的类型也称为domian。

(2)  在device/qcom/sepolicy/common/或是其他sepolicy下增加study.te文件。

Te文件属于类型强制规则文件(TypeEnforcement),它主要由类型定义和规则定义两部分组成

#定义了study和study_exec两种类型,study用在进程的安全上下文中,study_exec用在文件的安全上下文中。属性domain表示域,属性是android预先在system\sepolicy\attributes中定义好,当然我们也可以定义,比如在device\qcom\sepolicy\common\attributes中。

#无论是主题还是客体的类型定义,都是通过type语句来完成,通常主体的type具有domian属性,因此,我们也把主体的type称为domain,将domain设置为study的属性,表明zygote是用来描述进程的安全上下文的。

type study, domain;

#表明类型study_exec具有属性exec_type和file_type,即它是用来描述文件的安全上下文的

type study_exec, exec_type, file_type;

init_daemon_domain(study)

allow study study:capability dac_override;

allow study rootfs:lnk_file { read getattr};

allow study system_data_file:dir {opengetattr read write add_name};

allow study system_data_file:file {opengetattr create read write};

allow study shell_exec:file {read openexecute execute_no_trans rx_file_perms};

allow study toolbox_exec:file {getattrexecute read open execute_no_trans};

这些内容是根据avc denied的log增加的。

1)    init_daemon_domain(study)

程执行一个type为zygote_exec的文件时,将该子进程的domain设置为zygote,而不是继承父进程的domain。并且给与zygote这个domain,所有定义在tmpfs_domain宏中的权限。

# init_daemon_domain(domain)
# Set up a transition from init to thedaemon domain
# upon executing its binary.
define(`init_daemon_domain', `
domain_auto_trans(init, $1_exec, $1)
tmpfs_domain($1)
')

init_daemon_domain(study)是一个宏,声明当一个domain为init的进程创建一个子进程执行一个type为study_exec的文件时,将该子进程的domain设置为study,而不是继承父进程的domain。并且给与study这个domain,所有定义在tmpfs_domain宏中的权限。

2)    allow语句

比如allow study system_data_file:file {opengetattr create read write};

rule_name source_type target_type : classperm_set

source_type:通常是某种属性为domain的类型(type),代表主体。

Target_type(目标类型):允许访问的客体的类型,目标类型可以同时指定多个,

Class(客体类别):允许访问的客户的目标类型可能会涵盖比较广的范围,客体类别可以对客体目标类型进行限制和明确化,例如这里目标类型是system_data_file可以代表文件(file)、目录(dir)及链接(lnk_file),通过file对它进行了限制,因此,在这条规则中只代表文件。

增加的内容需要编译生成新的boot.img和生成study,其中增加的study.te文件在make bootimage编译的时候生成在out\target\product\msm8937_64\root\sepolicy中,而file_contexts文件汇总生成为out\target\product\msm8937_64\root\file_contexts.bin,file_contexts.bin文件,file_contexts.bin 和 file_contexts可互转,见链接:

https://blog.cofface.com/archives/2255.html

sepolicy可用二进制工具bless查找里面的内容。

2.    adb方式更新boot.img和study---OK

用fastboot烧录boot.img和adb push study到/system/bin下验证正常。

通过ls -z study方式得到结果:

u:object_r:study_exec:s0system/bin/study

3.    升级包update.zip方式更新boot.img和study---权限问题

更新后提示init: Service study does not have aSELinux domain defined.

通过ls -z study方式得到结果:

u:object_r:system_file:s0 system/bin/study

可见用adb的方式study的类型是study_exec,升级包的方式是system_file,为什么是system_file呢?见文件system\sepolicy\file.te下面的内容

# Default type for anything under /system.

type system_file, file_type;

为了解决init: Service study does not have aSELinux domain defined.问题,需要在升级包的META-INF\com\google\android\updater-script文件增加下面的内容:

set_metadata("/system/bin/study","uid", 0, "gid", 2000, "mode", 0755,"capabilities", 0x0, "selabel", "u:object_r:study_exec:s0");

android7.1增加一个开机自启动的bin应用遇到的权限问题相关推荐

  1. android 实现一个开机自启动的service

    1.概述 本文记录了如何在android11系统中创建一个native服务,实现简单的文件复制功能,并实现开机启动,通过aidl,应用层能够使用该服务.首先你得有一套android源码,并且编译过. ...

  2. 在Ubuntu上编写一个开机自启动的Python脚本

    编写一个shell脚本文件,例如python_auto.sh,文件内容: 2.编写start.py文件,里面执行你需要服务器开启执行的操作 3.在 /etc/profile  这个文件中,添加shel ...

  3. linux开机自启动tty设备,在 tty 里添加一个开机自启动的任务管理器

    每当感觉到系统卡的时候,最好的方法无外乎进入 tty,登入,打开一个 top 监视.可是每次到了需要的时候才去开,打开的效率自然不敢恭维.于是便想,每次开机的时候,记起来就跑到 tty 下面去先开起来 ...

  4. Ubuntu增加一个用户并给普通用户赋予root权限的方法

    1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy   //修改密码 Changing pa ...

  5. Ubuntu开机自启动程序的方法

    文章目录 Ubuntu开机自启动程序的方法 目标效果 方案1:修改rc.local 测试结果 方案2:单独增加一个开机启动的脚本 错误1 错误2 实测结果 refs 方案3:利用官方快捷方式启动 Ub ...

  6. 简单记录一下开机自启动软件失效,无法自启的问题

    原因是我写了一个开机自启动的脚本,作用是清除我的IE代理设置,之前都一切正常,但是后面加了一句之后就导致我自启软件全部失效了,脚本: @echo off echo 设置 ProxyEnable 为禁用 ...

  7. 向Linux增加一个系统调用或内核模块

    向Linux增加一个系统调用或内核模块 配置环境 获取root权限 sudo su 更新系统 sudo apt-get update 安装相关编译程序包 sudo apt-get install li ...

  8. ubuntu下以管理员权限开机自启动自己的程序

    实现目的:让自己编写的程序在ubuntu下开机自启动,并且要以管理员权限启动 实现步骤: 1.打开"Startup Applications" 程序,如下图: 或者在终端输入命令: ...

  9. 全志A40I Android7.1系统开机自启动

    全志A40I Android7.1系统开机自启动,也适用于其他Android系统.Android系统的自启动不同于Linux系统,linux直接在内核init.rc中修改,应用层不用修改,而Andro ...

最新文章

  1. 头插法建立单链表学习总结
  2. [html] canvas透明度是0.6的矩形和透明度是0.2的矩形叠加到一起,透明度是多少
  3. Python-进程相关概念
  4. Bash中命令连接符的用法——一次执行多个命令-转
  5. 使用keytool 生成证书
  6. linux解析器错误权限不够,实例解析Linux下目录的权限
  7. 《JavaScript语言精粹》笔记(内附《JavaScript语言精粹》百度云下载链接)
  8. ABAP 如何解析 JSON 数据试读版
  9. 【小教程】完全卸载Adobe Creative Cloud以及删除资源管理器左侧Creative Cloud Files导航栏的最快方法
  10. 手机平板如何查看IDEA中运行的Tomcat的web项目
  11. STM32 Cubemax(十五) —— 串级PID以控制电机角度值为例
  12. 三阶魔方还原步骤图_三阶魔方公式图解、教程
  13. Fortinet:网络安全越来越勤快,可甲方却应该越来越「懒」
  14. day05 Servlet组件(上)
  15. (附源码)springboot企业合同管理系统 毕业设计 161456
  16. 计算机大赛搞笑队名,电子设计大赛队名
  17. 麻将番型计算(二人麻将)
  18. 计算机语言词汇量,汉语作为第二语言的词汇量测量工具研究
  19. 维基解密再爆料:CIA能操纵浏览器,监视PPT
  20. 学习Linux内核必读的五本书

热门文章

  1. 015_JavaMail
  2. 037_CSS媒介类型
  3. 阿德莱德计算机专业排名,阿德莱德大学专业排名第几?2019年榜单揭晓!
  4. 深交所互动平台_怡达股份股价涨跌幅偏离大盘,深交所:啥原因?
  5. cf不能全屏win7的解决方法_win7电脑输入法不能打字的解决方法
  6. python调用所有函数_python打印所有函数调用以了解脚本
  7. 四级重点高频词汇表_四级为什么自己估分和真实成绩不一样……?
  8. 数据结构——树、二叉树、森林、哈夫曼树、字符串模式匹配
  9. mysql 表名不加单引号_当表名“ match”没有用单引号引起来时,MySQL引发错误?...
  10. php7与php5的区别,PHP7和PHP5区别