当前位置: 首页 > 科技观察

Android权限中要掌握的三个模块

时间:2023-03-11 23:05:00 科技观察

作者|赵清瑶点评|孙淑娟经过几天的分析,才明白关闭权限只是关闭Android的一部分权限,而不是全部权限。最后修改文件属性后,我的服务可以正常启动了。经历了这件事后,我决心把自己的经验总结出来,分享给志同道合的朋友。根据我个人的工作经验,我把Android权限分为以下三个部分:设置文件的属性和使用allow语句配置某个应用程序访问某个文件的权限。Linux系统原生用户,用户组权限点1和点2属于SELinux的范畴。这两部分是互补的。通过设置文件属性来配置一个文件是否为可执行文件,我们可以使用allow语句来配置可执行文件可以访问的文件资源及其对文件的访问权限。资源的操作权限;第三点属于Linux等系统的共性,与前两点完全不同。写入执行权限。下面我们先来认识一下SE??Linux,再详细看一下上面的三个部分。SELinux相关命令关闭SELinux权限:setenforce0,即设置SELinux为宽容模式,违反Selinux规则的行为会被记录下来,但不会被屏蔽。开启SELinux权限:setenforce1,即设置SELinux为enforcing模式,对违反Selinux规则的行为会进行记录和阻断。获取SELinux权限:getenforce上面三个命令的执行情况如下图1所示,供大家参考。图1:SELinux命令演示查看SELinux权限:在命令参数中添加-Z(注意这里是大写字母)选项。如果要查看文件,使用图2红框内的方法。图2:查看文件权限如果要查看进程权限,可以使用图2中提到的方法。图2列出了不查看的方法权限和查看权限,方便对比。图3:查看进程对应的SELinux权限下面图4是查看属性权限的命令。图4:查看属性权限配置SELinux权限这里,我用一个例子来说明如何配置。如果我们有一个可执行文件,我们使用test_bin来表示这个可执行文件需要访问我们的驱动程序节点/dev/test。在这种情况下,我们需要配置4个地方。1、在file_contexts中配置文件/dev/test。配置方法如下(首先假设已经定义了test_dev_node和test_bin_exec,后面会解释):est_bin_exec已经定义,后面会解释):/dev/testu:object_r:test_dev_node:s0test_bin(the这里需要使用test_bin的绝对路径)u:object_r:test_bin_exec:s0这个配置语句的意思是将我们的设备节点/dev/test配置为test_dev_node类型,将可执行文件test_bin配置为test_bin_exec类型,其余还有具体的意义,但对于用户来说,可以暂时忽略。配置具体项目时,只需替换上面配置文件中标注的内容即可。2、配置对应的te文件类型test_dev_node、dev_type;输入test_bin_exec、exec_type、vendor_file_type、file_type;允许test_bin_exectest_dev_node:chr_filerw_file_prems;以上三个语句主要完成两种工作,即类型定义和allow语句,两者比较重要,定义好类型后,我们就可以配置对应类型的资源,比如配置/dev/test和上面的test_bin,还有allow语句就是配置我们常说的权限。上面的allow语句是设置类型为test_bin_exec,可执行程序可以访问test_dev_node类型的文件。我把这个过程总结为定义类型---配置类型---设置权限。除了上述内容,Android系统还有property_contexts、service_contexts、seap_contexts等类型。不管是什么类型,我们都是通过三个步骤定义类型---配置类型---设置权限,结合需要处理的文件类型完成权限配置,比如属性文件。在定义类型时,其声明格式为typexxxproperty_type。如果还不知道怎么定义,可以参考Android基线代码中的SELinux定义,因为基线中的权限定义已经包含了尽可能完整的一种情况。当遇到neverallow问题时,我们会按照上面三个步骤重新定义有问题的部分---定义类型---配置类型---设置权限,并且重新定义的类型名称不在系统神经allow的范围内,并再次reset后,就可以避免nerverrallow的问题了。至此,我们对SElinux的问题有了一个简单的了解,然后再重新思考文章开头提到的三大块。1.设置文件的属性。也就是说上面的file_contexts中已经配置了/dev/test和test_bin这两个文件的属性。当我们关闭SELinux权限的时候,我们是无法关闭系统对文件属性的判断的。比如当我们不对test_bin进行配置的时候,Android系统会认为test_bin是一个普通的文件。在这种情况下,无论SELinux是否关闭,test_bin都无法正常运行。请记住,当SELinux关闭时,Android仍然会判断文件属性。2、allow语句当系统没有合适的allow语句,但配置了合适的文件属性、用户组属性、读写权限时,此时关闭SELinux即可正常工作。如果出现这种现象,说明allow语句的配置不合适。这时候应该快速抓取相应的日志,从相应的日志中过滤掉AVC日志。以下是AVC错误:avc:denied{read}forname="vendor"dev="tmpfs"ino=9241scontext=u:r:dumpstate:s0tcontext=u:object_r:test_dev_node:s0tclass=chr_filepermissive=0分析如下:上面日志中的方括号表示缺少Permissions,readwholeschoolismissingfromthelog;scontext=u:r:dumpstate:s0用于表示权限不足;tcontext=u:object_r:test_dev_node:s0用来表示访问哪类文件时的权限问题;tclass=chr_file表示要访问的文件类型。我们可以结合以上四部分来添加相应的权限如下:allowdumpstatetest_dev_node:chr_filerread;3、用户、用户组、读写权限是Linux等系统中原生的内容。与SELinux完全无关。当用户组配置出现问题时,即使关闭了SELinux权限,问题依然存在。那么在Android系统中,我们如何配置这样的权限呢?其实在Android中,有一种init.rc文件(文件名可以是init.rc或init.xxx.rc)。rc文件除了启动服务等功能外,还可以在该类文件中配置用户和用户。分组读写权限,如下例所示:oninitchmod0660/dev/testchownsystemsystem/dev/test总结本文首先简单介绍一下SELinux,然后分三部分进行讲解。如果这三个部分中的任何一个部分出现异常,其相应的功能就无法正常工作。在配置Android权限时,需要考虑这三个部分,缺一不可。最重要的一点是,关闭SELinux只能屏蔽allow语句对应的权限问题。笔者介绍赵庆尧,51CTO社区编辑,从事驱动开发多年。他的研究兴趣包括安全操作系统和网络安全,并发表了与网络相关的专利。