SELinux权限配置总结

1. 什么是SELinux:

作为 Android 安全模型的一部分,Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制 (MAC),甚至包括以 Root/超级用户权限运行的进程(Linux 功能)。很多公司和组织都为 Android 的 SELinux 实现做出了贡献。借助 SELinux,Android 可以更好地保护和限制系统服务、控制对应用数据和系统日志的访问、降低恶意软件的影响,并保护用户免遭移动设备上的代码可能存在的缺陷的影响。

SELinux 按照默认拒绝的原则运行:任何未经明确允许的行为都会被拒绝。SELinux 可按两种全局模式运行:

宽容模式(Permissive mode):权限拒绝事件会被记录下来,但不会被强制执行。
强制模式(Enforcing mode):权限拒绝事件会被记录下来并强制执行。

Android 中包含 SELinux(处于强制模式)和默认适用于整个 AOSP 的相应安全政策。在强制模式下,非法操作会被阻止,并且尝试进行的所有违规行为都会被内核记录到 dmesg 和 logcat。开发时,您应该先利用这些错误信息对软件和 SELinux 政策进行优化,再对它们进行强制执行。

此外,SELinux 还支持基于域的宽容模式。在这种模式下,可将特定域(进程)设为宽容模式,同时使系统的其余部分处于全局强制模式。简单来说,域是安全政策中用于标识一个进程或一组进程的标签,安全政策会以相同的方式处理所有具有相同域标签的进程。借助基于域的宽容模式,可逐步将 SELinux 应用于系统中越来越多的部分,还可以为新服务制定政策(同时确保系统的其余部分处于强制模式)。

2. 设置SELinux模式:

对于受SELinux权限影响的功能验证,我们可以先将 SELinux 模式调整到 Permissive mode,然后再测试确认是否与 SELinux约束相关。

在userdebug版本中:
adb root
adb shell setenforce 0
adb shell getenforce

注意,重启后SELinux模式会恢复为enforcing,若有功能需要在启动时验证,则可以单独重启Android。

3. 版本演变

低于安卓4.3 - 默认不支持SELinux

安卓4.3 - 宽容模式

安卓4.4 - 部分强制模式(多数设备依然是宽容模式)

安卓5.1 - 默认强制模式

高于安卓8.0 - 强制模式且Sepolicy规则被分成多个部分

4. 关键文件

通常情况下,不能直接修改 system/sepolicy 文件,但可以添加或修改自己的设备专用政策文件(位于 /device/<manufacturer>/<device-name>/sepolicy 目录中),比如qcom平台项目就要修改 ”/device/qcom/sepolicy” 目录下的文件。

要实现 SELinux,必须创建或修改以下文件:

1.新的 SELinux 政策源代码 (*.te) 文件 - 位于 /device/<manufacturer>/<device-name>/sepolicy 目录中。这些文件用于定义域及其标签。在编译到单个 SELinux 内核政策文件时,新的政策文件会与现有的政策文件组合在一起。按官方的描述,可以在其中新增新的政策文件,但最好还是尽可能尝试更新现有的文件。

请勿更改 Android 开放源代码项目提供的 app.te 文件,否则可能会破坏所有第三方应用。

2.file_contexts - 位于 sepolicy 子目录中。该文件用于为文件分配标签,并且可供多种用户空间组件使用。在创建新政策时,请创建或更新该文件,以便为文件分配新标签。

3.genfs_contexts - 位于 sepolicy 子目录中。该文件用于为不支持扩展属性的文件系统(例如,proc 或 vfat)分配标签。此配置会作为内核政策的一部分进行加载,但更改可能对核心内 inode 无效。要全面应用更改,需要重新启动设备,或卸载后重新装载文件系统。此外,通过使用 context=mount 选项,还可以为装载的特定系统文件(例如 vfat)分配特定标签。

4.property_contexts - 位于 sepolicy 子目录中。该文件用于为 Android 系统属性分配标签,以便控制哪些进程可以设置这些属性。在启动期间,init 进程会读取此配置。

5.service_contexts - 位于 sepolicy 子目录中。该文件用于为 Android Binder 服务分配标签,以便控制哪些进行可以为相应服务添加(注册)和查找(查询)Binder 引用。在启动期间,servicemanager 进程会读取此配置。

6.seapp_contexts - 位于 sepolicy 子目录中。该文件用于为应用进程和 /data/data 目录分配标签。在每次应用启动时,zygote 进程都会读取此配置;在启动期间,installd 会读取此配置。

