目前大量的研究都集中于收集,学习恶意代码的实例。毫无疑问,这是非常有意义的。但是目前的一些基于主机终端的方法大多数都是ineffective,这些方法集中于研究特定的恶意软件实例的特点,从而往往容易被混淆或多态性规避。当然,为了解决这类问题,已经有一些研究了。不幸的是,这些方法太慢了,并且经常需要繁琐的虚拟机技术。主机终端上需要短时间内扫描大量的文件,因此需要一个efficient的方法。
传统的host-based的方法常常用文件哈希和字节签名来检测恶意软件,这种方法容易被混淆或多态性规避。其它的一些模型捕获系统调用的序列,但是,当这些系统调用时独立的,很容易通过改变调用顺序或者添加一些无关的系统调用来避免被检测到。目前静态技术的主要问题是,静态二进制分析是困难的,成本过高,耗费的时间太多,恶意软件扫描器需要快速地扫描大量的文件。目前动态技术的主要问题是依赖于跟踪动态数据流的信息,来描述恶意活动,这种方法造成巨大的系统性能的开销。
关注恶意软件中系统调用之间的数据流信息,系统调用体现的是程序与它所在的环境的相互作用。作者认为任何有关违反安全的行为都可以体现在一个或多个这种相互作用当中。这个系统调用的信息对恶意软件来说是必要的,不能通过简单的混淆或多态技术回避。
现有的一些动态方法利用动态数据流分析的方法(污点)来确定系统调用之间的关系,但是污染会导致巨大的性能开销,需要一个特殊的环境。本文的方法只监视系统调用及其参数的依赖关系。该方法可以有效地识别数据流,而不需要昂贵的污染和特殊环境
先在一个受控制的环境中分析而已程序,建立一个模型来描述它的行为。这个模型描述了系统调用之间的信息流。作者认为这个系统调用的信息对恶意软件来说是必要的,不能通过简单的混淆或多态技术回避。
观察恶意软件的实例,提取出具有这种信息流的程序切片,执行这些切片并观察它与操作系统的交互,用符号表达式来表示各个切片。那么给定一个程序切片或者是相应的符号表达式,对于未知的程序也可以被监视。
首先通过行为图刻画程序活动。目前有一些从二进制文件中自动提取这些图的技术。最后,作者提出了一种方法来匹配未知二进制文件与先前生成的行为图的动作。
恶意软件作者通过整理代码来实现他们的恶意行为有着很大的自由度,很容易重新排序独立的系统调用或添加无关调用来规避检测。因此,我们不能简单使用观察到的可疑活动作为系统调用序列。相反,需要一个更加灵活的表示法。这表示必须抓住真正的系统调用之间的关系,但允许独立调用以任何顺序出现。所以将程序的行为表示为行为图,节点表示系统调用,其中的边的关系为,若有节点X到节点Y的边,Y使用的参数来自于X的输出。也就是说,边代表一个数据系统调用X和Y之间的相关性。
本文的核心理念是确定是否有一双系统之间的数据流调用x和y,它是类似于以前观测的数据流。对于用来观察的实例,作者将具有这些数据流关系的程序切片取出,用能表示该切片语义的符号表达式来表述。
给定一个程序切片或者是相应的符号表达式,对于未知的程序也可以被监视。每当这个程序调用系统调用x,就提取出相关的参数和返回值。然后将该值用作切片或符号表达式的输入,计算预期的输出。后来,每当调用一个系统调用y,就检查其参数。当系统调用参数的值等于此前计算,预期输出,则系统已检测到数据流。使用数据流信息,可以提高匹配精度观测系统调用行为图。
原则上,可以直接使用行为图来检测恶意软件。为此,我们监视系统调用,对于未知程序问题,检测这些呼吁与图中的节点匹配。只需要足够多的行为图和优秀的匹配方式即可。但是,这当中还存在些问题。一是X—>Y节点的边中,数据的输出和,参数的使用的对应关系很难匹配,二是行为图中的独立系统调用可能触发匹配,导致不可接受的误报的数量
更确切地说,本文相当于开发了一个扫描仪,监测系统调用分析的程序。扫描仪的目标是有效地确定这个程序是否匹配的众多的行为图之一。如果存在这样的匹配,就将该程序视为恶意软件。
因为前面解释了有误报的一些原因,以及恶意软件的作者可能添加无用节点来修改行为图,因此不能使用传统的图的匹配方法。本文的匹配行为图的方法,实质上只是一系列function的匹配。只要未知程序中存在观测实例中的一系列function,则将其视为恶意软件。
This is the key idea of our proposed approach: We can identify relationships between system calls without tracking any information at the instruction-level during runtime. Instead, we rely solely on the analysis of system call arguments and the functions in the behavior graph that capture the semantics of the program.
该例子为Netsky这类恶意软件中的一个程序切片,左图为特定环境Anubis动态监测的trace。根据现有的一些方法可以产出右图这样的行为图。
该图1描述了是Netsky蠕虫的行为图的一部分。在此图中,人们可以看到调用的系统调用和它们之间的依赖关系,当一方是创建一个本身的副本。蠕虫第一次通过调用Get ModuleFileNameA函数来获取它的可执行文件的名称。然后,它通过使用NtCreateFile调用打开其可执行的文件。在同一时间,它创建一个新文件,打开C盘中文件,意图将该文件变成Netsky蠕虫的一个副本。
可以发现有五条边,就会相应的有五个function。对于新的实例,依次检测这五个节点和这五个function。
该系统的主要前提是,观察样品在仿真程序的恶意活动。此外,还需要找到污点数据源和相应接收器之间的依赖关系。如果恶意软件完成规避这两个步骤中的任何一个,该系统就无法产生系统调用的签名,或者无法寻找切片过程的。
恶意软件的作者可以用延时,时间触发式的行为,命令和控制机制,以试图阻止恶意软件在分析期间执行任何恶意操作。
该系统重点在于检测数据的输入输出关系。一旦恶意软件编写者决定实施新的算法,使用不同的数据传输的方法,或使用不同的系统调用实现相同的目的,该方法就失去作用。