[随着黑客行动主义[1]](javascript:void())的兴起和网络犯罪分子对更高利润的渴望[[2]](javascript:void())不断增长,使用恶意电子邮件的针对性攻击在过去十年中逐渐扩大。根据知识丰富的 MITRE ATT&CK Matrix for Enterprise,1通过电子邮件传播的无文件恶意软件是主流的隐形攻击类型之一[[3]](javascript:void()),逃避大多数安全解决方案的检测并阻碍取证分析工作。即使安全监控和防御效力提高,电子邮件和诱饵 Office 文档仍然是恶意软件传播媒介的最佳组合。由于人们仍然容易受到操纵,人类的心理弱点导致了可通过社会工程学(例如鱼叉式网络钓鱼攻击)利用的主要漏洞。在这种情况下,攻击者通常会将包含 PowerShell 命令(PSCmds)的精心定制的恶意文档附加到伪造的电子邮件中。此外,发件人姓名或联系信息中经常使用冒充来引诱目标打开恶意文件。
离地攻击 (LotL) 策略和无文件攻击技术是定向攻击的新兴趋势[[4]](javascript:void())、[[5]](javascript:void())。攻击者使用合法且预装的系统工具,或直接在内存中运行 PSCmds 等脚本,在企业网络内进行横向移动。通过在目标系统上留下更少的痕迹和痕迹,攻击者可以最大限度地降低被安全防御系统检测到的风险,并提高攻击的成功率。考虑到 PowerShell 被广泛用于管理 Windows 操作系统,PowerShell 已成为无文件攻击中使用的主要攻击工具之一。
PowerShell 是一种基于 Microsoft.NET 框架构建的强大脚本语言、交互式命令行界面和脚本平台。PowerShell 拥有丰富的库和实用的命令,凭借其多功能性和可靠性,在软件开发人员和 IT 运维人员中越来越受欢迎。然而,网络犯罪分子和恶意软件编写者也在迅速利用 PowerShell 进行恶意攻击[[6]](javascript:void())。与其他恶意软件使用的脚本语言一样,PSCmds 广泛使用多种混淆策略和加密方法,使其难以被发现。因此,攻击者可以利用 PowerShell 的灵活性将恶意意图隐藏在代码上下文之外,从而影响安全分析师的分析。
表 1显示了来自本机 Windows 命令行、Powershell cmdlet 和 dotNet 代码的三个命令。尽管 PowerShell 是三种不同的调用方法,但它们可以解释所有这三个命令以产生相同的输出。此外,PowerShell 支持多种编码和加密机制,例如 Base64、Hex、XOR 和 SecureString。利用 PowerShell 的自然属性,攻击者可以组合多种混淆策略,以防止恶意 PSCmds 被沙盒或分析师快速自动破解。此外,恶意软件作者通常通过自动混淆引擎[[8]](javascript:void())、代码生成工具、代码保护方法[[9]](javascript:void())和打包程序等领域的进步来制作具有多态和变形属性的新一代恶意软件[[7]](javascript:void()),以规避检测。随着混淆技术和变形引擎的快速发展,恶意软件和脚本数量急剧增加[[10]](javascript:void())、[[11]](javascript:void())。因此,逃避检测和混淆技术是当今 IT 环境中需要缓解的一个不容忽视的挑战。
表 1 PowerShell 中用于同一目的的不同调用方法

虽然安全供应商和研究人员已经从各个方面提出了许多工作和解决方案来应对此类威胁,但大多数主要集中于动态执行或静态解析来检测 PSCmds。使用 .NET 框架[[12]](javascript:void())、[[13]](javascript:void())和通过反恶意软件扫描接口 (AMSI) 2记录脚本块的监控方案需要深入了解系统和动态机制中的实现。静态机制[[14]](javascript:void())、[[15]](javascript:void())、[[16]](javascript:void())、[[17]](javascript:void())使用正则表达式 (regex) 手动选择以匹配字符串级或令牌级签名已被证明可以促进恶意 PSCmds 的分析和反混淆。虽然安全分析人员受益于分析恶意 PSCmds 的动态和静态解决方案,但包含各种混淆变种的变形恶意软件的传播速度仍然比现实世界的检测和分析过程更快。因此,恶意软件作者和安全分析人员之间的军备竞赛仍在继续,需要更有效的解决方案来对抗高度混淆和加密的威胁。
另一方面,机器学习 (ML) 和深度学习 (DL) 等新兴技术表明,它们可以为研究人员提供替代解决方案[[18]](javascript:void())、[[19]](javascript:void())、[[20]](javascript:void())、[[21]](javascript:void()),以开发应对网络安全挑战的尖端方法。总的来说,一些研究取得了比传统签名扫描和执行监控机制更好的性能,包括使用抽象语法树 (AST) [[22]](javascript:void())、[[23]](javascript:void())、[[24]](javascript:void())、 [25 []](javascript:void())、[[26]](javascript:void())的向量表示特征进行检测,自然语言处理 (NLP) [[27]](javascript:void())、[[28]](javascript:void())、[[29]](javascript:void())、[[30]](javascript:void())和图神经网络 (GNN) [[31]](javascript:void())推理以区分恶意和良性脚本。然而,据我们所知,先前机器学习和深度学习的研究尚不具有定论,因为它们主要侧重于区分恶意PSCmd和良性PSCmd的二分类方法,并且往往无法揭示混淆PSCmd背后的语义或恶意意图。因此,这个问题仍未得到解决,分析人员仍然需要投入大量精力,通过动态或静态分析来找出PSCmd的行为以及攻击者的目标,以进行取证分析。
为了应对这一挑战,我们提出了一个结合深度学习和程序分析的混合框架,通过静态多标签分类实现自动PowerShell 去混淆和行为分析(PowerDP)。我们首先从内部沙箱和外部开放数据集收集恶意 PSCmds,以生成基本事实,包括混淆和行为标签。然后,我们采用混淆多标签分类器来预测 PSCmds 的混淆类型。根据预测,我们利用静态正则表达式替换来准确地去混淆并恢复混淆后 PSCmds 的原始内容。之后,利用 AST(代码抽象语法结构的树状表示),我们将每个任意长度的去混淆 PSCmd 处理为实值向量表示,以便通过多标签分类进行行为分析。 PowerDP 不仅高效地自动化了劳动密集型任务,减轻了分析师的脑力劳动,还能根据多标签分类的结果提供由粗到细的粒度报告,并可轻松与先前检测恶意 PSCmd 的研究成果相结合。安全分析师可以利用所提出的自动化机制,发现恶意软件衍生 PSCmd 背后的恶意意图,并减轻恶意软件和取证分析的负担。
本研究的重要贡献可以概括如下:
我们提出了一项新颖的研究任务,通过字符分布特征和混淆多标签分类自动识别恶意 PSCmds 的混淆类型。
我们根据经验扩展了以前关于静态正则表达式的研究,开发了一个反混淆器,按照推荐的顺序使用精确的正则表达式替换将混淆的 PSCmds 恢复为原始内容。
为了解决法医分析的行为分析问题,我们使用 PSCmds AST 中的实值向量表示作为行为多标签分类器的输入来预测潜在的行为功能。
本文的其余部分安排如下。在第二部分中,我们提供了背景信息、攻击者用来阻止分析工作的各种 PSCmds 混淆类型,以及 PSCmds 去混淆和行为分析的挑战。第三部分概述了我们的框架,并介绍了我们如何静态去混淆和分析 PSCmds 的方法。我们在第四部分中介绍了基本事实数据集的创建和校正过程,包括我们如何收集和预处理 PSCmds 以检测混淆类型和 PSCmds 的分析行为。第五部分说明了评估结果,然后在第六部分简要讨论了所提出方法的局限性。第七部分总结了相关工作。最后,我们在第八部分总结了这项工作并提出了未来改进的方向。
第二部分
背景和动机
由于 PowerShell 的多功能性和可靠性,PowerShell 被滥用为网络犯罪分子最常用的脚本语言之一。在所有攻击中,PSCmd 通常用于下载和执行恶意负载。清单 1展示了一个典型的恶意 PSCmd 示例,该示例通常存储在精心定制的恶意文档中。在本节中,我们将介绍各种混淆类型,并讨论通过反混淆和行为分析来揭示 PSCmd 背后的恶意意图所面临的挑战。

