安卓user版本在SELinux强制模式下获取root特权的方法及系统与流程

文档序号:15557484发布日期:2018-09-29 01:28阅读:5377来源:国知局

本发明涉及计算机软件应用领域,尤其涉及一种安卓user版本在selinux强制模式下获取root特权的方法及系统。



背景技术:

android4.4版本之前,android系统的底层的权限管理使用的是dac模式,android4.4版本之后,使用的是mac+dac模式,尽管有些版本不是完全的mac控制,但是随着安全性能越来越高,在最新的android系统当中,已经使用了完全的mac来控制权限,也就是说如果android系统内部没有许可获得特权,那么用户几乎是不能获得root权限的,即使用户获得dac的root权限,在实际操作过程中,还是会被mac拒绝而失败。而mac的控制就是使用selinux来实现的。

其中,dac为discretionaryaccesscontrol的简称,代表自主访问控制。访问控制模式是rwxrwxrwx,r代表read,w代表write,x代表execute,没有对应权限以-代替,每三个字符一组,这三个组分别是:所有者用户-所有者组-其他。

mac为mandatoryaccesscontrol的简称,代表强制访问控制,访问控制模式是user:role:type,代表用户:角色:类型。

正是因为这样严格的权限管理,我们在有些情况下就会遇到问题,比如:客户在使用user版本遇到了重大的必须解决的问题后,需要将系统里面的一些数据获取出来或通过设置手机里面的参数来调试的时候,却被权限管理挡在门外了,也就是需要一种在selinux正常工作的情况下,依然可以在user版本上获取特权的机制,方便临时调试。现存在的几种方案是根据系统属性值将selinux临时关闭,但这种方案的弊端是google认证会不定期检查user版本关闭selinux的情况,一旦google检测到这种情况,就会要求厂商更新软件,否者,google认证不与通过,这增加了后期维护的成本。现存的还有一种方案是为用户编译可调试版本,让客户或者售后重新下载软件,然后一直测试直到问题重现,再来调试,时间成本太高,并且本身版本性质不同也有一些差异,问题能否重现也不得而知。

其中,申请号:201210436649.9,专利名称为《安卓应用程序永久获取root权限的方法》的专利未考虑selinux在强制模式下的情况,在此模式下,此方案行不通,在获取root权限上会失败;并且,此方案依赖已经root好的系统作为前置条件,其运行在应用层面,在设置suid会被root检测程序检测出,从而无法获取root权限。



技术实现要素:

为解决现有技术中的问题,本发明提供一种安卓user版本在selinux强制模式下获取root特权的方法,还提供一种实现该方法的系统。

本发明方法包括如下步骤:

s1:设置两个属性,其中,第一属性用来标识安卓系统是否需要启动特权root;第二属性用来通知init进程执行selinux配置文件的重新加载;

s2:修改selinux的编译规则文件,使安卓系统编译时生成特权selinux配置文件,

s3:编写可执行文件,完成selinux配置文件的切换;

s4:编写可执行文件对应的rc文件;

s5:修改adbd源代码,使adbdfork出来的子进程shell有root权限。

本发明作进一步改进,还包括步骤s6:编写root开关应用程序,设置root特权启动方式。

本发明作进一步改进,在步骤s2中,修改后的编译规则文件,使系统生成两套配置文件,一套是原来android标准的配置文件,另外一套是特权selinux配置文件。

本发明作进一步改进,所述selinux的配置处理过程为:

a1:系统开启,kernelselinux驱动模块加载,判断是否enforcing=1,如果是,kernel进入enforcing模式,如果否,kernel进入permissive模式;

a2:通过init进程配置selinux,

具体实现方法为:

a201:判断安卓系统当前是否为user版本,如果是,安卓使用enforcing模式,如果否,init进程检测cmdline是否存在androidboot.selinux=permissive,如果存在,进入permissive模式,如果不存在,进入enforcing模式;

a202:判断设定目录下是否有配置文件,如果有,执行该配置文件,如果没有,执行系统默认配置。

本发明作进一步改进,步骤s3中,所述可执行文件的处理方法为:根据系统root特权需求选择将selinux配置文件拷贝入设定目录,或者删除设定目录下的selinux配置文件,然后,通知init进程重新加载selinux配置文件。

本发明作进一步改进,在步骤s5中,adbd处理方法为:

