PowerLZY's Blog

本博客主要用于记录个人学习笔记(测试阶段)

CADE: Detecting and Explaining Concept Drift Samples for Security Applications

原文作者:Limin Yang, University of Illinois at Urbana-Champaign

原文链接:https://www.usenix.org/conference/usenixsecurity21/presentation/yang-limin

发表会议:USENIXSec 2021

代码地址:https://github.com/whyisyoung/CADE

摘要

概念漂移对部署机器学习模型来解决实际的安全问题提出了严峻的挑战。由于攻击者(和/或良性对手)的动态行为变化,随着时间的推移,测试数据分布往往会从原始的训练数据转移,从而导致部署的模型出现重大故障

为了对抗概念漂移,我们提出了一种新的系统CADE,旨在(1)检测偏离现有类别的漂移样本;(2)解释检测到漂移的原因。与传统方法不同(需要大量新标签来统计确定概念漂移),我们的目标是在单个漂移样本到达时识别它们。认识到高维离群空间带来的挑战,我们建议将数据样本映射到低维空间,并自动学习距离函数来度量样本之间的相异性。通过对比学习,我们可以充分利用训练数据集中现有的标签来学习如何对样本进行比较和对比。为了解释检测到的漂移的意义,我们开发了一种基于距离的解释方法。我们表明,在这个问题背景下,解释“距离”比传统方法更有效,传统方法侧重于解释“决策边界”。我们通过两个案例来评估CADE:Android恶意软件分类和网络入侵检测。我们进一步与一家安全公司合作,在其恶意软件数据库上测试CADE。我们的结果表明,CADE可以有效地检测漂移样本,并提供语义上有意义的解释。

一、说明

由于概念漂移,部署基于机器学习的安全应用程序可能非常具有挑战性。无论是恶意软件分类、入侵检测还是在线滥用检测[6、12、17、42、48],基于学习的模型都是在“封闭世界”假设下工作的,期望测试数据分布与训练数据大致匹配。然而,部署模型的环境通常会随着时间的推移而动态变化。这种变化可能既包括良性玩家的有机行为变化,也包括攻击者的恶意突变和适应。因此,测试数据分布从原始训练数据转移,这可能会导致模型出现严重故障[23]。

[23] A survey on concept drift adaptation. ACM computing surveys (CSUR), 2014.

为了解决概念漂移问题,大多数基于学习的模型需要定期重新培训[36、39、52]。然而,再培训通常需要标记大量新样本(昂贵)。更重要的是,还很难确定何时应该对模型进行再培训。延迟的再培训会使过时的模型容易受到新的攻击。

我们设想,对抗概念漂移需要建立一个监控系统来检查传入数据流和训练数据(和/或当前分类器)之间的关系。图1说明了高级思想。当原始分类器在生产空间中工作时,另一个系统应定期检查分类器对传入数据样本做出决策的能力。A检测模块(1) 可以过滤正在远离训练空间的漂移样本。更重要的是,为了解释漂移的原因(例如,攻击者突变、有机行为变化、以前未知的系统错误),我们需要一种解释方法(2) 将检测决策与语义上有意义的特征联系起来。这两项功能对于为开放世界环境准备基于学习的安全应用程序至关重要。

image-20220605202728095

之前的工作已经探索了通过直接检查原始分类器(0)的预测置信度来检测漂移样本的方法 [32]。置信度较低可能表明传入样本是漂移样本。然而,该置信度得分是基于所有类别已知(封闭世界)的假设计算的概率(总和为1.0)。不属于任何现有类别的漂移样本可能会被分配到错误的类别,并具有很高的置信度(已通过现有工作验证[25、32、37])。最近的一项工作提出了计算传入样本和每个现有类之间的不一致性度量的想法,以确定适合度[38]。该不合格度量基于距离函数计算,以量化样本之间的不相似性然而,我们发现这种距离函数很容易失效,尤其是当数据稀疏且维数较高时。

[32] A baseline for detecting misclassified and out-of-distribution examples in neural networks.

我们的方法。在本文中,我们提出了一种检测漂移样本的新方法,并结合一种解释检测决策的新方法。我们共同构建了一个称为CADE的系统,它是“用于漂移检测和解释的对比自动编码器 (“Contrastive Autoencoder for Drifting detection and Explanation)”的缩写关键的挑战是推导一个有效的距离函数来衡量样本的相异性。我们没有随意选取距离函数,而是利用对比学习的思想[29],根据现有的标签,从现有的训练数据中学习距离函数。给定原始分类器的训练数据(多个类别),我们将训练样本映射到低维潜在空间。映射函数通过对比样本来学习,以扩大不同类样本之间的距离,同时减少同一类样本之间的距离。我们证明了在潜在空间中得到的距离函数可以有效地检测和排序漂移样本。

评价我们使用两个数据集评估我们的方法,包括Android恶意软件数据集[7]和2018年发布的入侵检测数据集[57]。我们的评估表明,我们的漂移检测方法具有很高的准确性,F1平均得分为0.96或更高,优于各种基线和现有方法。我们的分析还表明,使用对比学习可以减少检测决策的模糊性。对于解释模型,我们进行了定量和定性评估。案例研究还表明,所选特征与漂移样本的语义行为相匹配。

此外,我们还与一家安全公司的合作伙伴合作,在其内部恶意软件数据库上测试CADE。作为初步测试,我们从395个家庭中获得了2019年8月至2020年2月出现的20613个Windows PE恶意软件样本。这使我们能够在不同的环境中测试更多恶意软件系列的系统性能。结果很有希望。例如,CADE在10个家庭中进行训练并在160个以前未见过的家庭中进行测试时,F1成绩达到0.95分。这使得人们有兴趣在生产系统中进一步测试和部署CADE。

贡献:

本文有三个主要贡献。

  • 我们提出CADE来补充现有的基于监督学习的安全应用程序,以对抗概念漂移。提出了一种基于对比表征学习的漂移样本检测方法
  • 我们说明了监督解释方法在解释异常样本方面的局限性,并介绍了一种基于距离的解释方法
  • 我们通过两个应用对所提出的方法进行了广泛的评估。我们与一家安保公司的初步测试表明,CADE是有效的。我们在此处发布了CADE代码1,以支持未来的研究。

参数初始化

  • https://paddlepedia.readthedocs.io/en/latest/tutorials/deep_learning/model_tuning/weight_initializer.html

在我们开始训练神经网络之前,首先要做的是给网络中的每一个权重和偏置赋值,这个赋值的过程就是参数初始化。合理的初始化可以缩短神经网络的训练时间,而不合理的初始化可能使网络难以收敛。那么,我们要如何对参数进行初始化呢?或许你有想到过将全部参数都设置为0,这看起来是一个简单又方便的办法,但遗憾的是神经网络中不能对权重进行全零初始化。在讨论如何对参数进行初始化前,我们先来看看为什么不能进行全零初始化。

一、为什么不能全零初始化?

以一个三层网络为例,假设其具体的网络示意图如图1所示。

net_for_params_init

Learning from Context: Exploiting and Interpreting File Path Information for Better Malware Detection

  • https://ai.sophos.com/presentations/learning-from-context-a-multi-view-deep-learning-architecture-for-malware-detection/

用于静态可移植可执行(PE)恶意软件检测的机器学习(ML)通常使用每个文件的数字特征向量表示作为训练期间一个或多个目标标签的输入。然而,可以从查看文件的上下文中收集到许多正交信息。在本文中,我们建议使用静态上下文信息源(PE文件的路径)作为分类器的辅助输入。虽然文件路径本身不是恶意或良性的,但它们确实为恶意/良性判断提供了有价值的上下文。与动态上下文信息不同,文件路径的可用开销很小,并且可以无缝集成到多视图静态ML检测器中,在非常高的吞吐量下产生更高的检测率,同时基础结构的更改也很小。在这里,我们提出了一种多视图神经网络,它从PE文件内容以及相应的文件路径中提取特征向量作为输入并输出检测分数。为了确保真实的评估,我们使用了大约1000万个样本的数据集—来自实际安全供应商网络的用户端点的文件和文件路径。然后,我们通过LIME建模进行可解释性分析,以确保我们的分类器已学习到合理的表示,并查看文件路径的哪些部分对分类器得分的变化贡献最大。我们发现,我们的模型学习了文件路径的有用方面以进行分类,同时还学习了测试供应商产品的客户的工件,例如,通过下载恶意软件样本目录,每个样本都命名为其哈希。我们从我们的测试数据集中删减了这些工件,并证明在10−3假阳性率(FPR),10时为33.1%−4 FPR,基于类似拓扑的单输入PE文件内容模型。

摘要

用于恶意软件检测的机器学习(ML)分类器通常在进行恶意/良性判断时使用每个文件内容的数字表示。然而,也可以从文件所在的上下文中收集相关信息,这些信息通常被忽略。 上下文信息的一个来源是文件在磁盘上的位置。例如,如果检测器可以清楚地利用有关其所在路径的信息,则伪装为已知良性文件(例如Windows系统DLL)的恶意文件更有可能显得可疑。了解文件路径信息还可以更容易地检测那些试图通过将自己放置在特定位置来逃避磁盘扫描的文件**。文件路径也可以使用,开销很小,并且可以无缝集成到多视图静态ML检测器中,在非常高的吞吐量和最小的基础结构更改下,可能产生更高的检测率。

