论文学习_CLAP: Learning Transferable Binary Code Representations with Natural Language Supervision

论文名称发表时间发表期刊期刊等级研究单位
CLAP: Learning Transferable Binary Code Representations with Natural Language Supervision2024年arxiv-清华大学

1. 引言

研究背景:深度学习在许多二进制分析任务中都很有效,包括函数边界检测、二进制代码搜索、二进制代码相似性检测、函数类型推断、恶意软件分类、逆向工程,以及值集分析。 深度学习在二进制分析领域的成功可归因于其强大的表示学习能力,事实证明,这种能力可以有效捕获数据中的复杂模式和关系,以及学习有意义的汇编代码表示。

现存问题:尽管深度学习技术在二进制分析方面取得了进展,但现有方法仍存在一定的局限性。 首先,当前的方法在应用于新的数据集或任务时通常需要大量数据进行重新训练,导致在训练样本稀疏的场景中性能不佳。 这在少样本学习场景和零样本学习场景中尤其成问题,在少样本学习场景中,模型必须适应具有最少示例的新任务,在零样本学习场景中,模型遇到在训练期间从未见过的任务。 其次,现有的汇编代码编码方案通常会导致丢失关键信息,例如调用指令的参数、字符串和变量名称。 特别是,大多数方法倾向于使用特殊的词汇标记来标准化字符文本、常量数值和外部函数,这无意中导致了重要细节的遗漏。

研究动机:从多模态学习中汲取灵感,我们观察到诸如 CLIP 之类的模型可以通过将视觉模态概念与人类可理解的自然语言相结合来学习更好的图像表示(自然语言↔️图像)。 同样,我们可以将二进制代码概念化为一种类似的模态,并探索二进制代码和自然语言之间的一致性,以开发具有更好可移植性的语义上更深刻的汇编代码表示(自然语言↔️汇编代码)。 具体来说,我们可以使用自然语言(即代码语义的解释)作为监督信号,通过将二进制代码(即汇编代码)与预训练对齐来学习二进制代码的表示。 生成的模型很可能获得封装更多有关二进制代码的语义信息的表示。 为此,我们必须解决以下挑战:(1)获取具有成本效益的对齐数据进行训练;(2)保留通过现有二进制代码表示方法提取的语义信息(例如控制流和数据流)。

研究内容:为了解决这些挑战,论文引入了一种名为 CLAP 的新方法,它利用自然语言监督来学习可转移的二进制代码表示。 具体来说,关于第一个挑战,论文提出了一个高效的数据集引擎,可以自动生成用于模型预训练的大型且多样化的汇编代码和自然语言解释数据集。 关于第二个挑战,论文引入了一种新颖的二进制代码表示学习主干网络,该网络结合了 WordPiece 标记化(例如 Llama 使用)和跳跃感知嵌入(例如 jTrans 使用)设计。 该网络能够捕获二进制代码中的数据流和控制流信息,同时保留关键信息,例如函数调用参数、反编译器处理的字符串和变量名称。

实验结果:论文生成了 1.95 亿对数据(汇编代码及其对应的自然语言),并预训练了 CLAP 原型模型。在多个下游任务上对 CLAP 进行了评估,包括二进制代码相似性检测 (BCSD)、加密相关函数识别协议分类。 结果表明,即使没有任何进一步的特定任务训练或微调,CLAP 在这些任务上的表现也优于现有的最先进解决方案。 在 BCSD 任务中,当搜索 10,000 个函数之内的函数时,没有微调的 CLAP 以平均 Recall@1 率为 83.3% 获得最高排名。 相比之下,目前领先的监督解决方案仅达到 57.1%。 在与加密相关的功能识别方面,CLAP 在零样本设置中的表现略低于基线,但 CLAP 的微调版本大大超出了基线 17%。 在协议分类实验中,CLAP 的零样本和微调版本分别超过了最佳基线 6% 和 23%。 此外,论文还进行了一项案例研究,以评估真实样本上的 CLAP 的有效性。

