基于大语言模型的对抗性攻击与防御:以恶意JavaScript为例
我们开发了一种对抗性机器学习算法,利用大语言模型(LLM)来大规模生成恶意JavaScript代码的变体。通过这项研究,我们提升了对野外恶意JavaScript代码的检测能力,检出率提高了10%。
近期,随着大语言模型在代码理解能力方面的进步,人们开始担忧犯罪分子可能会利用这些模型来生成新型恶意软件。虽然大语言模型难以从零开始创建恶意软件,但犯罪分子可以轻易地利用它们来重写或混淆现有的恶意软件,使其更难被检测。
攻击者长期以来一直使用常见的混淆技术和工具来规避检测。由于现成的混淆工具为防御者所熟知,且其变换方式是预定义的,因此我们可以轻松地对它们进行特征识别或检测。然而,犯罪分子可以通过提示大语言模型进行更加自然的转换,这使得检测这类恶意软件变得更具挑战性。
此外,经过足够多层的转换,许多恶意软件分类器可能会误将恶意代码判定为良性。这意味着随着恶意软件的演变,无论是出于规避检测的目的还是自然变化,恶意软件分类的性能都会降低。
为了验证这一点,我们创建了一个算法,使用大语言模型以逐步方式重写恶意JavaScript代码。我们首先设定了一组重写提示,包括:
-
变量重命名 -
插入无用代码 -
删除不必要的空白字符
在测试恶意代码样本时,我们持续应用这些重写步骤,直到能够欺骗静态分析模型。在每一步中,我们还使用行为分析工具来确保程序的行为保持不变。
使用这种基于大语言模型的重写技术,我们显著降低了VirusTotal上检测每个样本为恶意的供应商数量。
背景:大语言模型用于生成恶意软件
2023年,多家新闻媒体报道了暗网上出现的"邪恶大语言模型"。这些邪恶的大语言模型声称是经过越狱的模型版本,攻击者可以利用它们生成新型恶意软件、编写钓鱼邮件和执行其他恶意任务。
邪恶大模型
-
WormGPT https://slashnext.com/blog/wormgpt-the-generative-ai-tool-cybercriminals-are-using-to-launch-business-email-compromise-attacks/
-
FraudGPT https://abnormalsecurity.com/blog/fraudgpt-malicious-generative-ai
经过仔细研究,这些声称在几乎所有情况下都缺乏实质依据。这些邪恶大语言模型的用户抱怨格式错误、上下文窗口有限,以及整体代码理解和生成能力较差。
正如我们在《威胁前沿报告》中关于应对新兴AI风险所述,即使是闭源的大语言模型,目前也需要大量人工辅助才能生成任何非平凡的恶意软件,这限制了它们对攻击者的实用性。
我们没有尝试从零开始生成恶意软件,而是尝试使用大语言模型重写现有的恶意软件样本以规避检测。这种方法更加可行,并产生了更难被检测的结果。
攻击:使用大语言模型创建恶意JavaScript变体
我们的算法使用大语言模型迭代转换恶意JavaScript,直到它能够规避像IUPG或PhishingJS这样的检测工具,同时保持其功能不变。我们设计这个算法的目的是能够大规模创建数千个新型恶意软件变体,无需任何人工干预。
我们选择JavaScript的原因是:
-
它是各种攻击(从恶意软件到钓鱼)的热门选择 -
它是一种脚本语言,在代码实现方面具有高度的多态性
算法概述
我们将这个任务框定为一个对抗性机器学习问题,目标是操纵模型输入(在这里是恶意JavaScript)以产生期望的输出(良性判定)。
我们首先设计了一组重写提示,指导大语言模型以特定方式转换代码。例如,这组提示包括:
-
变量重命名 -
字符串拆分 -
插入无用代码 -
删除不必要的空白字符 -
函数的替代实现
在图1中,我们展示了两个具体的重写指令示例,一个用于插入无用代码,另一个用于变量重命名。
然后,我们使用贪心算法将代码样本运行通过我们完整的重写提示集。在每次迭代中,我们尝试每个剩余的重写提示,将生成的样本通过深度学习模型。然后我们选择能够最大程度降低代码"恶意"分数的提示。图2展示了整体提示模板的示例。
除了评估增加的隐蔽性外,我们还必须确保代码的恶意功能保持不变。为此,我们使用自定义的JavaScript行为分析工具(https://unit42.paloaltonetworks.com/malicious-javascript-steals-sensitive-data/
)来确认重写后的脚本维持与原始脚本相同的行为集和网络活动。
该工具模拟执行多个可能的执行路径,以生成JavaScript可能采取的行为或动作列表,包括DOM注入、重定向和动态执行的代码。如果大语言模型生成的重写脚本与原始脚本的行为不同,我们就简单地丢弃该重写脚本。
完整算法如下:
最终输出是恶意JavaScript的一个新变体,它保持了原始脚本的相同行为,同时几乎总是具有更低的恶意分数。
当我们在几百个独特的恶意JavaScript样本上重复这个过程时,我们的算法在88%的情况下使深度学习模型的判定从恶意转为良性。
逐步示例
以下示例演示了基于大语言模型的重写过程如何应用于一个恶意JavaScript样本。
我们从图3所示的一个真实恶意JavaScript代码样本开始。这段代码来自一个用于窃取凭证的钓鱼网页。
最初,基线版本钓鱼深度学习模型的分数非常高,接近1.0或100%。这是因为该样本与其训练集中看到的恶意JavaScript类型非常相似。
其他安全供应商也已经检测到这个脚本。事实上,如图4所示,VirusTotal显示有13个供应商判定其为恶意。
在图5-7中,我们展示了这个贪心重写算法如何能够改变我们自己的深度学习模型和VirusTotal上其他供应商的判定。
在第一步中,贪心算法选择了"最小化"提示,它删除了代码中任何不必要的空白字符。如图5所示,这第一步导致深度学习模型的钓鱼检测分数从0.99999976略微降至0.99843687。
接下来,大语言模型对选定的字符串进行拆分。例如,如图6所示,它将图5中的第一个URL字符串'hxxp://gantep.edu[.]tr/'拆分为'hxxp://' + '/gantep.edu[.]tr'。这使重写样本的模型检测分数降至约0.91或91%。
最后,模型执行变量重命名,将JavaScript代码中的变量重命名为大语言模型选择的新名称。例如,它简单地将图5和图6中的第一个变量strMainDomain重命名为图7中的a。根据温度(大模型特定术语, 简而言之,温度越低temperature,结果越确定,因为总是会选择最有可能的下一个标记。提高温度可能会带来更多的随机性,从而鼓励更多样或更有创意的输出)设置,模型可以生成或多或少随机的变量名。
此时,我们已经堆叠了足够多的转换,使深度学习模型不再将此脚本检测为恶意。钓鱼检测分数现在为0.007577492,不到1%。请注意,所选步骤以及步骤的顺序将根据目标模型和JavaScript本身而有所不同。
此外,当我们将新重写的脚本上传到VirusTotal时,其他供应商也没有检测到它是恶意的。如图8所示,即使在4天后也是如此。这表明该攻击可以从我们自己的深度学习模型转移到其他分析器。
基于大语言模型的混淆与现成工具的对比
在大语言模型出现之前,攻击者就一直在使用常见的混淆技术来避免检测。这些混淆技术可以像以下活动一样简单:
-
通过分割和随后连接字符串进行操作 -
编码字符串 -
重命名标识符 -
注入无用代码以使JavaScript源代码更难理解
这些混淆技术也可以更复杂,比如控制流扁平化,它对原始源代码进行不可逆的结构性更改。攻击者经常使用obfuscator.io(https://obfuscator.io/
),它也作为一个npm包(https://www.npmjs.com/package/javascript-obfuscator
)提供,每周下载量超过18万次,以大规模应用这些混淆技术。
然而,与基于大语言模型的混淆相比,这些现成的JavaScript混淆工具有一个缺点。由于这些工具为防御者所熟知,并且以预定义的方式产生自动化更改,因此可以轻松地对这些工具的结果进行特征识别和可靠检测。
与现成工具相比,大语言模型重写的混淆看起来更加自然。图9展示了使用这两种方法对同一段JavaScript代码进行处理的结果比较。
为了进一步证明这一点,我们使用大语言模型重写和obfuscator.io的类似混淆技术对我们数据集中随机选择的一组JavaScript进行处理。然后,我们测量了生成的JavaScript代码中的文本熵分布。
源文本中的熵测量源代码中存在的随机性量。如图10所示,大语言模型生成的脚本的熵分布与原始脚本相比更接近,而工具生成版本的差异较大。这表明大语言模型重写的代码与现成工具重写的代码相比可以有多么有机,这为恶意行为者依赖大语言模型重写来规避检测提供了进一步的动机。
防御:数据增强和模型重训练
我们已经展示了如何将对抗性机器学习技术应用于使用大语言模型重写恶意JavaScript代码。现在让我们探讨如何改进基线检测模型以防御此类攻击。
一种自然的方法是将这个重写过程重新定义为数据增强(https://www.tensorflow.org/tutorials/images/data_augmentation
)技术。为了改善模型泛化能力,我们可以通过包含转换后的数据(在这种情况下是大语言模型生成的样本)来增强训练集。
我们测试了在这些大语言模型生成的样本上重新训练深度学习模型如何影响实际检测性能。对于这个实验,我们收集了2021年及更早的真实恶意JavaScript示例,特别是与钓鱼相关的JavaScript。然后,我们使用这些样本作为起点创建了10,000个独特的大语言模型重写样本。
当我们将这些样本添加到模型的训练集并重新训练时,我们看到在2022年及以后的样本上,实际检测率提高了10%。这是在未来真实恶意JavaScript样本上性能的显著提升。图11展示了这个过程的可视化。
这种性能提升的一个可能解释是,在这些大语言模型生成的样本上重新训练可能使深度学习分类器对表面级别的变化更具鲁棒性。这使得模型对恶意代码在现实世界中可能发生的变化不那么敏感。
实际检测
图12-14展示了经过对抗性重训练的恶意JavaScript模型的实际检测示例。
在2024年11月检测时,每个被检测的JavaScript样本都尚未出现在VirusTotal上。在这些情况中,被检测的JavaScript与一些现有的钓鱼脚本非常相似,但有细微的修改。
这些修改包括:
-
混淆 -
注释代码 -
重命名变量 -
功能的细微差异
在第一个示例中,图12显示了来自Web 3.0 IPFS(https://developers.cloudflare.com/web3/ipfs-gateway/concepts/ipfs/
)钓鱼页面(托管在bafkreihpvn2wkpofobf4ctonbmzty24fr73fzf4jbyiydn3qvke55kywdi[.]ipfs[.]dweb[.]link)的用于窃取webmail登录凭证的解混淆代码。图12中显示的脚本在行为和语法上与2022年5月首次出现的一个钓鱼脚本(https://www.virustotal.com/gui/file/0c5b6e6e2991aa30ac883bae6d5e2998629cd0e7c83e1ca2e1dc32243d153556
)有几个相似之处。但是,较早的脚本不包含基于Telegram的数据外泄功能。
图13显示了托管在jakang.freewebhostmost[.]com/korea/app.html的韩语通用webmail钓鱼页面的JavaScript。解混淆的JavaScript将钓鱼获取的凭证外泄到nocodeform[.]io,这是一个合法的表单托管平台。解混淆的脚本还显示了一条韩语信息,显示正在确认过程中(확인중…),但在受害者点击提交按钮后,最终会通过HTML编码的字符串显示登录失败。
图14显示了从dub[.]sh/TRVww78?email=[收件人邮箱地址]重定向的Web 3.0 IPFS钓鱼页面,该页面托管在ipfs[.]io
。该页面包含高度混淆的JavaScript,根据目标的邮箱域名渲染自定义背景。该脚本还禁用了右键点击,以防止用户或研究人员轻易检查网页,尽管我们仍然可以在URL开头添加view-source:来查看网页的源代码。
这三个混淆JavaScript的示例是我们经常使用重新训练的模型检测到的钓鱼页面中典型的恶意代码。
结论
虽然大语言模型在生成新型恶意软件时可能会遇到困难,但它们在重写现有恶意代码以规避检测方面表现出色。对于防御者来说,这既带来了挑战,也带来了机遇。
借助生成式AI的帮助,新的恶意代码变体的规模可能会增加。然而,我们可以使用相同的策略来重写恶意代码,帮助生成训练数据,从而提高ML模型的鲁棒性。
威胁指标
最近的钓鱼URL示例:
-
bafkreihpvn2wkpofobf4ctonbmzty24fr73fzf4jbyiydn3qvke55kywdi.ipfs.dweb[.]link -
jakang.freewebhostmost[.]com/korea/app[.]html -
dub[.]sh/TRVww78?email= -
ipfs[.]io/ipfs/bafkreihzqku7sygssd6riocrla7wx6dyh5acszguxaob57z4sfzv5x55cq
恶意JavaScript样本的SHA256哈希值:
-
03d3e9c54028780d2ff15c654d7a7e70973453d2fae8bdeebf5d9dbb10ff2eab -
4f1eb707f863265403152a7159f805b5557131c568353b48c013cad9ffb5ae5f -
3f0b95f96a8f28631eb9ce6d0f40b47220b44f4892e171ede78ba78bd9e293ef
原文始发于微信公众号(独眼情报):使用LLM混淆恶意 JavaScript,88%的恶意样本可以逃避检测
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论