从android5.0开始,强制开启了SELinux,对系统属性的访问权限也由selinux进行限制。

SELinux非常繁杂,8.0开始的Treble Project后,为了实现system、vendor分区的隔离,selinux的机制变的更加繁琐。本文不打算全面讲解android上selinux,通过概览全貌和常见案例分析,让大家在"不求甚解"的情况下,能够处理系统定制中80%的selinux权限问题。

1.SELinux的基本介绍

框架:Kernel中,SELinux通过Linux Security Modules实现。

kernel/fs/read_write.c:

int rw_verify_area(int read_write, struct file *file, const loff_t *ppos, size_t count)

{

......

/* 基础权限检查 */

if (unlikely(!access_ok(VERIFY_READ, buf, count)))

return -EFAULT;

......

/* selinux权限检查 */

retval = security_file_permission(file,

read_write == READ ? MAY_READ : MAY_WRITE);

......

}

语法:rule_name source_type target_type : class perm_set

allow system_app misc_user_data_file:file create_file_perms;

get_prop(system_app, system_prop) 其实是一个宏,展开如下:

allow system_app system_prop:file r_file_perms; #/dev/__properties__/system_prop

2.android上selinux相关文件

源码:

system/sepolicy:

├── private

├── public

│ ├── property_contexts

│ ├── property.te

│ ├── file_contexts

│ ├── file.te

│ ├── su.te

│ ├── system_app.te

│ ├── system_server.te

│ ├── untrusted_app.te

│ ├── priv_app.te

│ └── zygote.te

└── vendor

ROM:

selinux编译生成的策略文件sepolicy,8.0之前在boot.img中,8.0由于treble的原因,system和vendor分区各放置一部分,加载的时候会进行合并。8.0之后单刷userdebug版本的boot不再能获取root权限,要刷userdebug版的system.img才行。

/system/etc/selinux:

plat_file_contexts

plat_property_contexts

plat_sepolicy.cil

/vendor/etc/selinux:

vendor_file_contexts

vendor_property_contexts

vendor_sepolicy.cil

3.my_system_prop定义

property.te:

type my_system_prop, property_type;

property_contexts:

persist.my. u:object_r:my_system_prop:s0

system_app.te:

set_prop(system_app, my_system_prop)

案例

模块编译selinux:make sepolicy

关闭selinux:setenforce 0

案例一:build.prop明明声明了属性,为什么通过APK和adb shell获取不到?

属性组成:

/default.prop

/system/build.prop

/vendor/default.prop

/vendor/build.prop

由代码通过set生成的属性

首先,只要build.prop里声明了,就会被加载到系统属性中。属性是有权限控制的,所以APK是不能获取所有属性的。

参照上文my_system_prop的定义,如果对应APK没有声明get_prop的权限,是获取不到相关权限的。

例如:

persist.my.test u:object_r:my_system_prop:s0

com.android.myapp想要去读取这个属性,但是读不到,如何分析呢?

查看属性的安全上下文:getprop -Z persist.my.test

[persist.my.test]: [u:object_r:my_system_prop:s0]

查看进程的安全上下文:ps -AZ | grep com.android.myapp

u:r:platform_app:s0:c512,c768 com.android.myapp

给platform_app加权限,在platform_app.te中添加:

get_prop(platform_app, my_system_prop)

adb shell对应的身份是shell,也是受限的,只有adb root后getprop获取的属性才是最全的。

案例二:新增allow xxx权限,编译报错Neverallow,如何处理?

cts版本不能有任何neverallow,只能去掉添加的权限

国内版本可适当注释掉原生相关neverallow进行规避

neverallow check failed at out/target/product/sailfish/obj/ETC/plat_sepolicy.cil_intermediates/plat_sepolicy.cil:6373 from system/sepolicy/public/domain.te:1133

(neverallow base_typeattr_144 file_type (file (execmod)))

allow at out/target/product/sailfish/obj/ETC/vendor_sepolicy.cil_intermediates/vendor_sepolicy.cil:1396

(allow platform_app_28_0 app_data_file_28_0 (file (execute execmod)))

如上看出,具体是public/domain.te:1133的限制影响了新加权限,找到对应行数观察:

neverallow { domain -untrusted_app_all } file_type:file execmod;

解决方式:

直接注释到该行

# neverallow { domain -untrusted_app_all } file_type:file execmod;

只规避受影响的platform_app

neverallow { domain -untrusted_app_all -platform_app } file_type:file execmod;

案例三:avc: denied { write }之类的缺少权限如何处理?

audit(0.0:67): avc: denied { write } for path="/dev/block/vold/93:96" dev="tmpfs" ino=/1263 scontext=u:r:kernel:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=0

语法:rule_name source_type target_type : class perm_set**

万能公式:

缺少什么权限:{ write }权限

谁缺少权限:scontext=u:r:kernel:s0

对谁缺少权限:tcontext=u:object_r:block_device:s0

什么类型:tclass=blk_file

kernel.te:

allow kernel block_device:blk_file write;

写操作一般还伴随open、append等,所以一般使用w_file_perms宏替代单一的write

案例四:avc: denied { execmod }如何处理?

audit(0.0:51): avc: denied { execmod } for path="/system/app/education_student/lib/arm/libhpHandPends.so" dev="mmcblk0p24" ino=424 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:system_file:s0 tclass=file permissive=0