在这项工作中,我们提出了一种 multi-view 深度神经网络结构,该结构将PE文件内容中的特征向量以及相应的文件路径作为输入并输出检测分数。我们对大约1000万个样本的商业规模数据集进行了评估,这些样本是来自实际安全供应商提供服务的用户端点的文件和文件路径。然后,我们通过LIME建模进行可解释性分析,以确保我们的分类器已学习到合理的表示,并检查文件路径如何在不同情况下改变分类器的分数。我们发现,与只对PE文件内容进行操作的模型相比,我们的模型学习了文件路径的有用方面,在0.001假阳性率(FPR)下,真阳性率提高了26.6%,在0.0001 FPR下,提高了64.6%

keyword : 静态PE检测、文件路径、深度学习、多视图学习、模型解释

一、说明

商用便携式可执行(PE)恶意软件检测器由静态和动态分析引擎组成。静态检测通常首先用于标记可疑样本,它可以快速有效地检测大部分恶意软件。它涉及分析磁盘上的原始PE映像,可以非常快速地执行,但易受代码混淆技术的影响,例如压缩和多态/变形转换[1]。相比之下,动态检测需要在模拟器中运行PE,并在运行时分析行为[2]。当动态分析工作时,它不太容易受到代码混淆的影响,但与静态方法相比,它需要更大的计算容量和执行时间。此外,有些文件很难在仿真环境中执行,但仍然可以进行静态分析。因此,静态检测方法通常是端点恶意软件预防(在执行恶意软件之前阻止恶意软件)管道中最关键的部分。最近,由于采用了机器学习,静态检测方法的性能有所提高[3],其中高度表达的分类器(例如深层神经网络)适合于数百万个文件的标记数据集。训练这些分类器时,它们使用静态文件内容作为输入,但不使用辅助数据。然而,我们注意到,由于辅助数据(例如网络流量、系统调用等),动态分析工作得很好。在这项工作中,我们试图使用文件路径作为正交输入信息来增强静态ML检测器。文件路径是静态可用的,无需操作系统的任何附加工具。通过将文件路径作为辅助输入,我们希望能够将有关文件的信息与在特定位置看到此类文件的可能性的信息结合起来,并识别与已知恶意软件和良性文件相关的常见目录层次结构和命名模式。

静态检测:通用模块,快速有效地标记可疑样本;易受代码混淆技术(压缩和多态/变形转换)的影响。

[1] A. Moser, C. Kruegel, and E. Kirda, “Limits of static analysis for malware detection,” in Twenty-Third Annual Computer Security Applications Conference (ACSAC 2007). IEEE, 2007, pp. 421–430.

动态检测:分析模块,需要更大的计算容量和执行时间;有些文件很难在仿真环境中执行。

我们将分析重点放在三个模型上:

  • 仅基线文件内容(PE)模型,仅将PE功能作为输入并输出恶意软件置信度得分。
  • 另一个基准文件路径仅内容(FP)模型,仅将文件的文件路径作为输入,并输出恶意软件置信度得分。
  • 我们提出的多视图PE文件内容+上下文文件路径(PE+FP)模型,该模型同时考虑PE文件内容特征和文件路径,并输出恶意软件置信度得分。

三个模型的示意图如图1所示。

image-20220528162748125

我们对从一家大型反恶意软件供应商的遥测数据中收集的时间分割数据集进行分析,发现我们在文件内容和上下文文件路径上训练的分类器在ROC曲线上,尤其是在低误报率(FPR)区域,产生了统计上显著更好的结果。

本文的贡献如下:

  • 我们从安全供应商的客户端点(而不是恶意软件/供应商标签聚合服务)获得一组真实、精心策划的文件和文件路径数据集。
  • 我们证明,我们的多视图PE+FP恶意软件分类器在我们的数据集上的性能明显优于单独使用文件内容的模型。
  • 我们将本地可解释模型不可知解释(LIME)[4]扩展到PE+FP模型,并使用它分析文件路径如何影响模型的恶意/良性决策。

[4] M. T. Ribeiro, S. Singh, and C. Guestrin, “Why should i trust you?: Explaining the predictions of any classifier,” in Proceedings of the 22nd ACM SIGKDD international conference on knowledge discovery and data mining. ACM, 2016, pp. 1135–1144.

本手稿的其余部分结构如下:第二节涵盖重要的背景概念和相关工作。第三节讨论数据集收集和模型制定。第四节将我们的新多视图方法与拓扑结构相似的纯内容基线模型进行了比较,并对我们的模型进行了可解释性分析。第五节结束。

二、背景和相关工作

在本节中,我们将描述机器学习如何普遍应用于静态PE检测,以及我们的方法如何通过提供上下文信息作为辅助输入而在高层意义上有所不同。然后,我们介绍了其他机器学习领域的相关工作。

2.1 静态ML恶意软件检测

机器学习已经应用于计算机安全领域多年了[5],但在商业规模上使用ML的静态PE模型的破坏性性能突破是一个较新的现象。商业模型通常依赖深度神经网络[6]或增强的决策树集合[7],并已扩展到其他静态文件类型,包括web内容[8]、[9]、office文档[10]和档案[10]。

大多数用于信息安全的静态ML(ML-Sec)分类器操作的是文件部分(例如,标题)上的学习嵌入[11],整个文件上的学习嵌入[12],或者最常见的是,操作的是设计用于总结每个文件内容的预设计数字特征向量[6]、[13]–[19]。预先构建的特征向量表示往往更具可伸缩性,可以快速从每个文件中提取内容,同时保留有用的信息。有很多方法可以构建特征向量,包括在滑动窗口上跟踪每字节统计信息【6】、【18】、字节直方图【7】、【18】、ngram直方图【13】、将字节视为图像中的像素值(文件内容的可视化)【13】、【18】、操作码和函数调用图统计信息【18】、符号统计信息【18】、哈希/数字元数据值【6】、【7】、【18】–例如。,入口点作为文件的一部分,或散列导入和导出,以及分隔标记的散列[10]、[19]。在实际应用中,从文件内容中提取的几种不同类型的特征向量通常连接在一起,以获得优异的性能。

2.2 Learning from Multiple Sources

使用深度神经网络进行静态ML恶意软件检测的相关研究已经检验了从多个信息源学习的方法,但这些方法与我们的方法有根本不同:Huang等人【20】和Rudd等人【21】对多个辅助损失函数使用多目标学习【22】,【23】,他们发现这些函数在主要恶意软件检测任务中的性能有所提高。这两项工作都在培训期间使用元数据作为辅助目标标签,为模型提供额外的信息,并在部署时使用单个输入来做出分类决策。我们的方法利用了多种输入类型/模式——一种是以类似于[6]的PE特征向量的形式描述恶意样本的内容,另一种是将原始字符串提供给一个字符嵌入层(类似于[8]),该层提供了有关该样本出现位置的信息。这种技术是一种多视图学习方法[24]。顾名思义,多视图学习的大多数应用都是在计算机视觉中进行的,在计算机视觉中,多个视图实际上是由来自不同输入摄像头/传感器的视图或来自同一摄像头/传感器在不同时间的不同视图组成的。在ML-Sec空间中,我们只能找到两种专门将自己称为多视图的方法:即[25],Narayanan等人将多内核学习依赖图应用于Android恶意软件分类,以及[26],Bai等人将多视图集合用于PE恶意软件检测。虽然这些方法在某些方面与我们的方法相似,但据我们所知,我们是第一个在商业规模上使用外部上下文反馈到深层神经网络并结合文件内容特征来执行恶意软件检测多视图建模的方法。

[25] A. Narayanan, M. Chandramohan, L. Chen, and Y. Liu, “A multi-view context-aware approach to android malware detection and malicious code localization,” Empirical Software Engineering, pp. 1–53, 2018.

[26] J. Bai and J. Wang, “Improving malware detection using multi-view ensemble learning,” Security and Communication Networks, vol. 9, no. 17, pp. 4227–4241, 2016.

三、实施细节

在本节中,我们将介绍我们的方法的实现细节,包括从客户端点获取PE文件和文件路径的数据收集过程、我们的特征化策略以及我们的多视图深度神经网络和比较基线的体系结构。

3.1 数据集

在我们的实验中,我们从一家著名反恶意软件供应商的遥测数据中收集了三个不同的数据集:一个训练集、一个验证集和一个测试集。培训集由9148143个样本组成,这些样本首次出现在2018年6月1日至11月15日之间,其中693272个样本被标记为恶意样本。验证集包括在2018年11月16日至12月1日期间观察到的2225094个不同样本,其中85041个被标记为恶意样本。最后,测试集在2019年1月1日至1月30日期间共有249783个样本,其中38767个被标记为恶意。这些文件的恶意/良性标签是使用类似于[6]、[8]的标准计算的,但结合其他专有信息可以生成更准确的标签。

3.2 特征工程

