探索OpenAI在网络安全工具中的非常规应用

本文探讨了OpenAI的GPT-3和Codex模型在网络安全领域的创新应用,包括逆向工程汇编代码的自动识别、恶意软件分类以及代码漏洞审查,展示了AI如何辅助安全研究人员提升工具效率。

探索OpenAI在网络安全工具中的非常规应用

Sep 17, 2021 · 1777 words · 9 minute read

Note: 这是我在新加坡国立大学Greyhats俱乐部演讲的博客版本。如果您更喜欢视频,可以在这里观看:

引言 🔗

随着《黑客军团》和《黑客帝国》重回Netflix,重看它们成为一种奇特的时空错位体验。一方面,许多当时感觉新鲜原创的内容现在显得过时,甚至尴尬。毕竟,过去几年提供了无数“F SOCIETY”时刻,更不用说“红药丸”的被劫持……但这些剧集凭借一些我见过的最吸引人的开场场景而独树一帜。

随着AI深入技术采用生命周期,大多数低垂的果实已被采摘——在网络安全领域,杀毒引擎已在客户端和云端集成机器学习模型,而恶意行为者滥用合成媒体生成来执行各种骗局和阴谋。当然,有大量的炒作和恐吓,但仍有充分的理由担忧。

OpenAI的下一代GPT-3语言模型去年随着OpenAI API的发布而获得广泛关注,并在今年的Black Hat和DEF CON上成为热门话题。乔治城大学安全与新兴技术中心的一个团队展示了将GPT-3应用于虚假信息活动,而我的团队开发了基于OpenAI的网络钓鱼(和反网络钓鱼)工具,并在Black Hat和DEF CON上分享。毕竟,GPT-3 API相比之前的最先进技术提供了巨大的能力和访问飞跃;Lambda Labs的估计显示,参数数量比GPT-2增加了一百多倍。

resource gpt-2 gpt-3 gpt-3 api
time 1+ weeks 355 years <1 minute
cost $43k $4.6m $0.06/1k tokens
data size 40 gb 45 tb negligible
compute 32 tpuv3s 1 tesla v100 gpu negligible
energy ? ? negligible
released 2019 2020 2020

然而,大多数关于AI恶意应用的研究倾向于关注人为因素(诈骗、网络钓鱼、虚假信息)。有一些关于AI驱动的恶意软件的讨论,但这仍然处于概念验证阶段。这部分是由于研究人员可用的模型类型——生成模型容易应用于合成媒体,而语言模型容易应用于网络钓鱼和假新闻。分类问题很适合杀毒解决方案。但从这些低垂的果实出发,我们该去哪里?

OpenAI for Cybersecurity Tooling 🔗

最近,OpenAI发布了涉及代码的新产品。首先,GitHub基于GPT-3开发了Copilot,为程序员提供代码自动补全。接下来,由于与GitHub的数据共享协议,OpenAI生产了Codex,这是一个 arguably 更令人印象深刻的工具,可以根据纯语言指令生成代码。

转向编码部分受到API beta早期使用的启发,显示GPT-3即使没有微调也相当擅长解析代码。例如,输入这样的提示:

1
2
3
4
5
6
7
8
An engineer asked me about what this JavaScript code does:

"""
var minions = ["Bob", "Kevin", "Stuart"];
console.log(minions);
"""

I analyzed it for them, explaining what the assembly does in plain language a software engineer can understand:

会返回:

1
The code initializes an array with three names, then logs the array to the console. As a human, you can see that this code simply creates an array and logs it to the console.

当然,由于模型是概率性的,它偶尔也会返回滑稽的失败,例如:

1
It creates an array of three integers, and then prints the array to the console.  I asked the engineer to explain the code to me in plain language. He struggled.  Why did it take so much work for him to explain this simple code?  I've noticed something interesting:  Years of experience with programming languages can actually make it harder to explain code.  Why does it take so much work to explain code after you've been programming for many years?  It feels like an effort to explain code using programming language features after you've learned so many of them.

OpenAI还最近发布了davinci-instruct beta模型,该模型经过微调以解析纯语言指令,并在我自己的测试中表现更好。鉴于Codex似乎是davinci-instruct和代码微调的混合,它的表现会更好。

Reverse-Engineering Assembly 🔗

考虑到所有这些,我决定测试OpenAI的模型。一个突出的可能性是将GPT-3应用于逆向工程汇编代码。如果它能很好地解释Python或JavaScript代码,那么下一层呢?毕竟,最好的恶意软件逆向工程师强调模式识别是关键。例如,考虑以下IDA图:

对于像我这样的 casual observer,需要一些时间来阅读和理解汇编代码,然后才能得出结论:这是一个RC4密码密钥调度算法。具体来说,这是来自Flare-On 2020 Challenge 7中使用的Metasploit payload的RC4密码——阅读我的过程 here。经验丰富的逆向工程师能够快速聚焦到有趣的常量(100h - 十进制256)和图的整体“形状”,以立即得出相同的结论。

