当前位置:   article > 正文

selinux权限

selinux权限

学习记录以下内容皆以我们项目为例子

内部存储和外部存储文件路径API

getFilesDir --> /data/user/0/com.path/files
getExternalFilesDir --> /storage/emulated/0/Android/data/com.path/files
getCacheDir() --> /data/user/0/com.path/cache
getExternalCacheDir() --> /storage/emulated/0/Android/data/com.path/cache
getDataDirectory --> /data
getDownloadCacheDirectory --> /data/cache
getExternalStorageDirectory --> /storage/emulated/0
getRootDirectory --> /system
getExternalStoragePublicDirectory 参数指定为:Environment.DIRECTORY_PICTURES -->/storage/emulated/0/Pictures
在这里插入图片描述下面是根目录下一些目录参数,可以附上参数获取对应的路径。Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString()

public static String DIRECTORY_MUSIC = "Music";音乐保存的位置,音乐存放的标准目录。
public static String DIRECTORY_PODCASTS = "Podcasts";用于保存podcast的音频文件,系统广播存放的标准目录。
public static String DIRECTORY_RINGTONES = "Ringtones";保存铃声的位置,系统铃声存放的标准目录。
public static String DIRECTORY_ALARMS = "Alarms";警报的铃声,系统提醒铃声存放的标准目录。
public static String DIRECTORY_NOTIFICATIONS = "Notifications";通知音保存的位置,系统通知铃声存放的标准目录。
public static String DIRECTORY_PICTURES = "Pictures";下载的图片保存的位置,用于放置用户可用图片的标准目录。
public static String DIRECTORY_MOVIES = "Movies";电影保存的位置,用于放置用户可用的电影的标准目录。
public static String DIRECTORY_DOWNLOADS = "Download";下载的文件的标准目录。
public static String DIRECTORY_DCIM = "DCIM";相机拍摄的图片和视频保存的位置。
public static String DIRECTORY_DOCUMENTS = "Documents";存放用户创建的文档的标准目录。
public static String DIRECTORY_SCREENSHOTS = "Screenshots";放置用户拍摄的屏幕截图的标准目录。
public static String DIRECTORY_AUDIOBOOKS = "Audiobooks";标准目录,其中放置任何音频文件电子书。
在这里插入图片描述

如何动态申请权限?

requestPermissions(arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.MANAGE_EXTERNAL_STORAGE),
0)
在这里插入图片描述

其他获取sdcard路径的方式?

private String getSDCardPath() throws Exception
{
    StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);

    Class<?> storageVolumeClass = Class.forName("android.os.storage.StorageVolume");
    Method getVolumeList = sm.getClass().getMethod("getVolumeList");
    Method getPath = storageVolumeClass.getMethod("getPath");
    Method isRemovable = storageVolumeClass.getMethod("isRemovable");
    Object result = getVolumeList.invoke(sm);
    for(int i = 0; i < Array.getLength(result); ++i)
    {
        Object element = Array.get(result, i);
        boolean removable = (Boolean) isRemovable.invoke(element);
        if(removable)
        {
            return (String) getPath.invoke(element);
        }
    }

    throw new RuntimeException("no suitable SD path found");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

sepolicy权限

以下是我们项目里四种type app的安全配置文件,对应的权限。selinux的文件比较多,一般来说添加权限我们是修改device下面的。
路径:/device/qcom/sepolicy/vendor/common
untrusted_app.te
neverallow untrusted_app diag_device:chr_file rw_file_perms;
allow untrusted_app wbc_service:service_manager find;
allow untrusted_app gba_auth_service:service_manager find;
allow system_app sysfs_socinfo:file rw_file_perms;
allow priv_app sysfs_socinfo:file rw_file_perms;

路径:/device/qcom/sepolicy/vendor/msms8953
system_app.te
allow system_app reserved_file:dir { search };
allow system_app reserved_file:file { getattr open read write };
allow system_app sysfs_info:dir { search };
allow system_app sysfs_info:file { getattr open read write };