为了使用文件路径作为神经网络模型的输入,我们首先将可变长度字符串转换为固定长度的数字向量。我们使用类似于[8]的矢量化方案来实现这一点,方法是在每个字符上创建一个键控的查找表,该表用一个表示每个字符的数值(介于0和字符集大小之间)来表示。实际上,我们将此表实现为Python字典。在遥测和早期实验数据的指导下,我们将文件路径缩减到最后100个字符。短于100个字符的文件路径的功能用零填充。对于字符集,我们考虑整个Unicode字符集,但将词汇限制为150个最常见的字符。见附录??供进一步讨论。作为PE文件内容的特征,我们使用了由四种不同特征类型组成的浮点1024维特征向量,类似于[6]。总的来说,我们将每个样本表示为两个特征向量:1024维的PE内容特征向量和100维的上下文文件路径特征向量。

[8] J. Saxe and K. Berlin, “expose: A character-level convolutional neural network with embeddings for detecting malicious urls, file paths and registry keys,” arXiv preprint arXiv:1702.08568, 2017.

image-20220530152922273

3.3 网络体系结构

image-20220528204724740

我们的多视图体系结构如图2所示。该模型有两个输入,1024个元素的PE内容特征向量xPE和100个元素的文件路径整数向量xFP,如第III-B节所述。每个不同的输入分别通过一系列具有各自参数θPE和θFP的层,用于PE特征和FP用于文件路径特征,并在训练期间联合优化。然后将这些层的输出连接(串联)并通过一系列最终隐藏层,即参数θO的联合输出路径。网络的最终输出由密集层和sigmoid激活组成。

  • PE 特征:PE输入臂θPE使xPE通过一系列块,每个块由四层组成:一个完全连接的层,一个使用[27]中所述技术实现的层规范化层,一个丢失概率为0.05的丢失层,以及一个校正线性单元(ReLU)激活。其中五个块依次连接,密集层大小分别为1024、768、512、512和512个节点。
  • 文件路径
    • 文件路径输入arm θFP 将 xFP(长度为100的向量)传递到嵌入层 ???
    • 该嵌入层将文件路径的每个字符转换为32维向量,从而为整个文件路径生成100x32的嵌入张量
    • 然后将该嵌入馈入4个单独的卷积块,其中包含一个具有128个滤波器的1D卷积层、一个层归一化层和一个1D求和层,以将输出平坦化为向量。4个卷积块包含卷积层,卷积层的大小分别为2、3、4和5,用于处理2、3、4和5克的输入文件路径。
    • 然后将这些卷积块的平坦输出串联起来,作为大小为1024和512个神经元的两个密集块的输入(与PE输入臂中的形式相同)。
  • 输出层:PE arm和文件路径arm的完全连接块的输出随后被连接并传递到由θO参数化的联合输出路径。该路径由层大小为512、256和128的密集连接块(与PE输入arm中的形式相同)组成。然后将这些块的128D输出馈送至致密层,该致密层将输出投射至1D,然后进行sigmoid激活,以提供模型的最终输出。

仅PE模型只是PE+FP模型,但没有FP臂,输入xPE并拟合θPE和θO参数。类似地,FP模型是PE+FP模型,但没有3个授权的许可PE arm,采用输入xFP拟合θFP和θO参数。适当调整输出子网络的第一层,以匹配前一层的输出。我们使用二进制交叉熵损失函数拟合所有模型。给定标签为y的输入x的深度学习模型f(x;θ)的输出∈ {0,1},模型参数θ损失为:

image-20220528171648185

通过优化器,我们求解ˆθ的最佳参数集,以最小化数据集上的组合损失:

image-20220528171710886

其中M是数据集中的样本数,y(i)和x(i)分别是第i个训练样本的标签和特征向量。我们使用Keras框架构建和训练模型,使用Adam优化器和Keras的默认参数和1024个小批量。每个模型都经过15个阶段的训练,我们确定这些阶段足以使结果收敛。

4、实验分析

image-20220528172252766

5、总结

我们已经证明,深度神经网络恶意软件检测器可以从合并来自文件路径的上下文信息中获益,即使这些信息本身不是恶意或良性的。将文件路径添加到我们的检测模型中不需要任何额外的端点检测,并且在整个相关FPR区域的总体ROC曲线中提供了统计上显著的改善。我们直接在客户端点分布上测量模型的性能这一事实表明,我们的多视图模型实际上可以部署到端点以检测恶意软件。我们在第IV-B节中进行的LIME分析表明,多视图模型能够提取暗示实际恶意/良性概念的上下文信息;不只是数据集的统计伪影,尽管正如我们所观察到的,它还可以学习这些伪影。除了端点部署之外,这项研究可以应用的另一个潜在领域是端点检测和响应(EDR)环境,在该环境中,我们的模型的输出可以用于根据事件的可疑程度对磁盘上的事件进行排序。有趣的是,石灰等技术在这方面也有应用。使用从LIME或类似方法得出的解释,可以创建分析工具,允许非恶意软件/取证专家的用户执行某种程度的威胁搜寻。如图4所示,重要性突出显示不仅对用户有用,而且是最近邻/相似性可视化方法的替代方法,该方法不会显示其他用户的潜在可识别信息(PII)。

Doc2Vec

论文|Doc2vec的算法原理、代码实现及应用启发 - Thinkgamer的文章 - 知乎 https://zhuanlan.zhihu.com/p/336921474

Doc2vec主要为了解决word2vec只包含局部窗口内的语义信息的问题,在进行词向量表示的时候融入了句子的语义表示。

Doc2vec其实包含了两种算法:

  • PV-DM(Distributed Memory Model of Paragraph Vector):PV-DM类似于Word2vec中的CBOW模型
  • PV-DBOW(Distributed Bag of Words version of Paragraph Vector)

原理

doc2vec与word2vec的不同点:在输入层增加了Paragraph id向量,来作为句子的表示向量,该向量在同一句子的不同词训练中是权值共享

原因:在word2vec训练中,每次只会选择句子中窗口内的词来进行训练学习当前词的向量表达,而忽略了窗口外的词,最终的句子向量也只是每个词的简单累加,加入Paragraph id向量在同一个句子的若干次训练中是共享的,所以同一句话会有多次训练,每次训练中输入都包含Paragraph vector,它可以被看作是句子的主旨,这样训练在获得词向量的同时也能获得准确的句子向量表示。

image-20220712163125902

PV-DM模型的输入是固定长度的,其从段落的上下文的滑动窗口中进行采样,这一点和Word2vec是一致的,在基于同一段落构造好的样本中, 段落的向量是共享的,但是在基于不同段落构造好的样本中,段落的向量是不共享的。在所有的样本中,word的向量是一致的(共享的)。

在整个训练过程中,paragraph vector能够记忆整个句子的意义,word vector则能够基于全局部分学习到其具体的含义。

训练

每次从一句话中滑动采样固定长度的词,取其中一个词作预测词,其他的作输入词。输入词对应的词向量word vector和本句话对应的句子向量Paragraph vector作为输入层的输入,将本句话的向量和本次采样的词向量相加求平均或者累加构成一个新的向量X,进而使用这个向量X预测此次窗口内的预测词(softmax)。

预测

首先将新句子对应的Paragraph vector随机初始化,固定词向量还有投影层到输出层的softmax weights参数,对句子中的单词进行预测,根据结果进行Paragraph vector更新,获得最终的Paragraph vector。利用最终Paragraph vector进行词向量预测。

Living-Off-The-Land 恶意软件系统分析

[][AI安全论文] 1、21.S&P21 Survivalism经典离地攻击(Living-Off-The-Land)恶意软件系统分析:S&P21的离地攻击(Living-Off-The-Land)系统分析,这是一篇非常经典的论文,并且系统性分析文章是另一种讲故事的方式。

2、2021 RAID Living-Off-The-Land Command Detection Using Active Learning:https://dl.acm.org/doi/pdf/10.1145/3471621.3471858

图片

原文作者:Frederick Barr-Smith, Xabier Ugarte-Pedrero, et al. 原文标题:Survivalism: Systematic Analysis of Windows Malware Living-Off-The-Land 原文链接:https://ieeexplore.ieee.org/document/9519480 发表会议:2021 IEEE Symposium on Security and Privacy (SP)

文章目录:

  • 摘要

  • 一.引言

    1.什么是离地攻击

    2.APT中的离地攻击

    3.提出五个关键问题

    4.贡献(Contribution)

  • 二.背景和相关工作

    A.LotL Binaries

    B.Scope of our Study

    C.Related Work

  • 三.MOTIVATION: 杀毒软件产品 vs 离地攻击技术

  • 四.离地攻击流行性评估

    A.Dataset Composition

    B.Analysis Pipeline

    C.LotL Technique Identification

    D.Parameter Analysis to Identify Execution Purpose

  • 五.评估结果

    A.商用恶意软件中LotL技术的流行性(Prevalence)

    B.Comparison of Benign and Malicious Samples

    C.Prevalence of LotL techniques in APT Malware

  • 六.案例分析

  • 七.要点和讨论

  • 八.局限性和未来工作

  • 九.个人感受

摘要

随着恶意软件检测算法和方法变得越来越复杂(sophisticated),恶意软件作者也采用(adopt)同样复杂的逃避机制(evasion mechansims)来对抗(defeat)它们。民间证据表明离地攻击技术(Living-Off-The-Land,LotL)是许多恶意软件攻击中最主要的逃避技术之一。这些技术利用(leverage)系统中已经存在的二进制文件来执行(conduct)恶意操作。基于此,我们首次对Windows系统上使用这些技术的恶意软件进行大规模系统地调查。