清单 1.
Maclicious PSCmds 用于下载和执行恶意软件。
PowerShell 混淆
混淆是一种逃避检测和阻止恶意软件分析的技术,它为恶意软件和恶意脚本披上了一层隐形的外衣。通过混淆,攻击者可以在不知情的情况下有效地发起底层入侵。PSCmd 的混淆方法多种多样,其中许多方法在 Daniel Bohannon [[32]](javascript:void())于 2016 年创建的“Invoke-Obfuscation”框架以及其他工具(例如 PowerShell Empire 3和 PowerSploit)中实现。4恶意 PSCmd 通常采用 以下三类混淆方法:
**压缩。**此策略应用压缩来压缩恶意 PSCmds,然后利用 Base64 对结果进行编码。
**编码方案。**编码是 PowerShell 混淆中最常用的方法。我们简要回顾一下现实世界中常见的七种编码方案。
Base64:将整个 PSCmds 编码为 Base64 编码字符串。
ASCII:用 ASCII 码值表示 PSCmds 中每个可打印字符。
十六进制:将 PSCmds 中的每个可打印字符转换为十六进制值。
八进制:将 PSCmds 中的每个可打印字符转换为八进制值。
二进制:使用二进制表示为整个 PSCmds 生成编码有效载荷。
二进制异或:以 PSCmds 和指定密钥作为输入,并通过按位异或运算生成编码结果。
SecureString:使用指定的密钥从 PSCmds 生成 AES 加密的 SecureString 对象。
**字符串操作。**由于 PowerShell 提供了许多字符串级和令牌级的操作方法,攻击者总是试图修改 PSCmds 中易于识别的函数、参数和变量模式,以达到恶意目的。以下是四种常见的字符串操作方法。
连接:将PSCmds拆分成多个部分,并使用“+”运算符或连接运算符将所有分割的内容组合在一起进行恢复。
重新排序:将PSCmds分成几个部分,并通过“-f”运算符按指定的索引重新组合字符串,以格式化和重新排列字符串表达式。
反转:使 PSCmds 以相反的顺序出现,并在执行原始命令之前使用一些辅助函数重新创建字符串表达式。
勾选:在字符串中插入反引号“'”(也称为重音符)。反引号是转义字符,执行 PSCmds 时不会被解释。
除了上述方法外,还经常采用三个辅助函数或与其他混淆方法结合使用来增加复杂性。
**拆分。**此辅助函数将整个混淆字符串拆分为一个令牌数组,以删除原始 PSCmds 中不存在的无关符号或特殊字符。
**替换。**除了使用拆分函数外,替换也是消除表达式字符串中无意义字符的另一种方法,其目的与拆分相同。
**随机大小写。**在这种情况下,PSCmds 中的每个字母都会转换为随机混合的大小写,以破坏阅读理解并阻止恶意软件分析。
表 2列出了本文讨论的混淆方法的完整列表。公共 GitHub 存储库中给出了通过将上述 12 种混淆方法和 3 个辅助函数应用于清单 1中的 PSCmds 而得到的混淆 PSCmds 示例。5从示例中可以看出,PSCmds 的原始内容和意图被混淆所隐藏。此外,在不同的混淆中,PSCmds 的文本表示也发生了变化。因此,如果不进行去混淆,就很难理解 PSCmds 正在执行什么,从而影响取证分析和影响评估。但是,不同混淆策略的可能组合数量可能很大且很复杂。因此,我们需要一个程序或推荐的顺序来处理所有混淆方法的组合以进行恢复。
表 2 去混淆的完整列表和推荐顺序