论文主要探讨了一个关键的研究问题:即使面对极其有限或不存在的数据,是否可以在二元分析领域训练一个模型,以有效地将获得的知识转移到各种任务中? 论文所提的 CLAP 通过创新方法弥合了二进制代码和自然语言表示之间的差距,对该问题做出了肯定的回应。论文的的主要贡献如下:

  • 论文了 CLAP,它创新性地使用自然语言作为监督信号来学习二进制代码表示。 这种方法将汇编代码与自然语言结合起来,并增强了迁移学习能力,特别是在少样本和零样本学习场景中。
  • 论文开发了一个高效且可扩展的数据集引擎,能够生成汇编代码和相应自然语言解释的综合数据集。 该数据集有助于训练模型来表示具有自然语言监督的汇编代码,从而弥补了现有二进制分析方法中的重大差距。
  • 论文进行了大量的实验来证明我们提出的 CLAP 方法的有效性,该方法优于最佳基线,并在各种任务上显示出卓越的迁移学习能力。 这展示了该模型在二元分析应用中的多功能性和有效性,在该领域树立了新的基准。

2. 研究背景

本节概述与 CLAP 相关的关键概念和技术,重点关注二进制代码表示和大型语言模型。

2.1 二进制代码表示

在编译过程中,高级语言被转化为更接近机器硬件的汇编代码(即二进制代码)。 与源代码相比,汇编代码更难解释,主要是因为它缺乏源代码级别的清晰抽象,例如变量名称和高级逻辑结构。下图显示了汇编代码的示例,它实现了冒泡排序算法。 在二进制程序分析中,通常严重缺乏对源代码的访问。这不仅使理解程序变得更具挑战性,而且还产生了类似于源代码表示的场景,强调了对汇编代码的有效表示的需求。

二进制代码表示对于二进制代码相似性检测 (BCSD)、函数原型推断、恶意软件分类以及逆向工程等各种任务至关重要。多年来,研究人员设计了多种技术将二进制代码表示为向量空间中的连续向量,使其适合下游任务。这些获得函数向量表示的方法可以大致分为三组:原始字节的直接建模采用图模型建立控制流关系将函数指令表示为指令序列

2.1.1 原始字节

MalConv、DeepVSA 以及 𝛼-Diff 等多项研究采用 CNN 和 LSTM 等神经网络来分析原始字节的二进制代码,旨在改进恶意软件检测和识别代码相似之处。 这些方法专注于捕获数据依赖性和特征提取,并未不深入研究指令级语义或控制流图结构。这类方法具有计算效率上的优势,但无法实现深入的语义理解

2.1.2 图建模

汇编代码本质上是由一系列基本块连接而成的控制流图 (CFG) ,这促使人们研究以图形方式对 CFG 进行建模。 Gemini 利用 GNN 从 CFG 中导出函数嵌入,尽管它受到手动选择可能丢失复杂语义的特征的限制。 GMN 通过基于注意力的图匹配网络创新地计算图相似度。 GraphEmb 和 OrderMatters 都注入了​​ DNN 来学习基本的块属性,然后应用图模型将这些块的相互关系封装在 CFG 框架内,从而更有效地捕获流程和结构。

2.1.3 序列建模

序列建模方法将汇编代码视为指令序列,通过捕获指令顺序对指令序列建模。 Asm2Vec 和 SAFE 使用受语言启发的模型来生成指令和函数的嵌入,将指令类似于单词。基于 Transformers 的 Trex 和基于跳转感知模型的 jTrans 分别增强了微跟踪和控制流表示。VulHawk 集成了 RoBERTa 和 GCN 以实现多方面嵌入。 尽管它们在捕获语义细节方面很有效,但大多数序列模型缺乏全面的控制流图表示。

2.2 大语言模型(LLM)

最近,大型语言模型尤其是 GPT 系列模型,已经表现出了非凡的源代码理解能力。例如,论文提示 ChatGPT 输出如下图 a 所示的代码片段的解释,ChatGPT 不仅通过实际使用,而且还通过其阐明代码功能的能力来展示其对源代码的强大理解力,即“此代码的目的是创建一个表示文件或目录模式的字符串,例如 -rw-r–r–”。

3. 研究内容

数据集引擎:论文首先对 Ubuntu 存储库进行广泛的编译活动开始(源码→汇编代码),之后为 GPT-3.5 设计提示词以生成解释数据集(源码→自然语言描述,通用、在线),最后论文使用这个解释数据集对 LLaMA 模型进行了微调(源码→自然语言描述,定制、离线)。

CLAP 模型:论文首先通过汇编代码数据集预训练一个跳跃感知 Transformer(Assembly 编码器生成),之后采用具有大量负样本的对比学习策略实现 Assembly 编码器与 Language 编码器的对齐(对齐过程增强了语义表示)。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值