关于恶意软件被加壳时,基于静态分析特征的机器学习分类器的限制的一篇论文
NDSS2020顶会论文:When Malware is Packin’ Heat; Limits of Machine Learning Classifiers Based on Static Analysis Features论文理解&笔记
原文链接
摘要
为了挫败对反恶意软件系统的分析和逃避检测,恶意软件使用了包装和其他形式的混淆。然而,很少有人意识到良性应用程序也使用包装和混淆,以保护知识产权和防止许可证滥用。
在这论文中,作者研究了基于静态分析特征的机器学习如何在包装样本上运行。恶意软件的研究人员经常认为,包装会阻止机器学习技术建立有效的分类器。然而,工业界和学术界都发表的结果表明,基于机器学习的分类器可以实现良好的检测率,这导致许多专家认为分类器只是检测样本被加壳的事实,因为加壳在恶意样本中更为普遍。
作者表明,与通常假设不同的是,包装器在包装对恶意软件分类“有用”的程序时确实保留了一些信息。然而,这些信息并不一定能捕获样本的行为。作者证明了从加壳的可执行文件中提取的信号不够丰富,以便基于机器学习的模型通过(1)将它们的知识推广到看不见的封隔器上操作,并且(2)对对抗性的例子具有鲁棒性。我们还表明,一种nai’ve机器学习技术的应用导致大量的假阳性,这反过来又可能会导致过去工作中使用的真实数据的不正确标记。
1、这篇论文简单介绍
反恶意软件为终端用户提供了一种检测和纠正在他们的机器上存在的恶意软件的方法。大多数反恶意软件通常由两部分组成:基于特征的检测器和基于启发式的分类器。虽然基于特征的方法以很小的错误率检测已知恶意软件家族的类似版本,但随着越来越多的新恶意软件样本被识别出来,它们变得不足。VirusTotal报告称,平均每天有68万多个新样本被分析,其中一些只是先前看到的具有相同行为的样本的重新包装版本。在过去的几年中,由于需要将昂贵的人工专家从循环中移除,从而推广到新的未知恶意软件样本的技术,因此出现了结合数据挖掘和机器学习技术的静态和动态分析方法[26, 59, 80,81, 93 ,97,98,103]。
尽管动态分析提供了可执行程序行为的清晰图像,但它在实践中存在一些问题:例如,对不受信任的代码的动态分析需要内核级特权,从而扩展攻击面,或者需要虚拟机,这需要大量的计算资源。此外,恶意软件通常采用环境检查来避免被检测,虚拟环境可能不能反映恶意软件所针对的环境。 为了避免这种限制,一些方法严重依赖于通过静态分析提取的特征。这些方法对想要取代基于动态分析的反恶意软件系统的反恶意软件公司很有吸引力。这些基于静态分析的反恶意软件供应商,已经迅速成长为数十亿美元的公司,吹嘘他们的工具利用“人工智能技术”,仅根据程序的静态特征(即,无需执行它们)来确定程序的恶意。然而,静态分析在应用于模糊和包装样品时存在已知的问题。
通常认为包装会极大地阻碍利用从静态(文件)分析中提取的特征的机器学习技术。然而,业界和学术界都发表了研究结果,表明基于机器学习的分类器可以达到良好的检测率。许多专家认为,这些结果是由于这样一个事实,分类器只是学习区分加壳和解包的程序。事实上,我们认为基于机器学习的分类器在现实环境中性能较差,在现实环境中,加壳越来越多地出现在恶意和良性软件中。遗憾的是,在提出基于机器学习的分类器时,大多数相关工作都没有考虑或只是简要地讨论了包装的影响。令人惊讶的是,我们最初的实验表明,基于机器学习的分类器可以区分数据集中加壳的良性样本和加壳的恶意样本。这导致了我们下面的研究问题:对加壳二进制文件的静态分析是否提供了足够丰富的特性集来使用机器学习构建一个恶意软件分类器?
我们的实验需要一个真实数据集,我们可以确定每个样本是(1)加壳的还是解包的,(2)是恶意的还是良性的。我们创建了我们的第一个数据集,野生数据集,带有一个商业反恶意软件供应商提供的可执行文件,它使用了动态特性,并结合了标记的基准数据集EMBER。我们利用了供应商的沙箱和VirusTotal,从数据集中删除了带有不一致的良性/恶性标签的样本。为了识别加壳的可执行文件,我们使用了供应商的沙箱、Deep Packer Inspector工具和一些静态工具。我们主要基于样本的运行时行为构建数据集,这一事实使我们对基础真值标签有很高的信心。我们创建了第二个数据集,实验室数据集,通过使用广泛使用的商业和免费包装器加壳野生数据集中的所有可执行程序。在详细的文献研究之后,我们从两个数据集中的可执行文件中提取了九类特征。即使在我们的实验中我们使用支持向量机,神经网络(例如,MalConv[80]),和决策树学习者的不同变体,如随机森林,我们只讨论随机森林方法的结果(1)这些方法我们观察到类似的结果,随机森林是最好的分类器在大多数实验中,(2)与神经网络相比,随机森林可以更好地解释结果。
作为一个nai’ve的实验,我们首先在包装好的恶意和未加壳的良性样本上训练分类器。由此产生的分类器对包装好的良性样本产生了较高的假阳性率,这表明分类器偏向于检测包装。Perdisci等人使用n-grams。[77]也观察到,包装检测比检测恶意更容易学习。此外,我们通过使用实验室数据集中每个封隔器(类)的样本来训练封隔器分类器,证明了“封隔器分类”是一项微不足道的任务。该分类器对每一类的准确率和召回率均大于99.99%。这表明训练集中关于包装机的偏见可能会导致分类器学习特定的包装程序,作为恶意的标志。我们通过在由两个不重叠的加壳器子集加壳的良性和恶意可执行文件上训练分类器来验证这一点,我们分别称之为好加壳器和坏加壳器。由此产生的分类器学会了将好的加壳机加壳的任何东西标记为良性,将坏的加壳机加壳的任何东西标记为恶意,而不管样本是否恶意。
我们扩展了naıve实验,在不同的训练集上训练分类器,增加填充良性样本的比率。为了避免使用好包装机和坏包装机带来的偏见,我们从均匀分布在包装机上的实验室数据集中选择了包装样本。令人惊讶的是,尽管普遍认为压缩会阻碍基于机器学习的分类器,但我们发现,增加训练集中的包装比例有助于分类器保持相对较低的假阳性率和假阴性率。这表明加壳程序保留了一些关于原始二进制文件的信息,这些信息可用于恶意软件检测。例如,大多数包装工都会保留。可执行文件的资源部分中的CAB文件头。Jacob等人[44]发现,采用弱加密或包装的封隔器也有类似的趋势。通过一次对一个加壳机进行训练,我们观察到原始二进制文件保存的信息不一定与恶意行为有关,但对恶意软件检测“有用”。然而,我们认为这样的分类器仍然存在三个问题:(1)无法泛化,(2)在强加密的情况下失败,以及(3)对抗性样本的脆弱性。
泛化。 在包装样本上训练分类器并不能保证推广到不包含在训练集中的包装器。我们每次从训练数据集中排除一个包装器,并根据被排除的加壳器加壳的样本评估分类器。排除tElock、PEC和kch时,我们观察到假阳性率分别为43.65%、47.49%和83.06%。此外,在来自实验室数据集的所有包装器上训练的分类器对来自野生数据集的加壳可执行文件产生了41.98%的假阴性率。这意味着,尽管包装器保留了一些信息,但训练过的分类器不能推广到以前从未见过的包装例程。这是一个严重的问题,因为恶意软件的作者通常更喜欢定制的包装例程,而不是现成的包装器[34,66,110]。
强大和完整的加密。我们认为,可执行文件可能以一种在执行之前不显示与其行为相关的信息的方式加壳。作为初步步骤,我们使用自己的加壳器(称为AES Encrypter)加壳了wild dataset中的所有可执行文件,该加壳器使用AES加密可执行文件,并将其作为加壳二进制文件的叠加。当执行加壳的程序时,AES-Encrepter会解密覆盖层,并在一个新的进程中执行原始程序。除了从加密的覆盖层中提取的特征外,所有的静态特征都总是相同的。我们在AES加密机加壳的可执行文件上对分类器进行了训练和测试,正如预期的那样,分类器无法区分AES加密机加壳的良性和恶意可执行文件。这表明,如果为此目的进行了适当优化,则可以在不向加壳程序传输任何(静态)初始模式的情况下执行加壳。
对抗性样本。 基于机器学习的恶意软件分类已被证明容易受到对抗性样本的攻击,尤其是那些只使用静态分析功能的样本[33、41、89]。我们希望在我们的例子中生成这样的对抗性样本会更容易,因为加壳二进制文件的静态分析不能提供捕获样本行为的功能。我们首先在一个数据集上训练分类器,该数据集的良性和恶意样本都使用相同的包装,这样分类器就不会偏向于检测作为恶意标志的特定包装例程。分类器保持了较低的错误率。从分类器成功检测到的所有恶意样本中,我们设法生成分类器不再检测为恶意的新样本。具体来说,我们确定了良性样本中更频繁出现的“良性”字节序列,并将其注入目标二进制文件中,而不会影响样本的行为。最近,一组研究人员使用一种非常类似的技术欺骗Cylance基于人工智能的反恶意软件引擎,使其认为WannaCry等恶意软件和Mimikatz等工具是良性的[105]。他们通过从在线游戏程序中提取字符串并将其注入恶意文件来实现这一点。由于游戏是高度模糊和拥挤的,他们面对这样一个引擎进退两难;要么遗传对游戏的偏见,要么产生高误报率[1]。
为了研究现实世界的恶意软件检测器如何操作加壳的可执行文件,我们向每个加壳器加壳的良性和恶意可执行文件。我们只关注六个基于机器学习的引擎,根据VirusTotal或该公司网站上的描述,它们只使用静态分析功能。不幸的是,我们观察到这六个引擎都知道包装意味着恶意。必须指出的是,我们使用了商业包装,如Themida、PECompact、PELock和Obsidium,合法软件公司使用这些包装来保护他们的软件。然而,这些包装商包装的良性程序被检测为恶意软件。
随着包装器越来越多地被合法软件[84]所采用,反恶意软件行业需要比检测包装器做得更好,否则好的和坏的程序会被错误分类,给用户带来痛苦,最终导致警报疲劳和检测失败。这对于以前依赖反恶意软件产品来建立基本事实的研究尤其值得关注,因为对包装的良性程序的错误分类可能会使这些研究[22,43,86,88,97]产生偏差。
综上所述,我们做出了以下贡献:
- 我们研究了只使用静态特征的基于机器学习的恶意软件分类器的局限性。我们发现,在良性和恶意样本中使用的包装器之间缺乏重叠,导致分类器将特定的包装器与恶意联系起来。我们证明,如果训练正确,分类器能够区分由现实世界的包装器包装的良性和恶意样本,尽管它仍然容易受到看不见的包装例程的影响,或者更糟糕的是,受到对整个程序应用强加密的影响。此外,我们表明,有可能制造对抗性样本,通过naı’ve对抗攻击绕过检测。
- 我们对病毒总数的评估表明,当前静态的基于机器学习的反恶意软件引擎检测的是包装而不是恶意。
- 我们发布了一个包含392,168个可执行文件的数据集,我们知道每个示例是(1)良性的还是恶意的,以及(2)加壳的还是解包的。我们还知道实验室数据集的特定包装器,其中包括341,444个可执行文件
在https://github.com/ucsb-seclab/packware的Docker图像中发布了所有实验的源代码。
图1:野外包装样品的流行情况。
图2:包含Themida的窗口10个二进制文件的病毒总数检测数的直方图。
2、动机
长期以来,加壳一直是恶意软件作者逃避基于特征的反恶意软件引擎[71]检测的有效方法,但人们对其在良性应用程序中的合法使用知之甚少。作为这一方向的第一步,2013年,Lakshman Nataraj[69]探索了如何在VirusTotal手柄包装上提供反恶意软件扫描仪。他用四种不同的加壳器(UPX、Upack、NSPack和BEP)加壳了来自不同Windows操作系统版本的16663个良性系统可执行文件,并将它们提交给VirusTotal。他发现,96.7%的包含Upack、NSPack和BEP的文件在virus Total上至少触发了10次的检测。[116]另一项最近的研究挖掘了反恶意软件产品基于字节模式的特征,迫使良性文件进行错误分类,并发现加壳器的工件作为“恶意标记”是有效的。我们认为,这些结果源于一个事实:从历史上看,加壳只与恶意软件有关。因此,仅基于加壳样本的静态特征的na¨ıve检测方法将严重偏向于将加壳与恶意行为联系起来。事实上,基于机器学习的恶意软件检测器[28、68、82、101、102、103]也在使用静态分析功能,这些功能被证明对包装检测是有用的[5、15、37、44、59、76、77、102、109]。
我们从一个高级恶意软件保护产品的商业供应商那里收集了一个大规模的、真实的、恶意的、可疑的和良性文件的数据集。该数据集包括供应商在过去三年中从全球客户那里分析的样本。如图1所示,包装不仅在恶意软件样本中普遍存在(75%),而且在良性样本中也很常见(在最坏的情况下为50%)。请注意,图1给出了加壳可执行文件比例的下限。我们的发现与Rahbarinia等人[84]的发现重叠,Rahbarinia等人在2014年的7个月内研究了300万个基于网络的软件下载,发现恶意和良性文件都使用已知的加壳程序(分别为58%和54%)。更糟糕的是,在他们观察到的69个独特的加壳器(如INNO,UPX)中,超过一半同时被恶意和良性软件使用。虽然一些加壳器(例如,NSPack,Molebox)被专门用来在他们的数据集中加壳恶意软件,但他们得出的结论是,单独加壳信息本身并不是恶意行为的良好指标。我们用Themida进一步加壳了新安装的Windows 10(位于C:\Windows\System32)中的613个可执行文件,并将它们提交给VirusTotal。图2显示了检测次数的直方图。不出所料,在613个二进制文件中,有564个二进制文件被10多个反恶意软件工具检测为恶意文件。如果我们只考虑VirusTotal上的六个基于机器学习的反恶意软件引擎,那么在613个二进制文件中,有553个二进制文件被四个以上的工具检测为恶意。
正如这些数字所示,在设计和评估恶意软件检测方法时,如果任何方法未能考虑包装好的良性样本,最终都会导致真实数据出现大量误报。这对于基于机器学习的方法尤其令人担忧。在缺乏可靠和新鲜的事实的情况下,机器学习方法经常依赖于VirusTotal[22,43,86,88,97]上提供的反恶意软件产品的标签。鉴于反恶意软件产品在标记样本[42,48,65,99]时存在分歧,一种常见的做法是对数据集进行清理,例如,通过考虑来自一组选定的反恶意软件产品的决策,或者,作为另一个例子,通过使用基于投票的共识。尽管机器学习方法因各种原因而存在问题[42,65],但我们认为有一个主要方面特别麻烦:数据集污染。被反恶意软件产品检测为恶意的加壳良性样本被错误地用作恶意软件样本。 例如,最近的一项相关工作[22]使用了类似的标记程序,如作者所述:“我们使用监督学习训练分类器,因此需要每个样本都有一个目标标签(0表示良性,1表示恶意软件)。对于每个样本,我们统计VirusTotal聚合的各种引擎的恶意检测数量,根据我们给予每个引擎的声誉进行加权,这样几个知名引擎的权重大于1,所有其他引擎的权重均为1。我们使用该结果来标记一个样本为良性或恶意的。” 虽然我们不知道作者使用了哪些权重,但他们的数据集很有可能是倾斜的,因为,正如我们上面所展示的,Virus Total上的许多反恶意软件引擎将加壳的良性样本检测为恶意软件。
正如反恶意软件社区所研究的那样,评估现有的恶意软件检测方法[57,65,90]带来了巨大挑战。例如,Rossow等人[90]提出了收集和使用恶意软件数据集的准侧。本文的工作旨在发现包装是否保留了原始二进制文件中足够丰富的静态特性,以检测除了包装本身之外的任何有意义的东西。 据我们所知,之前的工作还没有考虑过加壳可执行文件对仅利用静态分析特性的基于机器学习的恶意软件检测器的影响。
3、背景
A. 可执行的加壳器
加壳器是一种应用一组例程来压缩或加密目标程序的软件组件。最简单的加壳形式包括(在运行时)对原始有效负载进行解密或解压缩,然后跳转到包含目标有效负载的内存地址(这种技术称为“尾部跳转”)。Ugarte等人[110]将加壳器分为六种类型,目标有效载荷的重建越来越复杂:
类型1:执行单个解包例程,将控制转移到原始程序。UPX是这类产品中最受欢迎的包装器。类型2:加壳器采用了一系列按顺序执行的解包例程链,并在链的末端重新编译了原始代码。类型3:解包程序包括循环和后缘。虽然原始代码不一定会在最后一层中重建,但仍然存在一个尾部转换来分离加壳器和应用程序代码。第4类:在每层包装中,拆包程序的相应部分与原始代码的相应部分交织。但是,在执行过程中的某个时刻,整个原始代码将在内存中完全解包。类型5:加壳器由不同的层组成,其中解包代码与原始代码相混淆。有多个尾部跳转,一次只显示原始代码的一帧。类型6:加壳器在任何给定的时间只显示(解包)原始代码的一个片段(只有一条指令)。
我们将讨论在附录a中提出的包装检测、包装器识别和自动拆包的方法。在这里,我们将讨论这些方法的局限性。
包装检测的局限性。 基于特征的包装检测方法有很高的假阴性率,因为它们需要由每个包装器生成的加壳可执行文件的先验知识。例如,PEiD显示有大约30%的假阴性率[76]。其他方法则应用静态分析来提取一组特征,或使用手工制作的启发式式方法来检测加壳的可执行文件。然而,他们很容易受到对手的攻击。例如,Zeus宙斯恶意软件家族应用了不同的技术,例如在可执行文件中插入一组选定的字节,以保持文件及其部分的熵值为较低[112]。这种恶意软件避开了基于熵的启发式方法,因为它们通常被用来确定一个可执行文件是否被加壳[59]。动态方法的性能似乎更好,因为它们通常在内存位置中查找写-执行序列,这是加壳的定义。然而,加壳的可执行文件通常使用不同的技术来逃避分析,比如有条件地执行解包例程[21]。
通用拆包器的局限性。 包装器通常使用不同的技术来逃避通用拆包器使用的分析方法。tELock和Armadillo lever对几个反调试例程进行老化,以在调试设置中终止执行[9,13]。尽管一些解包器利用硬件虚拟化来实现透明度[24],但引入的性能开销可能是不可接受的[117]。Themida将虚拟化混淆应用于其解包程序,这可能会导致切片大小爆炸[64]。一般来说,通用解包依赖于一些在实践中不一定成立的假设[110]:(1)整个原始代码在某一点上存储在内存中,(2)原始代码在最后一层解包,(3)解包例程的执行与原始代码完全分离,(4)解包代码和原始代码在同一进程中运行,没有任何进程间通信。这些简化使得这些拆包器不足以应对复杂的现实世界加壳机带来的挑战。此外,通用解包程序通常依赖于为特定加壳程序设计的启发式方法[110]。
B.包装 vs 静态恶意软件分析
在附录B中,我们将讨论反恶意软件社区如何采用机器学习来静态分析恶意程序。特别是,我们回顾了各种基于机器学习[2,7, 28,39,43 ,44,49, 51,52,53, 54,56,62, 63,68,70, 80,81,82, 86,93,94, 96,97, 98,102,103,104,107,108,118]的静态恶意软件分析方法。虽然静态恶意软件检测器已被证明倾向于检测包装[69,77,116],但我们在处理加壳的可执行文件方面观察到了相关工作中的一些局限性。特别是,在上面提到的30篇论文中:(1)10篇论文[2, 28,39, 63,68,81, 82,86, 98,118]没有提到包装或混淆技术。(2)如作者所述,10种方法[7,54, 56,62,93,94,96,104,107,108]只适用于未加壳的可执行文件。他们使用解加壳的可执行文件或成功解加壳的可执行文件。(3)七篇论文,[43,49,52,53,70 ,80 ,97]声称在恶意软件分类中表现良好,无论可执行文件是否被加壳。然而,作者并没有讨论在他们的数据集中是否存在包装方面的任何偏差。更准确地说,他们没有提到在他们数据集中使用加壳的良性可执行文件,或者对加壳的可执行文件[49,70]的影响进行了简短的检查,尽管只对未加壳的可执行文件执行了彻底的评估。(4)只有三篇论文,[51, 102, 103]专注于加壳的可执行文件。然而,它们有两个主要的局限性:(a),他们使用基于特征的包装器检测器(如PEiD)来检测加壳,而PEiD有大约30%的假阴性率[76],(b)他们通过只使用少量的加壳器打包良性可执行文件来扩充他们的数据集。然而,恶意可执行文件可能会用不同的加壳器进行加壳,这可能会导致偏向于检测特定的加壳技术。Jacob等人[44]发现了类似的恶意软件样本,即使它们被包装起来,但他们的方法只对使用加壳或弱加密的加壳器具有弹性。
最后,大多数相关的工作没有发布他们的数据集,因此这些方法不能公平地相互比较。
4、增值数据集
我们的实验需要一个由可执行程序组成的数据集,我们知道这些程序是:(1)良性还是恶意,(2)加壳还是解包。我们将一个来自商业供应商的带标签的数据集与EMBER[3]数据集(带标签)相结合,以构建我们的野生数据集。我们利用混合方法将可执行文件标记为加壳或解包。我们构建了另一个真实数据集,即实验室数据集,方法是使用广泛使用的商业和免费加壳器以及我们自己的加壳器AES Encrypter打包野生数据集中的所有可执行文件。在对文献进行详细研究之后,我们为所有样本提取了九个特征族。
A.野生数据集
我们使用了两个不同的源来创建Windows x86可执行文件的野生数据集。(1) 一家商业反恶意软件供应商提供了29573个可执行文件。这些“在野外”观察到的样本是从一个原始池中随机选取的,该原始池在2017年5月15日至2017年9月19日期间由美国反恶意软件供应商的沙箱进行分析。除了确定了良性/恶意标签和在执行过程中观察到的恶意行为外,供应商还确定了哪个可执行文件是否加壳。(2) Anderson等人[3]引入了一个名为EMBER的标记基准数据集,用于训练机器学习模型以静态检测Windows恶意软件。此数据集由800000个标记为的Windows可执行文件组成。但是,没有提供有关包装的信息。我们从该数据集中随机选择56411个x86可执行文件,并将每个样本提交给商业反恶意软件供应商的沙箱,以确定样本是否加壳。这也为我们提供了可执行文件是恶意软件还是良性软件的确认,因为沙箱可以检测到恶意行为。请注意,这两个来源的样本是在2017年的某个时候“在野外”观察到的,这让当前的反恶意软件引擎有足够的时间来整合检测手段。由于这两个来源可能有错误标记的样本,我们执行了仔细而广泛的后处理步骤,我们将在以下段落中描述。
恶意与良性。我们使用了三种不同的来源来检测一个可执行文件是恶意的还是良性的。(1)VirusTotal: 我们通过查询病毒总数获得了整个数据集的报告。我们数据集中所有85,984个可执行文件已经在VirusTotal上运行超过一年。从VirusTotal使用的所有引擎中,我们只考虑了7个反恶意软件行业的工具,并根据多数投票标记每个可执行文件。(2)反恶意软件供应商:由于我们将从ember数据集中提取的样本发送到供应商的沙箱,因此我们对所有样本都贴有了良性/恶意的标签。(3)EMBER数据集:我们从EMBER数据集中选择的所有样本都用Endgame[29]标记。
我们丢弃了4113个三个来源之间存在良性/恶意性质的样本。如表I所示,在这一步的结束时,我们还剩下37,269个良性样本和44,602个恶意样本(总共有81,871个可执行文件)。
加壳vs未打包 。由于第三节中讨论的限制,我们利用混合方法来确定可执行文件是否被打包。特别地,对于每个示例,我们采取了以下步骤:(1)反恶意软件供应商:我们将示例提交到供应商的沙箱,并给出下载的报告,我们检测是否发生了解包行为。反恶意软件工具通过在自定义沙箱中运行可执行文件来检测打包代码的存在,每次对内存位置进行写入,然后跳转到该地址时,该文件就会中断执行。在那个时间点,将加载指令的快照与原始二进制指令进行比较,如果它们不同,可执行文件将被标记为打包。(2)深度包装器检查器(dpi):我们使用dpi[110]进一步分析每个样本。这个框架衡量了包装器的运行时复杂性。添加一个额外的动态引擎可以帮助我们识别没有被第一个动态引擎检测到的打包可执行文件。例如,主机配置可能会使样本在解包过程开始之前终止。此外,这个框架还为我们提供了关于数据集中打包器的运行时复杂性的见解。由于dpi没有在.NET可执行文件上运行,我们从数据集中删除了所有13,489个.NET可执行文件,10,681个良性文件和2,808个恶意文件,结果得到68,382个可执行文件,26,588个良性文件和41,794个恶意文件。(3)特征和启发式:我们使用Mamalay[60]、ExeinfoPE、yara rules、mePEiD和F-Prot(来自VirusTotal)来识别在打包的可执行文件中留下明显工件的包装器。
特别是,如果供应商的沙箱、dpi和基于特征的工具中的一个检测到可执行文件为打包,我们就将可执行文件标记为打包。我们总共标记了46,328个包装样本,分为12,647个良性样本和33,681个恶意样本。我们进一步使用Mpalary提出的启发式方法进行包装检测,来确定可能包装的样品。Mtalary将24911个样品标记为“可能包装”,其中6898个样品没有被其他工具检测到已包装。我们认为这种差异可能是包装检测的局限性造成的,我们在第三-A节中有讨论。然而,我们丢弃了所有这些样品,因为我们不完全确定它们是否被包装好了。
附录中的表X显示了关于每种方法检测到的打包可执行文件的统计信息。在17,043个良性可执行文件中,12,647个可执行文件被打包,4,396个可执行文件被解打包,在40,031个恶意可执行文件中,33,681个可执行文件被打包,5,752个可执行文件被解打包。虽然未包装的恶意软件被证明是罕见的[10,59,61],但我们没有检测到5,752个(13.61%)恶意样本的包装。由于这个百分比可以被认为比预期的要高,我们试图通过随机选择20个样本,并手动查找解包程序来验证我们的包装器分析。我们观察了18个样品的解包常规代码,但由于这些样品使用的反检测技术,我们的封隔器检测方案没有检测到它们。由于我们的实验不需要任何解压缩的恶意可执行文件,因此我们丢弃了系统标记为解压缩的所有5,752个恶意样本。为了确认我们确定为未包装的4396个良性样本没有被打包,我们手动查看了100个未包装的良性可执行文件,没有发现任何包装的迹象。简单的统计数据保证了超过97.11%(95.59%)的样本被正确标记,置信度为95%(99%)。
我们进一步注意到,我们的数据集在DLL文件方面存在倾斜,包含4005个良性DLL,但只有598个恶意DLL。我们从数据集中删除了所有这些示例。最后,野生数据集由50,724个可执行文件组成,分为4,396个未打包良性文件、12,647个打包良性文件和33,681个打包恶意可执行文件。
包装器的复杂性。如附录中的表X所示,dpi检测到野生数据集中的34,044个可执行文件的解包行为。表XI显示了由Ugarte等人[110]为这些可执行文件定义的包装器复杂性类。
野外的包装器。使用PEiD、F-Prot、Mtalaly、ExeinfoPE和yara规则,我们匹配了9448个可执行文件、1866个良性文件和7582个恶意文件的包装特征。我们在野生数据集中发现了48个包装器的文物。如附录中的表XII所示,一些像dxpack、MPRESS和PECompact等这样的包装器主要用于恶意样本。
B.实验室数据集
我们的一些实验要求我们确定地知道哪个包装器是用来包装一个程序的。因此,我们获得了9个市售或免费的包装器(即Obsidium, PELock, Themida, PECompact,
Petite, UPX, kkrunchy, MPRESS, and tElock),并在我们的野生数据集中打包所有50,724个可执行文件来创建实验室数据集。没有一个包装器能够包装好所有的样品。 例如,Petite在大多数GUI可执行文件上都失败了,而Obsidiuum在某些情况下会生成空的可执行文件。我们查看了这些包装器生成的日志,并删除了那些没有正确打包的可执行文件。我们还验证了所有打包的可执行文件都有有效的入口点。 最后,我们开发了自己的简单打包器,称为AES-encrypter,给定可执行文件P的情况下,它使用具有随机密钥(包含在最终的二进制中)的AES对P进行加密,并将加密的二进制作为填充的二进制P‘的覆盖注入。当执行P‘时,它首先解密覆盖层,然后执行解密的(原始的)二进制文件。表二列出了我们用每个包装器成功包装的样品数量。我们总共生成了341,444个打包的可执行文件。为了确定包装是否确实保留了原始行为,我们将这些样品与原始样品的行为进行了比较。我们的结果证实了94.56%的样本表现出原始的行为。我们在附录C中解释了我们是如何进行这个比较的。
C. 特点
在对文献进行详细分析后(见B节)后,我们提取了9种静态分析特征,这些特征在相关工作中被证明是有用的。我们使用pefile[73]从三种不同的来源中提取特征:PE结构、程序的组装和二进制文件的原始字节。如表3所示,我们从数据集中的样本中总共提取了56,543个个体特征。
(1)PE标题。与PE标头相关的特性已被广泛地应用于相关工作中。在我们的例子中,我们使用PE头文件中显示在不同可执行文件之间可变性的所有字段(一些头字段不会改变[56])。我们从可选标头和COFF头中提取了12个单独的特征,如附录中的表XX所示。此外,我们从COFF报头的特征字段中提取了16个二进制特征,每个特征表示是否为可执行文件设置了相应的标志。因此,我们从PE头中提取了12个整数和16个二进制特征,总共得到28个特征。
(2)PE部分。每个可执行文件都有不同的部分,例如.data部分和.文本部分。对于每个部分,我们提取了8个单独的特征,如附录中的表第二十一项所述。此外,从节头中的特征字段中,我们为每个位(标记)创建了多达32个二进制特性。例如,当该部分是可执行时,第30位对应的特征为真。我们忽略了在数据集中没有变化的位(标志)。对于PE文件的每个部分,我们计算了32个(最多)二进制,7个整数和一个字符串特性,称为匹配部分id字段。可执行文件在数据集中的最大部分数是19。对于每个可执行文件,我们构建了一个由516个不同特性组成的向量,然后是示例不包含的部分的默认值。基于相关的工作,我们通过以下处理步骤增强了这组特征:(1)我们为可执行文件入口点所在的部分提取了上述特征,并将它们分别添加到数据集;(2)我们计算每个可执行文件的部分的平均值、最小值和最大熵。我们对大小属性和虚拟大小属性都做了同样的操作。因此,我们从PE部分中总共提取了570个特征。
(3)DLL导入。大多数可执行文件都链接到动态链接的库(dll)。对于每个库,我们使用一个二进制特性,当可执行文件使用该库时,该特性为真。在这个集合中,我们总共有4305个二进制特征。
(4)API导入。每个可执行文件都有一个导入目录表,其中包含可执行文件从外部dll导入的api。我们为每个API函数引入一个二进制特性,如果可执行文件导入该函数,该特性为真。在这个集合中,我们总共有19,168个二进制特征。
(5)丰富的头。PE文件中的富头字段包括有关对象文件的标识或类型以及用于构建可执行文件的编译器的信息。韦伯斯特等人。[115]已经表明,富头对于检测不同版本的恶意软件是有用的,因为恶意软件的作者通常不会故意删除这个头。特别是,他们观察到“大多数包装工商,虽然有时会引入异常,但通常不会从样品中剥离丰富的标题。”根据我们的观察,如表2所示,当阻塞、压缩、MPRESS和PELock剥离了野生数据集中70-80%的二进制文件时,其他包装器总是保留这个头,除了aes加密器,它总是产生相同的头。我们遵循韦伯斯特等人[115]的过程,将这个头编码为66个整数特征。
(6)字节n-grams。假设一个可执行文件是一个字节序列,我们通过将每n个连续字节作为单个特征来提取n个字节grams。考虑到n≥4的n克表示实际上不可能存储在主存储器中,需要一个特征选择过程[82]。Raff等人。[82]观察到,6-grams在他们的数据集上表现最好。我们使用相同的策略来选择最重要的6克特征,其中每个特征表示可执行文件是否包含相应的6克特征。我们首先随机选择一组1000个样本,并计算包含每个6-grams的文件数量。我们在这些样本中观察到1060957223个独特的6克。正如附录中的图10a所示,正如Raff等人[82]所观察到的,字节6-grams遵循幂律类型分布,99.99%6克出现10次或更少。我们通过选择出现在超过1%的样本中的6克来减少我们的候选6克集合,结果得到了204,502个单独的6克特征。然后,我们根据信息增益(IG)度量[79]选择了前13,000个n-gram特征,因为我们的数据集大致收敛于这个值,如图10b所示。
(7)操作码n-grams。我们使用顶点[12]反汇编器将可执行文件标记为操作码序列,然后构建操作码n-克。虽然一个小的值可能无法检测到复杂的恶意代码块,但使用简单的混淆技术[93]可以很容易地避免长序列的操作码。此外,n值的大值会引入高性能开销[49,93]。由于这些原因,与大多数相关的工作类似,我们使用长度为4的序列。我们通过计算每个序列的TF-IDF[92]值来表示操作码n-克。虽然我们可以提取野生数据集中所有样本的组装,但在实验室数据集中的341,444个样本中,我们无法分解2200个样本(见表2)。对于这些程序,我们将-1作为操作码n-gram特性的值。我们总共提取了5,373,170个唯一的操作码n克,其中只有51,942个n克出现在实验室数据集中超过0.1%的可执行文件中(图10c)。我们只考虑这些操作码n-克(减少98.47%)。图10d显示了这些操作码n-gram的信息增益(IG)度量。我们选择了前2500个操作码ngrams(基于IG值),并将它们的TF-IDF权值作为特征值,从而得到2500个浮动特征。
(8)字符串。包含在可执行文件中的(可打印的)字符串可以对可执行文件提供有价值的见解,如文件名、系统资源信息、恶意软件签名等。我们利用GNU字符串程序来提取至少有4个字符长的可打印字符序列。我们用一个二进制特性表示每个可打印字符串,指示可执行文件是否包含该字符串。我们观察到1,856,455,113个独特的字符串,其中超过99.99%的样本在不到0.4%的样本中出现。在删除了这些罕见的字符串后,我们获得了16,900个二进制特征。
(9)文件通用。我们还计算了每个样本的大小(字节数),以及整个文件的熵。我们进一步将这个小系列的特性称为“通用的”。
5、实验和结果
在这项工作中,我们的目的是回答以下问题:对打包二进制文件的静态分析是否为恶意软件分类器提供了足够丰富的特性? 我们通过进行大量实验来分析这个问题的多个方面。如引言所述,尽管我们使用几种机器学习方法(例如,SVM,神经网络和决策树),但我们只讨论随机森林方法的结果,因为(1)我们观察到了这些方法的类似结果,其中随机森林在大多数实验中是最好的分类器,和神经网络相比(2)随机森林可以更好地解释结果[35]。在对随机森林的不同配置进行线性搜索后,我们发现在学习时间和测试精度之间存在适当权衡。附录中的表XIX显示了该模型的参数。
请注意,我们的数据集中的所有恶意可执行文件都已打包了。除非另有说明:(1)我们总是以70%-30%的比例将数据集划分为训练集和测试集,并且训练集和测试集在良性和恶意可执行文件上是平衡的;(2) 我们通过每次将数据集随机分成训练集和测试集,重复每个实验五次,并平均所有五轮的结果;(3)我们使用所有56543个特性来训练分类器;(4)我们只关注真实世界的包装器(除了实验X外,我们不包括aes-加密器)。
我们引入并激发研究问题,帮助我们回答主要假设。对于每一个假设,我们描述了一个或多个实验,然后是相应的结果。我们的结果符合四个主要的发现,我们将其划分如下。(I)发现1和3可能在社区中直观地知道,尽管大多基于轶事经验。我们用固体实验证实了这些发现。(二)以往的研究显示了发现2的初步证据,但存在很大的局限性。我们为这一发现提供了广泛的证据。(三)我们提出了发现4的额外证据,这是一个已被相关工作证实的事实。
A. 训练过程中包装分布的影响
Rq1。在良性和恶意样本中使用的包装器分布的偏差是否导致分类器学习特定的包装例程作为恶意的标志?
RQ1很重要的原因有两个:(1)机器学习越来越多地用于恶意软件检测,同时,在第三节-b中讨论,大多数相关工作没有指定考虑打包的良性可执行文件,其余的少数工作忽视了良性和恶意样本中使用的打包器之间的重叠可能会带来的偏差;(2)如今,包装在良性样本[84]中也很普遍。为了回答RQ1,我们进行了三个实验。
实验一:“无包装良性”。我们对来自野生数据集中的3956个未打包良性文件和3956个打包恶意可执行文件进行了分类训练。结果分类器对12647个包装的良性样本产生了23.40%的假阳性率。需要注意的是,分类器的校准是相当好的,440(未看到的)恶意样本和440(未看到的)良性样本的假阴性和假阳性率分别为3.82%和2.64%。虽然这是一个na¨ıve实验,但它传递了一个重要的信息:将包装好的良性样本从训练集中排除会使分类器倾向于将包装解释为恶意的指示,这样的分类器在现实世界中会产生大量误报,而包装在良性样本中也很普遍。这个实验表明,在训练分类器时,必须考虑压缩的良性可执行文件。
在良性样本和恶意样本中使用的包装器之间的重叠可能会导致分类器区分包装程序,即包装器。为了进一步研究这一问题,我们进行了以下两个实验。
实验二:“包装器分类器”。我们使用实验室数据集创建了一个包装器分类器。我们为分类器定义了9个类,每个包装器一个。我们在样本均匀分布在所有类上的数据集上训练和测试了分类器。特别是,我们在107,471个样本上训练了分类器,并对46,059个样本进行了评估。请注意,我们丢弃了示例中的良性标签和恶意标签。分类器每类的准确率和查全率为99.99%。这一结果表明,“包装器分类”对于分类器是一个简单的任务,这表明在数据集的良性和恶意样本中使用的封隔器之间缺乏重叠,可能会使分类器将特定的包装例程与恶意关联起来。
实验三:“好坏包装器”。我们在一个数据集上训练分类器,其中良性样本由4个特定的包装器打包,恶意样本由剩下的5个包装器打包。我们将这两个不重叠的包装器子集分别称为好包装器和坏包装器。然后,我们分别对坏分类器和好分类器包装的良性和恶意样本进行了分类器测试。我们对每一部分包装工都重复了这个实验。分类器的准确率从0.01%到12.57%之间变化,表明分类器在区分好和坏包装器方面存在严重的偏差。
发现1。在良性和恶意样本中使用的包装器之间缺乏重叠,将使分类器倾向于区分包装器。
B . 包装器 vs 恶意软件分类
RQ2。包装器是否可以防止只利用静态分析特性的基于机器学习的恶意软件分类器的检测?
通常认为,机器学习只结合静态分析不能区分打包的良性和恶意样本。我们进行了以下三个实验来验证这一假设。
实验四:“不同的包装比例(野生)”。我们通过增加训练集中打包的良性可执行文件的比例,在野生数据集的不同子集上训练分类器,步长为0.05。“包装良性比例”是指包装的良性样本的比例。我们总是使用相同大小的数据集公平地比较训练过的模型,并使用包装好的良性样本的“野生比率”,即供应商在野生环境中看到的包装好的良性可执行文件的最大比率(即50%包装好的良性,见图1),对模型与测试集进行测试。如图3a所示,增加包装良性比值有助于分类器在包装样本上保持较低的假阳性率,而假阴性率略有增加。然而,由于分类器看到的未包装样本较少,未包装样本的假阳性率从3.18%显著增加到16.24%,这表明仅对包装样本进行训练的分类器不能在未包装样本上获得较高的精度。如表四所示,我们总是使用相同大小的训练集,均匀地分布在良性和恶意的可执行文件上。表4还表明,当我们增加训练数据集中打包的良性可执行文件的比例时,字节n-gram特征比其他特征族发挥了更重要的作用。
请注意,分类器的性能可能是由于不一定能捕获样本的真实行为的特征。例如,与恶意可执行文件相比,打包的良性可执行文件可能由不同的打包器打包。附录中的表XII显示,良性样本使用的封隔器的分布与恶意样本使用的封隔器有很大的不同。例如,有13个打包器,我们只在数据集中的恶意可执行文件中(例如,FSG、VMProct、dxPack和PE-Armor)中找到特征。虽然这种差异可能不适用于整个野生数据集,但这表明这种差异可能使分类器在区分好坏包装器方面存在偏差,因此,结果可能会产生误导。
图3:实验“不同包装比”
表四:实验“不同的包装比(野生)”。每一行都表示对分类器很重要的特征。
表五:实验“不同包装比(实验室)”
表六: 实验“单封隔器
实验五:“不同的包装比(实验室)”。为了减少数据集中包装器分布的不确定性,我们在实验室数据集上重复了之前的实验,该数据集与来自野生数据集的未打包良性可执行文件相结合。我们选择了均匀分布在包装器上的包装样本来进行训练和测试集。令人惊讶的是,与包装严重阻碍基于静态特征的机器学习模型这一流行假设不同,即使在训练集中没有未包装样本的情况下,分类器的性能也优于我们的预期,假阳性率和假阴性率分别为12.24%和11.16%。如图3b所示,随着我们增加训练数据集中打包良性样本的比例,打包可执行文件的假阳性率(误报率)从99.76%下降到16.03%。不出所料,当训练集中没有打包的良性可执行文件时,分类器会将实验室数据集中的包装器打包的所有内容检测为恶意的。表V给出了基于数据集中打包的良性可执行文件的比例的分类器的重要特征。字节n-grams和PE部分是最有用的特征系列。在下一个实验中,我们每次只关注一个包装器,以确定每个包装器的有用特征。
实验六:“单个包装器”。 对于每个包装器,我们只在打包好的良性和恶意可执行文件上训练和测试分类器。表六给出了与每个单独的包装器对应的分类器的性能。在所有情况下,分类器表现得相对较好,其中字节n-gram和PE部分特征是最有用的。
我们还很想知道打包程序时打包程序是如何保存信息的。为此,对于每个包装器,我们通过一次在一个特征族上训练分类器来建立不同的模型。我们特别观察到了以下情况:
Rich Header。除了那些经常剥离这个头的包装器(见表II),Rich Header家族单独可以帮助分类器实现相对较高的精度。例如,仅使用rich header特性,在用Themida打包的可执行文件上训练的分类器保持了89.03%的准确率。韦伯斯特等人。[115]也表明,rich header可用于检测类似的恶意软件。
API导入。如果我们使用tElock、Themida和kkrunchy,API导入功能对恶意软件检测不再有用。然而,其他包装器保留了这些天特征中的一些信息。例如,我们在使用UPX打包的可执行文件上训练分类器,并观察到准确率为89.11%。我们注意到DLL导入也有类似的趋势。在受这些特性影响的包装器中,API导入的数量是分类器最重要的特性之一。图5显示了UPX、Petite和PEct的这个特性的分布。我们还观察到特定的API导入非常明显,比如ShellExecuteA。附录中的表XXII显示了导入每个api的良性和恶意示例的数量。例如,Obsidium在打包二进制文件时一直导入API FreeSid,或者众所周知,UPX从原始二进制文件导入的每个DLL中保留一个API导入,以避免在执行过程中加载DLL的复杂性。这表明包装程序时会在导入目录表中保存一些信息。
图4:初始化数据的特征标题大小的直方图。
操作码n-gram。对于Obsidium、tElock和Themida中的每一个,我们都使用操作码n-gram对分类器进行训练,准确率下降到∼50%。然而,我在使用Petite、PELock、Mpress、kkrunchy、UPX和PECompact包装的样本进行训练时,准确率分别为89.01%、88.72%、88.27%、77.25%、77.04%和65.75%。。
PE头。对于所有的包装器,分类器的准确率都在90%以上。特别是,“初始化数据的大小”是除UPX之外的所有情况下最重要的特征。然而,这个特性的分布在不同的包装器中是不同的(见图4)。使用kkrunchy、Obsidium、PECompact、tElock和Themida打包的恶意示例具有更大的初始化数据,而使用MPRESS、PELock和Petite打包的相同恶意示例具有更小的初始化数据。有趣的是,含有UPX包装的恶意样本的分布与观察到的良性样本的分布非常相似。
PE部分。所有包装器的分类器准确率均在90%以上,从91.23%到96.72%不等。如图7所示,不同模型的特征重要性权重在模型之间存在显著差异。例如,入口点部分的熵是在MPRESS上训练的分类器的一个非常重要的特征。然而,当我们在包含缺陷、Themida或PELock的样本上训练分类器时,这个特性并没有帮助。用MPRESS打包的二进制文件的入口点位于第二部分中,。MPRESS2,其中良性和恶意的可执行文件的平均熵分别为6.16和5.77。然而,对于单调的空间,入口点部分总是有一个很高的熵,接近于8。
发现2。包装程序在打包可能对恶意软件分类“有用”的程序时保留了一些信息,然而,这些信息并不一定代表样本的真实性质。
我们应该强调的是,相关工作已经提供了发现2的初步证据。Jacob等人[44]表明,一些包装器采用弱加密,可以用来检测与这些包装器包装的类似恶意软件样本。韦伯斯特等人。[115]也表明,一些包装器不触摸富头,使它可行的恶意软件检测。
C. 现实场景中的恶意软件分类
RQ3.一个经过仔细训练且不偏向于特定包装例程的分类器能在现实场景中表现良好吗?
RQ3是开发基于机器学习的恶意软件分类器中的一个关键问题。在这项工作中,我们将重点关注三个具体的问题:
- 泛化。如今,运行时包装器正在不断发展,恶意软件的作者往往倾向于使用他们自己的自定义包装器[34,66,110]。这就引起了人们对分类器对以前看不见的包装器的表现的严重怀疑。
- 强大和完整的加密。恶意软件的作者可能会定制包装过程,以删除基于机器学习的分类器可以合理地期望利用的静态特性。恶意软件分类器能在存在强大和完全加密的情况下有效吗?
- 敌对的例子。尽管它们的范围有限,但[33,41,89]最近的工作表明,基于机器学习的恶意软件检测器很容易受到敌对例子的攻击。是否有可能使用学习到的模型来驱动逃避?
为了研究泛化问题,我们进行了接下来的三个实验。
实验七:“野生包装者vs.包装者”。首先,我们在从野生数据集中提取的打包良性样本的“野生比”的数据集上训练分类器,并在实验室数据集上进行测试。如表8所示,分类器对所有包装器的表现都较差,对Themida的准确率最高,为78.19%。这很有趣,因为我们知道,在我们的数据集中,至少有50%的包装器保留了富头,因此,分类器仍然应该根据早期的结果保持较高的准确性。我们认为,这是因为分类器选择了能够获得更多信息的特征,而且,当在实验室数据集上进行测试时,这些特征已经不再有用了。事实上,我们只使用富头来训练分类器,并且分类器对保留富头的包装器的准确率显著提高,达到了90%以上。
实验八:“扣留包装器”。其次,我们在实验室数据集上进行了几轮实验,其中我们从训练集中保留一个封隔器,然后在该封隔器生成的打包可执行文件上评估结果分类器(9个封隔器各有一轮)。为了在各轮之间进行公平的比较,我们将训练集的大小固定为83,760,通过为每个包装器选择5235个良性和5235个恶意可执行文件。然后,我们在5235个良性可执行文件和5235个恶意可执行文件上测试了该分类器。如表7所示,除了PECompte、tElock和kkrunchy三种明显情况外,分类器表现相对较好,F-1得分在0.90-0.95之间。
在所有情况下,我们都识别了提取的字节n-g特征。CAB文件头(驻留在资源部分中)是最重要的特性。有6717个良性可执行文件和1269个恶意可执行文件在野生数据集中启用了这些特性。在之前的实验中,分类器没有学习这些特征,因为有更多的区别特征。然而,由于包装器尽管对身体进行了加密,但大多保留资源的标题,当我们用多个包装器包装每个样本时,这种最初的偏见会加剧。特别是,在实验室数据集中有28765个良性文件和28428个恶意可执行文件。然而,对于PEcompte,情况有点不同,因为我们只能打包1095个良性样本和451个恶意样本。出租车的标题。对于tElock,我们只能打包181个良性样本和444个恶意样本。出租车的标题。这就解释了为什么分类器的准确性比pect和tElock要低。当我们在学习阶段保留kkrunchy时,我们查看了最重要的特征,我们发现从资源的版本信息字段中提取的字节n-g对分类器非常有帮助。其他包装器通常保存这些信息,因此分类器学习它,但没有利用这些包装kkrunchy的样本,因为包装器删除这些信息。我们通过排除字节n-克特征来重复实验,分类器的准确性在所有情况下都显著下降,除了我们保留PECompty或kkrunchy(见表7)。
实验九:“野生实验室”。在第三个实验中,我们在实验室数据集上训练分类器,并在野生数据集中的打包可执行文件上对其进行评估。这个实验很重要,因为恶意软件的作者通常更喜欢定制的包装程序,而不是现成的包装器[34,66,110]。为了避免我们的数据集中偏向于任何特定的封隔器,我们从不同的封隔器中统一选择了良性和恶意的可执行文件。假阴性率为41.84%,假阳性率为7.27%。
实验7、实验8和实验9表明,当使用静态分析特征时,分类器不能保证能很好地推广到以前未见过的封隔器上。作为迈向强和完全加密问题的初步步骤,我们进行了以下实验。
实验十:“强而完全的加密”。在这个实验中,我们对11929个良性和11929个caes加密的恶意可执行文件进行了分类器训练,并对5113个良性和5113个caes加密的恶意可执行文件进行了评估。由于AES-加密器使用AES对整个可执行文件进行加密,我们期望静态分析特性对静态恶意软件分类器不再有帮助。令人惊讶的是,仅仅因为“文件大小”和“文件熵”这两个特征,分类器就比随机猜测表现得更好,准确率为72.67%。由于良性样本在野生数据集中的样本更大,显然,打包的良性可执行文件仍然比打包的恶意可执行文件大,因为AESEncrypter只是加密原始二进制文件。此外,随着更大的覆盖增加了打包程序的熵,打包可执行文件的熵也会受到影响。所有其他静态分析特性在使用aes-加密程序打包的可执行文件之间都是相同的,除了字节n-克格和字符串特性,因为可执行文件有不同的(加密)覆盖。因为我们有更多的恶意样本在野生数据集,我们的特征选择过程提取字节ng和字符串(见第四节)倾向于选择那些特性出现在恶意样本有更高的概率,因此,我们预计分类器的准确性仍然略好于50%。特别是,从数据集中删除特征“文件大小”和“文件熵”后,可以得到一个准确率为56.85%的分类器。事实上,我们对一个只包含aes-encrypter的可执行文件的平衡数据集重复了特征选择过程,当删除这两个特征时,我们得到了分类器的50%的准确率。
实验10对机器学习分类器提出了严重的怀疑。当打包隐藏关于原始二进制的所有信息直到执行时,分类器别无选择,只能将该包装器打包的任何样本分类为恶意。这是一个问题,因为包装越来越多地被合法软件[84]采用。
实验11:“对抗性样本”。[33,41,89]最近的工作表明,基于机器学习的恶意软件检测器,特别是那些仅基于静态分析特征的检测器,很容易受到敌对样本的攻击。在我们的例子中,由于打包导致机器学习分类器基于非直接来自实际(未打包)程序的特征做出决策,这个问题变得放大了。因此,对对手来说,生成这样的对抗性样本将更容易。
在这个实验中,我们首先对3956个未打包的良性、3956个打包的良性和7912个恶意可执行器进行了分类训练,这些打包的良性和恶意样本均匀分布在实验室数据集的同一打包器上,并在野外打包了可执行文件。我们证明,这样的分类器并不偏向于检测特定的包装例程作为恶意的标志。与预期的一样,该分类器在评价中表现相对较好,假阳性率和假阴性率分别为9.70%和5.33%。图6显示了分类器在测试集上的置信度得分的框和须图。对于正确分类的打包和解打包可执行文件,分类器的平均一致性分别为0.89和0.93。对于分类器错误分类的良性样本(假阳性),包装样本和未包装样本的平均置信度分别为0.68和0.58。
表九:与VirusTotal集成的6个基于机器学习的引擎的假阳性和假阴性率(%)。
图6:“最佳可能的”分类器对假阳性、假阴性、真阳性和真阴性的置信度。
图7:实验“单个封隔器”。前20个特征的权重,而只训练体育课部分的特征。
然后,我们从所有2,494个恶意样本中生成对抗性样本,这些样本被分类器检测到为恶意样本(即真阳性)。为了实现这一点,我们识别了在良性样本中出现得更多的字节ngram和字符串特征,并将相应的字节注入到目标程序中,而不影响其行为。我们通过分析使用任何方法的样本来验证这一点。运行[4]沙箱。通过平均注入34.24(69.92)良性特征,我们成功地生成了2483个(1,966)对抗性样本,这些样本导致分类器以置信度大于0.5(0.9)进行错误预测。我们期望,当使用从动态分析中提取的特征来训练分类器时,需要一个更复杂的攻击,这些特征代表了样本的行为。
发现3。虽然我们观察到,静态分析特征结合机器学习可以区分打包的良性样本和打包的恶意样本,
但这样的分类器将在现实世界的设置中产生无法忍受的错误。
最近,一组研究人员发现了一种非常相似的方式来颠覆赛伦斯的基于人工智能的反恶意软件引擎[1,105]。他们开发了一种“全球旁路”方法,几乎可以使用任何恶意软件来欺骗赛伦斯引擎。这种逃避技术包括简单地从一个在线游戏程序中获取字符串,并将其附加到已知的恶意软件中,比如“想哭”。困扰赛兰斯的主要问题是,在恶意软件中常见的行为在游戏中也很常见。游戏使用这些技术有各种原因,例如,为了防止作弊或逆向工程。调整系统以标记恶意软件,但不是这样的良性程序是相当困难的,而且容易出现更多的错误,在这种情况下,赛伦斯的引擎进退两难,要么产生高误报,要么继承对它们的偏见。
D. 反恶意软件行业vs。包装工
Rq4。利用机器学习结合静态分析特性的真实反恶意软件引擎的准确性如何?
在当今世界,合法的软件作者打包他们的产品。因此,反恶意软件产品不再接受检测任何包装为恶意的东西。RQ4很重要,因为大多数基于机器学习的方法都依赖于来自缺乏可靠和新鲜的地面真实数据集[22,86,88,97]的病毒Total的标签。为此,我们在病毒总数上确定了6种产品,无论是在相应公司的网站上,还是在病毒总数的博客文章上,都被描述为基于机器学习的恶意软件检测器。值得注意的是,虽然病毒Total显然不鼓励使用他们的服务进行反恶意软件比较分析[113],但在下一个实验中,我们的目标只是看看这些引擎如何为包装样本分配标签。我们不打算将这些工具彼此进行比较或与其他工具进行比较。
实验十二章:“反恶意软件产业”。 2019年2月,我们从实验室数据集向病毒总数提交了6000个良性文件和6000个恶意可执行文件,以评估这六种反恶意软件产品。如表九清楚地显示的那样,所有六台发动机都已经学会了将包装与恶意联系起来。病毒总数上的其他引擎也产生了类似于这六种引擎的高错误率。正如我们在第二节中讨论的,相关工作已经发表了显示类似趋势[69,116]的结果。这个实验表明,随着包装在合法软件[84]中更常用,除非反恶意软件行业比检测包装做得更好,良性和恶意软件将越来越多地被错误分类。
发现4。基于机器学习的反恶意软件引擎在病毒上总检测包装而不是恶意。
六、讨论
我们展示了基于机器学习的反恶意软件的引擎在打包的二进制文件上产生大量的误报,这可能是由于本工作中讨论的局限性。这对于基于机器学习的方法来说尤其严重的问题,这些方法经常依赖于病毒Total[22,86,88,97]的标签,导致了一个无尽的循环,其中新方法依赖于污染的数据集,反过来,为未来的工作生成污染的数据集。
有人可能会说,基于代码签名证书的白名单可以避免包装的一般问题。然而,我们已经看到,有效的数字签名允许恶意软件,如锁卡,星网和火焰绕过反恶意软件保护[50]。值得注意的是,尽管我们展示了包装器分类是分类器学习的简单任务,但一般来说,包装检测是一个具有挑战性的任务[5,5,59,102],特别是当恶意软件作者使用定制的快速进化[34,66,110]的包装器时。虽然使用动态分析特性似乎有必要减轻静态恶意软件检测器的限制,恶意软件仍然可以迫使恶意软件检测器回到静态特性。例如,Jana等人。[45]通过针对恶意软件检测器中的文件处理,发现了针对36个流行的反恶意软件扫描器的45个规避漏洞。所有这些问题都表明,恶意软件检测应该使用一种同时利用静态和动态分析的混合方法来完成。
限制。在彭德尔伯里等人[75]和Jordaney等人[46]的鼓励下,恶意软件探测器应该评估他们如何处理概念漂移。我们观察到,机器学习与静态分析相结合可以很好地推广到看不见的包装器,然而,我们在实验中没有考虑时间限制,我们将其作为未来的工作。此外,我们在本文中只关注了Windowsx86可执行文件,但我们的假设可能也适用于安卓应用程序,因为它们的打包也得到了越来越常见的[25]。
7、相关工作
恶意软件检测的理论局限性已经得到了广泛的研究。对计算机病毒[18,19]的早期工作表明,检测所有计算机病毒的精确病毒检测器的存在意味着对停止问题的决策程序。后来,Chess等人[14]提出了一种任何程序都不能精确检测到的多态病毒。类似地,静态和动态分析的一些关键技术是不可确定的[55,100],包括解包执行的检测。
Moser等人[67]提出了一种基于不透明常数的二进制混淆方案,该方案打乱程序的控制流,并隐藏数据位置和使用。他们表明,他们的方法可以避免检测恶意代码的静态分析。[16]等人表明,三种反恶意软件工具可以很容易地逃避,通过非常简单的混淆转换。后来,他们开发了一个系统,用来评估反恶意软件工具,以对抗通常用来伪装恶意软件[17]的混淆转换。ADAM[119]和机器人变色龙[85]使用了类似的转换技术来评估商业安卓反恶意软件工具。特别是,卓伊德变色龙对10种反恶意软件产品的研究结果表明,这些产品都没有一种能抵抗常见的和简单的恶意软件转换方法。Bacci等人[6]表明,虽然基于动态分析的检测在混淆和非混淆的安卓恶意软件上表现出相同的性能,但基于静态分析的检测在混淆样本上性能较差。虽然他们证明,在学习阶段可以通过使用模糊的恶意样本来减轻这种影响,但没有使用混淆的良性样本,这就提出了分类器可能已经学会检测混淆的怀疑。Hammad等人[36]最近研究了代码混淆对安卓应用程序和反恶意软件产品的影响,发现大多数反恶意软件产品都受到简单混淆的严重影响。
8、总结
在本文中,我们研究了以下问题:对打包的二进制文件的静态分析是否为恶意软件分类器提供了足够丰富的特征集?我们首先观察到,必须考虑训练集中的封隔器的分布,否则在良性和恶意样本中使用的封隔器之间缺乏重叠,可能会导致分类器区分包装例程而不是行为。与通常假设的不同,包装器在包装对恶意软件分类“有用”的程序时保存信息,然而,这些信息并不一定会捕获样本的行为。此外,这些信息并不能帮助分类器向(1)推广其知识,以在以前未见过的包装器上进行操作,并且(2)对琐碎的对抗性攻击具有鲁棒性。我们观察到,基于病毒总数的静态机器学习的产品在打包的二进制文件上产生了很高的假阳性率,这可能是由于本工作中讨论的局限性。当我们看到反恶意软件行业的一种趋势,即不断增加地部署只使用静态特性的基于机器学习的分类器时,这个问题就被放大了。
据我们所知,这项工作是第一次全面研究打包的Windows可执行文件对只使用静态分析特征的基于机器学习的恶意软件分类器的影响。源代码和392,168个可执行文件的数据集可以在 https://github.
com/ucsb-seclab/packware.上公开获得。
附录A
包装检测和自动拆包
包装器检测和包装器识别 。打包软件的检测被认为是一项具有挑战性的任务[5,59,102]。打包器识别工具[30,60,74,87]使用特征来确定一个程序是否与一个特定的包装器混淆了。
Lyda等人[59]和Jacob等人[44]将熵分析技术应用于一个二进制文件,提出一个打包的二进制文件具有较高的熵。Sun等人[106]提出了一种不同的随机性分析方法,该方法为一个打包的可执行文件生成一个随机性配置文件,以识别用于保护程序的打包器。一项类似的工作通过结合字节直方图和熵分析来生成可选的随机性配置文件,以减轻对熵分析[112]的常见攻击。其他方法利用了PE头和[5,15,109]部分节的静态特性,也使用了机器学习分类器[37,76,77,95,102]。然而,区分打包可执行文件和未打包可执行文件的问题在总体上是无法确定的,尽管最近的工作提出了在某些空间和时间限制下可以处理这个问题的希望[11]。
自动拆包。为了提取原始有效载荷进行分析[9、23、38、47、61、77、91、111],已经有很多人尝试解压可执行文件。OmniUnpack[61]会在每次写入内存时扫描内存中是否存在恶意软件。PolyUnpack[91]首先使用静态分析来获取可执行代码的静态模型。然后,它在隔离的环境中执行二进制文件,并将执行上下文与静态代码模型进行比较。Coogan等人[21]利用别名分析、静态切片和控制流分析为可执行文件静态构造一个定制的解包器,可在以后执行该解包程序时以获得解包代码。类似地,Debray等人。[23]使用动态指令跟踪的离线分析来自动创建自定义解包例程。Renovo[47]的工作原理是假设整个未打包的二进制文件在某个特定的时间驻留在内存中。Bonfante等人[9]拍摄一系列内存快照,以提取执行的原始程序的指令。Haq等人[38]通过拍摄差分内存快照来最大限度地减少噪音,从而增强了这种方法。Polino等人[78]研究了恶意软件逃避动态二进制检测(DBI)的常见方法,并提出了一种抗DBI的解包程序。Ugarte等人[111]提出了特定领域的定制多路径探索技术,以触发所有代码区域的解包。最近,Cheng等人[13]提出了BinUnpack,其工作原理是假设导入地址表的重建在跳转到原始入口点之前完成。