一种免超级用户权限的进程行为监控装置与方法与流程

文档序号:16880093发布日期:2019-02-15 22:02阅读:207来源:国知局
一种免超级用户权限的进程行为监控装置与方法与流程

本发明属于android内核监控技术领域,特别涉及一种免超级用户权限的进程行为监控装置与方法。



背景技术:

近几年android市场占比达到89%,是手机用户数量最多的操作系统。但与此同时android系统上的恶意软件数量成爆炸式增长。据腾讯移动安全统计,2017年新产生的病毒的数量达4650604,相比2014年提高了近33倍。

针对android平台传统的攻击方式有诈骗短信,钓鱼链接,流氓软件等。传统的恶意软件检测主要分为静态分析和动态分析。静态分析主要分析app的静态特征,在app启动之前进行检测。动态分析主要分析app的动态行为特征,在app运行过程中进行检测。但是随着恶意软件检测技术的提高,普通的静态分析与动态分析可行性越来越低。目前已经有大部分的app使用jni技术,c++提高代码效率,或者使用控制流混淆等高级方法,使静态分析代价极高。并且针对动态分析也出现了反调试、模拟器逃逸等技术,恶意软件可以通过分析系统环境确定自己是否正在被监控,从而采取不同的行为伪装成正常应用。

目前大部分的监控系统都是基于framework层,无法监控到native层的操作,并且容易被恶意软件检测到。相比之下内核层监控系统更底层,监控范围更大,更隐蔽。而基于内核的监控系统需要超级用户权限启动相关服务,但现在虚拟机逃逸技术日渐成熟,恶意软件在检测到超级用户权限的存在时也可以采取不同的行为绕过监控。



技术实现要素:

为了克服上述现有技术的缺点,本发明的目的在于提供一种免超级用户权限的进程行为监控装置与方法,具有以下功能:1)不修改源码;2)可以指定监控目标;3)不需要超级用户权限;4)对系统性能没有影响。

为了实现上述目的,本发明采用的技术方案是:

针对功能1,本发明使用hook技术,将监控装置编译成内核模块。

针对功能2,本发明设计了过滤单元,使用单向链表在内核中存储需要监控的进程信息,在监控时进行比对以确定是否需要监控。

针对功能3,本发明修改系统配置文件,使安卓系统开机时自动加载内核模块,关闭安全策略,修改监控装置对应的驱动权限以及修改日志输出目录权限。整个系统运行不需要超级用户权限,可以使用release版本的系统。

针对功能4本发明在实现日志输出单元时使用双缓冲区技术和内核线程技术,使监控装置对系统运行的影响可以忽略不计。

具体地,本发明采取如下技术方案:

一种免超级用户权限的进程行为监控装置,其特征在于,包括:

交互单元,位于用户层,用于指定监控目标;

系统配置文件修改单元,位于用户层,用于免超级用户权限启动监控装置;

过滤单元,位于内核层,用于过滤非监控目标产生的行为;

行为监控单元,位于内核层,用于监控目标的行为;

日志输出单元,位于内核层,用于内核日志输出。

所述交互单元通过如下方式实现:

利用交互工具动态修改监控目标,所述交互工具先解析用户输入的参数,打开设备文件,将值通过write方法写入驱动中,驱动在初始化时注册文件操作函数结构体file_operations,进入内核后linux虚拟文件系统调用对应的write操作函数,驱动在经过初步的参数合法性校验后从参数中解析目标值,删除监控链表中所有节点并重新初始化监控链表,交互工具待write函数返回后关闭打开的设备文件;

所述过滤单元通过如下方式实现:

在内核层设置一个实时的监控链表,用以存储目标产生的所有进程,使之后进程的uid不论如何变化都能被监控到,该监控链表中的进程创建子进程时将子进程加入到监控链表中,在监控链表中的进程退出时删除相应节点;

在内核中宏定义current指向当前进程的进程描述符,系统执行被监控的系统调用函数,跳转到监控函数后,首先根据current指针得到当前进程的uid和pid,当前进程的uid等于用户指定的uid时说明当前进程需要被监控,如果当前进程的uid不等于用户指定的uid,但进程的pid仍然在监控链表中时,仍然需要进行监控;

