SELinux权限问题解决方法

前言

之前做系统应用操作设备节点的时候,出现SELinux权限的问题,即SELinux Policy Exception,查看log可以看到诸如此类的提示

avc: denied { read } for name="u:object_r:serialno_prop:s0" dev="tmpfs" ino=11725 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:serialno_prop:s0 tclass=file permissive=0

查了下资料,发现这篇博文介绍的比较全面,这里引用下该博文并做个简要的记录:https://blog.csdn.net/bsxiaomage/article/details/51126826

DAC

  • SELinux出现之前,Linux的安全模型采用的是DAC(Discretionary Access Control,自主访问控制)
  • 自主访问控制,系统只提供基本的验证,完整的访问控制由开发者自己进行控制
  • DAC的不足在于,一旦root权限被拿到,可以任意改动系统文件

MAC

  • 强制性访问控制,系统针对每一项访问都进行严格的限制,任何进程访问每一个文件资源都需要进行针对性的验证
  • 在Linux kernel,所有MAC机制都搭建在linux security modules的基础上,MAC可以弥补DAC的缺陷

SEAndroid

  • SEAndroid有permissive和enforce两种模式
  • permissive模式只打印异常的LOG,但并不拒绝请求,enforce打印异常LOG,同时也可以拒绝请求
  • SEAndroid严格限制了ROOT权限,降低了关键进程遭受攻击的风险,进一步强化了APP的沙箱操作,确保APP难以做出异常或者攻击行为,使得APP动态权限调整成为可能
  • SEAndroid基本架构和原理:是典型的MAC实现,对系统中每一个对象都生成安全上下文,每一个对象访问系统资源都需要进行安全上下文审查
  • 流程:进程通过系统调用访问某个资源,进入kernel后会做基本的检测,然后进行DAC审查,然后调用Linux kernel module的hooks进行MAC验证,访问真正的系统资源,返回用户态
  • SEAndroid分为内核空间和用户空间,内核空间的实现基于LSM;而在用户空间,涉及到安全上下文(security context)、安全策略(SEAndroid policy)和安全服务(security server)这三个模块
  • 安全上下文:分为subject主体以及object访问对象,主体通常以进程为单位,客体就是进程的访问资源,通常是以文件为单位;执行ls -Z就能够查看安全上下文;一般为u:object_r:touch_device:s0;u代表SELinux user,object_r代表文件资源,touch_device代表文件资源的type,s0代表MLS的级别,进程的SContext通过ps -Z进行查看,标准格式为user:role:type[:range]
  • SEAndroid安全策略主要使用对象安全上下文的基础进行描述,通过主体和客体的安全上下文去定义主体是否有权限访问客体,称为TypeEnforcement,简称TE,在external/sepolicy,所有.te后缀的文件通过编译之后,都会生成一个sepolicy文件;TE一般放在evice/mediatek/common/sepolicy/和external/sepolicy中,包括如下文件
    • 针对attribute的策略:unconfined.te、domain.te、CTS.te、bluetooth.te、net.te、file.te
    • 针对daemon domain的策略:adbd.te、gpsd.te、netd.te、bluetoothd.te、zygote.te、ueventd.te、installd.te、vold.te、dbusd.te、keystore.te、debuggerd.te、mediaserver.te、rild.te、drmserver.te、surfaceflinger.te、qemud.te、servicemanager.te、su.te、shell.te、wpa_supplicant.te
    • 针对系统其他模块的策略:
      • app.te:在这一文件里将安装在系统上的第三方app分类为受信任的app和不受信任的app,分别用不同的type表示,再分别为这两种app在访问网络,bluetooth,sdcard,数据,缓存,binder等等名感位置时设置相应权限
      • system.te: 这一文件主要针对的是系统app和system server进程。对系统app访问binder、systemdata files、dalvikcatch、keystone等进行权限控制,对system server访问网络、bluetooth、netlink、app、binder、device、data files、socket、cache files等进行权限控制
      • init.te: 在这一文件中声明了init拥有无限权限
      • nfc.te: 在这一文件中制定了nfc domain对nfc设备和相关数据文件的访问权限
      • kernel.te: 在这一文件中声明了kernel拥有无限权限
      • radio.te: 在这一文件中制定了radio
      • radio.te: 在这一文件中制定了radio domain对init、rild和相关数据文件的访问权限
      • device.te: 在这一文件中定义了所有跟设备相关的type,并将这些type都归到了dev_type属性中
  • SELinux问题解决方法
    • 主要通过查看SELinux Policy Exception,关键字"avc"的log
    • 例子
    avc: denied { write } for pid=4663 comm="om.zte.engineer" name="brightness" dev="sysfs" ino=9451 scontext=u:r:radio:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0
    
    • 分析
      • 缺少的权限:{write/read}
      • 谁缺少权限:scontext=u : r : radio : s0
      • 哪个文件的权限:tcontext=u:object_r:sysfs:s0
      • 文件的类型:tclass=file
    • 解决
      • allow radio sysfs:file write
      • 公式:allow + scontext + tcontext + “:” + file + permission

你可能感兴趣的:(Android)