B. PowerShell 行为分析
对恶意 PSCmds 进行行为分析可以让安全分析人员和研究人员快速查看代码执行后的恶意行为和潜在活动。此外,该过程有助于减少劳动密集型任务,例如在有限的时间内分析数千个文件。一些作者[[15]](javascript:void())、[[17]](javascript:void())提供了对 PSCmds 进行静态分析以进行 PowerShell 行为分析的实用方法。例如,在通过关键字识别行为后,他们使用许多自定义正则表达式来消除各种类型的混淆,并相应地对恶意代码进行评分。但是,尽管以前的工作已被证明对行为分析很有用,但该过程仍然需要迭代执行以解开新内容并寻找可能被混淆或隐藏在上下文中的特定关键字。
与此同时,机器学习算法和深度学习架构近年来取得了显著进展,蓬勃发展,尤其是在计算机视觉、视频和语音识别以及自然语言处理领域。此外,像 Code2vec [[33]](javascript:void())这样的研究在代码搜索和理解方面展现出了卓越的性能和效率。通过利用具有代表任意大小代码片段的固定大小向量输入的神经网络,研究人员可以实现算法预测[[34]](javascript:void())、语义代码标记[[35]](javascript:void())、[[36]](javascript:void())以及代码功能的多标签分类[[37] 。](javascript:void())
多项最新研究[[10]](javascript:void())、[[11]](javascript:void())、[[38]](javascript:void())、[[39]](javascript:void())、[[40]](javascript:void())、[[41]](javascript:void())使用机器学习/深度学习和遗传算法,在检测和分析恶意可执行文件和移动应用程序方面取得了性能提升。此外,这些研究还表明,用于恶意软件分析的自动化行为分析或语义标记可以使安全分析人员受益并减少人工工作。因此,有必要研究如何将机器学习/深度学习技术(在先前的工作中主要侧重于恶意 PSCmd 的二元分类)扩展到行为分析中的多标签分类,以了解 PSCmd 背后的恶意意图。
第三部分
拟议的 PowerDP 框架
为了应对恶意 PSCmd 的复杂性和威胁,我们提出了 PowerDP,这是一个混合框架,用于自动执行 PowerShell 去混淆处理,并通过静态多标签分类进行行为分析。图 1展示了 PowerDP 框架的概览,该框架可生成由粗到细粒度的恶意 PSCmd 多标签分类报告。在以下小节中,我们将解释 PowerDP 中各个组件的技术细节。

图 1.
所提出的 PowerDP 框架的概述。
A. 系统概述
如图 1所示,所提出的 PowerDP 框架由两个阶段组成,每个阶段都涉及一个多标签分类任务,如下所述。
1)第一阶段:解密 PowerShell 命令
在第一阶段,为了提高效率,我们采用静态技术而非动态机制对 PSCmds 进行去混淆。我们从 PSCmds 中提取文本特征和字符分布的统计特征来表示恶意 PowerShell 样本。给定字符分布的表示向量,我们训练一个混淆多标签分类器来预测 PSCmds 的混淆类型。之后,我们实证扩展了先前关于静态正则表达式的研究[[14]](javascript:void())、[[15]](javascript:void())、[[16]](javascript:void())、[[17],](javascript:void())以 Python 语言开发了一个 PowerShell 去混淆器,该器利用针对第二部分中提到的 15 种混淆类型的精确正则表达式替换,根据分类器的预测将混淆的 PSCmds 恢复为原始内容。
2)第二阶段:分析 PowerShell 命令
对 PSCmds 进行去混淆处理后,原始的恶意 PSCmds 便显露出来,我们可以根据上下文分析其行为,从而揭示代码背后的意图。我们不是按顺序从去混淆后的 PSCmds 上下文中检索关键字等行为模式,而是使用神经网络深度学习在 AST 的高抽象级别上对潜在行为进行分类。具体而言,我们开发了一个 AST 解析器,将 PSCmds 中离散符号的底层含义封装在一个集成向量中,例如 AST 节点类型和 AST 节点之间的父子关系,以表示恶意 PowerShell 样本,这将在第 III-C1 节中详细介绍。最后,我们使用来自 PSCmds AST 的实值向量表示来训练行为多标签分类器,以预测 PSCmds 的五种行为。我们将在第 IV 节中讨论如何选择这五种预定义行为。
3)多标签分类
多标签分类[[37]](javascript:void())是寻找一个模型来映射输入的问题十 到二元向量是= {y1,y2,… ,yn} , 在哪里y我∈ { 0,1 }}米f 表示标签向量十 ,n 是样本数量,米f 是类维度;也就是说,它为每个元素(标签)分配是 值为 0 或 1,其中y我= 1 表示标签的存在。目前,文献中已经详细记录了几种解决多标签分类问题的方法。这些方法可以分为[[37]](javascript:void())中提出的两类:问题转换方法和算法自适应方法。问题转换方法旨在将问题分解为一组二元问题。另一方面,算法自适应方法扩展了特定的学习算法,使其直接处理多标签数据。我们分享了两个多标签分类器的设计,分别旨在实现混淆和行为多标签分类。
B. 反混淆 PowerShell 命令
在此阶段,我们专注于根据多标签分类器预测的混淆类型对恶意 PSCmds 进行去混淆,下面详细介绍每个设计组件。
1)基于字符分布的特征
由于不同的混淆方法会通过其属性将相同的 PSCmds 改变为文本中的不同呈现方式,因此我们尝试在 PSCmds 中保留文本代码最有意义且最具代表性的抽象。与其他研究不同,我们不会对 PSCmds 进行预处理以消除或规范化冗余标记或字符。对于混淆多标签分类,我们从最小单位(即 PSCmds 中的可打印字符)中收集了 97 个基于字符的特征。
a:角色统计
我们统计了PSCmds中ASCII十进制值在32到126之间的所有可打印字符,从而得到了每个字符在PSCmds中的存在数量,并将其表示为95个特征。
b:字符长度
根据我们的观察,编码方案中混淆后的 PSCmds 的长度通常比字符串操作和压缩中混淆后的 PSCmds 的长度要长得多。因此,我们将代码长度作为 PSCmds 的一个特征。
c:信息熵
熵是一种度量,它用概率分布来表示同一源中不同特征的统计特征。我们可以用它来分析不同特征的分布。熵的计算方法如下:
哈(X) = −∑i = 1np (x我)日志10p (x我)⎧⎩⎨⎪⎪十西p (x我)= {x1,x2,… ,xn}=∑ni = 1x我=x我西(1)
查看源代码
在公式(1)中,x我 和西 参考 PSCmds 中每个不同字符的数量和所有字符的数量,并且p (x我) 表示频率我th 鲜明的性格。
2)混淆多标签分类器
对于用于预测混淆类型的混淆多标签分类,我们比较了问题转换方法中的线性支持向量机 (SVM) 和随机森林 (RF)、算法自适应方法中的 K 最近邻 (KNN) 和决策树 (DT) 以及深度神经网络 (DNN) 的性能。所有模型均使用 Python 语言在 Google Colaboratory 6上使用 Scikit-learn [[42]](javascript:void())和 Keras 7库构建。机器学习算法的参数使用网格搜索策略确定,列于表 3中,DNN 的架构如表 4所示。最后,我们采用评估后性能最佳的分类器。
表3 不同机器学习算法的参数

