一种基于深度学习的程序执行路径的监控方法及系统
技术领域
本发明涉及程序运行时的恶意行为监控,计算机安全技术领域,特别涉及一种基于深度学习的程序执行路径的监控方法及系统。
背景技术
近年来,云计算因为其清晰的商业模式,从而受到了业界和学术界的广泛关注和普遍认可,成为了最受关注的IT技术之一。随着云计算高速发展,需求的飞速增长和需求的多样化成为了必然的趋势,而这也使得数据中心的规模越来越大,基础架构也日趋复杂多样。当前底层平台的复杂性激增,在带来便利和高效的同时,也对包括系统软件在内的云平台基础设施的安全造成了极大的挑战。
虽然网络安全并不是全新的研究领域,但由于网络技术在当今云平台中的基础性地位,使得很多传统的网络安全问题以新的形式呈现在我们面前,而这些成为保障云平台本身安全的一个部分。众所周知,网络中包含了各种各样的恶意代码(病毒、蠕虫等等),用以非法访问、篡改各种未经授权的信息,或隐藏其本身的踪迹,潜伏在客户系统中记录、监控客户的各种操作行为。针对此类安全问题的研究主要分为恶意行为分析和恶意行为检测两方面。恶意行为分析技术包括静态和动态两方面,静态分析是指在不执行二进制程序的条件下进行分析,属于逆向工程分析方法,主要手段有反汇编分析、源代码分析、二进制统计分析及反编译等;动态分析方法是指在恶意代码执行的情况下,利用程序调试工具对其进行跟踪和观察,确定其执行过程,对静态分析结果进行验证。静态和动态分析技术相互补充,用于对已知的恶意行为进行分析,提取其特征,作为检测该类恶意行为的依据,协助恶意行为检测技术共同保障系统的安全。
虽然上述问题在传统的安全领域都有所涉及,但在海量数据的背景之下,对于网络安全的攻防呈现出很多新的特点,传统的检测方法渐渐体现出其局限性,例如,动态污点跟踪技术是一种常用的恶意行为分析手段,该技术跟踪恶 意代码的执行过程,分析并提取其行为特征。主要原理是:将来源于网络等不信任渠道的数据标记为“污染”的,对该类数据进行一系列算术和逻辑操作而新生成的数据也会继承源数据的“污染”属性,此继承行为称为污点数据的传播。系统运行过程中,一旦检测到对“污染”数据的非法操作,系统会发出报警,生成当前的相关内存、寄存器和一段时间内的网络数据流的快照,并将其传递给特征码生成服务器,作为特征码的原始资料。动态污点跟踪技术的优点在于能够准确对恶意代码行为进行分析且识别未知病毒,但目前部署于QEMU模拟器中,性能开销大,不能作为一种在线的检测手段,只能作为线下恶意代码分析方法。该技术主要针对的攻击方式为缓冲区、栈溢出攻击及格式字符串攻击等。
在当今底层系统复杂度日益上升的背景之下,各种平台间及平台本身的调用关系错综复杂,而在模块化编程思想的指导下,各个功能模块间高内聚、低耦合,这使得模块间的组合方式呈组合爆炸使得增长,人工分析需要耗费大量的时间和精力,对大型系统的全面分析几乎是不可能完成的任务。
发明专利“动态探测程序执行路径的方法、装置和计算机系统”,该发明实施例提供了一种动态探测程序执行路径的方法、装置和计算机系统,能够实现程序执行路径的动态实时探测,对于应用程序和内核态程序具有通用性。该方法包括:根据被探测程序的进程特征码从所述处理器记录的指令转移信息集合中获取所述被探测程序的指令转移信息集合,所述指令转移信息集合包括至少一个指令转移信息,所述每一指令转移信息包括指令转移前后运行的指令所属的函数的符号表;根据所述每一指令转移信息包括的所述每一指令转移前后运行的指令所属的函数的符号表,生成所述被探测程序的程序执行路径,所述被探测程序的程序执行路径包括所述被探测程序运行过程中的函数调用关系。该发明实施例适用于信息技术领域。但是该发明需要从所述处理器记录的指令转移信息集合中获取所述被探测程序的指令转移信息集合,其中包括指令转移前后运行的指令所属的函数的符号表,以此推测出被探测程序前后运行的函数,并生成被探测程序运行过程中的函数调用关系,而本专利则是通过特定的探测工具,得到函数运行时特定的执行信息(函数返回地址),并根据此地址返回信息查找到其调用函数,并通过上述信息建立函数调用路径,分析后得到整个函数调用执行路径,另外,本发明并不人工分析函数调用关系流,而是通 过深度学习的方式自动形成。
发明内容
针对现有技术不足,本发明提出了一种基于深度学习的程序执行路径的监控方法及系统,同时本发明基于深度学习这一方法,所述深度学习包括深度神经网络,所述神经网络是指有多个隐含层的神经网络,这使得本发明可以计算输入的更为复杂的特征,因为每个隐含层计算前一层的非线性变换,一个深度网络比浅层网络具有更强的表达能力,其最主要的优势是相比浅层网络它可以更紧凑地表示一个更大的函数集合,例如,有些函数可以用k层网络紧凑地表示(这里的紧凑是指隐藏层单元数目与输入呈多项式关系),但是k-1层网络无法表示,除非其隐藏单元数目与输入呈指数关系,考虑建立布尔网络来计算n个比特输入的奇偶校验码或异或值,假设网络的每个单元可以计算逻辑“或”或者逻辑“与”,如果仅有一个包含一个输入层、一个隐藏层和一个输出层的网络,奇偶校验函数需要的节点数目与输入规模n呈指数关系,但是如果使用更深一点的网络,网络大小就可以为n的多项式函数。
与传统分析方式的最大不同之处在于,本发明并不人为的分析函数的调用路径,而是通过大规模的监控收集实际运行中的函数调用关系,并将之作为输入数据输入到深度网络中,通过深度网络对数据的训练和学习,以达到分类的目的,从而在系统的实际运行中得出函数调用路径上的特征行为库,并将监控到的调用路径信息与该特征库相比对,以判定是否属于恶意行为。
本发明一种基于深度学习的程序执行路径的监控方法,包括:
步骤1,对所述程序中的函数插入探测点,获取所述函数运行时的返回地址,并通过栈指针回溯查询所述函数的函数地址;
步骤2,获取用户层和/系统层中所有函数的函数地址区间,将所述函数地址与所述函数地址空间进行对比,获取与所述函数地址相对应的函数名;
步骤3,根据所述返回地址、所述函数地址空间、所述函数名,获取所述程序中的所述函数在所述用户层和/所述系统层中的调用路径;
步骤4,对所述程序进行深度学习,获取所述程序中所述函数的调用特征,并生成调用特征库,将所述调用路径与所述调用特征库进行对比,以完成对所述程序执行路径的监控。
所述的基于深度学习的程序执行路径的监控方法,所述步骤3之前还包括:将所述函数名与所述返回地址进行封装。
所述的基于深度学习的程序执行路径的监控方法,所述步骤3包括:获取每个进程从所述用户层和/所述系统层调用到所述探测点的所有所述函数的所述调用路径。
所述的基于深度学习的程序执行路径的监控方法,所述步骤4之前还包括:重复所述步骤1-3,获取所述程序中所有所述函数的所述调用路径。
所述的基于深度学习的程序执行路径的监控方法,所述步骤4还包括:判断所述调用路径是否被篡改,若被篡改,则停止运行所述程序。
本发明一种基于深度学习的程序执行路径的监控系统,包括:
获取函数地址模块,用于对所述程序中的函数插入探测点,获取所述函数运行时的返回地址,并通过栈指针回溯查询所述函数的函数地址;
获取函数名模块,用于获取用户层和/系统层中所有函数的函数地址区间,将所述函数地址与所述函数地址空间进行对比,获取与所述函数地址相对应的函数名;
获取调用路径模块,用于根据所述返回地址、所述函数地址空间、所述函数名,获取所述程序中的所述函数在所述用户层和/所述系统层中的调用路径;
深度学习模块,用于对所述程序进行深度学习,获取所述程序中所述函数的调用特征,并生成调用特征库,将所述调用路径与所述调用特征库进行对比,以完成对所述程序执行路径的监控。
所述的基于深度学习的程序执行路径的监控系统,还包括:封装模块,用于将所述函数名与所述返回地址进行封装。
所述的基于深度学习的程序执行路径的监控系统,所述获取调用路径模块包括,用于获取每个进程从所述用户层和/所述系统层调用到所述探测点的所有所述函数的所述调用路径。
所述的基于深度学习的程序执行路径的监控系统,还包括循环模块:循环执行所述获取函数地址模块、所述获取函数名模块、所述获取调用路径模块,获取所述程序中所有所述函数的所述调用路径。
所述的基于深度学习的程序执行路径的监控系统,所述深度学习模块还包括:用于判断所述调用路径是否被篡改,若被篡改,则停止运行所述程序。
由以上方案可知,本发明的优点在于:
由于仅需要对关键路径设立探测点,余下的步骤都由算法自动实现,在大规模节省了人力成本的同时,也使得对当下日趋复杂的云平台底层基础设施的全面分析成为了可能;
由于对执行路径的收集工作是建立在系统真实运行的环境当中,这使得收集到数据对系统分析有绝对的参考价值,也避免了传统人工分析时由于各种假设而带来的偏差;
由于作为深度学习输入数据的函数调用关系都是建立在对真实运行系统大规模收集的基础之上,因此我们在学习的同时也容易通过分析数据获得整个系统的执行热点,而了解这些对于进一步的修复或加固系统都有指导意义。这样可以避免遇到问题时大规模的排查和分析,可以帮助做到有的放矢和防患于未然。
另外,本发明虽然以操作系统内核层的函数调用为例进行说明,然而,此方法本质上并不局限于系统内核函数的调用路径分析,作为一种通用的方法,将之用于监控用户层的函数调用关系分析也是可行的。
附图说明
图1为本发明总体架构示意图;
图2为获取内核函数调用关系图;
图3为通过深度学习形成特征行为库示意图。
其中附图标记为:
步骤100为获取内核函数调用关系的具体步骤,包括:
步骤101/102/103/104/105。
具体实施方式
本发明的具体步骤,如图1所示:
对所述程序中的函数插入探测点,获取所述函数运行时的返回地址,并通过栈指针回溯查询所述函数的函数地址;
获取用户层和/系统层中所有函数的函数地址区间,将所述函数地址与所述函数地址空间进行对比,获取与所述函数地址相对应的函数名;
将所述函数名与所述返回地址进行封装;
根据所述返回地址、所述函数地址空间、所述函数名,获取所述程序中的所述函数在所述用户层和/所述系统层中的调用路径,其中获取每个进程从所述用户层和/所述系统层调用到所述探测点的所有所述函数的所述调用路径;
重复以上步骤,获取所述程序中所有所述函数的所述调用路径;
对所述程序进行深度学习,获取所述程序中所述函数的调用特征,并生成调用特征库,将所述调用路径与所述调用特征库进行对比,以完成对所述程序执行路径的监控,其中判断所述调用路径是否被篡改,若被篡改,则停止运行所述程序。
以下为本发明的具体实施例,如下所示:
本发明用于监控系统中的程序行为,识别程序的恶意行为,从而保护系统中的文件,本发明目的在于提供一种程序运行时的恶意行为监控的方法,具体而言,本发明实施例分为两大部分:
第一部分,利用Linux内核调试工具kprobe监控执行路径上的特定关键函数,并通过获取内核栈指针,回溯查询函数调用栈,获取被调用函数的地址信息,并通过对照符号表,获取函数调用执行路径;
Kprobe,K可以认为是kernel(内核)的缩写,而probe直译为探针或探头,所以该工具可以理解为“内核探头”。不过常见的中文资料都是直接使用其英文名称,并未翻译成中文。
Kprobe机制是Linux内核提供的一种调试机制,它提供了一种方法,能够在不修改现有代码的基础上,灵活的跟踪内核函数的执行。它的基本工作原理是:用户指定一个探测点,并把一个用户定义的处理函数关联到该探测点,当内核执行到该探测点时,相应的关联函数被执行,然后继续执行正常的代码路径。
一般,使用kprobe的程序实现作一个内核模块,模块的初始化函数来负责安装探测点,退出函数卸载那些被安装的探测点。kprobe提供了接口函数(APIs)来安装或卸载探测点。
第二部分,在大量收集内核函数的调用执行路径之后,本发明引入深度学习,通过对深度网络的训练及对输入数据的学习,提取调用特征,并形成特征行为库,并将监控到的调用路径信息与该特征库相比对,并分析被监控程序的调用路径是否被篡改,是否有不明程序改变被监测程序的执行路径用以获取核心数据。以判定是否属于恶意行为。
本发明虽然以操作系统内核层的函数调用为例进行说明,然而,此方法本质上并不局限于系统内核函数的调用路径分析,作为一种通用的方法,将之用于监控用户层的函数调用关系分析也是可行的。
下面结合附图和具体实施方式,对本发明做进一步的说明,如下所示:
本实施例的总体架构如图1所示,可以分为两个阶段:1)获取内核函数调用关系,2)通过深度学习形成特征行为库,下面将分别详述之:
获取内核函数调用关系,如图2所示:
步骤101,获取用户内核层函数返回地址:采用Linux内核提供的内核函数调试工具kprobe对选定函数加入探测点(其中个别有些不能加探测点的位置可以舍弃),被探测的函数在运行时会被kprobe工具获取返回地址等相应信息。本质上,可以认为是在该处设立了一个内核断点;
步骤102,通过栈指针(esp)回溯查询当前进程的内核栈:以栈顶指针为起始,栈底(current_thread_info()+THREAD_SIZE)为终止,循环回溯输出栈中的被调用函数的地址,并将之保存在内核中的一个专用环形缓冲区。同时,可以通过current宏获取当前进程的相关信息(如PID,进程名等等);
步骤103,获取内核层函数地址区间,以确定函数名:利用Linux提供的proc文件系统,通过读取/proc/kallsyms文件,获取内核符号表。其中含有所有内核函数在内核中的起始地址。通过读取此文件后,并与相邻函数首地址做减法得到函数地址区间。将步骤102中所获得的被调用函数的地址与该区间相比对,以确定各个函数地址所对应的函数名;
步骤104,将数据从内核层传输到用户层:利用relayfs转发工具将函数名称,执行过程中返回地址信息必要的内核信息封装后,可以将这些必要的返回信息根据进程号PID等信息进行区分,以进程为单位将地址返回信息区分整理后,再由内核层传递到用户层;
步骤105,函数调用关系分析:获取的函数的返回地址及其地址区间等信息(relayfs传递到用户态的数据),可以建立每个进程从系统调用(内核的入口点)到步骤101中通过kprobe设定的探测点间的所有函数调用路径。如 此就形完成了一次函数执行路径的提取与分析,而这将作为下一步深度学习的一个原始输入。
大量收集内核函数调用信息:大量重复步骤101-104,大量收集内核函数的调用路径,以备之后的学习之用。
通过深度学习形成特征行为库,如图3所示:
此处假设我们想要训练一个含有2个隐藏层的栈式自动编码机(这里以含有2个隐藏层为例进行说明,实际操作中需要根据输入数据规模及训练分类的效果等具体情况做相应调整,并不局限于2个隐藏层)。
在原始输入x上训练一个稀疏自动编码机来学习原始输入的第一层特征h1,k;
接下来,将原始输入xk送入稀疏自动编码机得到主要的特征激活值h1,k。然后利用得到的第一层特征作为另一个稀疏自动编码机的原始输入学习第二层特征h2,k;
按照这样,将第一层特征h1,k再送入第二个稀疏自动编码机得到对应的第二层特征h2,k。然后将第二层特征作为softmax分类器的原始输入,训练分类器完成第二层特征到数字标签的映射;
关于Softmax,一般的中文资料都是直接使用其英文名称,并没有刻意翻译成中文。下面是关于Softmax的简介:
Softmax回归是一种非常高效的分类器。它不仅可以预测样本的类别,还可以计算出分类的概率信息。它是一种有监督学习算法(supervised learning algorithm),主要用于多分类问题。该模型是logistic回归模型的推广(也可以认为logistic回归是Softmax回归在k=2时的特殊情况),在该模型中,类标签y可以取k个不同的值,而不仅仅是两个值。例如,在MNIST手写数字分类问题中,本发明有k=10个不同的类别。通过对该模型的训练,本发明可以得到高效的分类器。
将所有的三层结合起来组成栈式自动编码机,包含两个隐藏层和一个可以实现MNIST数字分类的softmax分类器层次。
The MNIST database(Mixed National Institute of Standards andTechnology database),混合的美国国家标准和技术(MNIST)数据集是一个手写体数字(handwritten digits)集合。该数据集包括一个规模为60000 实例的训练集和一个10000实例的测试集。
虽然MNIST图像很小(28x28像素),且仅有10个数字(0到9),然而经验表明识别MNIST图像并非易事。因此,该数据集被广泛用于图像处理和机器学习领域的训练和测试,业界以它作为图像识别算法的基准测试程序(benchmark)。