所述日志输出单元为双缓结构,将需要同步的共享变量由文件变为缓冲区,当监控函数产生日志时,调用日志输出系统的接口将日志写入缓冲区,写完缓冲区后判断当前缓冲区是否已满,如果已满则创建内核线程将当前缓冲区写入文件,准备写入下一个缓冲区;如果未满则继续。

所述行为监控单元包括:

进程创建行为监控模块,用于监控进程的创建行为;

进程退出行为监控模块,用于监控进程的退出行为;

进程cred结构体监控模块,用于监控进程cred结构体的变更情况。

所述进程创建行为监控模块通过如下方式实现:

将__nr_clone对应的系统调用表项修改为进程创建监控函数地址;

所述进程退出行为监控模块通过如下方式实现:

使用内核inlinehook技术实现进程退出行为的监控;

所述进程cred结构体监控模块通过如下方式实现:

使用inlinehook技术劫持执行所有系统调用的控制流,并且将cred结构体关键值保存在监控链表中,在执行系统调用之后根据监控链表判断cred结构体关键值是否发生变化,如果发生变化则更新监控链表并输出日志。

所述内核inlinehook技术的过程为:原函数为指令1、指令2和指令3,

1)原函数被调用后,利用跳转指令1,跳转到监控函数;

2)利用寄存器备份跳转指令1,将寄存器保存在堆栈中,备份原函数寄存器上下文,避免执行环境被监控函数破坏;

3)调用监控函数记录监控日志;

4)利用寄存器恢复指令,从堆栈中恢复原寄存器上下文,方便继续执行;

5)利用跳转指令2,跳转到存放指令1的内存空间,执行被覆盖掉的指令1;

6)执行完毕后通过跳转指令3跳转到原函数指令2继续执行;

监控流程为:

1)内核执行do_exit,进入监控函数m_exit;

2)由current指针得到当前进程的pid和uid;

3)判断是否为指定uid,如果是,则跳转到(6);否则,跳转到(5);

4)判断pid是否在监控列表中,如果是,则跳转到(6);否则,跳转到(9);

5)记录时间戳;

6)记录当前进程pid、uid。

7)从监控列表中删除当前进程pid;

8)输出监控日志;

9)跳转到m_exit_gagdet函数;

10)执行do_exit函数被覆盖的前四条汇编指令;

11)跳转到do_exit函数第五条指令继续执行。

其中“m_exit_gagdet”表示用来执行原do_exit函数前四条汇编指令并且跳转到do_exit第五条指令的函数,m_exit表示监控函数;

进程cred结构体监控模块的原理为使用inlinehook技术劫持执行所有系统调用的控制流,具体流程为:

1)修改指令,在vector_swi函数执行系统调用之前跳转到监控函数;

2)调整堆栈与寄存器,改变lr寄存器使系统调用完成后仍跳转到监控函数;

3)执行系统调用;

4)系统调用执行完毕跳转回监控函数;

5)判断当前进程是否具有超级用户权限,如果是,跳转到6);否则,跳转到8);

6)判断当前进程是否在监控链表中,如果当前进程在监控链表中并且上次系统调用没有超级用户权限,跳转到7);否则跳转到8);

7)说明此次系统调用过程中发生修改cred结构体行为,更新监控链表并输出日志;

8)执行完毕。

本发明还提供了一种免超级用户权限的进程行为监控方法,包括:

启动监控装置;

指定监控的目标;

操作目标,触发行为;

监控装置采集和记录目标的进程行为信息,生成监控日志;

关闭监控装置,输出监控日志。

本发明无需获取超级用户权限,通过修改系统配置文件,在启动监控装置时执行以下操作:

自动加载内核模块;

关闭安卓系统安全策略;

修改监控装置对应的驱动权限;

修改日志目录权限。

所述监控的目标是可唯一标识监控目标的数据项,包括但不限于进程pid或应用uid。

本发明通过更改系统调用表和替换内核函数指令,改变函数执行流程,获取监控信息,所述监控信息包括但不限于操作时间戳、调用被监控函数的进程uid、被监控函数名、被监控函数参数、被监控函数返回值。

所述目标的进程行为信息包括:

进程创建信息;