表 4 用于混淆多标签分类的 DNN 架构(学习率:0.0001;批量大小:256;优化器:Adam)

3)反混淆器
基于预测的混淆类型,我们构建了一个 PowerShell 去混淆器,如下所示。我们实证扩展了以前关于静态正则表达式替换的工作[[14]](javascript:void())、[[15]](javascript:void())、[[16]](javascript:void())、[[17]](javascript:void()),以开发去混淆器,将混淆的 PSCmds 恢复为原始内容。在收到分类器的预测结果后,去混淆器会在 PSCmds 中搜索指定的签名和模式进行替换和恢复。为了提高我们设计的去混淆器的准确性,我们在表 2中提供了针对具有多种混淆类型的 PSCmds 的去混淆过程的推荐顺序。去混淆的顺序源于我们在调查野生 PowerShell 样本中不同类型的混淆时面临的实际问题,以及以前工作中的迭代处理和测试等可重复的过程。
由于字符串操作方法的复杂性和多样性,必须将其作为反混淆处理的首要任务。攻击者会结合使用运算符、字符串表示以及基于字符串的辅助函数(例如替换和拆分)将恶意命令嵌入表达式字符串中,导致字符串几乎无法读取。因此,首先应该考虑使用反混淆器将字符串操作的混淆结果恢复到反混淆后的内容中。同时,编码方案与字符串操作中常见的命令标记化或部分替换不同。所有编码方案中的方法都会使用其对应编码值范围的指定表示来更改整个 PSCmds。因此,编码方案是反混淆处理的次要候选。我们可以检测混淆后的 PSCmds 中编码值的范围,并使用相应的变换来恢复原始表达式字符串。
除了前面讨论过的混淆方法外,Base64 编码是所有混淆方案中最简单、最常见的反检测方法,并且似乎存在于压缩、SecureString 编码和 Base64 编码本身中。由于压缩和 SecureString 编码需要额外的操作来对 PSCmds 进行反混淆,例如解压缩函数和使用密钥解密,因此我们设计了反混淆器,以便在第三阶段恢复包含 Base64 编码字符串的 PSCmds,以避免误判。最后,当最终识别到 Randomcase 时,反混淆器会将 PSCmds 中的所有字母转换为小写,以防在之前的反混淆过程中需要一些大写字符。
C. 分析 PowerShell 命令
在此阶段,我们的目标是对恶意 PSCmds 进行行为分析,这些 PSCmds 在上一阶段已被去混淆。
1)基于抽象语法树的特征
鉴于抽象语法树 (AST) 在编程语言处理系统中被广泛用于表示程序的抽象语法结构,我们使用 PowerShell 命令“ParseFile”和“FindAll”开发了一个 AST 解析器,以确定去混淆后 PSCmd 的 AST。我们将完整的 AST 信息按深度优先搜索的顺序保存为一个文本文件,其中包含父子关系和所有 AST 节点类型。解析每个 PSCmd 的 AST 结构后,我们提取了五个统计特征,包括节点类型数量、节点数量、叶子节点数量、节点最大度数和树的高度。此外,我们的数据集中有 45 种不同的 AST 节点类型,每种类型都与一个特征向量相关联,如下所述。
我们注意到向量嵌入表示适用于一般的机器学习/深度学习任务,例如聚类、推荐和分类。因此,我们采用[[43]](javascript:void())来学习 45 种不同 AST 节点类型的实值向量表示。此外,除了 AST 中每种节点类型的向量表示之外,我们还尝试在向量中保留 AST 节点之间的父子关系。因此,AST 中节点的向量表示不仅应该从不同节点类型中学习,还应该由其子节点的表示“编码”,这意味着节点的向量表示可以被视为其子节点所有功能的总结。举个例子,对于每个具有父节点的子树磷 和n 直接子节点碳1,… ,碳n 在 AST 中,我们将它们呈现为向量( P) , v e c (碳1) , … , v e c (碳n) . 主要目标是
向量( P) ≈ t a n h (∑i = 1n升我西我⋅vec (碳我)+bb)(2)
查看源代码
在哪里
升我= (#树叶的碳我) / ( #树叶的磷)
是权重系数,
bb∈R北f
是一个偏差向量。此外,
西我∈R北f×北f
是子节点的权重矩阵
碳我
,其定义如下:
西我=n − in − 1西升+i − 1n − 1西r(3)
查看源代码
在哪里
西升,西r∈R北f×北f
是可训练的权重矩阵。目标是使公式 (2)中左右两个向量表示之间的欧氏距离尽可能小。此外,为了克服不同节点可能具有不同子节点数量的问题,[[44]](javascript:void())提出了“连续二叉树”的概念,其中
西升
和
西r
是模型参数,
西我
是
西升
和
西r
根据节点的位置
我
正式来说,
磷
有
n (n≥2 )
孩子们,如果
n = 1 ,西我=12西升+12西r
在我们的实验中,我们根据经验设定
北f
为22,表示每个AST节点向量的长度。
[在优化所有参数之后,我们可以使用[43]](javascript:void())中的方法生成所有 AST 节点的实值向量表示。对于 AST 中的叶节点,它们就是算法学习到的向量表示。同时,对于每个非叶节点磷 ,有两个表示向量。一个是算法学习到的式(2)左边,另一个是子节点编码的式(2)右边。因此,我们将节点的组合向量表示为磷 作为磷磷 我们有
磷磷=12× ve c ( P)+12× t a n h (∑i = 1n升我西我⋅vec (碳我)+b二).(4)
查看源代码
由于 AST 中的每个非叶节点都可以使用公式 (4)表示为一个实值向量,因此我们采用广度优先搜索来创建树向量。图 2展示了我们的想法:抽象 PSCmds 中的所有信息,并通过 AST 节点关系将其从字符串标记封装为实值向量。由于每棵树中的节点数不同,因此每个树向量的长度也不相同。但是,对于 ML/DL 模型,所有数据的输入长度应该相同。为了解决这个问题,我们在每个树向量的末尾填充零,并将最大扩展长度固定为左 在我们的实验中,我们将讨论长度左 向量表示会影响性能。

图 2.
通过 AST 节点之间的关系从字符串标记组装实值向量表示的概念。
2)行为多标签分类器
从 PSCmds 的 AST 中提取特征后,我们构建了一个用于行为分析的多标签分类器。具体来说,我们实现了一个不同的 DNN 架构,详细信息见表5。我们使用不同的实验设置训练了该分类器,并选择了性能最佳的分类器,以验证行为多标签分类的有效性。
表 5 行为多标签分类的 DNN 架构(学习率:0.00001;批量大小:8;优化器:Adam)