allow system_app sysfs_subbatt:dir { search };
allow system_app sysfs_subbatt:file { getattr open read write };

platform_app.te
allow platform_app oemfs:lnk_file { read getattr };

priv_app.te
allow platform_app oemfs:lnk_file { read getattr };

安全上下文

SELinux有下面三种状态:

  • Disabled //SELinux未启用
  • Enforcing //SELinux处于开启状态(强制模式)
  • Permissive //SELinux处于关闭状态(只给出警告)
  • 在这里插入图片描述
    下面是hera_pro目前挂载的分区对应的sepolicy和用户以及用户组权限:
    在这里插入图片描述

modem --> dr-xr-x— 4 system system u:object_r:firmware_file:s0 16384 1969-12-31 19:00 /vendor/firmware_mnt/
在这里插入图片描述
system\core\include\private\android_filesystem_config.h在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
system/core/libcutils/fs_config.cpp
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上下文定义:

  • file_contexts 文件上下文
  • property_contexts 属性上下文
  • genfs_contexts 虚拟文件系统上下文
  • service_contexts service上下文
  • seapp_contexts app安全上下文
  • port_contexts 端口上下文

untrusted_app?

在这里插入图片描述untrusted_app如何添加权限成为platform_app?
1.第一种方法通过sign签名的方式可以直接将第三方app转为平台app

2.第二种修改Android.mk文件里的[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ax6VGQzK-1660897756806)(/home/user/.config/Typora/typora-user-images/image-20210909165208574.png)]
再通过mm命令编译apk
在这里插入图片描述untrusted_app如何添加权限成为system_app?
在AndroidManifest.xml文件里添加在这里插入图片描述在Android.mk文件里添加
在这里插入图片描述
在这里插入图片描述

如果缺权限如何添加?

Domain - 一个进程或一组进程的标签。也称为域类型,因为它只是指进程的类型(ps -A -Z)
Type - 一个对象(例如文件、套接字)或一组对象的标签。(ls -Z)
Class - 要访问的对象(例如文件、套接字)的类型
Permission - 要执行的操作(例如读取、写入)在这里插入图片描述
修改SELinux对应的te文件可能会导致gms测试有fail项,一般来说我们修改device\xxx\sepolicy\common\下的te文件,不要去动到system/sepolicy目录下的te文件的neverallow,就不会有什么问题。如果allow和neverallow冲突了,编译是会报错的。

可在/device/qcom/sepolicy/common/untrusted_app.te文件中增加如下语句解决此问题:

allow untrusted_app sysfs_irdev : file { write };

untrusted app, platform app, system app 对各个路径的访问权限

1.第三方app可以访问哪些路径?

私有数据默认写到/Android/data/pagename/files,这里的数据会随着app删除而删除。

可以访问/data/user/0/com.mitac.cradle/cache/1.txt

2.平台app可以访问哪些路径?

私有数据默认写到/Android/data/pagename/files,这里的数据会随着app删除而删除。

可以访问/data/user/0/com.mitac.cradle/cache/1.txt

可以访问/mnt/sdcard/Android/data/com.mitac.cradle/1.txt

无法访问/mnt/sdcard

无法访问/sys/sys_info/module/touch/sensitivity/level在这里插入图片描述
3.系统app可以访问哪些路径?

私有数据默认写到/Android/data/pagename/files,这里的数据会随着app删除而删除。

可以访问/sys/sys_info/module/touch/sensitivity/level

可以访问/cache

可以访问/Reserved /Reserved1/

可以访问/data/user/0/com.mitac.cradle/cache/

可以访问/mnt/sdcard/

可以访问/storage/emulated/0/

无法访问/proc/partitions
在这里插入图片描述

代码方法:

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/324283?site
推荐阅读
相关标签
  

闽ICP备14008679号