2.4 恶意代码动态分析环境—沙箱
为真实了解恶意代码的行为特征,分析人员通常采用动态分析的方式实际运行恶意代码,并监控记录恶意代码的执行过程,由此评价程序的真实恶意意图。为避免恶意代码实际执行过程给主机环境造成的破坏性影响,通常是在虚拟机环境下执行恶意代码。
虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实Windows系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响,而且具有能够在现有系统与虚拟镜像之间灵活切换的一类操作系统。当前,流行的虚拟机软件有VMware(VMWare ACE)、Virtual Box和Virtual PC,它们都能在Windows系统上虚拟出多个计算机。
而沙箱(Sandbox)则是一种基于虚拟机的恶意代码分析环境,它是一种将未知、不可信的软件隔离执行的安全机制。恶意代码分析沙箱一般用来将不可信软件放在隔离环境中自动地动态执行,然后提取其运行过程中的进程行为、网络行为、文件行为等动态行为,安全研究员可以根据这些行为分析结果对恶意软件进行更深入地分析。
2.4.1 沙箱的基本原理
沙箱被广泛应用于计算机安全领域,它是一种用于实现安全运行程序目标的安全机制。它常常用来执行那些非可信的程序。在执行过程中,非可信程序中潜藏的恶意代码对系统的影响将会被限制在沙箱内而不会影响到系统的其它部分。
沙箱技术按照一定的安全策略,通过严格限制非可信程序对系统资源的使用来实现隔离。比较典型的实现方案包括:Janus、Chakravyuha、BlueBox等,它们通过拦截系统调用来限制在沙箱中运行的程序对系统某些重要资源的使用。这些资源通常是指那些对系统安全起关键作用的资源,一旦被非法使用,便会对系统安全造成严重影响。下面对这几种实现方案做以简单介绍:
(1)Janus
Janus [16] 是由加州大学伯克利分校的研究人员开发完成,其设计初衷是搭建一个不可信程序运行的安全环境,在此环境中,通过限制程序对操作系统的访问权限以降低可能发生的安全风险。
(2)Chakravyuha
Chakravyuha(简称CV) [17] 是由IBM公司开发的一个沙箱环境,其设计初衷是通过第三方授权为陌生代码分配访问系统逻辑资源(比如,可调用的函数和服务)和物理资源(比如CPU占比,内存和磁盘空间等)的专属权限集合。当要在沙箱中安装程序时,其相关联的权限由操作系统管控存储在一个安全区域。
(3)BlueBox
BlueBox [18] 是由IBM公司研发的一个基于主机的入侵检测系统,它同样采用了系统调用内省机制,在内核中创建虚拟环境定义和增强非常细粒度的进程功能。这些功能通过制定的一组规则(策略)实现,规定每一个可执行文件对系统资源的访问行为。
此外,与以上采用拦截系统调用过程对程序执行过程进行控制的策略不同,Strata系统则通过软件动态转换(Software Dynamic Translation)的技术实现沙箱。与拦截系统调用一样,软件动态转换的目的也是通过动态转换来完成对沙箱中程序的资源使用行为进行限制。
通过上述分析,我们可以得出结论,沙箱技术是通过设置安全策略来限制程序对系统资源的使用,进而防止其对系统进行破坏。所以,沙箱的有效性依赖于所使用的安全策略的有效性。如果安全策略的限制过于苛刻,那么对沙箱中运行程序的行为限制就会比较严格,可能会影响到程序的正常运行。反之,如果安全策略限制较松,那么就可能会造成程序运行不受限制,从而对系统本身造成破坏。所以,安全策略设置与充分分析程序行为特征两者之间需要折衷衡量。
2.4.2 Cuckoo沙箱基本框架
Cuckoo沙箱 [19] 是一款开源的恶意代码自动化分析系统,目前已被业界广泛采用,被用于自动执行和分析样本文件,并将分析结果汇总为报告的形式。
Cuckoo沙箱可以分析的文件样本类型包括:
(1)Windows可执行文件(exe)
(2)DLL文件
(3)PDF文档
(4)Microsoft Office文档
(5)URLS或HTML文件
(6)PHP脚本
(7)CPL文件
(8)宏文件
(9)VB(Visual Basic)脚本
(10)ZIP压缩文档
(11)JAR文件
(12)Python文件等。
Cuckoo沙箱对样本分析之后得到的分析结果包含如下内容:
(1)恶意样本的API调用序列
(2)恶意样本执行期间发生的文件、文件夹创建、删除、修改、枚举等操作
(3)恶意样本执行期间发生的注册表操作
(4)恶意样本进程的内存镜像
(5)PCAP格式的网络流量记录
(6)恶意样本执行期间的屏幕截图
(7)获取运行恶意代码的客户机的完整内存镜像等。
Cuckoo沙箱的基本架构如图2-2所示,主要包括两部分:
(1)Cuckoo Host
Cuckoo Host是Cuckoo沙箱的服务端,负责启动分析任务和生成分析结果报告,并负责管理多个分析客户机(虚拟机)。
(2)Analysis Guest
Cuckoo沙箱的分析客户机,可以理解为一台虚拟机,负责提供干净的虚拟环境供恶意代码样本运行,监测并记录样本的运行情况,并将记录的行为数据信息汇报给Cuckoo Host。
两者之间通过虚拟网络连接,一个Cuckoo Host可以与多个Analysis Guest组成一个局域网,该Cuckoo Host负责管理这些Analysis Guest。