在本文中,我们分析了这些本地系统的二进制文件在多个恶意软件数据集上的使用情况,这些数据集共包含31,805,549个样本。我们发现平均流行率(prevalence)为9.41%。实验结果表明,LotL技术被大量的使用,特别是在高级持久性威胁(Advanced Persistent Threat ,APT)恶意软件样本中,离地攻击占比为26.26%,是社区恶意软件的两倍多。

为了验证(illustrate)LotL技术的逃逸潜力,我们在本地沙箱环境(sandboxed environment)中对几个完全打补丁的Windows系统进行了离地攻击技术的测试,其结果表明在10个最流行的反病毒产品(anti-virus)中存在明显的gap。

一、引言

1.1 什么是离地攻击

恶意软件开发和检测是猫和老鼠的游戏,恶意软件作者不断开发新技术来绕过(bypass)检测系统。像AV杀毒软件(anti-virus)这样的安全产品通过静态和启发式分析(heuristic analysis)技术,以检测、分类和防止恶意软件有效执行。

在过去,许多解决方案严重依赖于基于签名的检测,但不幸的是,由于使用了多态性(polymorphism)和加壳程序(packers),这些方法变得不再那么有效。相反,许多产品开始开发启发式分析解决方案,包括检测恶意行为的算法。这些算法已成为AV引擎的重要组成部分。随着时间的推移,这些算法越来越复杂,因此需要更多创新性的逃避技术。

恶意软件作者和红队经常研究和发现新方法来绕过安全解决方案。虽然它们的潜在目标本质上可能有所不同,但这两种类型的攻击者通常都利用(leverage)最先进(state-of-the-art)的逃避技术来实现目标。从防守者的角度来看,为了及时作出响应,了解这些攻击和研究它们的趋势是至关重要的(crucial)。其中,在红队和恶意软件作者中都流行的规避策略就是使用离地攻击(LotL)技术。

离地攻击(LotL)技术是指使用系统中已经存在或易于安装的二进制文件(如已签名的合法管理工具)来执行后渗透活动(post-exploitation activity)。

  • 通过利用这些工具,攻击者可以实现注册表修改、持久化、网络或系统侦察,或执行其他恶意代码。它们甚至可以用来减少由恶意活动产生的事件日志,而不需要将其他文件下载到本地的系统中。

1.2 APT中的离地攻击

离地攻击并不是隐蔽的技术,它们在互联网上公开记录着。许多开源的攻击安全工具利用了LotL技术,并且经常被攻击者所使用,从合法的红队到业余的网络攻击者,以及有组织的APT团队。

  • PoshSpy[15]:是一个俄罗斯APT29攻击模块,它是第一个被检测到的APT组织使用的LotL技术,特别是在PowerShell和Windows Management中。
  • 伊朗威胁组织[1]、APT33、APT34和其他组织也以使用本地Windows二进制文件和其它签名工具而闻名,特别是PowerShell[8]。

尽管“离地攻击”在信息安全界是一个相对知名的术语,但有时很难找到一个精确的定义。此外,据我们所知,没有任何研究包含了对LotL技术在恶意软件样本中的流行程度的系统分析。关于LotL技术的文档大多以博客的形式出现,并记录着某些恶意软件家族的在野发现,或者攻击者在远程访问受损系统中所使用技术的描述。

  • 例如,EmotetTrickbot,两个最常见的远程访问木马(Remote Access Trojans,RAT),据称是使用链接的LotL二进制文件来实现持久化。
  • 作为一种对策,微软描述了对抗使用LotL技术商用RAT的基本步骤。高度逃逸的远程访问木马 AstarothTA505 组织的一些恶意软件库,Dexphot cryptominerNodersok 同期使用的多个LotL二进制文件。

1.3 提出5个关键性问题

在本文中,我们分析了LotL现象,即商用恶意软件中与离地攻击二进制文件利用相关的文件。我们首先描述了什么是LotL binary以及它如何被恶意软件利用来实施恶意行为的。

本文的研究重点是以Windows为主导的操作系统下流行且恶意软件最常针对的目标。许多基于离地攻击的AV逃逸行为已被记录下来。因此(As a consequence),安全界很大程度上认为,LotL技术(如代理执行恶意软件)实际上对安全解决方案是有效的。

首先,我们提出了第一个假设以及第一个研究问题:

#### 问题1:Can LotL techniques effectively evade commercial AV?

#### LotL技术能有效地逃避目前大部分安全厂商的杀毒软件检测吗?

为了回答这个问题,我们评估了一组具有代表性的安全产品,并展示了其中的一些技术,虽然这是攻击者和防御者所熟知的,但仍然是绕过安全解决方案的有效方法,因此对安全行业来说这仍是一个开放的挑战。

事实上,LotL二进制文件经常被系统管理员和高级计算机用户使用来执行(perform)系统管理任务,这使得即使是对于训练有素的分析人员来说,区分(distinguish)合法行为和恶意行为也非常困难。我们负责任地向受影响的供应商披露了我们的发现并进行跟进,因此提高了他们的检测能力。

尽管现有的文档提供了这些技术使用的可靠证据,但仍然不清楚这种现象在恶意软件样本中有多普遍。因此(In this way),我们就提出了第二个研究问题:

#### 问题2:How prevalent is the use of LotL binaries in malware?

#### 在恶意软件中使用LotL二进制文件的情况有多普遍?

在此基础上,我们试图阐明当前威胁情景中的一些趋势,以确定(identify):

#### 问题3:What purposes do malware binaries use LotL techniques for?

#### 恶意软件的二进制文件使用LotL技术的目的是什么?

#### 问题4:Which malware families and types use LotL binaries most prolifically and how does their usage differ?

#### 哪些恶意软件家族和类型使用LotL二进制文件最多,它们的使用情况又有何不同?

此外,我们还调查(investigate)了为什么这些技术难以检测。部分杀毒软件公司参与了我们的披露,即将恶意攻击与系统管理员执行完全合法的管理任务区分开来是困难的。这就给我们带来了另一个问题:

问题5:What are the overlaps and differences in the behavior of legitimate and malicious binaries with respect to the usage of LotL binaries? How would this affect detection by heuristic AV engines?

#### 在使用LotL二进制文件方面,合法和恶意二进制文件的行为有哪些重叠和差异呢?这将如何影响启发式AV引擎的检测呢?

虽然恶意样本和良性样本之间的LotL二进制使用频率(prevalence)有一些明显的差异,但我们也注意到一些类别存在某些相似性,如代理执行(proxied execution)

最后,我们将注意力集中在高逃逸和高级持续威胁的恶意软件上,我们发现它利用离地攻击技术是商用恶意软件的两倍。在表1中列出了一些使用LotL技术进行攻击的APT组织。

1.4 贡献

据我们所知,本文提出了迄今为止对商用和APT恶意软件使用LotL技术最大规模的系统分析。本文的核心(core )贡献:

  • 我们通过测试一组最流行的AV引擎来对抗基于LotL技术部署的恶意载荷,以评估LotL技术的可行性,并展示了离地攻击检测的复杂性对行业仍是一个挑战。即使在披露9个月后,这些技术仍没有被发现
  • 我们对代表现代商用恶意软件的几个数据集进行了大规模的评估,并确定了LotL技术的流行程度,以及在不同恶意软件家族和类型之间的差异。我们还评估了LotL技术由于假阳性风险可能对行业产生的影响。
  • 我们评估了一个APT恶意软件数据集,并将其公开以促进(facilitate)后续的研究,并确定它执行LotL技术的频率是商用恶意软件的两倍。此外,我们还确定了哪些APT组织最多地使用LotL技术。

二、背景和相关工作

我们首先定义LotL二进制文件,并枚举恶意软件使用这些二进制文件的目的。

2.1 LotL Binaries

近年来,“Living-Off-The-Land binary(LOLbin)”已经成为一个常用词,用来指在网络攻击中广泛使用的二进制文件。历史上,“Living-Off-The-Land”一直被用来表示可以为农业或狩猎提供喂养土地或离地的概念。转换为恶意软件和入侵领域,攻击者可能利用那些已经可以使用的文件(即系统上已经存在或易于安装的)来发起攻击并躲避检测。

在本文中,我们将LotL二进制定义为:

  • 任何具有公认合法用途的二进制文件,在攻击期间利用它直接执行恶意行为,或间接协助一系列恶意行动,从而达到恶意结果。

In this paper, we define a LotL binary as any binary with a recognised legitimate use, that is leveraged during an attack to directly perform a malicious action; or to assist indirectly, in a sequence of actions that have a final malicious outcome.

图片

