张威武,朱江,马峥巍,王攀,赵康
(1.杭州市公安局,浙江 杭州 310002;2.杭州安恒信息技术股份有限公司,浙江 杭州 310051)
随着互联网和物联网的发展,诸如木马、蠕虫等恶意软件已严重威胁公民隐私、社会经济发展甚至是国家安全。其中APT(高级持续性威胁,Advanced Persistent Threat)攻击的危害也在逐渐扩大。APT 攻击是有组织的、精心策划的一系列隐蔽和持续的攻击过程[1]。APT 攻击经常使用恶意软件对系统漏洞进行利用,并使用外部C&C(Control&Command)服务器对攻击的特定目标进行持续监控和数据窃取。APT 攻击具有极强的隐蔽性和针对性,所以一旦侵入成功,会对攻击目标造成非常大的威胁。
由于APT 攻击往往采取更有针对性的定制手段,会通过对木马进行“免杀”等处理方式,确保在攻击过程中逃避主流杀毒软件的检测,所以传统的安全产品如杀毒软件等,已无法充分应对APT 威胁。基于这样的安全形势,研究快速、准确的恶意文件检测技术刻不容缓。
目前,人们越来越多地将沙箱技术应用于恶意文件检测中。沙箱技术[2]主要是通过限制在其中运行的非可信软件所能访问的系统资源来保障系统的安全,在沙箱中只能操作有限的系统资源,执行受限制的操作。把可疑文件提交到沙箱中动态模拟运行,不仅可以避免未知恶意行为对真实系统的破坏,还可以对可疑文件的行为信息进行捕获和分析,从而为恶意文件的检测提供一种新的方案。基于沙箱的恶意文件检测技术能够对APT 攻击的各个环节进行检测,对追踪木马、僵尸网络控制端和发现APT 攻击意义巨大。
本文提出一种基于容器特性的沙箱隔离机制和沙箱逃逸对抗技术,通过对APT 攻击全阶段多维度分析,引入了基于行为链的综合评分机制,改进恶意文件检测和APT 攻击检测方法,在保证准确度的基础上,大大提高恶意文件检测速度和检出率,降低检测结果误报比率。
恶意文件的检测方法主要包括静态检测方法和动态检测方法两大类[3]。静态检测最早是利用基于特征或启发式的病毒检测方法,通过对特征片段计算哈希值,构建指纹库进行匹配的方式进行检测。这种检测方法需要经常更新指纹库信息,对新样本不具备检测能力,检测的准确性完全依赖指纹库。随着技术的发展,目前主流的静态检测方法是通过分析文件嵌入的代码、文件的内容和结构特征,使用统计方法来判断文件的性质。
静态检测方法对于代码混淆等逃避检测技术一直缺乏好的解决方案。而动态检测方法可以通过在虚拟环境中打开样本文件和监测样本运行过程中的行为来判定是否属于恶意文件。动态检测方法虽然能够在不用对样本进行学习的情况下直观地发现攻击者的攻击行为及其攻击目的,具有较强的健壮性[4],但是该方法通常会消耗大量资源和内存空间,而且会受到反虚拟机技术的对抗,在实际的使用中,往往达不到理想的效果。
动态检测方法的关键技术之一是沙箱系统。沙箱系统创造一个限制程序行为的执行环境,在该环境内部运行的程序对系统的影响是受控的、可还原的。为了尽可能接近真实环境,沙箱系统一般采用虚拟机实现,在虚拟机中安装操作系统和软件,模拟日常办公和其他业务场景的软硬件环境[5]。为了充分暴露并检测不同类型的攻击行为,沙箱需准备相应的环境。由于恶意文件种类非常多,依赖的执行环境也很多,以Windows 系统为例,沙箱系统需要准备的软件包括但不限于表1所罗列部分[6]。
表1 沙箱虚拟机常用软件Table 1 Common software of sandbox virtual machine
一个脆弱和暴露的系统更容易吸引网络攻击,沙箱系统应虚拟一个网络环境用于检测APT 攻击和蠕虫传播等网络行为。比如准备Windows 网络邻居、域控服务器、Exchange 邮件服务器和基于IIS(Internet Information Server)、Apache 或Nginx 的Web 网站等。沙箱还应在虚拟环境中放置一些Office 和TXT 文档,以便勒索软件有目标来执行破坏行为。此外,虚拟机中系统自身的安全措施可以适当关闭或者削弱,比如屏蔽杀毒软件、关闭UAC(User Account Control)提示、允许Office 宏、关闭浏览器安全配置项等。
沙箱系统的典型架构主要由任务调度模块、虚拟机、行为监控采集模块和行为特征分析模块组成[7],如图1 所示。
图1 沙箱典型架构Figure 1 Typical architecture of sandbox
任务调度模块负责接收检测任务,将样本文件传给虚拟机中的代理程序,再由代理程序打开或执行文件。行为监控采集模块负责记录样本执行时产生的操作行为,包括但不限于文件操作、注册表操作、进程操作、网络操作、窗口操作和服务操作等。行为特征分析模块负责行为日志,根据一定的规则判定样本的恶意性产出分析报告。
沙箱对文件的主要检测流程如下:
(1)对文件进行预处理,识别文件格式。对于可执行文件,区分是32 位或者64 位程序,是否依赖DotNet、Java 或者其他环境。对于非可执行文件,选择最合适的处理软件打开。比如同样是Office 文档,DOC 格式适合用早期的Word 版本打开,而DOCX 可以用新版Word 打开。对于压缩文件应解压后对内部文件分别处理。
(2)在虚拟机中执行或者打开文件。在这个阶段比较重要的步骤是模拟人工操作,即虚拟机中的代理程序能仿照正常用户使用鼠标和键盘进行一系列操作。特别是对于文档类型的文件,打开之后自动翻页查看内容,识别并进一步访问其中的URL、内嵌文档或者邮件附件。
(3)采集样本的行为。通过API 挂钩、内存取证、网络抓包等手段,记录样本在运行时发生的行为,截取窗口图像并保存样本,释放或者下载结果文件。经过一段时间运行或者样本进程结束后,停止虚拟机并恢复虚拟机快照。如果虚拟生成了复杂网络环境且样本对网络进行了攻击,需要恢复这些网络环境相关的虚拟机。
(4)使用规则匹配识别恶意行为,分析行为日志。规则一般针对可执行文件和非可执行文件两大类。每条规则有一个分值代表相应恶意行为的可能性和对系统的破坏程度。根据行为的类别对规则进行分组分类,同一组命中规则的分值只取最大的一个,不同组的命中规则按照权重相加。最后计算得到总分,总分越高表明文件是恶意的可能性越大。
(5)对样本的衍生产物进行检测。例如将样本释放的文件重新投入沙箱检测,提取行为日志中的IP 和域名至威胁情报库中进行查询;待所有的信息汇总后,生成相应的样本分析报告。
仅针对单个文件进行检测的沙箱在防御APT攻击方面的能力缺乏优势。因为APT 攻击的特点之一是持续时间长久,每个步骤单独分析虽然有一定的特征,但经过精心的伪装后,这些恶意行为会混合在大量正常行为之中,建立在规则匹配和打分机制上的沙箱分析引擎往往不会达到告警的阈值,而调低告警阈值容易造成误报。因此有必要从各个维度对APT 攻击生命周期中可能的攻击点进行深层次的分析检测,并且将某一攻击阶段中发现的攻击线索进一步作为其他攻击阶段的检测依据,同时使各攻击阶段的检测结论深度关联,形成确定性更高的攻击证据,以准确发现隐蔽的APT 攻击。
多维度APT 分析首先需要主动监控网络流量,对常见的网络应用层协议数据包(如HTTP,SMTP,POP3,IMAP,FTP,SMB 和DNS 等)做流量采集,将从中提取出的传输文件放入沙箱检测。然后提取流量的元数据(包括五元组、域名、URL、邮箱地址、文件名、文件Hash、文件大小、时间戳、数据包大小、协议相关控制命令等)保存到数据库中;每次沙箱生成检测报告后都将报告中的文件Hash、域名、IP 地址等数据和历史累积的流量元数据进行关联,构成跨时域的多个行为链。最后设计一种基于行为链匹配的记分机制,根据APT 攻击生命周期各个阶段的攻击行为特征去匹配行为链,对每个阶段匹配的程度进行打分,行为链的总分作为判断APT 攻击是否成立的依据。
典型的APT 攻击分为初步入侵、建立据点、木马回连、提权、内部勘测、横向扩散、窃取数据共7个阶段[8]。相应的检测内容包括:
(1)在初步入侵攻击阶段,进行网络资产扫描、邮件钓鱼攻击和恶意文件投递等检测;
(2)在建立据点攻击阶段,进行文件下载和释放、持久化、Webshell 植入等检测;
(3)在木马回连攻击阶段,进行C2 IP/URL、DGA(Domain Generation Algorithm)生成域名、自签名数字证书、伪装协议和蔽信道传输等检测;
(4)在提权攻击阶段,进行漏洞利用和密码破解等检测;
(5)在内部勘测攻击阶段,进行内网拓扑扫描、ARP(Address Resolution Protocol)欺骗、网络代理和端口转发等检测;
(6)在横向扩散攻击阶段,进行内网密码暴力破解、已知远程溢出攻击、网络邻居共享文件等检测;
(7)在窃取数据攻击阶段,进行文件搜索和遍历、隐蔽信道传输、异常流量大小和时间等检测。
检测到可疑的攻击行为发生频率越高、持续时间越久、涉及数据量越大则认为恶意的程度越强,相应的评分也越负面。利用行为链记分机制,各个行为涵盖的阶段越全面、行为之间的联系点越多则误报可能性越低。
沙箱必须依赖虚拟机提供完善的隔离环境,但虚拟机占用的系统资源很多,尤其是内存消耗至少2GB,新版本操作系统如Windows10 则需要4GB以上的内存空间。资源占用条件限制了一台服务器上可部署的虚拟机总数。
为了保证检测环境的纯净性,每个虚拟机一次只检测一个样本文件,检测完毕都要恢复虚拟机快照,还原沙箱到初始状态。恶意样本检测所需安装的各种软件加上操作系统自身,需要的磁盘空间在40GB 以上。虚拟机配置的虚拟硬盘和虚拟内存越大,恢复快照速度越慢。虚拟机恢复快照是I/O 密集型操作,磁盘I/O 速度限制使得快照恢复时间需要5~10s。当多个虚拟机同时恢复快照时,磁盘I/O瓶颈尤其严重,每次恢复快照消耗的时间可能长达20s,而每个样本的分析时间一般也只有20~30s。服务器资源限制使得沙箱系统检测样本的速度可能不足以处理每天截获的大量可疑文件和APT 攻击。虽然通过增加硬件资源、提高硬件性能可以缓解该问题,但也会增加额外成本。而且无论硬件条件怎样提高,为了检测一个可能1MB 大小都不到的样本文件,却消耗整个虚拟机系统的资源,此情况亟待改进。
Linux 系统内置了容器化技术,这是一种进程级的资源隔离[9]。容器在提供隔离的同时,还通过共享这些资源节省开销,这意味着容器比真正的虚拟化开销要小得多。如果在虚拟机中运行若干个容器,每个容器负责检测一个样本文件,既避免了样本行为之间相互干扰,又充分利用了系统资源,从而提高整体检测效率。然而,如表2 所示,Windows系统目前没有与Linux 功能相当的原生容器。现有的Windows 原生容器只能在Windows10 及以上版本的系统上使用,容器内支持的应用仅限于部分控制台程序和服务,不能满足样本检测的需要。Linux容器应用软件Docker 虽然有Windows版,但其使用的Hyper-V 虚拟机不满足轻量化要求。因此,要实现隔离程度高、兼容性好、比虚拟机轻量的Windows 容器,需要着眼于编写内核驱动程序来扩展系统功能。具体来说,可以通过文件过滤驱动、注册表过滤驱动和网络过滤驱动分别实现文件、注册表和网络的隔离[10]。
表2 Windows 和Linux 原生容器对比Table 2 Comparison of Windows and Linux native containers
2.2.1 文件隔离系统
通过Windows 系统提供的Minifilter 驱动框架开发文件过滤驱动,可以接管应用程序和操作系统的所有文件操作。实现文件系统隔离的关键方法是文件操作重定向。图2 为文件操作重定向图示。
如图2 所示,当应用程序对文件的操作涉及到文件名称、文件内容、文件大小和文件时间等属性的变化时,文件过滤驱动拦截该操作,然后复制文件到容器的隔离目录(C:Containeridfs),最后将操作重定向到新文件上。经过操作重定向,应用程序实际打开和修改的是隔离目录下的文件副本。下一次应用程序打开文件时,文件过滤驱动发现该文件在容器对应位置上存在副本,直接进行重定向文件操作。整个重定向过程对于应用程序来说是透明的,应用程序仍然认为自己正常操作了原始位置的文件。
图2 文件操作重定向Figure 2 File operation redirection
当应用程序删除文件时,不允许真正删除容器外的文件,因此可以采取标记删除的方式。如图3所示,文件过滤驱动判断要删除的文件是实际存在的,就在容器内对应位置创建一个特殊的标记删除文件。该文件的创建时间被设置为一个特殊的时间点,文件过滤驱动让删除操作直接返回,不执行实际的删除过程。
图3 文件标记删除Figure 3 File mark deletion
文件改名操作和文件删除类似,先复制文件到容器内改成新名称,再在原文件对应的位置创建标记删除文件。当应用程序再次打开文件时,文件过滤驱动读取容器内文件的创建时间属性,发现是一个标记删除文件,就向应用程序返回表示“文件不存在”的错误码。文件被标记删除不是永久的状态,当创建或者文件改名时,如果新文件的名称与标记文件相同,则用新文件覆盖标记文件。
目录查询如图4 所示,文件过滤驱动必须合并容器外和容器内两个目录的查询结果。首先按照文件名称排序条目,然后再依次对比。当容器内外存在同名文件(如A.doc)时,只显示容器内的该条目;对不同名称的文件或目录(如1.txt 和2.txt、DirXxx和DirYyy)叠加条目;遇到标记删除文件(如B.pdf)时忽略该条目。
图4 目录查询合并Figure 4 Directory Query Merge
2.2.2 注册表隔离
实现注册表隔离的方法与文件系统隔离类似,通过注册表过滤驱动接管应用程序和操作系统的所有注册表操作。不同之处在于注册表使用的磁盘空间比较小,可以将整个注册表复制一份放在容器内,所有的注册表操作一律重定向到容器内。删除、改名和枚举键值等操作不需要考虑标记删除问题,直接对注册表的副本进行操作即可。
Windows 存储注册表的文件叫做蜂巢(Hive),存储系统配置的蜂巢文件位于C:WindowsSystem32config 目录下,存储用户配置的蜂巢文件位于C:Users 各个用户名目录下。这些文件受到操作系统的保护无法直接被复制,但可以调用API(RegSaveKey)将注册表指定位置的所有键值保存为一个蜂巢文件,然后使用API(RegLoadKey)将蜂巢文件加载到注册表的另一个位置(如HKEY_USERS),成为容器专用的注册表。
2.2.3 网络隔离
虚拟机支持创建多个虚拟网卡,但与Linux 容器不同的是,Windows 系统没有设计网络名字空间隔离,不能限制应用软件及其使用的协议栈唯一绑定在某个虚拟网卡上。替代方案是通过网络过滤驱动(如WFP,Windows Filtering Platform)将应用程序与IP 地址绑定,使得一个容器内的应用程序所有网络套接字都绑定在单个IP上,而不是原本的所有IP 地址(0.0.0.0)上。此方案可以保证不同容器的应用程序能够使用相同的本地端口(比如监听80 端口)而又互不干扰。
沙箱的行为采集模块一般部署在虚拟机之外的Host 系统上,由于有了IP 绑定,根据IP 地址就可以分辨来自不同容器的网络行为。
除了占用资源过多,沙箱使用虚拟机的另一个问题是虚拟机环境与真实环境存在一些差别,一些恶意文件或者APT 攻击会利用这种差别逃避沙箱检测。例如虚拟机提供的虚拟显卡和虚拟硬盘等设备的厂商名称一般是虚拟化软件公司的名称,程序可以通过各种API 查询硬件设备的厂商属性发现自身运行在虚拟机之上。
除了利用环境信息差异,恶意文件还可以通过长时间休眠来逃避检测。沙箱每天需要检测大量的样本,而分配给每个样本的检测时间是有限的,超过时间,样本分析就会终止。如果在检测过程中恶意文件一直休眠不产生攻击行为,沙箱无法分析特征行为,则不能判定该样本的恶意程度。
所有逃避沙箱检测的情况统称为沙箱逃逸。随着沙箱技术的普遍应用,恶意文件的逃逸手段愈发丰富。表3 比较了开源沙箱Cuckoo[11]和虚拟机检测工具al-khaser[12]的逃逸对抗情况,并给出解决方法。
从表3 可以看出,Cuckoo 沙箱的逃逸对抗能力十分欠缺,仅考虑了样本检测父进程是否为explorer.exe 和鼠标位置是否变化等情况。由于沙箱不是调试器,al-khaser 检测调试器对沙箱无效,这实际上不属于Cuckoo 逃逸对抗能力。改进的对抗逃逸方法包括两类,一类是修改虚拟机配置,比如修改MAC 地址、磁盘大小和CPU 数量;另一类是通过挂钩API 和COM 接口的方式修改对软硬件的查询结果。其中,CPU 数量从一核增加到两核,直接导致虚拟机资源消耗翻倍。由于样本检测CPU数量的方法多种多样,远不止表3 中列举的几种,因此不适合采用挂钩的方法对抗。理想的解决方案是使用容器技术充分利用虚拟机资源,使得虚拟机即使配置了四核CPU 也不会浪费。
表3 沙箱逃逸对抗情况Table 3 Sandbox escape countermeasures
使用容器技术改进Cuckoo 沙箱后,在普通PC上实际测试了一个样本集(黑白样本共26447 个)。虚拟机的资源分配、检测时长和容器数量如表4 所示。虚拟机使用不同数量容器时的资源占用如图5、图6 和图7 所示。
图5 CPU 平均使用率对比Figure 5 Comparison of average CPU utilization
图6 磁盘IO 使用率对比Figure 6 Comparison of disk IO usage
图7 内存使用范围对比Figure 7 Comparison of memory usage range
表4 虚拟机和容器配置Table 4 Virtual machine and container configuration
如图8 所示为检测速度对比。从图8 可以看出,容器技术能显著提高检测速度。在Windows 7使用1 个容器时平均每个样本检测时间约20s,比不使用容器节省了10s 左右的恢复快照时间。由于Windows 10 相比Windows 7 系统消耗资源更多,恢复容器更慢,所以同等条件下Windows 10 检测速度更慢。对比PC1、PC2、PC3 的检测速度和PC4、PC5、PC6 的检测速度可以看出,虚拟机使用容器数量越多,每小时样本检测数量越大。
图8 检测速度对比Figure 8 Comparison of detection speed
但是检测速度和容器数量不是按比例增长的。随着检测样本数量增多,样本运行时磁盘I/O 资源竞争越来越严重,为保证样本检测的完整性,使用12 个容器时平均每个样本检测时间需增加到35s左右。对比PC5 和PC6 的检测速度可以看出,继续增加容器数量对整体检测速度提升较小。并且从图5、图6、图7 中可以看出,PC5 和PC6 虚拟机的资源使用率远大于其他虚拟机,考虑到需要维持虚拟机的稳定运行,我们认为表4 中的Windows10 虚拟机配置5 个容器为最优配置。
通过加强Cuckoo 沙箱的逃逸对抗,并采取多维度APT 分析方法后,在普通PC 上实际测试一个样本集。其中黑白文件样本共26447个,模拟APT攻击8次,样本详情见表5。
表5 实测样本集Table 5 Measured sample set
图9 和图10 分别对比了改进前后沙箱的检出率和误报率。可以看出,加强逃逸对抗对可执行文件和非可执行文件的检出率都有提高,分别提升了19.2%和9.8%。此改进对可执行文件的提升幅度更大,是因为可执行的样本能够采取的逃逸手段种类更多,使用了逃逸手段的样本占比更高。改进后可执行文件的误报率略微提升,经过分析是由于某些白样本也使用WMI 查询软硬件信息被误认为是逃逸行为导致的。
图9 检测效果对比Figure 9 Comparison of test results
图10 误报率对比Figure 10 Comparison of false alarm rate
在APT 攻击检测方面,检出率也有所提高。经过详细分析发现,改进前的沙箱能够检出APT 攻击前三个阶段初步入侵、建立据点和木马回连出现的恶意文件。但是有些恶意行为只有在特定条件下才发生,比如查询网络时间为特定日期、查询当前系统IP/MAC 地址为特定值等,容易逃避沙箱检测。此时沙箱仅仅能检出部分可疑行为,如持久化和网络请求,但不足以判定样本为恶意文件。改进后的沙箱加入了行为链的综合评分机制,能够发现之前遗漏的恶意文件,成功产生告警。其余没有检出的APT 攻击是因为采取了无文件攻击方式或者漏洞利用方式,不在规则涵盖范围,致使沙箱缺失可检测的目标。
本文在传统沙箱恶意文件检测基础上,融合了基于容器特性的沙箱隔离机制和沙箱逃逸对抗技术,通过对APT 攻击全阶段多维度分析,引入基于行为链的综合评分机制,提出了一种改进的恶意文件和APT 攻击检测方法,大大提高了恶意文件检测速度和检出率,降低了检测结果误报比率。该方法的特点是:
(1)采集网络流量数据,提取其中的文件数据放入沙箱分析,并且记录流量元数据形成历史数据库。针对样本检测报告和元数据进行关联分析,根据APT 攻击的各个阶段行为特征来匹配行为链并给予评分。在实际测试中,本方法成功检出了前期由于恶意行为特征不明显导致漏检的样本,极大地降低了误报率。
(2)在Windows 系统上实现轻量级的容器,隔离样本使用的文件、注册表和网络资源对象,使得多个样本能够在一个虚拟机内互不干扰地同时运行。实现容器隔离的关键方法是资源访问重定向,利用驱动程序接管样本对资源对象的操作,如果样本试图修改资源,则复制或者新建资源对象到容器专属的名字空间中,并把操作重定向到新的资源对象上。实测结果显示,一个虚拟机同时运行5~12 个容器且在同样的硬件条件下,沙箱整体检测速度提升6 倍以上。
(3)针对沙箱逃逸越来越普遍的情况,通过分析虚拟机检测工具al-khaser 的检测手段,有针对性地加强Cuckoo 沙箱的逃逸对抗。主要的对抗手段有两类:一是修改虚拟机配置使得虚拟机配置与真实系统更加接近;二是对于不适合直接修改的配置则挂钩API 或者COM 接口,修改查询请求的结果。实测表明,加强逃逸对抗对于可执行文件和非可执行文件的检出率分别提高20%和10%。
Windows 容器技术充分利用了虚拟机系统资源,能够在有限的成本控制下大幅度提升沙箱整体检测速度。但是由于容器的隔离程度不如虚拟机,遇到无法隔离的情况需要退化到传统的检测方式。例如,容器不适合隔离内核直接进行的资源操作,如果样本自带驱动程序,沙箱应该在捕获到样本试图加载驱动程序时终止分析,并把该样本交由没有容器的虚拟机重新检测。
缺乏逃逸对抗的沙箱检出率一般不超过50%,加强逃逸对抗是沙箱提高检出率的重要途径。本文提出的改进方法对虚拟机环境检测逃逸手段具有很强的针对性,效果显著。但是没有涵盖其他类型的逃逸手段,比如样本根据操作系统的区域和语言、IP 地址归属地、网络时间等信息有条件地执行。对抗条件执行可以采取静态分析和动态分析结合的手段,引入字符串模糊匹配和符号执行等技术,主动识别出样本的运行条件,并相应地模拟环境属性。
针对APT 攻击,采取APT 行为链匹配和评分方式解决了单个文件检测时告警阈值设置不够敏感的问题。沙箱采集的APT 攻击阶段行为越多,历史积累的元数据越丰富,检测效果越明显。比较实测效果可以得出结论,对于无文件和0day 等攻击的检测依然存在疏漏。因此应考虑多种采集手段结合,比如将采集点部署到PC 终端上,更加全面地覆盖APT 攻击过程。
恶意文件和APT 攻击层出不穷,检测手段也必须与时俱进。希望本文的研究,能够对物联网络安全和APT 检测技术作出一定的贡献。