图2-2 Cuckoo沙箱基本框架
2.4.3 Cuckoo沙箱程序结构及运行流程
2.4.3.1 Cuckoo沙箱程序结构
Cuckoo沙箱的程序组件主要包括以下几个模块:
(1)任务调度器(Scheduler)
任务调度器是Cuckoo沙箱组件中一直处于运行状态的组件中的一个。它负责对已配置的虚拟机(如VirtualBox、VMware等)进行初始化,并在系统具备足够可用资源(比如磁盘空间等)的情况下开启正在等待的分析任务。通过这种运行模式,确保所启动和运行的虚拟机的数量不会超出所配置的上限。调度器会持续地检查是否有可用的虚拟机。如果有,则前往查询是否有正在等待分析的任务。如果两者都存在,就会挑选一个任务启动运行,任务信息会同时传递给分析管理器(The analysis manager)。
(2)分析管理器(The Analysis Manager)
分析管理器由任务调度器启动,它负责一个任务的全部分析过程。分析管理器决定一个虚拟机何时启动,何时结束,以及是否或者何时需要启动其它模块。一旦分析管理器开始运行,它就会寻找能够与新任务相匹配的虚拟机。例如,一个任务可能要求它的对象运行在一个特殊的环境或者虚拟机中。那么,在启动虚拟机之前,分析管理器会启动所需要的辅助模块。此时,由客户机管理器(The Guest manager)管理分析过程直到分析器(Analyzer)结束,或者分析时间超过时间限制。
(3)辅助模块(Auxiliary Modules)
辅助模块是指一个虚拟机启动之前需要运行的其它辅助性模块。这些模块负责保障在虚拟机运行之前和运行期间所要完成的所有类型的任务所需要的支持。例如,Mitdump和Sniffer就是开展恶意代码分析所要用到的辅助模块。Sniffer主要用于将一个虚拟机运行期间所生成的所有网络流量转储(dump)出来,以备后续分析。
(4)机械模块(Machinery Modules)
机械模块负责与虚拟机监控程序或者物理机之间进行交互,该模块负责启动虚拟机运行、结束虚拟机运行,以及将虚拟机恢复到初始干净状态。在Cuckoo沙箱运行期间,其中一个机械模块(默认情况下是VirtualBox)由任务调度器初始化,并用于在沙箱运行期间管理所有配置的虚拟机。
(5)客户机管理器(The Guest Manager)
客户机管理器负责与代理进行交互。它检查虚拟机是否已经启动,启动之后它会上传所有的内容,并启动分析器(Analyzer)。分析器启动之后,客户机管理器将会处于等待状态,并持续询问代理,分析器是否已将其所做的分析工作进行汇报。如果一个分析任务超时,那么客户机管理器将会强制分析器停止运行。
(6)Cuckoo代理(The Cuckoo Agent)
Cuckoo代理是一个简单的HTTP服务器,负责启动进程和上传文件。它运行于虚拟机中,并且随着操作系统启动而开始运行。客户机管理器使用代理上传和启动分析器(Analyzer)。
(7)分析器(The Analyzer)
分析器是位于客户虚拟机中运行的组件。它包括了分析任务所需要的所有逻辑和支持模块,该组件会因为所处平台的不同而各异,因为在不同的平台上分析流程和所需模块也是不同的。客户机管理器会根据所用机器的特定平台选择分析器,配置文件中会对此进行具体说明。
代理一旦启动分析器,分析器就会开始找寻它所接收到的配置信息。配置信息中包括关于分析对象、URL或者虚拟机上文件路径等的信息。一个分析对象使用一个分析指令包进行执行,这是一条关于如何打开分析对象的指令。例如,一个URL是通过IE浏览器打开,还是通过FireFox浏览器打开,或者一个特定的文件,比如一个docx文件或jar文件是否应该打开等。
分析指令包可在提交分析对象时提供。如果未提供,分析器将会通过配置文件中所包含的关于分析对象的信息,尝试寻找最优的分析指令包。
客户机辅助模块将会在启动分析对象之前开始运行。客户机辅助模块是指客户机上所能提供的所有逻辑功能,就像是一台主机上所包含的模块那样。比如,客户机辅助模块可以提供拟人操作模块和截图模块,拟人操作模块可以模拟人类行为与客户机进行交互,截图模块则用于捕获屏幕。
当一个对象在Windows系统上运行时,运行过程将会被注入Cuckoo的监控DLL。该DLL通过hook函数和跟踪进程而记录下它所看到的所有行为。所有收集到的行为数据会被发送到主机上的结果服务器(the result server)。
只要有分析对象进程仍在运行,或者分析任务未超时,分析器就会运行。
(8)结果服务器(The Result Server)
在虚拟机启动之前,分析管理器将虚拟机的IP地址和分析任务ID号发送给结果服务器进行注册。结果服务器负责处理输入的数据流,并将其以正确的格式存储在正确的任务路径下。
(9)处理模块、特征及报告模块(Processing Modules,Signatures and Reporting Modules)
按照顺序,当虚拟机结束运行之后,就需要开始处理所收集到的数据。首先,要将所截获记录下来的行为数据转换成特征模块可以使用的数据;其次,要确保数据以报告的形式展示给终端用户。为此,要运行所有的处理模块,比如,将收集到的系统调用转换成可读/可搜索的格式,执行静态分析,提取网络流量;最后,搜索进程内存转储信息。所有已运行的模块都提供了一组结构化的结果,Cuckoo特征模块和报告模块都可以使用这些结果。
当处理过程完成之后,特征模块开始运行。如果有一个特征能够匹配,那么就将该特征和对应的攻击指标(Indicators of compromise)添加到结果集合中。作为分析过程的最后一步,此时会运行所有的报告模块。报告模块将结果按照不同的格式进行存储。常用的存储格式包括JSON文件和MongoDB数据文件,这两种格式可被用于展示到Cuckoo的web页面中。
最后,当汇报完成之后,该分析任务会被标记为已报告,分析结果可向用户进行解释和展示。
2.4.3.2 Cuckoo沙箱分析流程
Cuckoo沙箱完成一次完整分析任务的流程如图2-3所示,具体步骤如下:
(1)当提交一个样本或者URL之后,将会在数据库中创建一个新条目,并生成一个任务ID。数据库条目中主要包括分析对象是什么,以及为此新任务配置和指定的分析首选项。
(2)调度器一直在不断地检查是否有可用的虚拟机。如果有,它将会搜索待分析的任务列表。然后,将会根据任务优先级选择一个任务,并将所选的任务传递给分析管理器。
(3)分析管理器选择一个可用的虚拟机用于此次分析任务,然后就开始分析。作为起始步骤中的一步,结果服务器与此同时也会接收到关于此新任务的通知,以确保它能够完全跟踪上传给它的所有搜集到的数据。
(4)在开始运行虚拟机之前,要启动所有的辅助模块(支持模块)。一旦开始运行,客户机管理器将分析器、监控器、配置以及分析对象上传到位于虚拟机中的代理,客户机管理器负责与代理之间进行交互。代理启动分析器,然后依次启动/打开分析对象,并将监控器注入到分析器中。
(5)在分析对象运行期间,监控器和分析器将收集到的行为信息回传给结果服务器。在此主机上,分析管理器此时处于等待状态,直到客户机管理器通过检查分析器是否已停止运行,或者任务已超时,来确定一个分析对象是否已完成运行。
(6)当分析对象结束运行时,分析管理器将会停止虚拟机和所有辅助模块。当所有这些都终止运行之后,处理模块将会开始处理所收集到的行为信息,并返回可用的结果。然后,将这些结果应用于已有的特征集合进行匹配检查。最后的步骤是对结果运行所有的报告模块。报告模块确保将结果存储为终端用户可用的形式,比如可用于web接口的JSON和MongoDB格式。

图2-3 Cuckoo沙箱分析流程