7.mac_permissions.xml - 位于 sepolicy 子目录中。该文件用于根据应用签名和应用软件包名称(后者可选)为应用分配 seinfo 标记。然后,分配的 seinfo 标记可在 seapp_contexts 文件中用作密钥,以便为带有该 seinfo 标记的所有应用分配特定标签。在启动期间,system_server 会读取此配置。

5. 规范

根据SELinux规范,完整的SContext字符串为:
user:role:type[:range]

以 “/build.prop u:object_r:rootfs:s0”为例:
u:为user的意思,它代表创建这个文件的SELinux user
object_r:在SELinux中,文件类型都用object_r来表示它的role
rootfs:它表示该目录或文件对应的Type是rootfs,type会在te文件中定义
s0:SELinux的Multi-Level Security(MLS)机制

根据 SELinux 规范,完整的 SELinux 策略规则语句格式为:
allow domains types:classes permissions

domain:一个进程或一组进程的标签,也称为域类型
type:一个对象(文件,套接字等)或一组对象的标签
class:要访问的对象的类型
permission:要执行的操作,例如读写等

示例:
allow appdomain app_data_file:file rw_file_perms

表示所有appdomain域都可以读取和写入带有app_data_file标签的文件

6. 调试工具

一般使用 audit2allow 进行权限的调试,audit2allow 工具可以获取 dmesg 拒绝事件并将其转换成相应的 SELinux 政策声明。因此,该工具有助于大幅加快 SELinux 开发速度。但是该工具并不能完全调试 OK,还需要用户自行根据需要修改。

在 ubuntu 中安装 policycoreutils:
sudo apt-get install policycoreutils

提取设备内部的sepolicy规则文件:
adb pull /sys/fs/selinux/policy

用logcat抓取log后使用audit2allow工具解析:
adb logcat -b all -d | audit2allow -p policy

解析后会打印类似如下内容:

#============= xxread ==============
allow xxread shell_exec:file map;

也可以通过log去自行解析,通过过滤“avc”相关的信息,比如:

12-28 02:26:50.659  3058  3058 W init.app.hibern: type=1400 audit(0.0:66): avc: denied { map } for path="/system/bin/sh" dev="overlay" ino=20087 scontext=u:r:xxread:s0 tcontext=u:object_r:shell_exec:s0 tclass=file permissive=0

同样能得出上面那段内容,但是需要一定的解读能力。
然后基于此内容将对应的allow权限添加至对应的 .te 文件中即可(上面这段就要在xxread.te文件中添加)。

7. 编译验证

对于SELinux策略修改的验证,可以使用:
make selinux_policy

编译之后,会在相应的out目录下生成新的文件
system(\vendor\system_ext)/etc/selinux/
把新生成的文件push到机器对应的路径下替换即可

8. 问题案例

这个编译问题出在原本把新增的文件放在vendor目录下,由于文件中需要引用system下的可执行文件,所以根据audit2allow增加了访问system_file的allow规则,但是这样一来编译就会提示与系统默认定义的neverallow规则冲突了,我们是通过/vendor分区去执行/system分区命令,这是由于Google启动的Treble计划,为实现分区可独立升级,不允许进行跨分区调用。

由于log中提示“neverallow on line 1024 of system/sepolicy/public/domain.te”,想尝试在domain里面的那个neverallow中使用“-xxx”来去掉对该域的限制,后来编译发现又报错了:

提示意思是domain.te是不允许被修改的,编译时会与默认的api目录下的domain.te进行比对,一有差异就会中断,这点在第4小节中已经提到了,/system/sepolicy/ 目录下的规则是不允许修改的。

所以最后把此文件放在system目录下,然后使用system分区的te规则文件。

9. 思路总结

  1. 先确认问题是否与 Selinux 权限相关,关闭权限限制,先调试功能,再调试权限。

  2. 小问题可以使用 audit2allow 工具直接加。

  3. Neverallow 问题添加缩小域范围,自定义新的权限域进行规避。

  4. 添加权限尽量不修改系统定义域,以免其它进程访问不到,引起功能问题。

  5. 多项目共基线修改,注意添加兼容问题。防止不同项目编译错误。

  6. 不到万不得已不修改 system/sepolicy/下的文件,防止 CTS 认证失败。

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

推荐阅读更多精彩内容