第四部分
数据集
互联网上有许多公开的 PowerShell 语料库,例如 Microsoft PowerShell 库、GitHub 代码库和博客。然而,它们中的大多数都是非恶意的、未经过混淆且未标注的。为了评估我们的系统,我们需要一个标注数据集,该数据集能够提供 PSCmd 的混淆类型和恶意行为标签。因此,我们首先收集未经混淆的恶意软件衍生 PSCmd 作为主要数据集。然后,我们利用安全工具生成所需的带有混淆标签的混淆 PSCmd,并使用其行为标签对未混淆的 PSCmd 进行注释。图 3展示了我们数据集创建的流程图。我们将详细解释该过程。

图 3.
数据集创建的流程图。
A. 原始数据收集
我们从内部沙盒分析报告中获取了恶意 PSCmd 作为初始数据集。为了进一步丰富数据集,我们还从开放数据集中收集了 PSCmd,包括 Palo Alto 的研究数据8和各种在线沙盒,例如 Any.run、9 FileScan.IO、10 Hatching Triage 11和 VirusShare (一个用于研究的恶意软件存储库)。除了 Palo Alto 的数据外,我们还使用关键字“PowerShell”并进行不区分大小写的搜索,从每个数据集中发现了所需的恶意 PSCmd。我们根据提交时间检查了 2019 年至 2021 年间检测到的所有脚本。表 6显示了我们从每个数据集中获得的恶意 PSCmd 的数量。所有接收到的脚本和命令均通过沙盒动态分析或至少三个防病毒程序的静态检测标识为恶意。在手动删除上一收集阶段重复和混淆的 PSCmd 后,我们最终得到了 3,057 个由恶意软件执行的未混淆的 PSCmd。
表 6 未混淆的恶意 PSCmd 集合

B. 地面实况创建
收集到原始 PSCmds 样本后,我们生成两个数据集,分别用于混淆多标签分类和行为多标签分类。首先,为了实现混淆多标签分类,我们使用 Invoke-Obfuscation 工具[[32]](javascript:void())(一个兼容 PowerShell v2.0+ 的 PowerShell 命令和脚本混淆器)基于原始数据手动生成混淆的 PSCmds,以构建混淆数据集的基本事实。然后,我们对 3,057 个未混淆的 PSCmds 运用第二部分介绍的三大类 12 种混淆方法和三个辅助功能。经过此步骤,我们得到了 39,741 个 PSCmds 样本,其中包括 3,057 个未混淆样本和 36,684 个带标签的混淆样本。
其次,要使用多标签分类执行行为分析,我们需要为每个 PSCmds 注释预定义的行为标签。然而,为 PSCmds 注释所有行为非常困难且不可行。因此,我们利用 PowerShellProfiler 13 (由 Palo Alto 的研究人员[[17]](javascript:void())开发的基于模式的 PowerShell 分析器)手动识别 37 个预定义行为标签中的负面、中性和良性行为。在分析了 3,057 个未混淆的 PSCmds 之后,我们的数据集中得到了 23 个行为标签。为避免数据不平衡的问题,我们仅保留至少有 1,000 个样本的行为标签,并删除模糊和非行为标签。因此,我们使用前 5 个行为标签进行行为分析评估,如表 7所示。
表 7 至少有 1,000 个非混淆 PSCmds 样本的前 5 个行为标签

