Android 利用安全加强型 Linux (SELinux) 对全部历程强制实行强制访问控制 (MAC),此中包括以 Root/超等用户权限运行的历程(Linux 功能)。
工作模式
宽容模式 - 仅记录但不强制实行 SELinux 安全政策。
强制模式 - 强制实行并记录安全政策。如果失败,则表现为 EPERM 错误。
可以通过getenfoce来获取当前工作模式:
- console:/ # getenforce
- Enforcing
复制代码 还可以通过setenforce 0来设置当前模式为Permissive:
- console:/ # setenforce 0
- console:/ # getenforce
- Permissive
复制代码 也可以通过setenforce 1来设置当前模式为Enforcing:
- console:/ # setenforce 1console:/ # getenforce
- Enforcing
复制代码 SELinux安全上下文
SELinux 管理过程中,历程是否可以精确地访问文件资源,取决于它们的安全上下文。历程和文件都有自己的安全上下文,SELinux 会为历程和文件添加安全信息标签,安全上下文的格式为:user:role:type:sensitivity[:categories],通常可以忽略上下文的 user、role 和 sensitivity 字段。当运行 SELinux 后,全部这些信息都将作为访问控制的依据。
- 1|console:/ # ls -Z
- u:object_r:cgroup:s0 acct u:object_r:tmpfs:s0 mnt
- u:object_r:apex_mnt_dir:s0 apex u:object_r:vendor_file:s0 odm
- u:object_r:rootfs:s0 bin u:object_r:vendor_file:s0 odm_dlkm
- u:object_r:rootfs:s0 bugreports u:object_r:oemfs:s0 oem
- u:object_r:cache_file:s0 cache u:object_r:postinstall_mnt_dir:s0 postinstall
- u:object_r:configfs:s0 config u:object_r:proc:s0 proc
- u:object_r:rootfs:s0 d u:object_r:system_file:s0 product
- u:object_r:system_data_root_file:s0 data u:object_r:rootfs:s0 sdcard
- u:object_r:mirror_data_file:s0 data_mirror u:object_r:tmpfs:s0 second_stage_resources
- u:object_r:tmpfs:s0 debug_ramdisk u:object_r:mnt_user_file:s0 storage
- u:object_r:device:s0 dev u:object_r:sysfs:s0 sys
- u:object_r:rootfs:s0 etc u:object_r:system_file:s0 system
- u:object_r:init_exec:s0 init u:object_r:system_dlkm_file:s0 system_dlkm
- u:object_r:rootfs:s0 init.environ.rc u:object_r:system_file:s0 system_ext
- u:object_r:linkerconfig_file:s0 linkerconfig u:object_r:vendor_file:s0 vendor
- u:object_r:metadata_file:s0 metadata u:object_r:vendor_file:s0
复制代码- console:/ # ps -Z -e |grep smartdevice
- u:r:mt_platform_app:s0 system 1512 384 1232712 75756 do_epoll_wait 0 S com.smartdevice.global.service
- u:r:system_app:s0 system 2081 384 1330484 186356 do_epoll_wait 0 S com.smartdevice.dailyshortcut
- u:r:system_app:s0 system 2123 384 1193112 55872 do_epoll_wait 0 S com.smartdevice.leanbacklauncher.customizer
- u:r:system_app:s0 system 3157 384 1302756 119640 do_epoll_wait 0 S com.smartdevice.dtv.icast
- u:r:untrusted_app_32:s0:c54,c256,c512,c768 u0_a54 3186 384 1883096 63176 do_epoll_wait 0 S com.smartdevice.tv.aircast
- u:r:mt_platform_app:s0 system 4268 384 1230384 94636 do_epoll_wait 0 S com.smartdevice.factory
- u:r:system_app:s0 system 8659 384 1195700 57920 do_epoll_wait 0 S com.smartdevice.bleconnectservice
- u:r:system_app:s0 system 11512 384 1262884 129512 do_epoll_wait 0 S com.smartdevice.ipcontrol
复制代码 历程SContext的type字段代表该历程所属的Domain。
3. 查看属性的安全上下文,实行下令如下:
- console:/mnt/vendor # getprop -Z persist.sys.locale
- u:object_r:locale_prop:s0
复制代码 安全策略
SELinux安全机制又称为是基于TE(Type Enforcement)策略的安全机制。全部安全策略都存放在.te结尾的文件中,一般放在 /system/sepolicy/private/,厂商定制的一般放在/device/xxx/sepolicy/下。
语句格式为:
- allow source target:class permissions;
- //source - 规则主题的类型(或属性),即进程的组,也就是进程的domain。
- //目标 - 对象的类型(或属性),即进程所要操作的文件的type。
- //类 - 要访问的对象(例如,文件、套接字)的类型,system/sepolicy/private/security_classes中有class的定义,常见的有file,dir等。
- //权限 - 要执行的操作(或一组操作,例如读取、写入),常见的有read , write, ioctrol, create, getattr, getattr等。
复制代码 示例:
- allow system_app vendor_configs_file:file { read getattr open };
- get_prop(system_app, vendor_default_prop) 其实是一个宏,展开如下:
- allow system_app vendor_default_prop:file r_file_perms;
复制代码 错误修改
常见错误
出现违反SELinux安全策略的错误时一般会有如下log输出:
- type=1400 audit(0.0:16187): avc: denied { read getattr open } for name="vendor" dev="tmpfs" ino=2 scontext=u:r:system_app:s0 tcontext=u:object_r:vendor_configs_file:s0 tclass=file permissive=0
复制代码 按照规则 allow scontex tcontex:tclass action 来改即可:
- allow system_app vendor_configs_file:file { read getattr open };
复制代码 违反规则的同时又neverallow问题修改
Google 在system/sepolicy中有利用相关neverallow 规则, 对SELinux Policy 的更新进行了限制, 以防止开发者过分开放权限,从而引发安全问题。而且通过CTS Test 检测开发者是否有违反相关的规则.
如:
- type=1400 audit(0.0:2928): avc: denied { search } for name="vendor" dev="tmpfs" ino=2 scontext=u:r:system_app:s0 tcontext=u:object_r:mnt_vendor_file:s0 tclass=dir permissive=0
复制代码 按照之前规则设置:
- allow system_app mnt_vendor_file:dir { search };
复制代码 编译出现报错:
- FAILED: out/soong/.intermediates/system/sepolicy/sepolicy.recovery/android_common/sepolicy
- out/host/linux-x86/bin/secilc -m -M true -G -c 30 out/soong/.intermediates/system/sepolicy/recovery_sepolicy.cil/android_common/recovery_sepolicy.cil -o out/soong/.intermediates/system/sepolicy/sepolicy.recovery/android_common/sepolicy_policy -f /dev/null && cp -f out/soong/.intermediates/system/sepolicy/sepolicy.recovery/android_common/sepolicy_policy out/soong/.intermediates/system/sepolicy/sepolicy.recovery/android_common/sepolicy && rm -f out/soong/.intermediates/system/sepolicy/sepolicy.recovery/android_common/sepolicy_policy # hash of input list: 187605db6ee3f7580bafd9adbd0101d2c2a0d02f423bb7efa74ee537c43d35ce
- neverallow check failed at out/soong/.intermediates/system/sepolicy/recovery_sepolicy.cil/android_common/recovery_sepolicy.cil:11171 from system/sepolicy/public/domain.te:1233
- (neverallow base_typeattr_281 mnt_vendor_file (dir (ioctl read write create getattr setattr lock relabelfrom relabelto append map unlink link rename execute quotaon mounton audit_access open execmod watch watch_mount watch_sb watch_with_perm watch_reads add_name remove_name reparent search rmdir)))
- <root>
- allow at out/soong/.intermediates/system/sepolicy/recovery_sepolicy.cil/android_common/recovery_sepolicy.cil:33799
- (allow system_app mnt_vendor_file (dir (search)))
- Failed to generate binary
- Failed to build policydb
复制代码 通过查看system/sepolicy/public/domain.te:
- # Platform must not have access to /mnt/vendor.
- neverallow {
- coredomain
- -init
- -ueventd
- -vold
- -system_writes_mnt_vendor_violators
- } mnt_vendor_file:dir *;
复制代码 domain.te文件中,明白domain中是没有对mnt_vendor_file的读写权限。
- 方法一:将 system_app 添加到上述neverallow的domain例外中,但后续大概会有cts问题,不发起利用。
- 方法二:将要操纵的文件界说为其他type,然后允许system_app来读写这个新type的文件。
- file.te新增mt_config_file SELinux type:
- type mt_config_file, file_type;
复制代码
- 绑定文件到SELinux type, file_contexts文件添加:
- /mnt/vendor/config(/.*)? u:object_r:mt_config_file:s0
- //这个含义代表/mnt/vendor/config下所有的文件或者目录的标签都是mt_config_file,
- //如果在mnt/vendor/config的子目录下,创建一个目录或者文件,并不给它打标签的话,那么这个新创建的文件或者目录会和父目录的标签一致
复制代码- allow system_app mt_config_file:dir search;
复制代码
- 发现还是无法访问,再修改权限域,seapp_contexts新建权限域:
- user=system seinfo=platform name=pkgNmae domain=mt_platform_app type=mt_tvapk_app_data_file
复制代码
- 最后新建mt_platform_app.te,申请权限:
- allow mt_platform_app mt_config_file:dir search;
复制代码 自界说Prop 错误
在mk中增加Prop,
- PRODUCT_PRODUCT_PROPERTIES += \
- ro.vendor.firmware.version=1.0.0
复制代码 通过SystemProperties去获取时发现出现Access denied finding property "ro.vendor.firmware.version"问题。
对于vendor下property权限,雷同file权限
- attribute mtk_core_property_type;
复制代码- vendor_public_prop(vendor_fw_version_prop)
- typeattribute vendor_fw_version_prop mtk_core_property_type;
复制代码- ro.vendor.firmware.version u:object_r:vendor_fw_version_prop:s0
复制代码- allow system_app vendor_fw_version_prop:file { map getattr open };
- get_prop(system_app, vendor_fw_version_prop)
复制代码 其他
App的上下文 seapp_contexts 文件,可以直接修改,push手机上。重启后见效。 属性的上下文
property_contexts 文件, 可以直接修改,push手机上。重启后见效。 服务的上下文 service_contexts
文件,可以直接修改,push手机上。重启后见效。 假造文件上下文 genfs_contexts 文件,通过chcon下令进行修改。
讲下文件上下文 file_contexts 文件的修改与测试。restorecon 下令可使文件上下文selinux政策见效。
restorecon -R
下令行:
修改某个文件(夹)的selinux lable:
- chcon <安全上下文> 文件
- chcon -R <安全上下文> 目录
复制代码 示例:
- chcon u:object_r:system_data_file:s0 epopdata.json
复制代码 修改前:
- console:/mnt/vendor/persist/config/EPOP # ls -Z
- u:object_r:mt_persist_file:s0 EPOP.zip u:object_r:mt_persist_file:s0 epopdata.json
- on -R -t u:object_r:system_data_file:s0 epopdata.json
复制代码 修改后:
- console:/mnt/vendor/persist/config/EPOP # ls -Z
- u:object_r:mt_persist_file:s0 EPOP.zip u:object_r:system_data_file:s0 epopdata.json
复制代码 修改 /vendor/tvconfig/config/app 下文件上下文示例:
- 首先修改vendor_file_contexts 文件:
- 把 /vendor/tvconfig/(.*)? u:object_r:vendor_configs_file:s0
- 修改为:/vendor/tvconfig/(.*)? u:object_r:vendor_configs_file_new:s0
复制代码- console:/vendor/tvconfig/config/app # restorecon config.json -v
- SELinux: Loaded file context from:
- /system/etc/selinux/plat_file_contexts
- /system_ext/etc/selinux/system_ext_file_contexts
- /product/etc/selinux/product_file_contexts
- /vendor/etc/selinux/vendor_file_contexts
- SELinux: Relabeling /vendor/tvconfig/config/app/config.json from u:object_r:vendor_configs_file:s0 to u:object_r:vendor_configs_file_new:s0.
复制代码 TE文件说明:
可用于加标签的文件名含义对应的声明文件名file_contexts给文件/目次/节点 新增标签file.tegenfs_contexts给节点新增标签,与上一个不同的是,不消实行restorecon操纵file.tehwservice_contexts给hal服务新增标签hwservice.teproperty_contexts给prop服务新增标签property.teseapp_contexts给APP新增标签untrusted_app,te app.te,system_app.te…等service_contexts给系统服务新增标签service.te
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |