本发明涉及防root方法,尤其涉及一种基于android的防root方法。
背景技术:
基于android的防root方法,传统的方案是启动一个nativedaemon,该程序周期性搜索/system/bin和/system/xbin下带有setuid权限标志位的文件.这种方案存在几个问题:
(1)无法搜索非法植入手机的隐藏文件。通常隐藏文件的方法有修改文件权限;修改用户层查看文件工具,so库;通过insmod内核模块添加模块通过lsm钩子函数改变系统调用;通过insmod内核模块在现有分区上做一个特殊文件系统,将文件隐藏到伪坏块中等.而而通过搜索文件,无法找到通过这几种方法隐藏的文件。
(2)无法避免非法程序将试图删除su文件的进程被杀死的风险.非法程序通过插入lmk调用内核钩子查看谁在删除su文件,然后将该进程kill掉,这样无法通过用户进程防止这种技术。
(3)为了及时发现非法可执行文件,需要尽可能搜索的间隔较短;为了避免放到非/system/bin和/system/xbin目录下,需要进行整个系统范围内搜索,占用了大量系统cpu,memory,io资源。
技术实现要素:
为了解决现有技术中的问题,本发明提供了一种基于android的防root方法。
本发明提供了一种基于android的防root方法,包括以下步骤:
s1、在操作系统内核启动时,注册一个lsm模块,注册内核线程;
s2、在进程空间中,调用setuid/setgid函数,判断原始程序是否存在升权行为,如果存在,则将task_struct放到全局链表中,并启动内核线程;
s3、在内核线程中,在全局链表中找到task_struct结构体,找到进程对应的可执行文件和带有setuid权限的文件;
s4、停止进程,释放进程资源,删除步骤s3中的可执行文件和带有setuid权限的文件。
作为本发明的进一步改进,在步骤s1中:注册一个lsm模块checkroot,赋值security_operations中的security_task_fix_setuid、task_setpgid函数接口;注册一个kernelthread。
作为本发明的进一步改进,在步骤s2中:在security_task_fix_setuid、task_setpgid中获取当前进程的task_struct结构体,判断原uid是否比现在的uid小,如果是则将该task_struct记录下来。
作为本发明的进一步改进,在步骤s3中:启动kernelthread,在kernelthread中通过步骤s2找到的task_struct结构体,查找进程打开的文件中带有setuid权限的文件对应的file_struct,根据file_struct找到文件的dentry和inode结构体。
作为本发明的进一步改进,直接在内核中stop掉有非法操作的进程并将进程占用的资源释放掉,并将步骤s3找到的文件删除。
本发明的有益效果是:可以避免修改库和用户层程序及修改属性来隐藏文件的问题,有利于搜索非法植入手机的隐藏文件。
附图说明
图1是本发明一种基于android的防root方法的示意图。
具体实施方式
下面结合附图说明及具体实施方式对本发明作进一步说明。
如图1所示,一种基于android的防root方法,通过内核钩子函数,内核线程相结合,在su程序setuid、setgid时(必须通过setuid、setgid等系统调用来提权),判断该进程是否在升权,具体包括以下步骤:
s1、在kernel启动时,注册一个lsm模块,注册内核线程;
s2、在进程空间中,调用setuid/setgid函数,判断原始程序是否存在升权行为,如果存在,则将task_struct放到全局链表中,并启动内核线程;
s3、在内核线程中,在全局链表中找到task_struct结构体,找到进程对应的可执行文件和带有setuid权限的文件;
s4、停止进程,释放进程资源,删除步骤s3中的可执行文件和带有setuid权限的文件。
在步骤s1中:注册一个lsm模块checkroot,赋值security_operations中的security_task_fix_setuid、task_setpgid函数接口;注册一个kernelthread。
在步骤s2中:在security_task_fix_setuid、task_setpgid中获取当前进程的task_struct结构体,判断原uid是否比现在的uid小,如果是则将该task_struct记录下来。
在步骤s3中:启动kernelthread,在kernelthread中通过步骤s2找到的task_struct结构体,查找进程打开的文件中带有setuid权限的文件对应的file_struct,根据file_struct找到文件的dentry和inode结构体。
直接在内核中stop掉有非法操作的进程并将进程占用的资源释放掉,并将步骤s3找到的文件删除。
如图1所示,首先几个空间要区分开,kernel空间包含kernel启动,进程在内核运行系统调用部分和内核线程。初始化部分是在kernel启动过程中,主要是初始化数据结构,注册security模块,注册内核线程;检测部分是在进程通过系统调用软中断方式进入kernel空间后,判断原始uid,gid和要设置的uid,gid的关系;而检测失败后的操作是放在内核线程中处理。
本发明提供的基于android的防root方法,由于机制是在kernel中作判断,这样我们可以避免修改库和用户层程序及修改属性来隐藏文件的问题;对于非法杀死程序,作判断操作的是在非法进程内部,杀死的本进程就杀掉了非法进程本身。而该内核线程在selinux权限中不容许被用户层杀死;该机制只有在进程行为确实有问题才出发,不会无端消耗系统资料。
以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。