首页 > 系统相关 >Android SELinux权限

Android SELinux权限

时间:2024-11-18 16:22:40浏览次数:1  
标签:sepolicy object vendor SELinux s0 system file Android 权限

Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制 (MAC),其中包括以 Root/超级用户权限运行的进程(Linux 功能)。

工作模式
宽容模式 - 仅记录但不强制执行 SELinux 安全政策。
强制模式 - 强制执行并记录安全政策。如果失败,则显示为 EPERM 错误。
可以通过getenfoce来获取当前工作模式:
还可以通过setenforce 0来设置当前模式为Permissive:
也可以通过setenforce 1来设置当前模式为Enforcing:

SELinux安全上下文
SELinux 管理过程中,进程是否可以正确地访问文件资源,取决于它们的安全上下文。进程和文件都有自己的安全上下文,SELinux 会为进程和文件添加安全信息标签,安全上下文的格式为:user:role:type:sensitivity[:categories],通常可以忽略上下文的 user、role 和 sensitivity 字段。当运行 SELinux 后,所有这些信息都将作为访问控制的依据。

1、查看文件和目录的安全上下文,执行命令如下:

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   

2、查看进程的安全上下文,执行命令如下

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的文件。
1、file.te新增mt_config_file SELinux type:

type mt_config_file, file_type;

2、绑定文件到SELinux type, file_contexts文件添加:

/mnt/vendor/config(/.*)?                                u:object_r:mt_config_file:s0
//这个含义代表/mnt/vendor/config下所有的文件或者目录的标签都是mt_config_file,
//如果在mnt/vendor/config的子目录下,创建一个目录或者文件,并不给它打标签的话,那么这个新创建的文件或者目录会和父目录的标签一致

3、申请权限:

allow system_app mt_config_file:dir search;

4、发现还是无法访问,再修改权限域,seapp_contexts新建权限域:

user=system seinfo=platform name=pkgNmae domain=mt_platform_app type=mt_tvapk_app_data_file

5、最后新建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权限

1、attributes.te定义type:

attribute mtk_core_property_type;

2、在property.te 中添加:

vendor_public_prop(vendor_fw_version_prop)
typeattribute vendor_fw_version_prop                        mtk_core_property_type;

3、在property_contexts中添加:

ro.vendor.firmware.version                              u:object_r:vendor_fw_version_prop:s0

4、system_app.te添加权限

allow system_app vendor_fw_version_prop:file { map getattr open };
get_prop(system_app, vendor_fw_version_prop)

image

标签:sepolicy,object,vendor,SELinux,s0,system,file,Android,权限
From: https://www.cnblogs.com/baiyunyouyou/p/18552912

相关文章

  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】绘制空心圆圈
    Androidjava绘制圆圈自定义CircleViewpackagecom.java.circle;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Paint;importandroid.view.View;publicclassCircleViewextendsView{privatePaintpaint;......
  • QT 6.8 安卓 Android 环境安装配置,你踩了几个坑,我教你跳出来,早看不入坑… …
    安装了QT6.8最新版本,在线安装,用了数天后,想开始写一个Android程序,发现还在配置环境才可以继续,于是就开始配置: 菜单:编辑-->preferences-->设备-->Android         [界面没有完全本地化,部分会是英文,无紧要,看习惯了一样] 因为之前己安装了java开发环境,所以JDK......
  • Android 10.0 Service启动流程分析一
    1.概述在10.0的系统rom开发中,app中对于Service的使用也是非常常见的,但是在系统framework中同样需要了解service的启动流程,看下service具体是怎么样启动的,这样就可以方便解决一些服务相关问题2.Service启动流程分析一的核心类frameworks\base\core\java\android\app\Contex......
  • 如何在Mac上直接编辑Android设备上的文件?推荐使用MacDroid Pro
    MacDroidPro是一款功能强大、易于使用的跨平台文件传输与管理软件。它能够实现Mac电脑与Android设备之间的无缝连接和传输,提供全面的文件管理和同步功能,并具备直观易用的界面和安全可靠的数据保障。 MacDroidPro通过以下步骤实现Mac电脑与Android设备之间的文件传输:下载......
  • 【Android Studio 2022软件下载与安装教程】
    1、安装包AndroidStudio2022:链接:https://pan.quark.cn/s/9821141ab2c7提取码:aTaw2、安装教程1)       解压下载安装包,双击Setup.exe安装,弹窗安装对话框  2)       点击下一步  3)       默认,点击下一步  4)       选择安......
  • 如何从 Android 图库中恢复误删除的照片
    如果您正在阅读这篇文章,那么您肯定意外地从Android设备中删除了照片。并且您正在寻找一种简单的方法来恢复Android图库中已删除的照片。从图库恢复已删除的照片随着技术的进步,现在使用单个设备(即Android手机),您就可以捕捉图像、根据需要编辑图像、高效管理图像、存储图......
  • Android Studio 2023搭建Flutter开发环境
    1、安装PluginsFlutter,搜索出来,就点击Install。安完之后重启AndroidStudio。            2、再到Plugins查看Installed,是否安装成功了Flutter和Dart。3、安装FlutterSDK,下载地址:https://docs.flutter.dev/get-started/install/windows/mobile4......
  • 织梦网站修改需要权限吗,如何获取织梦网站修改权限
    联系网站管理员如果您不是网站的管理员,需要联系网站管理员或拥有管理员权限的人员,请求他们授予您修改权限。登录织梦后台使用管理员账号登录到织梦后台管理界面。进入用户管理在后台管理界面中,找到并点击“系统”-“用户管理”选项。添加或编辑用户如果需要......
  • 【Linux之权限】理论篇
    前言Linux的权限是我们学习Linux初期非常重要的基础知识,接下来我将通过一个系列【Linux之权限】,共三篇文章,对此进行较为全面和详细的解说。sudo情况:如果我们不是超级管理员,但是想执行一个权限级别比较高的指令,比如我们想以超级管理员的身份来创建一个文件,那么就:sudotou......
  • C++继承权限
    目录1.相关概念 2.继承权限private:protectedpublic:3.继承中的构造函数与析构函数4.继承同名成员的处理方式5.多继承1.相关概念  定义:允许一个类继承另外一个类的属性和方法。 好处:可以减少一些重复性的代码 语法:classA :继承权限 B     ......