进程退出信息;

进程cred结构体变动记录。

与现有技术相比,本发明的有益效果是:

1)监控范围较传统监控系统更大;

2)监控系统更加隐蔽;

3)监控更加高效稳定。

附图说明

图1是本发明运行流程图。

图2是本发明动态修改uid流程图。

图3是本发明进程过滤模块执行流程图。

图4是本发明进程创建行为监控模块监控流程图。

图5是本发明inlinehook原理图。

图6是本发明进程退出行为监控模块监控流程图。

图7是本发明进程cred结构体监控模块监控流程图。

图8是本发明日志输出单元输出流程图。

具体实施方式

下面结合附图和实施例详细说明本发明的实施方式。

参考图1,本发明一种免超级用户权限的进程行为监控方法,流程如下:

启动监控装置;

指定监控的目标;

操作目标,触发行为;

监控装置采集和记录目标的进程行为信息,生成监控日志;

关闭监控装置,输出监控日志。

本发明免超级用户权限的进程行为监控装置,组成其的各个单元的详细介绍如下:

1、交互单元

编写交互工具,在系统运行时可以与监控装置进行交互,动态修改监控目标。流程如图2所示。

交互工具先解析用户输入的参数,打开设备文件,将值通过write方法写入驱动中。驱动在初始化时会注册文件操作函数结构体file_operations,进入内核后linux虚拟文件系统会调用对应的write操作函数。驱动在经过初步的参数合法性校验后从参数中解析目标值,删除监控链表中所有节点并重新初始化监控链表。交互工具待write函数返回后关闭打开的设备文件。

2、过滤单元

过滤单元主要作用为过滤非监控目标的操作。

为保证监控的完整性,本系统在内核中实现一个实时的单向链表,用以存储目标产生的所有进程,使之后进程的uid不论如何变化都能被监控到。为保证监控链表的实时性,本系统在监控链表中的进程创建子进程时将子进程加入到监控链表中,在监控链表中的进程退出时删除此节点。流程如图3所示。

在内核中中宏定义current指向当前进程的进程描述符,在系统执行被监控的系统调用函数,跳转到监控函数后,首先根据current指针得到当前进程的uid和pid。当前进程的uid等于用户指定的uid时说明当前进程需要被监控。但是为保证监控链表内的进程不论uid如何变化都能被监控到,如果当前进程的uid不等于用户指定的uid,但进程的pid仍然在监控链表中时,仍然需要进行监控。

3、行为监控单元

以内核模块形式加载,功能为监控指定监控目标的系统调用。包括进程创建行为监控模块、进程退出行为监控模块和进程cred结构体监控模块。

3.1进程创建行为监控模块

进程创建监控模块主要完成实时添加进程监控链表操作以及产生监控日志功能。

android系统libc提供的库函数与系统调用对应的调用函数全部放在android系统源码的/libc/bionic/syscalls文件下,经搜索android7.0系统与进程对应的系统调用只有sys_clone,所以实现进程创建监控模块只需要将__nr_clone对应的系统调用表项修改为进程创建监控函数地址。以sys_clone系统调用为例,sys_clone系统调用监控流程如图4所示,其中orig_sys_clone为原系统调用地址。

系统执行sys_clone系统调用时会跳转到监控函数,进入监控函数后先根据current指针得到调用者的uid和pid。为保证不影响原系统调用执行流程需要先执行原系统调用orig_sys_clone并保存返回值。随后进入进程过滤模块,判断调用者是否需要被监控。如果需要被监控则将当前进程和子进程都加入到监控链表中,同时记录时间戳、当前进程uid、当前进程pid和子进程pid并输出日志,返回orig_sys_clone函数的返回值。如果不需要监控则直接返回。

3.2进程退出行为监控模块

进程退出行为监控模块主要实现实时删除监控链表节点功能以及产生监控日志的功能。

查阅源码得到与进程退出相关的系统调用有sys_exit、sys_kill和sys_exit_group,其中sys_exit和sys_kill均可以通过修改系统调用表进行监控。在实际测试时发现修改系统调用表无法监控到所有的进程退出行为,因为进程调用sys_exit_group后会向同组所有进程发出退出信号,接收到退出信号的进程在下次信号处理时完成进程退出。如果在sys_exit_group系统调用时监控进程退出,需要遍历内核中所有存在的进程寻找同组进程,进行处理。信号处理过程不属于系统调用,无法通过修改系统调用表进行监控。