s51:adbd服务启动,判断是否请求root特权,如果是,adbd不降权,设置selinux环境上下文,使adbdfork出来的子进程shell为特权shell,如果否,adbd降权,adbdfork出来的子进程shell为普通shell;

s52:执行adbd主循环,adbd服务结束。

本发明还提供一种实现该方法的系统,包括设置模块:用于设置两个属性,其中,第一属性用来标识安卓系统是否需要启动特权root;第二属性用来通知init进程执行selinux配置文件的重新加载;第一修改模块:用于修改selinux的编译规则文件,使安卓系统编译时生成特权selinux配置文件;第一编写模块:用于编写可执行文件,完成selinux配置文件的切换;第二编写模块:用于编写可执行文件对应的rc文件;第二修改模块:用于修改adbd源代码,使adbdfork出来的子进程shell有root权限。

本发明作进一步改进,还包括第三编写模块:编写root开关应用程序,设置root特权启动方式。

与现有技术相比,本发明的有益效果是:解决了需要调试等一些特殊问题,在不破坏现场环境的情况下,提供了有力的帮助,大大缩短了时间成本。

附图说明

图1为本发明方法流程图;

图2为selinux标准配置方法流程图;

图3为可执行文件的处理方法流程图;

图4为dbb系统服务在针对系统请求服务的逻辑处理流程图。

具体实施方式

下面结合附图和实施例对本发明做进一步详细说明。

本发明是android(安卓)系统user版本在selinuxenforcing(强制模式)的环境下,能获取root特权的方案。selinux在user版本状态下,一般的都是使用了系统默认配置。而本申请另辟蹊径,让系统可以使用预先定义好的特权配置文件,让selinux策略给特定的程序以特定的权利,本申请在现有的androidselinux的基础上,只需少量代码配置即可实现,在不违背标准selinux策略配置的情况下,根据请求特权与否,将预置的特权配置文件放到系统特定的目录/data/security/current/下面,或将系统特定目录/data/security/current/目录下的配置文件全部删除,然后通知init进程重新加载selinux配置文件,从而形成新的权限策略。

其中,android是谷歌公司基于linux开发的一套开源系统,称为安卓。user版本:是android在发布软件的可选项之一,android在发布软件有以下三种可选项:

1.debug版本;--用于普通调试,有root权限;

2.userdebug版本;--用于接近量产版本调试,有root权限;

3.user版本;--用于量产版本,不能调试,没有root权限。

selinux:security-enhancedlinux的简称,是美国国家安全局对于mac的实现,其工作模式有:

1.disable;--禁用模式;

2.permissive;--宽容模式;

3.enforcing;--强制模式。

root则是linux系统的最高权限。

具体地,如图1所示,作为本发明的一个实施例,本发明方法包括如下步骤:

步骤s1:定义两个persist属性,一个用来标识系统是否需要启动特权root,本发明以persist.hipad.root为例;另外一个用来通知init进程执行selinux配置文件的重新加载,本发明以sys.selinux.reload为例,使用这个属性的主要目的是android系统不允许除init以外的进程修改selinux.reload_policy属性,如果不这样,就不能触发init重新加载selinux的配置文件。

步骤s2:修改selinux的android.mk文件,其位于目录system/sepolicy/下(不同android版本,位置可能不同,有些放在external/sepolicy/),使系统生成两套配置文件,一套是原来android标准的配置文件,另外一套是需要特权的配置文件,特权配置文件放在镜像文件系统/system/etc/security/目录下,以备后续使用。

如图2所示,所述selinux的配置处理过程为:

系统开启,kernel(内核)selinux驱动模块加载,判断是否enforcing=1,如果是,kernel进入enforcing模式,如果否,kernel进入permissive模式。

步骤101是kernel配置了enforcing=1参数的条件判断,现有android系统默认是不含有这样的字段的,也就是说kernel在启动阶段,selinux工作在permissive模式。

然后,通过init进程配置selinux,具体实现方法为:

步骤102:判断安卓系统当前是否为user版本,如果是,安卓使用enforcing模式,如果否,init进程检测cmdline是否存在androidboot.selinux=permissive,如果存在,进入permissive模式,如果不存在,进入enforcing模式。

步骤102是当前版本是否是user版本的判定,一般是user版本,也就是出货版本,selinux必须是enforcing模式。