C. 数据交叉核对
为了确认安全工具生成的两个数据集适合我们的评估,两位安全专家协助审查并交叉核对了数据集。混淆数据集中 PSCmds 的标签数量在 0 到 4 之间,也就是说,在我们的数据集中,应用于 PSCmds 的最大混淆方法为 4 种,而未混淆的 PSCmds 的方法为 0 种。同时,未混淆的 PSCmds 的行为标签的最大和最小数量范围为 0 到 5。在手动纠正一些混淆和行为标签的错误标记后,我们形成了最终的多标签分类的 ground truth 数据集。
第五部分
评估
在本节中,我们展示评估结果,并展示我们提出的工作的性能和有效性。具体来说,我们进行了大量的实验来回答以下研究问题:
**RQ1:**使用字符分布特征来检测和区分多种混淆类型的性能如何?
RQ2: PowerDP 中的反混淆器针对各种混淆方法的成功恢复率是多少?
RQ3: PowerDP 使用实值向量表示在 AST 的高抽象级别上分析 PSCmds 的多种恶意行为的效果如何?
A. 评估方法
在本研究中,我们采用以下标准指标和方法来评估 PowerDP 的性能和正确性。
1)绩效指标
针对 ML/DL 解决方案,我们已经开发了各种评估指标。除了标准的准确率、精确率、召回率和 F1 分数外,我们还采用了汉明损失 (Hamming Loss),这是一种用于评估多标签分类问题的常用指标。
汉明损失(HL):它报告样本与类标签的相关性平均被错误预测的次数。汉明损失值越小,分类性能越好。它可以定义为公式(5),其中是j我 预测是否给出了预测标签我th 样本和jth 类,以及Zj我 目标是否给出了实际的标签我th 样本和jth 班级。
哈L =1千1n∑i = 1n∑j = 1千(是j我⊕Zj我)(5)
查看源代码
准确率(AS):也称为精确匹配率或子集准确率。如公式(6)所示,它是最严格的指标,表示所有标签都被正确分类的样本比例,其中我 是指示函数。
作为=1n∑i = 1n我(是我=Z我)(6)
查看源代码
精度分数(PS):如公式 (7)所示的标准度量,其中精度分数是预测正确标签与预测标签数量的比例,对所有样本取平均值。
磷秒=1n∑i = 1n|是我∩Z我||是我|(7)
查看源代码
召回率分数(RS):如公式(8)所示的标准指标,其中召回率分数是预测正确标签占实际标签总数的比例,是所有样本的平均值。
RS=1n∑i = 1n|是我∩Z我||Z我|(8)
查看源代码
F1分数(F1):它在精确度和召回率之间寻求平衡,被解释为精确度和召回率分数的调和平均值。公式(9)显示了F1分数的计算公式。
F1 =2 ∗ P秒∗ RS磷秒+ RS(9)
查看源代码
2)相似度比较
理想情况下,PSCmds 去混淆过程可以恢复与原始内容相同的内容。然而,在实践中做到这一点并不容易。因此,我们需要一个指标来评估我们工作的整体恢复效果。我们应用基于抽象语法后缀树[[45]](javascript:void())的克隆检测方法来比较去混淆后的 PSCmds 与原始内容的相似度。先前的研究将克隆分为三类:
类型 1克隆是没有修改的精确副本,除了空格和注释可能存在差异。
类型 2克隆是语法上相同的副本,但参数有所变化,例如函数名称、类型和变量。
类型 3克隆是语法上不同的副本,其语句有所修改,但语义上相似。
[由于我们利用[45]](javascript:void())中的方法比较相似性,即将 PSCmds 的 AST 转换为语义字符串序列,并使用“A-Za-t”中的每个唯一字母作为每种 AST 节点类型的标识符,因此我们可以将类型 1 和类型 2 视为同一类型的克隆。因此,对于精确克隆检测(类型 1 和类型 2),我们检查去混淆后 PSCmds 及其原始内容的最长公共子序列(LCS) [[46]](javascript:void())度量。如果 LCS 度量与原始 PSCmds 的语义字符串序列相同,则我们断言它们是完全克隆。LCS 度量定义如下:
LC秒(十我,是j) =⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪0 ,如果 LC秒如果最大限度如果 i = 0或j = 0 (十i − 1,是j − 1)∧x我, i , j > 0且 x我=yj{ LC秒(十我,是j − 1),LC秒(十i − 1,是j)} , i , j > 0且 x我≠yj(10)
查看源代码
在哪里
十= {x我,i = 1,2 ,… ,m }
是去混淆后的 PSCmds 的语义字符串序列,并且
是= {yj,j = 1,2 ,… ,n }
是原始 PScmds 的语义字符串序列。
对于语义克隆检测(类型 3),我们根据编辑距离[[47]计算](javascript:void())编辑率 (EditRatio),作为去混淆后 PSCmds 与原始内容之间的可比指标。两个字符串之间的编辑距离是将一个字符串更改为另一个字符串所需的最小单字符操作次数,包括插入(代价为 1)、删除(代价为 1)和替换(代价为 2)。例如,以下公式计算两个 PSCmds 语义字符串序列之间的编辑率 (EditRatio ):
埃d它比率(X,Y) = 1 −距离( X,Y)| X| + | Y|(11)
查看源代码
EditRatio接近 1 表示两个 PSCmd 之间的语义相似度过高,这意味着恢复结果有效;而接近 0 则表示相反。我们将阈值设置为 0.7,只提取 EditRatio 超过阈值的样本*,**并*认定这些样本是复制并修改的。
B.评估结果
1)混淆多标签分类模型的性能
在我们的第一个实验中,我们使用了原始数据中来自 3 个不同混淆类别、共 15 个标签的 36,684 个混淆样本,以及 3,057 个标签均为零的未混淆 PSCmd。在对所有 39,741 个样本进行混合和打乱后,我们遵循 80/20 规则将数据集分为训练集和测试集。实验中共使用了 97 个基于字符的特征。为了使混淆分类器的自动多标签分类结果达到最佳性能,我们在所有模型中进行了 5 倍交叉验证测试。如表 8所示,每个评估指标中的最佳结果以粗体标记。
表 8 不同分类方法的 Hamming 损失、准确率、精确率、召回率和 F1 分数比较

结果表明,汉明损失的最小值来自 RF 和 DNN 模型,与其他模型相比,这些模型表现出了出色的多标签分类性能。至于 RF 和 DNN 模型之间的比较,尽管 RF 的精度优于 DNN,但我们仍然选择 DNN 模型作为 PowerDP 中所需的分类器。这是因为 DNN 模型的召回率高于 RF,这意味着 DNN 的错误预测结果更少。因此,可以合理地说,DNN 在混淆多标签分类中的表现更可靠。在 PowerDP 中,混淆多标签分类的预测被传递给广泛的 PowerShell 去混淆器。此外,去混淆器会尝试使用基于预测标签的不同方法将混淆恢复为原始内容。因此,错误预测越少,恢复就越成功。
2)针对不同混淆类型的预测准确率
表 9展示了 5 个 ML/DL 模型针对不同混淆标签的汉明损失。汉明损失评估标签被错误分类的次数。汉明损失值越大,性能越差。我们用粗体标记了每个模型中错误分类最多的前 3 个标签。如表 8所示,使用“替换”、“二进制异或”和“随机大小写”方法的混淆是错误分类最多的三种类型。
表9 不同分类方法对不同混淆方法的汉明损失

在分析了“二进制异或”方法混淆的PSCmds的字符分布后,我们发现它们与其他采用不同混淆方法的PSCmds非常相似。因此,由于字符分布差异不大,它们可能难以被准确分类。此外,作为辅助函数,“替换”和“随机大小写”方法经常与其他混淆策略结合使用。然而,从统计信息来看,它们与其他混淆类型相比并没有表现出太多独有的特征。相反,如果我们使用传统的正则表达式模式来发现“替换”的关键字,或者检测“随机大小写”中混合的特定命令,则更容易检测到它们。
在字符串操作类别的四种混淆方法中,“反转”的分类结果最差。显而易见,与同类别的其他方法相比,“反转”方法除了反转整个表达式字符串外,并没有对原始 PSCmds 进行过多的插入或修改。另一方面,DNN 模型在所有模型中的平均分类结果良好。在我们的实验中,DNN 模型可以 100% 预测五种混淆类型,包括“压缩”、“Base64 编码”、“二进制编码”、“安全字符串”和“重新排序”。从人类视觉的角度来看,所有这些混淆类型在混淆后都具有独特的文本表示。
3)扩展 PowerShell 去混淆的正确性
当存在多重混淆时,我们根据经验设计的反混淆器会尝试按照表 2中的反混淆顺序将混淆后的 PSCmd 恢复到其原始内容。我们通过比较反混淆后的 PSCmd 与其原始内容的相似度来评估恢复质量。在本实验中,我们使用“Invoke-Obfuscation”工具中 12 种混淆方法生成的全部 36,684 个混淆样本,并附上上述的真实混淆标签。
如图 4所示,左图为采用完整克隆检测进行相似度比较的去混淆器的成功恢复率,右图为采用复制修改检测进行相似度比较的去混淆器的成功恢复率。其中,“压缩”和“编码”类 8 种混淆方法的恢复率均高于 98.5%(采用完整克隆检测),这意味着只有 1.5% 的采用“压缩”和“编码”策略的混淆样本无法被去混淆器理想地恢复。这是因为“压缩”和“编码”方案将 PSCmds 的整个表达式字符串封装在其编码表示中。一旦去混淆器发现了核心封装,它就可以按照编码方案将封装转换为原始内容。