举例:

  • 在Windows系统上默认安装的二进制文件(binaries installed),如 Reg.exeSc.exeWmic.exe 是最常被恶意软件执行的文件。
  • 大多数默认安装的二进制文件都是由微软认证码签名的。认证码签名证明二进制文件没有在编译中被篡改或修改,这些二进制文件甚至可能被列为白名单。利用可信的LotL二进制文件的恶意软件可能因此避开杀毒软件。在Windows系统上使用系统二进制文件可以作为恶意软件操作的一部分,更重要的是,许多LotL技术使用系统二进制文件来实现这些二进制文件的目的。
  • 此外,可以使用外部签名二进制文件(external signed binaries),如 PsExec.exe 或其他系统内部二进制文件。虽然它们使用频率不高,但本文的分析也囊括了这些文件。如APT组织在 SoftCellHavex 中都使用 PsExec.exe 来秘密执行远程命令,从而实现网络中的横向移动。
  • 某些罕见情况,脆弱的(已签名)驱动程序被用来升级系统上的权限。这是 RobbinHood 勒索软件和各种 APT wiper 恶意软件样本所使用的一种技术,针对 Saudi Arabian 系统,包括 DustmanShamoonZerocleare

可追溯性(Traceability):

  • 某些LotL二进制文件可能会比其他文件留下更多的系统日志,安全工具或取证分析人员可以利用这些日志来检测恶意操作。例如,可以将Powershell配置为具有全面的日志记录
  • 微软甚至建议阻止在系统上执行一些本机的二进制文件,除非有充分的理由。

2.2 Scope of our Study

在本文中,我们关注的是Windows恶意软件执行系统二进制文件的目的。这些目的通常包括沿着 kill chain的进展或逃避AV的检测。所有这些技术都被部署在系统的用户空间中。

hollowinginjection(注入) 不在我们的研究范围内,尽管这是无文件恶意软件部署的常见技术。因为根据我们早期的定义,它们不是LotL技术。

2.3 Related Work