步骤103:判断设定目录下是否有配置文件,如果有,执行该配置文件,如果没有,执行系统默认配置。步骤103是最为关键的节点,user版本/data/security/current/目录下一般是没有任何配置文件的,也不能往这个地方写入任何东西。

步骤s3:编写可执行文件,完成selinux配置文件的切换。

具体地,编写一个可执行文件,根据persist.hipad.root属性值来处理,完成其主要功能:

a)当persist.hipad.root的值真时,则将步骤s2生成的6个文件复制到特定的目录/data/security/current/,android的selinux库规定了这个目录,确保文件模式,所有者,访问存储时间等属性都需要全部拷贝过来.保持一致性;

b)当persist.hipad.root的值非真时,需要将/data/security/current/目录下面的文件全部删除。

完成上述a)或者b)操作之后,设置sys.selinux.reload属性值。

如图3所示,步骤s3是是本发明的关键部分,主要目的是使将之前预置的特权配置文件生效。

步骤201是根据特权需求决定不同的操作,拷贝还是删除来控制/data/security/current/目录下的文件。

步骤202是通知init进程重新加载selinux配置文件。当标准selinux环境下,只有init进程能重新加载selinux的sepolicy等配置文件,而只有init和system_service域能设置selinux.reload属性。这些都是google标准配置,不能随便更改,否者googlects或gts认证不会通过。

步骤s4:编写步骤s3对应的rc文件,主要是配置:

a)步骤s3生成的可执行程序作为系统服务,配置好执行的用户、组、时机和方式,本例的用户为一般用户,组为root,时机配置为classlate_start。

增加sys.selinux.reload属性触发的功能,以setpropselinux.reload_policy1为主要目的,让init来重新加载selinux的配置文件,步骤s3已经准备好了/data/security/current/目录下特权的配置文件,根据设定的条件,决定selinux是否进入有特权的状态。

步骤s5:修改adbd源代码,根据persist.hipad.root属性值来处理是否adbd需要掉权,这主要是解决dac的权限和设置selinux环境上下文,让adbdfork出来的子进程shell有root权限。

如图4所示,adbd具体处理方法为:

adbd服务启动,判断是否请求root特权,如果是,adbd不降权,设置selinux环境上下文,使adbdfork出来的子进程shell为特权shell,如果否,adbd降权,adbdfork出来的子进程shell为普通shell,fork为计算机程序设计中的分叉函数。然后执行adbd主循环,adbd服务结束。

其中,步骤301在不降权的时候,adbd会切换上下文为u:r:su:s0,这是特权的关键。步骤302这里列举的是不同权限的shell,普通的shell上下文的是u:r:shell:s0,而特权的shell上下文是u:r:su:s0。

步骤s6:编写root开关应用程序

具体地,编写简单的apk应用,用platform签名,完成对persist.hipad.root的设置,true或false.应用以系统暗菜单或者是暗码形式启动,一般不出现在主菜单中。设置好之后,重启手机即可;如果不想重启手机,需要在rc文件里面配置属性persist.hipad.root改变时,对adbd和步骤s4自定义服务重新启动即可。

本发明还提供一种实现该方法的系统,包括设置模块:用于设置两个属性,其中,第一属性用来标识安卓系统是否需要启动特权root;第二属性用来通知init进程执行selinux配置文件的重新加载;第一修改模块:用于修改selinux的编译规则文件,使安卓系统编译时生成特权selinux配置文件;第一编写模块:用于编写可执行文件,完成selinux配置文件的切换;第二编写模块:用于编写可执行文件对应的rc文件;第二修改模块:用于修改adbd源代码,使adbdfork出来的子进程shell有root权限。

本发明作进一步改进,还包括第三编写模块:编写root开关应用程序,设置root特权启动方式。

本例用到的术语解释如下:

persist属性:是android系统以persist.开头会存储到文件系统的键值对;

android.mk:android系统编译规则文件,是对makefile的封装;

rc文件:供init进程解析并执行对应操作的脚本文件;

shell:伪终端的称呼;

adbd:andoriddebugbridgedaemon的简称,是与adb(安卓调试桥)对应的服务器端;

apk:androidpackage简称,是代表android的应用程序.以后程序的后缀名是.apk。

以上所述之具体实施方式为本发明的较佳实施方式,并非以此限定本发明的具体实施范围,本发明的范围包括并不限于本具体实施方式,凡依照本发明所作的等效变化均在本发明的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1