图 4.
反混淆器针对不同混淆方法的成功恢复率。
对于“字符串操作”类中的四种混淆方法,所有恢复率均高于完整克隆检测的76.09%,与其他两类相比明显下降。由于“字符串操作”通过多次插入、删除、替换等操作改变了整个表达式字符串,因此去混淆后的内容与原始内容并不严格一致,因此我们采用复制修改检测来比较去混淆后与原始样本的语义相似度。如图 4(b)所示,对于“字符串操作”类中的去混淆PSCmds,在复制修改检测(EditRatio > 0.7)下,恢复率从76.09%显著提升至92.54%。最终,去混淆器在完整克隆检测下的平均恢复率为94.54%,在复制修改检测下平均恢复率提升至98.11%。
4)行为多标签分类的有效性
为了验证行为多标签分类的有效性,我们选取睡眠、已知恶意软件、代码注入、字节使用和下载器五个行为标签,对 3,057 个未混淆的 PSCmd 中的行为进行标注。我们将 PSCmd 转换为其 AST 结构,然后基于 AST 节点类型的向量构建实值向量表示作为特征。首先,由于每个实值向量的大小会根据填充前 PSCmd AST 中的节点数而变化,因此我们评估实值向量大小对行为多标签分类性能的影响。在实验设置中,我们将每个 AST 节点类型的向量大小设置为 22,并使用第三部分中提到的五个统计特征作为默认特征。
在我们的数据集中,超过 40% 的样本有超过 100 个 AST 节点,最大节点数为 1,392。因此,我们比较了{ 0 , 10 , 20 , 50 , 100 , 1392 } 来形成实值向量表示,并检查实值向量大小对有效性的影响。表10展示了整体的比较结果。从实验中我们发现AST的基本统计特征足以描述PSCmds的行为,准确率得分为89.38%。如果我们按照广度优先搜索的顺序组装20个AST节点的子向量作为实值向量特征,我们可以将准确率提高到98.53%,并将汉明损失从10.62%降低到1.47%。显着的改进表明集成顺序和实值向量的大小都是有效性的重要因素。此外,我们还注意到,当我们使用更多AST节点的子向量来组成实值向量时,性能略有下降,这表明对向量中的零填充产生了负面影响。
表 10 构建 AST 向量时不同节点数的 Hamming 损失、准确率、精确率、召回率、F1 分数对比

图 5展示了在 20 个 AST 节点和 DNN 模型的实验设置下,行为多标签分类的有效结果。除“下载者”标签外,DNN 模型能够预测所有样本中的其他四种行为,准确率超过 99.5%。检查被误分类的带有“下载者”标签的样本的内容和 AST 结构后,我们发现下载命令被放置在这些 PSCmd 的尾部。此外,某些命令在将 PSCmd 转换为 AST 后会生成过多的节点。因此,在将 20 个 AST 节点的子向量组装成实值向量的设置下,特征向量在向量表示中可能缺少“下载者”行为的关键信息。从结果中可以清楚地看出,长度左 实值向量表示是行为分类有效性的权衡因素。

