为Android自定义服务配置SElinux权限

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为Android自定义服务配置SElinux权限相关的知识,希望对你有一定的参考价值。

参考技术A 这里有两种选择:

如果使用自定义服务类型,那么一定要有这一步。如果使用已有的服务类型,那么应用可能已经具备找到服务的权限了。具体配置方法如下:

这里是让拥有系统签名但没有system权限的应用可以通过ServiceManager找到hatpreview_service类型的服务。另外类型的应用需要在priv_app.te和system_app.te中进行配置。

Native的服务一般是通过rc文件定义的可执行程序拉起并注册进ServiceManager的,所以要对可执行程序做如下权限配置:

根据自己的情况替换previewserver和previewserver_exec哦。
然后就是配置服务的具体权限。如果我们用到了某样权限但并没有在SELinux中配置,在运行时会看到如下报错log:

权限配置格式如下:

以下是示例:

Android 在 SElinux下 如何获得对一个内核节点的访问权限

本文转载自:http://blog.csdn.net/u012719256/article/details/52585956

Android 5.0下,因为采取了SEAndroid/SElinux的安全机制,即使拥有root权限,或者对某内核节点设置为777的权限,仍然无法在JNI层访问。

本文将以用户自定义的内核节点/dev/wf_bt为例,手把手教会读者如何在JNI层获得对该节点的访问权限。
 
第一步:找到需要访问该内核节点的进程(process),笔者自己这个节点由system_server进程来访问
 
第二步:打开文件AndroidL/android/external/sepolicy/file_contexts.be
仿照这个文件里的写法,为你的节点定义一个你想要的名字:
[python] view plaincopy技术分享技术分享
 
 
  1. /dev/tegra.* u:object_r:video_device:s0  
  2. /dev/tf_driver u:object_r:tee_device:s0  
  3. /dev/tty u:object_r:owntty_device:s0  
  4. /dev/tty[0-9]* u:object_r:tty_device:s0  
  5. # We add here  
  6. /dev/wf_bt              u:object_r:wf_bt_device:s0  
wf_bt_device是自定义,其他左右两边的内容都和上面的范例一致。
 
第三步:打开文件AndroidL/android/external/sepolicy/device.te
仿照这个文件里的写法,将刚刚第二步写的wf_bt_device声明为dev_type:
[python] view plaincopy技术分享技术分享
 
 
  1. # Device types  
  2. type device, dev_type, fs_type;  
  3. type alarm_device, dev_type, mlstrustedobject;  
  4. type adb_device, dev_type;  
  5. type ashmem_device, dev_type, mlstrustedobject;  
  6. type audio_device, dev_type;  
  7. type binder_device, dev_type, mlstrustedobject;  
  8. type block_device, dev_type;  
  9. # We add here  
  10. type wf_bt_device, dev_type;  
第四步:
AndroidL/android/external/sepolicy/目录下很多.te文件都是以进程名来结尾的,比如有针对surfaceflinger进程的surfaceflinger,有针对vold进程的vold.te,
刚刚从第一步得到,这个节点是由system_server进程来访问,所以,我们找到system_server.te打开,加入允许这个进程对/dev/wf_bt的读写权限,
 
[python] view plaincopy技术分享技术分享
 
 
  1. # Read/Write to /proc/net/xt_qtaguid/ctrl and and /dev/xt_qtaguid.  
  2. allow system_server qtaguid_proc:file rw_file_perms;  
  3. allow system_server qtaguid_device:chr_file rw_file_perms;  
  4.   
  5. # chr_file表示字符设备文件,如果是普通文件用file,目录请用dir  
  6. # rw_file_perms代表读写权限  
  7. allow system_server wf_bt_device:chr_file rw_file_perms;  // 允许system_server进程拥有对wf_bt_device的这个字符设备的读写权限;
这句话的意思是:允许system_server进程拥有对wf_bt_device的这个字符设备的读写权限。
改了这些之后,你就可以make installclean;make -j16编译image来验证权限是否获取成功。
 
fd =open("/dev/wf_bt",O_RDONLY | O_NOCTTY); 绝对成功!!!!!

=====================================

allow system_server wf_bt_device:chr_file rw_file_perms; //允许system_server进程拥有对wf_bt_device的这个字符设备的读写权限。

以上是关于为Android自定义服务配置SElinux权限的主要内容,如果未能解决你的问题,请参考以下文章

Android 5.x SEAndroid/SElinux内核节点的读写权限学习笔记

Android : 为系统服务添加 SELinux 权限 (Android 9.0)

实现自己的HAL-15 控制led(Android 8.1 selinux 配置(自定义系统服务,以及节点的读写)),从app 到 hal 到底层内核kernel层的驱动 的实现

实现自己的HAL-15 控制led(Android 8.1 selinux 配置(自定义系统服务,以及节点的读写)),从app 到 hal 到底层内核kernel层的驱动 的实现

SELinux安全机制 自定义用户环境 firewalld基础配置

为 Android M 权限对话框提供自定义文本