属性问题展开的selinux权限介绍

从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想要去读取这个属性,但是读不到,如何分析呢?

    1. 查看属性的安全上下文:getprop -Z persist.my.test
      [persist.my.test]: [u:object_r:my_system_prop:s0]
    2. 查看进程的安全上下文:ps -AZ | grep com.android.myapp
      u:r:platform_app:s0:c512,c768 com.android.myapp
    3. 给platform_app加权限,在platform_app.te中添加:
      get_prop(platform_app, my_system_prop)

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

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

    1. cts版本不能有任何neverallow,只能去掉添加的权限
    2. 国内版本可适当注释掉原生相关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)))
    <root>
    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;

解决方式:

  1. 直接注释到该行
# neverallow { domain -untrusted_app_all } file_type:file execmod;
  1. 只规避受影响的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参数即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容