图 5.
20 个 AST 节点中使用实值向量表示的行为分析的性能。
第六部分
讨论与局限性
经过混淆的 PSCmd 非常复杂,为攻击者提供了隐藏恶意意图的灵活性,使其远离代码上下文。尽管许多作者已经对 PowerShell 的检测和反混淆进行了研究,但该问题仍未得到充分探索。本文介绍了多种混淆方法,并尝试使用深度学习和程序分析相结合的混合方法对 PSCmd 进行反混淆,然后使用多标签分类来分析其行为。利用程序分析中基于字符的原生特征以及抽象语法树 (AST) 抽象的集成实值向量表示,我们强调了自动反混淆和行为分析任务的改进机会,并弥合了恶意软件分析与机器学习之间的差距。然而,我们发现某些混淆并没有呈现出不同的文本表示和独特的字符分布。此外,将某些带有字符串操作的混淆方法准确恢复到其原始内容也十分困难。因此,我们将恢复问题转化为概念验证的语义相似性比较,这在某些情况下可能会带来风险。
由于缺乏符合基本事实的标记数据,我们创建了两个数据集,并依赖于其他安全研究人员开发的开源安全工具。尽管这些工具提供了多种选项和方法来生成我们所需的数据,但我们的工作中尚未全面讨论其他一些混淆方法和行为标签。我们的局限性之一是,基本事实数据是闭源的,并未完全涵盖恶意 PSCmd 的所有混淆和行为。其次,我们基于经验扩展了其他先前关于静态正则表达式替换的研究,设计了一个基于 Python 语言的 PowerShell 反混淆器,该工具使用正则表达式来实现快速有效的反混淆过程。但是,我们不处理多层混淆和其他更复杂的技术,例如使用原生 Windows 命令、PowerShell cmdlet 和 dotNet API 的混合混淆。
第七部分
相关工作
本节概述了过去几年关于恶意 PowerShell 检测和反混淆的文献。大多数机器学习/深度学习 (ML/DL) 工作侧重于二分类,以区分恶意 PSCmd 和良性 PSCmd。同时,其他研究人员提出了创新且可行的方法,使用抽象语法树 (AST) 中的子树或经典正则表达式进行反混淆。
A. 恶意 PowerShell 的检测
在先前的工作中,使用系统监控[[12]](javascript:void())、[[13]](javascript:void())或通过 AMSI 记录脚本块来检测恶意 PowerShell 的动态机制已经被提出作为直接的想法。一些安全供应商也提出了他们的实用解决方案。例如,来自 Palo Alto 的 Jeff White [[16]](javascript:void())提供了一系列对恶意 PowerShell 行为的观察结果和深入的静态分析。随着新兴的 ML/DL 的出现,来自 FireEye 的 Bohannon 等人[[18]](javascript:void())利用线性回归和梯度下降算法等机器学习方法来检测恶意 PowerShell。此外,许多 DL 方法结合了 AST、NLP 或 Graph 的概念,它们在区分恶意脚本和良性脚本方面表现出色。
AST 通常用于编程语言处理系统中,以表示程序的抽象语法结构。Rusak 等人[[22]](javascript:void())提出了结合 AST 和 DL 的恶意 PowerShell 检测方法。他们使用 AST 对 PowerShell 代码进行建模,然后利用 AST 的结构信息创建每个 PowerShell 的集成向量表示。将这一新颖的想法与 DL 结合,他们成功地识别了 PowerShell 代码的常见内在模式并区分了恶意软件家族。Song 等人[[25]](javascript:void())尝试通过混合使用基于标记和基于 AST 的关键字提取来优化特征选择。通过结合 PowerShell 代码的词汇和结构,检测恶意 PowerShell 的性能得到了提高。
由于 NLP 的 DL 方法最近取得了巨大成功,Hendler 等人[[27]](javascript:void())、[[28]](javascript:void())表明,使用字符级信息和命令中单词的上下文嵌入的基于 DL 的检测器对恶意 PowerShell 检测的贡献最大。在第一项工作中,他们从 DL 的角度提取字符级信息作为卷积神经网络 (CNN) [[48]](javascript:void())的输入。他们的评估结果表明,结合基于 NLP 的分类器和基于 CNN 的分类器的集成检测器性能最佳。在后来的工作中,他们将语义相似的单词投影到具有上下文词嵌入的嵌入空间中的近似向量。结合 DL 的字符级和标记级细节,他们取得了令人印象深刻的性能,误报率低于 0.1%。同时,Fang 等人[[24]](javascript:void())和 Mimura 等人[[29]](javascript:void())使用传统的基于 NLP 的方法(例如 FastText [[49]](javascript:void())和 Doc2vec [[50])](javascript:void())提出了概念上相同的工作结构。通过从 PowerShell 中提取混合特征,他们的模型展示了对复杂 PSCmds 进行分类的能力,并且比其他研究有所改进。
最后,Ongun 等人[[30]](javascript:void())采用主动学习和 cmd2vec 特征生成将检测范围扩展到 LotL 威胁,这些威胁包含使用更多系统预安装工具和命令的攻击。Sunoh Choi [[31]](javascript:void())提供了另一种视角,使用 GNN 将检测转化为图推理问题,并通过 Jaccard 相似性生成邻接矩阵来检测恶意 PowerShell。毫无疑问,ML/DL 检测方法在许多方面受益。然而,ML/DL 的全部潜力尚未在恶意 PowerShell 分析中得到发挥,特别是在去混淆和行为分析方面。在本文中,我们提出了一个由粗到细粒度的框架 PowerDP,它可以轻松地与以前基于检测的方法相结合,并通过行为多标签分类进一步推断恶意 PSCmds 的意图。
B. 恶意 PowerShell 的反混淆
尽管机器学习/深度学习在恶意 PowerShell 检测方面取得了进展,但对于恶意 PowerShell 去混淆的完美解决方案仍未达成共识。Liu 等人[[14]](javascript:void())提出了一个名为 PSDEM 的框架,该框架应用双层去混淆技术来恢复 Word 文档中混淆的恶意 PowerShell 代码的原始内容。从结果来看,与其他安全工具和防病毒程序相比,PSDEM 可以静态提取命令并将原始脚本呈现给用户,而且没有误报。在相关工作中,Jeff White [[17]](javascript:void())开发了一个精心设计的工具 PowerShellProfiler,它不仅可以处理 PowerShell 代码的去混淆,还可以使用大量预定义的正则表达式模式静态创建行为配置文件。Ugarte 等人[[15]](javascript:void())设计了 PowerDrive,这是一个针对 PowerShell 攻击的开源静态和动态多阶段去混淆器。PowerDrive 利用正则表达式通过多层恢复进行递归去混淆。此外,还报告了分析过程中的行为模型分类和恶意域的综合列表。
表面上看,正则表达式技术仍然是分析人员有效抵御各种混淆方法的主要解决方案。然而,相关的解决方案很容易与攻击者陷入猫鼠竞赛,并且无法高效地递归解析可能被混淆或隐藏在上下文中的特定模式或关键词的新内容。另一方面,AST 为研究人员提供了另一种解决方案,可以不受保护地洞察混淆的 PSCmds 的结构。Li 等人[[23]](javascript:void())提出了第一个语义感知的 PowerShell 攻击检测系统,该系统可执行混淆检测和基于仿真的恢复。该系统在 PowerShell 脚本 AST 的子树级别对混淆进行反混淆。根据对数据集的评估结果,该系统的性能优于 Windows Defender 14和 VirusTotal。15但是,该系统不支持行为分析,并且处理的混淆方法数量有限。最终,我们的方法受到了先前杰出研究人员工作的启发。如何在高效的去混淆过程与机器学习/深度学习之间取得平衡,并为程序分析保留互补的语义上下文,是至关重要的问题。
第八部分
结论和未来工作
本文介绍了 PowerDP,这是一个结合深度学习和程序分析的混合框架,用于自动执行 PowerShell 去混淆和行为分析。我们利用多标签分类预测了 15 种混淆类型,从而提高了广泛去混淆器的准确性,并成功分析了五种恶意 PowerShell 命令的行为。我们的方法在使用字符分布特征对不同混淆类型进行分类以及使用抽象语法树中的实值向量表示检测恶意行为方面取得了优异的性能。据我们所知,PowerDP 是首个采用多标签分类方法,分别推断恶意 PowerShell 命令在去混淆前后的混淆类型和行为标签的研究成果。未来,我们将扩展我们的研究,以应对更多混淆类型和恶意行为。我们还将研究多层混淆,并提高分类性能和准确性。




![[闲谈新片]扫黑除恶,打掉罪恶的“保护伞” - 宋马](https://pic.songma.com/blogimg/20250216/0dc53c20f1bf45f390419b51216ebb26.jpg)










暂无评论内容