按照万能公式可得如下策略语句,这是没问题的。但这不是最优解,也可能违反Neverallow。

allow untrusted_app system_file:file execmod;

目前android加载so的策略是强制使用地址无关代码的模式,execmod的本质是由于so不支持地址无关导致加载失败。

地址无关可以在多个进程间共享so的代码指令,无需拷贝重定位,节省内存。

目前的Android.mk、NDK都默认加有-fPIC,只有很早之前的编译的so存在此问题。

因此最优解是重新编译so,GCC编译时加上-fPIC参数即可。

service获取selinux权限_属性问题展开的selinux权限介绍相关推荐

  1. java 共享内存获取写权限_跨进程访问共享内存的权限问题

    问:我在服务器上用 CreateFileMapping 创建了一段共享内存.让这个exe始终在服务器上跑. 同时,别的用户在客户端用IE访问服务器,将要查询的数据通过C#制作的网页提交上来,服务器得到 ...

  2. 怎么设置mysql 的权限_怎么设置SQL数据库用户权限

    一.操作步骤 首先进入数据库级别的[安全性]-[登录名]-[新建登录名] (图1:新建登录名) 2. 在[常规]选项卡中,如下图所示,创建登陆名,并设置默认的数据库. (图2:设置选项) 3. 在[用 ...

  3. 软件获取手机的ime权限_你手机上软件的权限请求,都要同意吗,会不会泄漏你的隐私?...

    生活中,在你使用各种手机软件的时候,不知道你有没有注意到,在软件第一次安装打开的时候,有大多数软件会弹出一个权限请求的弹框,显示出应用要请求获取什么权限以及使用这些权限的一些情况说明.我相信大多数人可 ...

  4. 设置字段权限_命令行快速提示:权限进阶

    (给Linux爱好者加星标,提升Linux技能) 编译:linux中国- Xingyu.Wang,作者:Paul W. Frields 前一篇文章介绍了 Fedora 系统上有关文件权限的一些基础知识 ...

  5. mysql修改导入导出权限_数据库导入导出与赋权限及建同义词

    1.数据库导入导出DMP文件(一般要以adm账号来执行) a)从正式库导出数据: exp sw_adm/swadm123@cwdevdb owner=sw_adm file=E:20121217cwd ...

  6. django 自定义权限_如何对django api做权限限制

    前面的篇章,我们搭建了django的rest api服务,那么现在,我们就需要对api来做权限限制,不能让随便一个人就可以访问api接口.一般api访问的权限限制,包括basic的验证,每次的请求头中 ...

  7. mysql 使用手册 权限_创建MySQL用户及用户权限管理

    通过grant [aɪ'dɛntɪfaɪd] 命令创建用户并授权 grant命令简单语法 grant all privileges on dbname.* to username@localhost  ...

  8. sqlserver2000给账户授予所有的权限_内网渗透 | 域内权限解读

    域内权限解读 目录 域本地组 全局组 通用组 A-G-DL-P策略 内置组 几个比较重要的域本地组 几个比较重要的全局组.通用组的权限 域本地组 多域用户访问单域资源(访问同一个域) 可以从任何域添加 ...

  9. 授予数据库账号dba权限_深入理解 MySQL 用户和权限

    一. 用户 1 创建用户(这里的用户不可使用,在分配权限后可正常登陆) 只创建用户 CREATE USER username IDENTIFIED BY 'password'; 创建用户的同时授予权限 ...

最新文章

  1. 马哥学习笔记——shell变量类型
  2. Core Java(一)
  3. iOS开发者React Native学习路线
  4. Indian Scientists Design Device to Collect Solar Energy 印度科学家设计太阳能收集设备
  5. 逆序对java_逆序对
  6. express基本原理
  7. 1.9 Important Themes(一些重要的概念)
  8. 系统防御工程v0.2
  9. 转行做软件测试的原因
  10. HTML编辑器-Bluefish 2.0.1 发布
  11. Hypervisor 技术的演进
  12. Dual Illumination Estimation for Robust Exposure Correction阅读札记
  13. 求最大公因数的几种算法
  14. Android—调用高德地图显示定位蓝点
  15. 玩转冷板式液冷 你需要一份靠谱的“设计参考”
  16. Nlog日志记录组件使用
  17. 文章详情页文章评论功能
  18. 高价值行为用户一键同步,精准投放提升广告效率
  19. Docker基础篇 - (六)Docker 网络Spring Boot微服务打包Docker镜像
  20. 【学习】数据库MySQL

热门文章

  1. Java每日问题汇总-02
  2. 选择 Java 编写 iOS 与 安卓 App的八大理由
  3. 敏捷开发用户故事系列之一:何为用户故事
  4. 未来通信设备的体系构架
  5. Java之for和while的内容
  6. python append函数 循环_Python中循环后使用list.append数据被覆盖问题的解决
  7. python爬虫框架源码_python爬虫的基本框架
  8. python 美化ppt_使用python-pptx包批量修改ppt格式的实现
  9. Python批量提取Word文件题库中的答案
  10. 电脑屏幕卡住了按什么都没反应_刚买2个月,联想电脑屏幕出现坏点,售后回复:坏点不够3个不能保修...