
文章目录一、Selinux相关概念DAC 与 MAC---自助式访问控制 与 强制访问控制传统自助访问控制DAC介绍---基于Linux GID/UID机制的Selinux---一种基于域-类型模型的强制访问控制MAC安全系统SeAndroid---Android推出一套以SELinux为核心的系统安全机制二、Selinux规则详解2.1 Selinux编译配置---要使用要先编译进入内核2.2 Selinux三种基本模式---disable/permissive/enforcing2.3 Selinux安全策略Policy的制定安全上下文security context概念---描述访问主客体策略Policy基础语法---描述访问规则策略制定相关文件---安全上下文定位contexts文件策略配置te文件三、Selinux问题定位典型的MAC权限保报错日志参考一、Selinux相关概念DAC 与 MAC—自助式访问控制 与 强制访问控制Linux上传统的访问控制标准是自主访问控制Discretionary Access ControlDAC。这种形式下一个软件或守护进程以User IDUID或Set owner User IDSUID的身份运行并且拥有该用户的目标文件、套接字、以及其它进程权限。这使得恶意代码很容易运行在特定权限之下从而取得访问关键的子系统的权限。强制访问控制Mandatory Access ControlMAC对系统中的资源分密级和类别进行管理保证每个用户只能访问那些明确授权可以访问的资源该限制单元独立于传统的Linux安全机制运作并且没有超级用户的概念。注意当DAC和MAC并存在一次访问过程中系统先进行DAC检查通过后再进行MAC检查。传统自助访问控制DAC介绍—基于Linux GID/UID机制的资源访问权限有访问主体如进程和客体如文件的属性决定可以通过ls -al查看其属性文件类型属主权限属组权限其他用户权限。运行期间资源的所有者属主和同组成员可以修改其权限用以被其他主体访问如chmod 777 xxx.png;ls-aldrwxr-xr-x133root root12288Aug2616:37 etc drwxr-xr-x4root root4096Jun62020home lrwxrwxrwx1root root33Jun92020initrd.img -boot/initrd.img-4.4.0-148-generic lrwxrwxrwx1root root33Jun92020initrd.img.old -boot/initrd.img-4.4.0-142-genericSelinux—一种基于域-类型模型的强制访问控制MAC安全系统安全增强型 LinuxSecurity-Enhanced Linux简称 SELinux它是一个 Linux 内核模块也是 Linux 的一个安全子系统。由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。将系统中的资源分密级和类别进行管理保证每个用户只能访问那些明确授权可以访问的资源制定访问者与被访问资源之间的访问规则。SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源最小权限原则。SeAndroid—Android推出一套以SELinux为核心的系统安全机制从Android 4.3开始Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制甚至包括以 Root/超级用户权限运行的进程。更好地保护和限制系统服务、控制对应用数据和系统日志的访问、降低恶意软件的影响。如果需要通过Android的CTS认证必须要让Selinux使能并处于强制模式。打开Selinux必然会对性能有一定影响。二、Selinux规则详解由于SeAndroid是基于Selinux的后续内容描述没有他们割离开来将涉及android部分即SeAndroid相关扩展2.1 Selinux编译配置—要使用要先编译进入内核首先Selinux是一个内核子模块无论启动后需要将Selinux工作在任何模式需要先在内核编译时带上他。在内核中启用 SELinuxCONFIG_SECURITY_SELINUXy一般情况启动时处于强制模式还是宽容模式常用bootargs来进行配置传递给kernel进行默认初始值设置有些linux版本通过配置文件/etc/selinux/config来记录启动默认值看实际玩法。BOARD_KERNEL_CMDLINE : androidboot.selinuxpermissive2.2 Selinux三种基本模式—disable/permissive/enforcing当编译进入内核后启动kernel之后Selinux状态(模式)有如下三种1、disabled 关闭selinux完全失效2、permissvie 宽容模式发生违反权限事件只记录日志并不禁止操作3、enforcing 强制模式发生违反权限事件记录日志并禁止操作状态查看命令getenforce会显示是Disabled, permissvie, enforcing宽容与强制模式切换命令setenforce 0/10表示宽容模式1表示强制模式需要root权限2.3 Selinux安全策略Policy的制定安全策略规则就是描述 允许 谁 能对 什么资源 做什么事情或者 禁止 谁 对 什么资源 做什么事情。用于判定操作合法性。安全上下文security context概念—描述访问主客体安全上下文就是一个标签Label用来标识对象的安全所属范围即 描述在权限规则中 主体或客体 “谁” 这一个概念。安全上下文的典型定义usr:role:type:sensitivity;其中usr在SeAndroid值固定urole可以为r表示主体或者objpect_r表示客体sensitivity为s0等级type就是重点表诉 在安全规则中 是 谁 这一概念查看方法1进程类服务、APKps带上-Z命令即显示安全上下文的标签第一列即是注意app主要分三类untrusted_app第三方应用platform_app有平台签名应用system_app有平台签名并且有system权限的应用HWRVL:/ $ps-A-ZLABELUSERPIDPPIDVSZ RSS WCHAN ADDR S NAME u:r:init:s0 root1035864193600S init u:r:kernel:s0 root200000S[kthreadd]u:r:servicemanager:s0 system522112516176000S servicemanager u:r:hwservicemanager:s0 system52312127260252400S hwservicemanager u:r:vndservicemanager:s0 system524113024144400S vndservicemanager u:r:hal_hwfactoryinterface_de system525130988202800S vendor.huawei.hardware.hwfactoryinterface1.1-service u:r:system_app:s0 system192258842921605241600S com.huawei.powergenie u:r:radio:s0 radio194258844108606059200S com.android.phone u:r:platform_app:s0:c512,c768 u0_a681958588557879213361200S com.huawei.android.launcher u:r:kernel:s0 root195920000S[kbase_event]u:r:untrusted_app:s0:c155,c25 u0_a155208458919541727673600S com.UCMobile:push2文件类包含设备节点虚拟文件等ls命令带-Z即显示安全上下文的标签。1|HWRVL:/ $ls-al-Zdrwxr-xr-x2root root u:object_r:radio_data_file:s002018-08-08 00:01 3rdmodem drwxr-xr-x2root root u:object_r:radio_data_file:s002018-08-08 00:01 3rdmodemnvm drwxr-xr-x2root root u:object_r:radio_data_file:s002018-08-08 00:01 3rdmodemnvmbkp dr-xr-xr-x105root root u:object_r:cgroup:s002021-08-2220:43 acct lrw-r--r--1root root u:object_r:rootfs:s0112018-08-08 00:01 bin -/system/bin lrw-r--r--1root root u:object_r:rootfs:s0502018-08-08 00:01 bugreports -/data/user_de/0/com.android.shell/files/bugreports drwxrwx---7system cache u:object_r:cache_file:s040962020-10-06 02:22 cache lrw-r--r--1root root u:object_r:rootfs:s0132018-08-08 00:01 charger -/sbin/charger策略Policy基础语法—描述访问规则1、描述 谁 能对或者禁止对 什么类型的资源 进行 什么 操作权限语法如下rule_variant source_types target_types : classes permissionsrule_variant规则类型声明包含allow允许 neverallow禁止allowaudit记录dontaudit失败不记录 source_types访问主体对象的安全上下文type或attribute如进程的u:r:kernel:s0中的kernel target_types访问客体对象的安全上下文type或attribute如文件的u:object_r:rootfs:s0中的rootfs classes访问客体的类型中的具体类别提示被访问的是什么东西如file文件 permissions需要获取的权限比如wrirte、read、ioctrl这里可以是一些宏包含一组权限用来简化规则 小技巧简化1如果有多个source_typetarget_typeclass或perm_set可以用”{}”括起来2~号表示除了~以外3-号表示去除某项内容4*号表示所有内容比如// 允许init域进程对shell_data_file,app_data_file类型字符文件普通文件执行除了execmod execute relabelto以外的操作allow init { shell_data_file app_data_file}:{ chr_file file } ~{execmod execute relabelto};2、type/ attribute/ typeattribute声明命令进行类型关联描述谁的关系性语法如下type type_id [attribute_id][attribute_id] … // 表示定义把type并和一个到多个attribute关联attribute attr_id // 定义一个attribute属性就是一组type的集合typeattribute type_id attr_id // 把已经定义的type和 attribute进行关联attribute就是一组type的集合作为规则的执行对象。比如domain包含了一系列进程的typeinit、debuggerd、kernel、system等。有了attribute之后可以将这些type与某个attribute关联起来把这些type共有的权限通过一条allow语句来设置attribute的属性不需要每条type单独配置attribute attr_test;# 声明attr_test属性typet_a, attr_test;# 定义t_a 类型 并关联 attr_test 属性typet_b, attr_test;allow attr_test t_c:fileread;策略制定相关文件—安全上下文定位contexts文件策略配置te文件安全上下文通过文件的方式定义不同的android版本存放的目录或者名称上有少量差异往往 还会 分为google原生定义、vender供应商定义、平台的定义等。例如默认android9.0上的配置文件举例/system/sepolicy/private/基本都分为以下几类、file_contexts 文件安全上下文定义/(vendor|system/vendor)(/.*)? u:object_r:vendor_file:s0 /(vendor|system/vendor)/bin/sh u:object_r:vendor_shell_exec:s0 /(product|system/product)(/.*)? u:object_r:system_file:s0 // 该目录下默认上下文为system_file /dev(/.*)? u:object_r:device:s0 /mnt u:object_r:tmpfs:s0 /sys u:object_r:sysfs:s0 /dev/binder u:object_r:binder_device:s0 /dev/socket/netd u:object_r:netd_socket:s02、service_contexts 服务安全上下文storaged u:object_r:storaged_service:s0 storaged_pri u:object_r:storaged_service:s0 storagestats u:object_r:storagestats_service:s0 SurfaceFlinger u:object_r:surfaceflinger_service:s0 system_update u:object_r:system_update_service:s0 * u:object_r:default_android_service:s0 // 任意取名默认权限3、property_contexts 系统属性 安全上下文注意系统属性get时不会检测set都会做mac检测sys. u:object_r:system_prop:s0 sys.cppreopt u:object_r:cppreopt_prop:s0 log. u:object_r:log_prop:s0 log.tag u:object_r:log_tag_prop:s0 persist.audio. u:object_r:audio_prop:s0 persist.bluetooth. u:object_r:bluetooth_prop:s0 ro.vendor.config.hw_vowifi u:object_r:vowifi_prop:s0 * u:object_r:default_prop:s0 // 任意取名默认权限4、app安全上下文和seapp_contexts进程的安全上下文 可以通过静态设置 和 动态转换为app打标签mac_permissions.xml根据apk签名设置app的seinfoAndroidL只识别platform签名其它都是default!-- Platform dev keyinAOSP --signersignaturePLATFORMseinfovalueplatform//signer!-- All other keys --defaultseinfovaluedefault//default接下来seapp_contexts根据seinfo和user来为app打标签usersystemdomainsystem_apptypesystem_app_data_fileuserbluetoothdomainbluetoothtypebluetooth_data_file … …# 三方的apk如果有platform签名则运行在platform_app域user_appseinfoplatformdomainplatform_apptypeapp_data_file# 三方的apk如果没有platform签名则运行在untrusted_app域user_appdomainuntrusted_apptypeapp_data_file、除了以上各类安全上下文定位的文件剩下的.te文件就是策略文件*部分举例如下# /system/sepolicy/private/adbd.te文件# adb pull /data/local/traces/*allow adbd trace_data_file:dir r_dir_perms;allow adbd trace_data_file:file r_file_perms;# Run /system/bin/buallow adbd system_file:file rx_file_perms;# /system/sepolicy/private/service.te 文件typestats_service, service_manager_type;typestatscompanion_service, system_server_service, service_manager_type;# /system/sepolicy/private/untrusted_app.te 文件typeattribute untrusted_app coredomain;app_domain(untrusted_app)untrusted_app_domain(untrusted_app)net_domain(untrusted_app)bluetooth_domain(untrusted_app)三、Selinux问题定位典型的MAC权限保报错日志一般通过 logcat | grep ‘avc|denied’ 关键字。或者在dmesg中搜索类似如下6[12.435524] type1400 audit(3635791.670:21): avc: denied { read write } for pid273 comm“mediaserver” name“tfa98xx” dev“tmpfs” ino9770 scontextu:r:mediaserver:s0 tcontextu:object_r:device:s0 tclasschr_file表示 { read write } 一次读写权限被拒绝主体的mediaserver这个进程其安全上下文是u:r:mediaserver:s0访问的客体安全上下文是u:object_r:device:s0客体类型chr_file字符文件参考android官方文档:https://source.android.google.cn/security/selinux?hlzh_cnAndroid安全机制https://www.kancloud.cn/alex_wsc/androids/472168https://blog.csdn.net/qq_33750826/article/details/80743035https://blog.csdn.net/paul_liao/article/details/50837873https://www.jianshu.com/p/ba7c4e8cd699