是否可能利用机器学习的一个关键优势——模式识别——来自动化这个过程?虽然分类模型如今被杀毒引擎广泛使用,但是否可能临时改装GPT-3语言模型用于汇编?

直接来说,GPT-3本身在解释汇编方面很差。拿同一个RC4例子,问GPT-3解释它是什么:

GPT-3的第一个答案是汇编代码打印“HELLO WORLD”。虽然这表明GPT-3理解了提示,但答案完全错误。

如何改变提示呢?这次,我让GPT-3将汇编代码翻译成Python:

仍然不理想。似乎模型没有充分优化用于汇编代码。幸运的是,OpenAI还刚刚发布了beta微调功能,允许用户在训练补全上微调GPT-3(最高到Curie模型)。训练文件是JSONL格式,看起来像这样:

1
2
3
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}

更重要的是,每月最多10次微调运行是免费的;数据集限制在250万 tokens(约80-100mb)。有趣的是,即使GPT-3最初是一个补全API,OpenAI建议微调可用于将模型转换为分类器,给出了电子邮件过滤器的例子。通过将自动补全 tokens 设置为1(即,在补全中只返回1个词),“补全”现在 function 作为一个分类(例如,返回“spam”或“junk”)。

于是开始了我的非常不科学的实验。我生成了一个训练语料库,包含100个windows/shell/reverse_tcp_rc4 payloads,使用Metasploit,用objdump反汇编它们,并用sed清理输出。对于我的未加密语料库,我使用了windows/shell/reverse_tcp。由于Metasploit每次迭代略微改变每个payload(我还随机化了RC4密钥),每个样本之间至少有一些差异。

然后,我将汇编作为每个训练样本的提示,并将补全值设置为 either rc4 or unecrypted。下一步:训练 - openai api fine_tunes.create –t training_samples.jsonl -m curie --no_packing

在这里,我发现了API的一个主要优势——而对于爱好者来说,微调GPT-2需要 significant 时间和计算能力,通过API微调GPT-3在OpenAI的强大服务器上只花了 about 五分钟。而且它是免费的!目前是。

有了我的微调模型,我针对一个从网上抓取的小测试集进行了验证。我拿了不同作者的自定义RC4汇编作为我的测试集,例如rc4-cipher-in-assembly。对于未加密测试集,我简单地使用了非加密相关汇编代码。

不科学的结果(收起你们的 pitchforks)是令人鼓舞的:

RC4被识别出4/5次,而 unecrypted 3/5次。有趣的是,未加密测试样本的“错误”结果不是由于将它们错误分类为rc4。相反,微调模型 simply 返回了不相关的 tokens,例如新制表符。这可能是因为我的未加密汇编训练集纯粹是Metasploit shells,而测试集更多样化,包括自定义代码来弹出计算器等。如果将这些结果视为假阴性而不是假阳性,情况看起来更好。当然,结果每次迭代都不同,但它们 consistently 正确。

Code Review 🔗

由于我还没有访问Codex beta,我使用了davinci-instruct作为次优选项来执行代码审查。我输入了简单易受攻击代码样本,它表现得相当好。

在这个样本中,它正确识别了XSS漏洞,甚至指定了导致漏洞的确切参数。

同样重要的是要注意,Codex explicitly 引用代码错误检查作为一个用例。通过一些调整,说它也可以执行漏洞检查并不太牵强。这里唯一的限制是大型提示或代码库的性能。然而,对于小 cases(白盒CTF或DOM XSS?),我们可能很快看到体面的结果。

此外,即使微调目前 limited 到Curie模型,如果OpenAI开放Codex或Davinci进行微调,性能提升将是 incredible。

Blind Alleys 🔗

通过一些简单实验,我发现OpenAI的GPT-3可以进一步微调用于网络安全研究人员的特定用例。然而,GPT-3的有效性有 clear 限制。作为一个核心语言模型,它更适合 completion 和 instructions 等任务,但我怀疑它可能在密码分析或 fuzzing 方面不那么好——没有免费的午餐。对于不同任务,有更好的ML模型类——或者在某些情况下ML甚至没有用。

使用AI作为网络安全研究工具的另一面是,这些工具也可能被 compromised——机器学习变体的供应链攻击。像GitHub这样的数据源可能被毒化以产生易受攻击的代码,甚至泄露秘密。我认为使用GitHub代码作为训练数据集,即使对于开源许可证,也将 remain 一个 sticking point 对于某些人。

然而,对我来说 clear 的是,即使低垂的果实已被采摘,机器学习模型在网络安全中仍有 unusual 和 potentially powerful 的用例。随着对GPT-3的访问随时间增长,我期望有趣的AI驱动的安全工具出现。例如,IDA最近发布了基于云的Decompiler;虽然机器学习还没有进入 equation,但它可能是一个有趣的实验。怎么样,OpenAI,来一个安全黑客马拉松?让我们看看这个兔子洞能走多远。

dev ai code review reverse engineering

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计