离地攻击相关工作较少,并且都非常经典,因此下面罗列了详细的相关研究,仅供自己后续深入,也希望对您有所帮助。

  • LotL恶意软件及其别名,“advanced volatile threat”或“无文件”恶意软件在当前的学术文献中很少被提及。这主要受限于介绍分析少或描述为一个新兴的高逃逸恶意软件变体。
  • Li等[31]对恶意PowerShell脚本进行了分析,其中有一个小节专门描述了LotL攻击和无文件攻击作为近年来网络攻击的趋势。(作者第17篇博客详细介绍过PS经典
  • Wang等[72]最近发表的一篇关于数据来源分析的论文指出,Living-Off-The-Land 是一种新兴的、突出的逃避型恶意软件子类(evasive malware subtype)。(经典的You Are What You Do后续即将分享
  • 先前的工作[64]进行了介绍性分析,然而LotL恶意软件还没有受到详细的学术分析。(An emerging threat Fileless malware: a survey and research challenges)
  • 赛门铁克[73,66]和思科Talos的[65]白皮书介绍了这个主题,并对多个数据集的流行性进行了分析。目前,没有论文对包含多个使用LotL技术的Windows恶意软件数据集进行大规模地系统分析。(经典
    • https://www.symantec.com/content/dam/symantec/docs/security-center/white-papers/istr-living-off-the-land-and-fileless-attack-techniques-en.pdf
    • https://www.symantec.com/content/dam/symantec/docs/white-papers/living-off-the-land-turning-your-infrastructure-against-you-en.pdf
    • https://blog.talosintelligence.com/2019/11/hunting-for-lolbins.html

图片

在一些论文中提到了LotL技术,强调了高隐蔽(stealthiness)和APT恶意软件曾使用。

  • 在一篇关于恶意软件分析工具Yara的论文中,Cohen[9]将LotL描述 “ LotL as a trend that has been recently observed in the tactics used by elite threat actors”,我们的分析结果进一步证实了该说法。

  • Hassan等[21]的研究表明,APT恶意软件使用LotL攻击策略来实现持续攻击并分析了两个活动,他们的工作还利用了MITRE ATT&CK框架[45],通过MITRE定义了一个描述和分类知名攻击的分类方法。许多LotL技术在MITRE ATT&CK框架内被索引。Mitre公司及其常见CVE漏洞是安全领域的既定权威,他们囊括并描述许多LotL技术,这样表明离地攻击是一个值得深入分析的课题。

    • W. U. Hassan, A. Bates, and D. Marino, “Tactical Provenance Analysis for Endpoint Detection and Response Systems,” IEEE Symposium on Security and Privacy, 2020.

强烈推荐一个包含LotL二进制和ATT&CK功能映射的资源

  • https://github.com/LOLBAS-Project/LOLBAS

图片

与我们研究相关的是对基于脚本的恶意软件分析和去混淆。使用LotL技术的恶意软件经常使用恶意脚本作为有效负载。(下列论文在作者第16篇PowerShell总结博客中详细介绍过

  • Ugarte等[67]通过识别可疑行为模式,测试了经 Powershell.exe 二进制调用的恶意脚本。
  • Rubin等[61]将机器学习应用于检测PowerShell恶意软件(微软团队)
  • Curtsinger[11]等人提出了恶意Javascript攻击的检测机制——ZOZZLE。

虽然这些论文提出了有效的检测方法,但是他们都是为狭隘的恶意载荷(payload)所用,他们没有分析更广泛的恶意软件生态系统和这些有效载荷是如何被LotL二进制文件触发的。

三、动机

安全研究人员已经记录了许多使用LotL技术成功躲避安全产品的案例。在许多情况下,这些LotL二进制文件被用来代理恶意载荷的执行,使其在一个合法的进程上下文中执行,或者作为一个合法系统进程的子进程生成一个新进程。在某些情况下,这些有效载荷作为LotL二进制调用的副作用被执行,而在其他情况下,它只是其主要记录行为的结果。此外,许多杀毒产品未能正确检测到这些技术。

图片

为了回答第一个问题,我们首先分析了当前AV产品是否将LotL技术作为恶意行为的指标。

为此,我们首先选择了10个具有代表性的AV产品(详见附录C),并利用常见基于LotL的代理执行技术来实施反弹Shell的模拟攻击。此外,本研究的目的不是测试任何特定AV产品的检测能力或将它们相互比较,而是确定是否存在普遍的检测差距。

  • 实验在联网的Windows 10虚拟机执行,并将最新的本地AV产品连接到它们的云组件。
  • 利用一个反弹Shell来评估AV系统在部署LotL技术的恶意软件中有多脆弱。本文认为能够允许远程执行命令的reverse shell是成功执行代码的证明,这与许多远程访问木马(RAT)功能相同。
  • 通过从不同LotL二进制文件中运行这个反弹shell来进行实验,以测试AV产品是否检测到离地攻击技术是恶意的。
  • 我们在必要时混淆了反弹shell的有效载荷,并使用各种有效载荷类型来测试AV检测传递机制本身的能力,而不是通过静态签名传递的特定有效载荷(详见附录D)。

实验结果如表2所示:

  • 可以发现大部分的AV引擎允许我们建立一个反弹Shell并执行命令,它们并没有检测出利用LotL技术的恶意软件,60个中只检测出4个。

图片

负责任的披露和回应:

此后,我们向相关的AV供应商发布了一份文件,包含我们检查的结果并协助补救。9个月后,我们在Windows 10机器上重复了类似的测试,这允许我们测试AV供应商是否在他们的产品中包含了新的启发式规则来检测LotL二进制的使用。其结果如下:

  • 可以发现在60个相同的有效载荷中检测到了25个
  • 在检测到的反弹shell测试中,我们修改了载荷(利用混淆或运行不同的载荷),同时为LotL二进制文件保持了完全相同的命令行参数,通过利用这些混淆和修改的有效载荷,我们成功地在这25个被拦截的实例中的19个执行了一个反向shell。

图片

实验结果表明,LotL技术仍然是杀毒软件供应商面临的一个重大挑战。合法用户通常以不可预知的方式使用这些工具,而安全公司很难在没有误报的情况下部署有效的检测策略。

接下来将展示这些技术如何在商用恶意软件中是普遍存在的,以及离地攻击是不应该被安全社区忽视的问题。

四、离地攻击流行性评估

在本节中,我们测量了恶意软件中LotL技术的流行程度,并试图回答所提出的研究问题。

4.1 数据集描述

评估工作是在9个独立的子数据集上进行的。我们总共收集了31,805,549个样本,其中我们从VirusTotal(VT)中获得了16,048,202份行为报告。

图片

Public Datasets

公共恶意软件数据集,包括商用恶意软件、VirusShare语料库的二进制文件、窗口恶意PE文件、佐治亚理工学院发布的可执行文件、VX-Mumbal和MalShare共享的样本(两个重点的共有数据集)。

  • https://impactcybertrust.org/dataset{ }view?idDataset=1143
  • https://vx-underground.org/samples.html
  • https://malshare.com

VirusTotal Balanced Dataset

从VT中收集了237,288个hash值,利用 AVClass 预处理代码和打标签(家族分类),并平衡数据集中每个族。

APT Malware

我们根据一种类似于数据集论文dAPTaset[59]的方法收集了一个APT恶意软件的数据集。我们处理了HTML页面和pdf文件(APTnotes),并提取了这些文件中包含的所有恶意软件的hash值。

  • https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-rezaeirad.pdf
  • https://github.com/aptnotes/data

Yara Rule Match Malware

部署3个Yara规则来检测LotL二进制文件,并使用Livehunte来识别上传到VT的新的恶意软件hash,并使用LotL技术匹配恶意软件的行为特征。

4.2 Analysis Pipeline

当收集了由Windows PE二进制文件组成的不同数据集,我们就分析样本的行为。包括三个阶段:

  • data collection
  • data augmentation
  • data analysis

First Seen:首次发现病毒样本的时间戳 AVClass Family:某恶意软件样本所属家族 Behavioural Report:恶意行为报告,由特定恶意软件样本执行的进程和Shell命令的列表

4.3 LotL Technique Identification

数据准备就绪,那么如何识别是否使用了LotL技术呢?

我们使用模式匹配来识别恶意软件执行过程中对LotL二进制文件调用的情况,从而处理所有收集到的行为报告(behavioural reports)。行为报告包括两个指标:

  • Shell Commands(Shell命令)

    恶意二进制文件在主机操作系统中执行的Shell命令,Shell命令日志可以通过引用系统二进制文件的绝对路径来显示它的执行情况。同时,Windows的命令提示符还包括许多别名,例如Reg.exe的reg

  • Processes(进程)

    进程日志明确由恶意软件样本执行的系统二进制文件。执行的参数也包含在行为报告中的进程日志中。

在我们的分析中,如果一个样本的行为报告包含至少一个LotL二进制文件的执行,那么它使用了LotL技术。我们记录了每一个LotL的执行及其参数细节,并将它们插入到数据库中。然后,我们分析了这些恶意软件样本的参数,以确定每个数据集中最常见的参数类型和执行目的。

具体而言,我们确定了这两种独立类型的二进制文件:

  • Default System Binaries
  • Installed Signed Binaries

模式匹配优化:模式匹配方法在不断改进,直到所有识别的LotL命令被正确分类和映射到执行目的,并进行了数据清洗处理。

  • 不带参数的二进制执行移除
  • 沙箱产物删除(如Explorer.exe和sha256),Web访问不处理
  • 删除Verclsid.exe的实例

4.4 Parameter Analysis to Identify Execution Purpose

为了确定LotL技术的执行目的,我们观察了恶意软件样本提供的参数。

图1说明了四个进程执行的映射。该映射通过识别单独的执行目的来在所有数据集上实施,例如执行Net.exe时使用stop参数表示任务停止。在将单个命令映射到执行目的之后,我们将为该二进制文件选择所有匹配的执行。我们在所有系统二进制执行中重复该步骤,直到每次执行被分类为属于特定的执行目的或被错误分类。

图片

按照这种方法,我们按目的将参数分为9个独立的类别。

首先是三种与执行有关的类型:

  • Proxied Execution:代理执行,如Mshta.exe执行.hta文件,Rundll32.exe执行.dll文件
  • Persistence:持久化:如果恶意代码配置或修改系统以在未来某个时间点执行命令或存储的作业,那么它就实现了持久性,比如Sc.exe带有创建参数的Bitsadmin.exe,或带有日期时间参数的Schtasks.exe/At.exe
  • Delayed Execution:延迟执行,比如 Ping.exe执行-n

接着是三类与底层系统组件的修改有关。恶意软件通常从事这种行为,以便在机器上对目标进行进一步的传播或行动。

  • Firewall Modification:防火墙修改,如Netsh.exe
  • Registry Modification:注册表修改,如Reg.exe
  • Permissions Modification:权限修改,如Cacls.exe修改文件权限

最后是与执行或系统修改无关的三类。

  • File Opening:打开文件,如Explorer.exe
  • Reconnaissance:侦察,触发本地或远程配置的横向移动,如Net.exe
  • Task Stopping:使用LotL二进制文件秘密停止另一个进程或服务,如Taskkill.exe

Dynamic Malware Analysis with Feature Engineering and Feature Learning

  • 项目:https://github.com/joddiy/DynamicMalwareAnalysis
  • 文章:https://arxiv.org/abs/1907.07352

摘要

动态恶意软件分析在隔离的环境中执行程序,并监控其运行时行为(如系统API调用),以检测恶意软件。该技术已被证明对各种代码混淆技术和新发布的(“零日”)恶意软件有效。然而,现有的工作通常只考虑API名称而忽略参数或者需要复杂的特征工程操作和专家知识来处理参数。在本文中,我们提出了一种新的、低成本的特征提取方法,以及一种有效的深度神经网络体系结构,用于准确、快速地检测恶意软件。具体而言,特征表示方法利用特征哈希技巧对与API名称关联的API调用参数进行编码。深度神经网络体系结构应用多个选通CNN(卷积神经网络)来转换每个API调用的提取特征。通过双向LSTM(长-短期内存网络)进一步处理输出,以了解API调用之间的顺序相关性。实验表明,我们的解决方案在大型真实数据集上的性能明显优于基线。从烧蚀研究中获得了有关特征工程和建筑设计的宝贵见解。

一、说明

网络安全给全世界带来了巨大的经济成本。美国政府的一份报告(CEA 2018)估计,2016年美国经济中恶意网络活动的成本在570亿美元至1090亿美元之间。恶意软件(或恶意软件)是快速发展的主要网络安全威胁之一。据报道,每年发现超过1.2亿个新的恶意软件样本(AV-TEST 2017)。因此,开发恶意软件检测技术是迫切而必要的。

数十年来,研究人员一直致力于恶意软件检测。主流解决方案包括静态分析和动态分析。静态分析方法扫描软件的二进制字节流以创建签名,如可打印字符串、n-gram、指令等(Kruegel等人,2005)。然而,基于签名的静态分析可能容易受到代码混淆的影响(Rhode、Burnap和Jones,2018;Gibert等人,2018),或者不足以检测新的(“zeroday”)恶意软件(Vinod等人,2009)。相反,动态分析算法在隔离的环境(例如沙盒)中执行每个软件,以收集其运行时行为信息。通过使用行为信息,动态分析的检测率更高,比静态分析更稳健(Damodaran et al.2017)。在本文中,我们主要关注动态分析。

在行为信息中,系统API调用序列是最常用的数据源,因为它捕获了软件执行的所有操作(包括网络访问、文件操作等)。序列中的每个API调用都包含两个重要部分,即API名称和参数。每个API可能有零个或多个参数,每个参数都表示为名称-值对。为了处理行为信息,提出了许多特征工程方法。例如,如果我们将API名称视为一个字符串,则可以提取最多N个(例如1000个)频繁的N-gram特征(N=1,2.....) 从序列中。然而,从异构类型的参数(包括字符串、整数、地址等)中提取特征并非易事。最近,研究人员将深度学习模型应用于动态分析。卷积神经网络(CNN)和递归神经网络(RNN)等深度学习模型可以直接从序列数据中学习特征,而无需进行特征工程。尽管如此,计算机视觉和自然语言处理等传统深度学习应用程序的数据是同质的,例如图像(或文本)。使用深度学习模型处理异构API参数仍然具有挑战性。因此,大多数现有方法都忽略了这些参数。有几种利用API参数的方法(Tian et al.2010;Fang et al.2017;Agrawal et al.2018)。然而,这些方法要么将所有参数视为字符串(Tian et al.2010;Agrawal et al.2018),要么只考虑参数的统计信息(Ahmed et al.2009;Tian et al.2010;Islam et al.2013)。因此,它们无法充分利用来自不同类型参数的异构信息

在本文中,我们提出了一种新的特征工程方法和一种新的恶意软件检测深度学习体系结构。特别是,对于不同类型的参数,我们的特征工程方法利用哈希方法分别提取异构特征从API名称、类别和参数中提取的特征将进一步串联并输入到深度学习模型中。我们使用多个选通CNN模型(Dauphin et al.2017)从每个API调用的高维哈希特征中学习抽象的低维特征。来自选通CNN模型的输出由双向LSTM处理,以提取所有API调用的顺序相关性。

我们的解决方案比所有基线都有很大的优势。通过广泛的烧蚀研究,我们发现特征工程和模型架构设计对于实现高泛化性能至关重要。本文的主要贡献包括:

  • 我们为系统API参数提出了一种新的特征表示。从我们的数据集中提取的特征将发布供公众访问。
  • 我们设计了一种深度神经网络结构来处理提取的特征,它将多个门控CNN和一个双向LSTM相结合。它以巨大的利润超过了所有现有的解决方案。
  • 我们在一个大型真实数据集1上进行了广泛的实验。通过消融研究,发现了有关特征和模型架构的宝贵见解。

二、相关工作

在本节中,我们将从特征工程和深度学习的角度回顾动态恶意软件分析。

2.1 API调用的功能工程

(Trinius等人,2009)介绍了一种称为恶意软件指令集(MIST)的特征表示。MIST使用多个级别的功能来表示系统调用。第一级表示API调用的类别和名称。以下级别是为每个API调用手动指定的,以表示它们的参数。然而,对于不同的API,同一级别的特性可能表示不同类型的信息。这种不一致性给使用机器学习模型学习模式带来了挑战。

(Qiao等人,2013)扩展了MIST,提出了一种称为基于字节的行为指令集(BBIS)的表示。他们声称,只有MIST的第一级(API调用的类别和名称)是有效的。此外,他们还提出了一种算法CARL来处理连续重复的API调用

统计特征是训练机器学习模型的常用方法。提取API调用名称及其参数中的字符串,以计算频率和分布,作为中的特征(Tian et al.2010;Islam et al.2010;2013)。(Ahmed et al.2009)还使用统计特征来捕获空间和时间信息。从参数中提取空间信息,如均值、方差和熵。时间信息来自ngram API调用,包括两个n-gram API调用之间的相关性和转换可能性。

(Salehi、Ghiasi和Sami 2012)提出了一种将API调用与其参数关联起来的特性表示。它将每个参数与其API调用的名称连接起来,形成一个新的序列,然而,这种方法会导致一个非常长的特征向量,并且可能会丢失API调用序列的模式。

(Hansen等人,2016)提出了另外两种特征表示法。这些表示包括前200个API调用及其“参数”。但是,此“参数”仅指示此API调用是否与后一个API调用连接,而忽略原始参数。

2.2 Deep Learning Based Approaches

(David and Netanyahu 2015)将沙盒报告视为一个完整的文本字符串,然后用任何特殊字符拆分所有字符串。他们计算每个字符串的频率,并使用20000位向量来表示最频繁的20000个字符串。他们的模型是一个深度信念网络(DBN),由八层组成(从20000个大小的向量到30个大小的向量)。利用交叉熵损失对模型进行训练。在一个包含600个测试样本的小数据集上,它们的准确率达到98.6%。

(Pascanu et al.2015)提出了两个阶段的方法,即特征学习阶段和分类阶段。在第一阶段,他们使用RNN根据之前的API调用序列预测下一个可能的API调用。在分类阶段,他们冻结RNN,并将输出输入最大池层,以转换特征进行分类。在75000个样本的数据集上,它们的召回率达到71.71%,假阳性率为0.1%。

(Kolosnjaji et al.2016)提出了一种将CNN与LSTM相结合的方法。他们的方法堆叠两个CNN层,每个CNN层使用一个3大小的内核来模拟3-gram方法。在CNN之后,附加一个具有100大小隐藏向量的LSTM来处理时间序列。以前的论文通常忽略了论点。

(Huang和Stokes 2016)使用了一种包含三个部分的特征表示,即参数中存在可运行代码、API调用名称与其中一个参数的组合(手动选择)以及3-gram的API调用序列。通过随机投影(random projection),此特征表示从50000减少到4000。(Agrawal et al.2018)提出了一种特征表示方法,该方法使用来自API调用名称的一个one-hot和参数字符串的前N个频繁N-gram。该模型使用了几个堆叠的LSTM,其性能优于(Kolosnjaji等人,2016)。他们还声称,多个LSTM不能提高性能。

三、系统框架

为了收集运行时API调用,我们实现了图1所示的系统。该系统由体育档案采集、行为信息采集、特征提取和模型训练三部分组成。

image-20220526165948643

3.1 PE文件收集

我们系统的工作流程从可移植可执行文件(PE)集合开始。在本文中,我们重点检测Windows系统中可移植可执行文件(PE)格式的恶意软件,这是最流行的恶意软件文件格式(AV-TEST 2017)。此收集部分已由新加坡SecureAge Technology本地反病毒公司实施。此外,该公司还维护了一个包含12个防病毒引擎的平台,用于对PE文件进行分类。对分类结果进行聚合,以获得每个PE文件的标签,用于模型培训。一旦模型经过培训,它将作为第13个防病毒引擎添加到平台中。收集之后,将维护一个执行队列,以提交PE文件以供执行。它监视存储使用情况并决定是否执行更多PE文件。

3.2 行为信息收集

https://cuckoosandbox.org/

json在线解析:http://www.jsons.cn/jsoncheck/

布谷鸟是一款开源软件,用于运行PE文件和收集执行日志。它在虚拟机内执行PE文件,并使用API挂钩监视API调用跟踪(即行为信息)。此外,布谷鸟模拟了一些用户行为,例如单击按钮、键入一些文本等。在我们的系统中,我们在每台服务器上维护了数十台虚拟机。所有虚拟机都安装了64位Windows 7系统和一些日常使用的软件。我们利用虚拟机的快照功能在执行后回滚它。所有生成的日志都存储在本地的布谷鸟服务器上

3.3 特征提取和模型训练

沙盒生成的执行日志包含PE文件的详细运行时信息,PE文件的大小从几KB到数百GB不等。我们设计了一个可以并行运行的特征工程解决方案以有效地从原始执行日志中提取特征。提取特征后,我们在带有GPU的模型服务器上训练我们的深度学习模型,以进行恶意软件分类。

4、方法

#### cuckoo json:

  • behavior

    • summary

      • file_recreated
      • file_failed
      • dll_loaded
      • guid
      • file_opened
      • file_created
      • file_written
    • generic

      • process_path: 进程启动路径
      • process_name: 进程执行程序名
      • pid: 进程id
      • first_seen: 进程启动时间戳
      • ppid: 父进程id
    • apistatsAPI名称的调用次数信息

    • processes

      • command_line

      • calls

        { "api": "NtCreateFile", "category": "file", "return_value": 0, "stacktrace": [ ], "flags": { "desired_access": "FILE_READ_ATTRIBUTES|READ_CONTROL|SYNCHRONIZE", "share_access": "FILE_SHARE_READ", "file_attributes": "", "create_disposition": "FILE_OPEN", "create_options": "FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT", "status_info": "FILE_OPENED" }, "arguments": { "desired_access": "0x00120080", "share_access": 1, "filepath_r": "\??\C:\Users\xn\AppData\Local\Temp\0e823db8b1beaca62207e2a82a9cd691c7af44cd14b876cb9f823f29750dd008", "filepath": "C:\Users\xn\AppData\Local\Temp\0e823db8b1beaca62207e2a82a9cd691c7af44cd14b876cb9f823f29750dd008", "file_attributes": 0, "create_disposition": 1, "file_handle": "0x000004ac", "status_info": 1, "create_options": 96 }, "tid": 3564, "status": 1, "time": 1622640835.384851 },

      • modules: 样本运行时调用的系统文件信息, 包括被调用文件名/路径/基地址及其大小

      • time: 运行时间

    • processtree

      • children: 子进程列表

4.1 特征工程

  • FeatureHasher: https://scikit-learn.org/dev/modules/generated/sklearn.feature_extraction.FeatureHasher.html#sklearn.feature_extraction.FeatureHasher

  • Feature Hashing for Large Scale Multitask Learning (2013)

以前的大多数工作(Qiao et al.2013;Pascanu et al.2015;Kolosnjaji et al.2016)都忽略了API调用的参数,只考虑了API名称和类别。因此,一些重要(鉴别)信息丢失(Agrawal et al.2018)。例如,如果忽略文件路径参数,则两个写操作(API调用)的功能将完全相同。但是,当目标文件由程序本身创建时,写入操作可能是良性的,但如果目标文件是系统文件,则写入操作可能是恶意的。一些考虑到论点的著作(Trinius et al.2009;Agrawal et al.2018;Huang and Stokes 2016)未能利用不同类型论点的异质信息。我们建议采用(Weinberger et al.2009)中的哈希方法,分别对API的名称、类别和参数进行编码

如下表所示,我们的特征表示由不同类型的信息组成。API名称有8维,API类别有4维。API参数部分有90个维,16个用于整数参数,74个用于字符串参数。对于字符串参数,将处理几种特定类型的字符串(文件路径、DLL等)。此外,从所可打印字符串中提取了10个统计特征。将所有这些特征串联起来,形成102维特征向量

image-20220526170451620

  • API名称和类别

单词拆分?fastext?删除循环调用?

布谷鸟沙盒总共跟踪312个API调用,它们属于17个类别。每个API名称由多个单词组成,每个单词的第一个字母大写,例如“GetFileSize”。我们将API名称拆分为单词,然后应用下面的特性哈希技巧处理这些单词。对于API类别,由于该类别通常是单个单词,例如“network”,我们将该单词拆分为字符并应用特征哈希技巧。此外,我们计算API名称、类别和参数的MD5值,以删除任何连续重复的API调用

我们使用方程1中的特征哈希(Weinberger et al.2009)将字符串序列编码为固定长度的向量。随机变量x表示元素序列,其中每个元素要么是字符串,要么是字符。M表示维度数量,即8表示API名称,4表示API类别。第i个bin的值通过以下公式计算:

image-20220526172933876

其中,h是将元素(例如xj)映射到自然数m的哈希函数∈ {1,…,M}作为bin索引;ξ是另一个将元素映射到{+-1} 。也就是说,对于x的每个元素xj,其bin索引h(xj)为i,我们将ξ(xj)添加到bin中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class APIName(FeatureType):
''' api_name hash info '''
name = 'api_name'
dim = 8
def __init__(self):
super(FeatureType, self).__init__()
self._name = re.compile('^[a-z]+|[A-Z][^A-Z]*')
def raw_features(self, input_dict):
"""
input_dict: string
"""
tmp = self._name.findall(input_dict)
hasher = FeatureHasher(self.dim, input_type="string").transform([tmp]).toarray()[0]
return hasher
def process_raw_features(self, raw_obj):
return raw_obj

class APICategory(FeatureType):
''' api_category hash info '''
name = 'api_category'
dim = 4
def __init__(self):
super(FeatureType, self).__init__()
def raw_features(self, input_dict):
hasher = FeatureHasher(self.dim, input_type="string").transform([input_dict]).toarray()[0]
return hasher
def process_raw_features(self, raw_obj):
return raw_obj
  • API参数

image-20230319160222991

至于API参数,只有两种类型的值,即整数字符串。整数的单个值没有意义。需要参数名称才能获取值的含义。相同的整数值可能表示具有不同参数名称的完全不同语义。例如,名为“port”的数字22与名为“size”的数字不同。我们采用前面的特征哈希方法对整数的参数名称及其值进行编码,如等式2所示。我们使用参数名称来定位哈希容器。特别是,我们使用名称哈希值为i的所有参数通过求和更新第i个bin。对于每个这样的参数,我们计算对bin的贡献,如等式2所示,其中ξ(\(x_{name_j}\))是参数名称上的哈希函数,\(x_{value_j}\)是整数参数的值。由于整数可能在某个范围内稀疏分布,因此我们使用对数对值进行规格化,以压缩该范围。

image-20220526174316254

其中,h和ξ是与等式1中相同的哈希函数。对于API参数字符串,它们的值比整数更复杂。某些以“0x”开头的字符串包含某些对象的地址。还有一些可能包含文件路径、IP地址、URL或纯文本。此外,一些API参数甚至可能包含整个文件的内容。字符串的多样性使得处理它们具有挑战性。根据之前的工作(Tian et al.2010;Islam et al.2010;2013;Ahmed et al.2009),最重要的字符串是关于文件路径、DLL、注册表项、URL和IP地址的值。因此,我们使用方程1中的特征哈希方法【string】来提取这些字符串的特征。

为了捕获字符串中包含的层次信息,我们将整个字符串解析为几个子字符串,并分别对它们进行处理。例如,我们使用“C:\”来标识文件路径。所有这些子串都通过方程1进行处理

Path对于像“C:\a\b\C”这样的路径,将生成四个子字符串,即“C:”、“C:\a”、“C:\a\b”和“C:\a\b\C”。

dll:以“.dll”结尾的字符串

注册表:项通常以“HKEY”开头

IP:由点分隔的四个数字(范围从0到255)组成的字符串

URL:我们仅从URL的主机名生成子字符串。例如,对于“https://security.ai.cs.org/,将生成以下子字符串“org”、“cs.org”、“ai.cs.org”和“security.ai.cs.org”。

DLL、注册表项和IP也采用相同的处理方法dll是以“.dll”结尾的字符串。注册表项通常以“HKEY”开头。IP是由点分隔的四个数字(范围从0到255)组成的字符串。URL略有不同,我们仅从URL的主机名生成子字符串。例如,对于“https://security.ai.cs.org/,将生成以下子字符串“org”、“cs.org”、“ai.cs.org”和“security.ai.cs.org”。这样,域和组织信息将对该功能贡献更多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class PRUIInfo(FeatureType):
''' Path, Registry, Urls, IPs hash info '''
name = 'prui'
dim = 16 + 8 + 12 + 16 + 12

def __init__(self):
super(FeatureType, self).__init__()
self._paths = re.compile('^c:\\\\', re.IGNORECASE)
self._dlls = re.compile('.+\.dll$', re.IGNORECASE)
self._urls = re.compile('^https?://(.+?)[/|\s|:]', re.IGNORECASE)
self._registry = re.compile('^HKEY_')
self._ips = re.compile('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')

def raw_features(self, input_dict):
paths = np.zeros((16,), dtype=np.float32)
dlls = np.zeros((8,), dtype=np.float32)
registry = np.zeros((12,), dtype=np.float32)
urls = np.zeros((16,), dtype=np.float32)
ips = np.zeros((12,), dtype=np.float32)
for str_name, str_value in input_dict.items():
if self._dlls.match(str_value):
tmp = re.split('//|\\\\|\.', str_value)[:-1]
tmp = ['\\'.join(tmp[:i]) for i in range(1, len(tmp) + 1)]
dlls += FeatureHasher(8, input_type="string").transform([tmp]).toarray()[0]
if self._paths.match(str_value):
tmp = re.split('//|\\\\|\.', str_value)[:-1]
tmp = ['\\'.join(tmp[:i]) for i in range(1, len(tmp) + 1)]
paths += FeatureHasher(16, input_type="string").transform([tmp]).toarray()[0]
elif self._registry.match(str_value):
tmp = str_value.split('\\')[:6]
tmp = ['\\'.join(tmp[:i]) for i in range(1, len(tmp) + 1)]
registry += FeatureHasher(12, input_type="string").transform([tmp]).toarray()[0]
elif self._urls.match(str_value):
tmp = self._urls.split(str_value + "/")[1]
tmp = tmp.split('.')[::-1]
tmp = ['.'.join(tmp[:i][::-1]) for i in range(1, len(tmp) + 1)]
urls += FeatureHasher(16, input_type="string").transform([tmp]).toarray()[0]
elif self._ips.match(str_value):
tmp = str_value.split('.')
tmp = ['.'.join(tmp[:i]) for i in range(1, len(tmp) + 1)]
ips += FeatureHasher(12, input_type="string").transform([tmp]).toarray()[0]
return np.hstack([paths, dlls, registry, urls, ips]).astype(np.float32)

def process_raw_features(self, raw_obj):
return raw_obj

统计信息

对于许多其他类型的字符串,根据之前的工作(Ahmed et al.2009;Tian et al.2010;Islam et al.2010),我们从所有可打印字符串中提取统计信息。可打印字符串由0x20到0x7f的字符组成。因此,包括所有路径、注册表项、URL、IP和其他一些可打印字符串

  • 以“MZ”开头的一类字符串通常是包含整个PE文件的缓冲区,通常出现在恶意PE文件中,如线程注入(Liu et al.2011)。因此,我们额外计算“MZ”字符串的出现次数。
  • 10维向量用于记录字符串的数量、平均长度、字符数、所有可打印字符串的字符熵,以及路径、DLL、URL、注册表项、IP和“MZ”字符串的数量。我们没有处理其他参数,如虚拟地址、结构等,与上述类型的参数相比,这些参数相对不太重要。

虽然所提出的特征工程方法很容易使用额外的bins应用于它们,但我们期待着进行更有针对性的研究来探索这些论点。

4.2 模型结构

我们提出了一种深度神经网络架构,它利用了所提出的特征工程步骤中的特征。图2概述了我们提出的深度学习模型。

image-20220526184024769

  • 输入模块

在特征工程之后,我们得到大小为(N,d)的输入向量,其中N是API调用序列的长度d(102位)是每个提取的API特征的维数。我们首先通过批量规范化层(BN)对输入进行规范化(Ioffe和Szegedy 2015)。该批次标准化层通过减去批次平均值并除以批次标准偏差来标准化输入值。它保证了特征向量的某些维数不会太大而影响训练;实验验证了该方法的正则化效果。

  • 门控CNNs模块

输入模块后应用了多个门控-CNN(Dauphin et al.2017)。门控-CNN允许选择重要和相关的信息,使其在语言任务上与循环模型相比,但消耗更少的资源和时间。对于每个选通的CNN,输入分别馈入两个卷积层。设XA表示第一卷积层的输出,XB表示第二卷积层的输出;它们由image-20220526184352710组成,它涉及到元素乘法运算。这里,σ是sigmoid函数。σ(XB)被视为控制从XA传递到模型中下一层的信息的门按照(Shen et al.2014)中的想法,一维卷积滤波器被用作n-gram检测器。如图2所示,我们使用两个选通CNN,其过滤器大小分别为2和3。所有卷积层的滤波器个数为128,步长为1。

  • BI-LSTM模块

来自门CNN的所有输出连接在一起。对这些输出应用批处理规范化层,以减少过拟合。我们使用双向LSTM来学习序列模式每个LSTM的单元数为100。LSTM是一种递归神经网络架构,其中设计了几个门来控制信息传输状态,以便能够捕获长期上下文信息(Pichotta和Mooney 2016)。双向LSTM是两个LSTM叠加在一起,但方向输入不同。与单向LSTM相比,双向LSTM能够同时整合过去和未来状态的信息。双向LSTM在恶意软件检测方面已被证明是有效的(Agrawal et al.2018)。

  • 分类模块

在Bi LSTM模块中学习序列模式后,应用全局最大池层从隐藏向量中提取抽象特征。全局最大池层不是使用Bi LSTM的最终激活,而是依赖于整个序列中观察到的每个信号,这有助于保留整个序列中学习到的相关信息。在全局最大池层之后,我们使用单元数为64的密集层将中间向量的维数减少到64。将ReLU激活应用于该致密层。然后,我们使用速率为0.5的衰减层(dropout)来减少过度拟合。最后,单位数为1的致密层将维数减少到1。在致密层之后附加一个Sigmoid激活以输出概率。我们的模型使用与每个输入向量相关的标签进行监督。为了测量用于训练模型的损失。

image-20220526185129696

此外,我们采用的优化方法是Adam,学习率为0.001。

Dynamic Malware Analysis - 代码结构

model.py

  • ClassifyGenerator: Generates data for Keras
  • Model: 模型结构定义、模型训练
  • Cuckoo2DMDS:
  • DMDS