经过跟踪调试源码后发现sys_exit、sys_kill和sys_exit_group三个系统调用最终均会执行do_exit函数,信号处理时进程退出同样调用do_exit函数,所以do_exit函数是进程退出必须经过的执行的函数。由于do_exit函数不属于系统调用,本模块使用内核inlinehook技术实现监控进程退出行为。

inlinehook是一种修改函数在内存中的指令,控制函数执行流程的技术。典型的inlinehook实现原理如图5所示。其中原函数为指令1、指令2和指令3,

1)原函数被调用后,利用跳转指令1,跳转到监控函数;

2)利用寄存器备份跳转指令1,将寄存器保存在堆栈中,备份原函数寄存器上下文,避免执行环境被监控函数破坏;

3)调用监控函数记录监控日志;

4)利用寄存器恢复指令,从堆栈中恢复原寄存器上下文,方便继续执行;

5)利用跳转指令2,跳转到存放指令1的内存空间,执行被覆盖掉的指令1;

6)执行完毕后通过跳转指令3跳转到原函数指令2继续执行。

进程退出行为监控模块执行流程与进程创建行为监控模块执行流程大致相同。监控流程如图6所示,其中“m_exit_gagdet”表示用来执行原do_exit函数前四条汇编指令并且跳转到do_exit第五条指令的函数,m_exit表示监控函数。具体流程为:

1)内核执行do_exit,进入监控函数m_exit;

2)由current指针得到当前进程的pid和uid;

3)判断是否为指定uid,如果是,则跳转到(6);否则,跳转到(5);

4)判断pid是否在监控列表中,如果是,则跳转到(6);否则,跳转到(9);

5)记录时间戳;

6)记录当前进程pid、uid。

7)从监控列表中删除当前进程pid;

8)输出监控日志;

9)跳转到m_exit_gagdet函数;

10)执行do_exit函数被覆盖的前四条汇编指令;

11)跳转到do_exit函数第五条指令继续执行。

3.3进程cred结构体监控子模块

进程cred结构体监控模块主要完成监控cred结构体变化并输监控出日志的功能。

由于系统调用为内核空间与用户空间进程的唯一接口,所以修改cred结构体必须通过系统调用。可以使用以下方法实现cred结构体完整性监控。

使用inlinehook技术劫持所有系统调用的控制流,并且将cred结构体关键值保存在监控链表中,在执行系统调用之后根据监控链表判断cred结构体关键值是否发生变化,如果变化则更新监控链表并输出监控日志。监控流程如图7所示,其中虚线部分不执行:

1)修改指令,在vector_swi函数执行系统调用之前跳转到监控函数

2)调整堆栈与寄存器,改变lr寄存器使系统调用完成后仍跳转到监控函数;

3)执行系统调用;

4)系统调用执行完毕跳转回监控函数;

5)判断当前进程是否具有超级用户权限,如果是,跳转到6);否则,跳转到8);

6)判断当前进程是否在监控链表中,如果当前进程在监控链表中并且上次系统调用没有超级用户权限,跳转到7);否则跳转到8);

7)说明此次系统调用过程中发生修改cred结构体行为,更新监控链表并输出日志;

8)执行完毕。

4、日志输出单元

日志输出子系统功能为将android内核驱动的监控日志输出到文件系统中。

如果每次监控时打开并写入日志文件,由于一些监控函数被调用十分频繁,如sys_open,这些系统调用就可能同时被进程调用。所以写入文件时就必须在打开文件时进行同步,使整个系统运行缓慢。所以本系统设计了双缓冲日志输出,将需要同步的共享变量由文件变为缓冲区,极大地提高了监控系统的性能。双缓冲区流程如图8所示。

当监控函数产生日志时,调用日志输出系统的接口将日志写入缓冲区,写完缓冲区后判断当前缓冲区是否已满,如果已满则创建内核线程将当前缓冲区写入文件,准备写入下一个缓冲区;如果未满则继续。

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