当前位置: 首页 > 科技观察

机器学习如何检测使用沙箱规避和静态保护的恶意软件

时间:2023-03-17 19:33:42 科技观察

Unit42研究人员讨论了一个机器学习管道,该管道建立在基于管理程序的沙箱中基于内存的工件上,这是AdvancedWildFire的一部分。可以提高恶意软件的检测准确性。正如我们之前介绍的那样,恶意软件开发人员不断改进他们的攻击媒介以击败静态分析和沙盒等策略。封装方法和沙箱规避等不断发展的技术使防御者难以防范。更糟糕的是,流行的检测技术,如结构分析、静态签名和许多类型的动态分析,都无法很好地应对当今日益复杂的攻击。恶意软件开发人员越来越多地采用规避技术,例如混淆、封装和在进程内存中执行动态注入的shellcode。使用文件结构中的线索进行恶意软件检测可能并不总是成功。封装技术可以充分修改文件结构以删除这些线索。因此,仅针对此类特征进行训练的机器学习模型将无法有效检测此类样本。这种检测方法的另一种流行替代方法是使用机器学习模型,该模型根据沙箱内恶意软件执行的痕迹来预测恶意行为。然而,正如我们在原始文章中详述的那样,沙盒规避非常普遍,有效载荷通常会根据指向被模拟样本的任何线索选择不执行。恶意软件还可能无意或有意地破坏沙箱环境、覆盖日志文件或由于其使用的低级技巧而阻止成功分析。这意味着在执行日志上训练机器学习模型不足以捕获这些规避性恶意软件。使用NSISCrypter加密的GuLoader恶意软件在这篇文章中,我们将分析使用Nullsoft脚本安装系统(NSIS)加密器加密的GuLoader下载程序。NSIS是一个用于创建Windows安装程序的开源系统。Hashcc6860e4ee37795693ac0ffe0516a63b9e29afe9af0bd859796f8ebaac5b6a8c为什么静态分析没有帮助一旦解压缩,我们仍然拥有加密数据和NSIS脚本。脚本本身也会动态解密部分代码,这是另一个难以检测的因素。但是,没有太多结构线索可以将其识别为可能的恶意软件。因此,在可移植可执行(PE)结构上训练的机器学习模型将无法有效地区分该文件与其他良性文件。NSIS脚本和提取GuLoadershellcode要提取NSIS脚本,我们必须使用旧版本15.05的7-Zip。这个版本的7-Zip可以解压脚本,新版本去掉了解压NSIS脚本的功能。一旦我们提取了文件内容和NSIS脚本(如图1所示),我们就可以开始分析脚本并查看GuLoader示例是如何执行的。NSIS脚本如果我们向下滚动脚本,我们会很快注意到文件正在被复制到一个新创建的名为%APPDATA%\Farvelade\Skaermfeltet的文件夹中。虽然不清楚原因,但使用的文件路径似乎是丹麦语。在复制活动之后,脚本中有通常的安装逻辑,但是有一个有趣的函数,叫做func_30。在调用此函数之前,字符串$INSTDIR\Filterposerne\Malkekvg.exeNat被复制到名为$4的字符串变量中,如图2和图3所示。函数func_30从Programmeludviklinger210读取数据。一旦看到字符Z,就会调用Kon文件和构建代码。NSIS允许开发人员能够从WindowsDLL调用任何导出的函数,还允许他们将结果直接保存在NSIS寄存器/堆栈中。此功能允许恶意软件作者在运行时动态调用WindowsAPI函数,并使静态分析更加困难,因为它们必须在分析之前进行评估。调用函数func_30解码NSIS代码要解码动态代码,我们可以编写一个简短的Python脚本来重现行为并提取WindowsAPI调用:下图显示了上述脚本生成的解码数据DecodedWindowsAPIcallsDecodedfunctionstogetherRead从NSIS存档中的另一个文件中提取shellcode,并使用EnumWindows函数执行它。如果我们不得不用伪代码编写这个过程,它应该看起来像这样:为了使其余的分析更容易,我们将使用shellcode生成一个PE。要生成可执行文件,我们可以使用CerberoProfiler或LIEFPython库等工具。在这个例子中,我们使用LIEF库来构建一个新的可执行文件。我们所要做的就是添加一个包含Malkekvg.Nat文件内容的新部分,并将入口点设置为正确的偏移量。一旦我们有了这些,我们应该能够在IDAPro中打开shellcode并看到它包含有效的x86指令。在IDAPro的入口点生成PE文件Shellcode分析现在我们在PE文件中有了第一阶段的shellcode,我们可以在动态分析中运行它,看看会发生什么。我们将看到的第一件事是它检测到虚拟机并在显示消息框后停止执行。此文本在运行时使用4字节XOR密钥解密。无法在虚拟环境中执行示例如果我们在IDAPro中打开文件并稍微跟随代码,我们应该能够看到用于解密第一阶段的大函数。虽然函数图概述看起来很大,但识别垃圾代码仍然很容易。解密代码如下图所示。在下图中,我们可以看到跳转到第二阶段的最终调用。此时,我们可以将第二阶段转储到另一个可执行文件中进行解密。我们可以直接从内存中转储可执行文件,但我们必须确保将入口点修补到正确的地址(在本例中为0x404328)。第一阶段的shellcode解密被调用到下一阶段,第二阶段使用了很多反分析技术,其中一些是:内存扫描已知沙箱字符串;虚拟机监控程序检查;时间测量;为了获得GuLoader是下载最终的payload,我们必须手动绕过所有这些检查,在不受所有这些技术影响的沙箱中运行它,或者在裸机沙箱上运行它。提取有效负载信息为了在不分析第二阶段的情况下获取有效负载信息(包括所有字符串),我们可以使用Spamhaus描述的一个小技巧。GuLoader使用简单的XOR加密来加密其字符串,其中包括有效负载URL。要解密字符串,我们可以对我们已知存在于第二阶段的模式使用暴力破解。异或运算的结果是关键。唯一的限制是模式必须足够大,我们才能完全解密有效负载URL。例如,一个好的模式可能是用户代理字符串,它默认为Mozilla/5.0(WindowsNT10.0;WOW64;Trident/7.0;rv:11.0),例如Gecko。为了快速自动找到解密密钥,我们必须首先加密一个短模式(例如,用户代理字符串的前8个字节),然后搜索该结果是否在文件中的某处。如果它在文件中的某处,那么我们可以继续解密剩余的模式以获得完整的加密密钥。我们将在本文末尾附上一个Python脚本,它可以通过上述方法从payload中找到加密密钥。在任何转储的第二阶段GuLoader负载上运行脚本后,我们应该能够看到一些字符串和负载URL。GuLoader有时会在负载URL前面包含7到8个随机字符,并在运行时将其替换为http://或https://。使用http或https之间的区别由随机模式中的第四个字符决定。本例中的payloadURL为http://ozd[.]com[.]ar/wp-includes/nHMoYlbGLWls101.qxd,分析时payload仍然在线。最终下载的有效负载来自FormBook恶意软件系列,其SHA256值为fa0b6404535c2b3953e2b571608729d15fb78435949037f13f05d1f5c1758173。机器学习如何检测?在上一篇文章中,我们详细介绍了在实时沙盒运行期间可以从内存中提取的几个可观察到的工件。我们发现,当与机器学习结合使用多种规避技术检测恶意软件时,来自内存分析的数据非常强大。接下来我们仔细看看所有这些在运行时在内存中修改的东西,并将它们与大规模机器学习结合起来进行恶意软件检测。该算法会自动查找模式,并可以识别恶意软件试图隐藏其内存足迹、动态分配和执行shellcode或使用解包的共性。在这个GuLoader示例中,人类分析师会立即识别出有几个独特的函数指针。我们还注意到,该恶意软件已将其自身进程内存中多个页面的页面权限更改为可写和可执行。我们的机器学习模型使这些活动自动化,从各种记忆工件中提取相关特征以检测GuLoader实例。如上所述,我们为AdvancedWildFire创建的自动化分析平台将以高性能方式自动提取所有这些基于内存的工件。这意味着与动态解析函数指针、权限更改和解包可执行文件相关的所有信息都可以用于我们手动策划的检测逻辑以及我们的机器学习管道。使用机器学习模型进行检测下图显示了我们如何创建机器学习模型管道的高级视图,该模型管道根据从上述基于内存的工件中提取的自定义特征进行训练。我们选择的特征旨在保留冗长工件中最有用的信息。我们还使用恶意软件执行跟踪作为额外的信息来源,并构建一个集成模型来检测恶意样本。如下图所示,从四个内存工件和恶意软件执行痕迹中自动提取各种自定义特征,并传递给分类模型以检测恶意样本。此外,我们构建了一个集成模型,该模型在内存工件和基于执行跟踪的功能上进行了训练,以提高其性能。示例机器学习模型架构文件由管道处理,以将内存工件和其他恶意软件属性保存到功能存储中。特征提取阶段使用流式和批处理PySpark作业的组合来生成用于训练模型的最终特征向量。地面实况标签来自一个单独的通道,该通道根据恶意软件的特征和研究人员的输入为样本分配标签。该管道通过使用样本第一次出现的时间和哈希生成非重叠的训练和评估数据集。解释模型预测了解机器学习模型的预测对于识别模型的局限性和能力至关重要。机器学习很容易出现误报,因为它在很大程度上依赖于训练数据的质量和多样性,以及将预测概括为不断变化的文档的能力。因此,具有识别预测因果特征的能力非常有用。ShapleyValuesShapleyAdditiveExplanation(SHAP)是一种博弈论方法,用于解释任何机器学习模型的输出。SHAP值说明了与基线预测相比,每个特征对输入特征向量的实际预测的影响。在下图中,从右到左的红色特征是将模型推向恶意预测的最重要特征。从左到右,蓝色特征代表最重要的特征,这些特征降低了被预测为恶意软件的可能性。如上图所示,我们绘制了具有显着SHAP值的前7个特征及其对应的原始特征值的力图。由于存在这些顶级功能,我们的机器学习模型能够检测到GuLoader。这些特征对应于几个特定的??动态解析的API指针及其在内存中的相对位置,以及样本所做的内存页面权限更改的相对类型。通过聚类寻找相似样本理解模型预测的另一种方法是识别训练数据集中的相似样本。我们使用基于密度的扫描(DBScan)作为聚类技术,如下图所示,因为它允许异常值和不同形状的聚类。基于DBSCAN的集群总结GuLoader家族是unit42开发的用于检测恶意软件的机器学习模型的一个很好的例子,因为GuLoader使用了沙箱规避和静态保护,使得传统防御很难仅使用结构线索和执行日志进行检测。在AdvancedWildFire中,开发人员引入了一个基于管理程序的沙箱,该沙箱可以在执行期间监视GuLoader的内存,以解决有意义的内存驻留工件和对机器学习检测管道有用的信息。这允许防御者使用从观察到的基于内存的工件中提取的特征来准确检测恶意行为。本文翻译自:https://unit42.paloaltonetworks.com/malware-detection-accuracy/