Advertisement

论文学习_IFAttn: Binary code similarity analysis based on interpretable features with attention

阅读量:

0. 论文概述

二进制代码相似性分析(BCSA)在各种软件安全应用中都很有意义,包括漏洞发现、克隆检测和恶意软件检测。尽管近年来许多 BCSA 研究都是基于神经网络,但一些重大问题仍难以解决。首先,大多数现有方法更关注函数对相似性检测任务(FPSDT),而忽略了更主要于漏洞发现的函数搜索任务(FST)。而且,他们更关心最终的结果,即利用无法解释的神经网络来提高FPSDT的成功率。最后,在实践中,大多数方法都很难抵抗BCSA中的交叉优化和交叉混淆。我们首先提出了一种结合可解释特征工程和可学习注意力机制的自适应 BCSA 架构来解决这些问题。我们设计了具有丰富可解释特征的自适应模型,FPSDT 和 FST 的实验结果优于最先进的方法。此外,我们还发现注意力机制在功能语义表达方面具有突出的优势。最后,评估表明我们的方法可以显着提高跨架构、交叉优化、交叉混淆和交叉编译器二进制文件之间的 FST 性能。

1. 引言

由于有大量的开源代码可用,为了提高开发效率,程序员通常使用开源代码来开发新软件。 如果程序员从开源项目中复制有漏洞的函数,该漏洞将持续存在并且很难被发现。 这种趋势对软件的安全性和可靠性产生了深远的影响。不幸的是,使用相似性分析从二进制代码中检测此类问题并不简单。 原因是二进制代码缺乏语义抽象,因此很难直接从二进制中提取函数语义信息进行函数相似性分析。 此外,功能边界的精确划分是一项非常具有挑战性的任务。 研究背景

因此,检测二进制代码的相似性一直是克隆检测,恶意软件检测,库函数发现领域的重要研究方向。根据提取特征的粒度,现有方法可分为以下几类:基于基本静态特征的方法;基于代码图结构的方法,例如控制流图特征;基于代码张量结构的方法;基于使用深度学习生成函数嵌入的方法。尽管关于二进制代码相似性分析(BCSA)的研究工作很多,但一些关键问题难以解决。

  • 现存问题1 :首先,大多数现有方法更关注函数对相似性检测任务(FPSDT),而忽略了在漏洞发现中更重要的函数搜索任务(FST)。 FPSDT是指检测函数对是否相似的任务,输入一对函数,并输出相应的相似度。 FST是指在函数库中寻找与目标函数最相似的函数,输入一个函数,输出与其最相似的前K个函数。
  • 现存问题2 :其次,大多数方法更关心最终结果。 他们使用无法解释的机器学习技术来设计复杂的分析过程来提取二进制语义,而不考虑该方法背后的精确推导。 深度学习近年来被广泛应用于许多二进制分析任务中,PalmTree通过在大规模无标签二进制语料库上进行自监督训练来生成通用指令嵌入,然后用于各种下游 任务。 然而,现有方法忽略了使用复杂语义分析的必要性的解释。
  • 现存问题3 :最后,由于编译器优化和混淆会显着改变代码结构,因此大多数方法在交叉优化和交叉混淆情况下表现不佳。 此外,BCSA 方法仅适用于特定基准而不适用于其他基准的原因尚不清楚。

我们提出了一种新方法,将基本特征的可解释性与注意力机制的可学习性相结合来解决这些问题。 具体来说,我们解决以下两个主要挑战。

  • 挑战1 :如何融合可解释的基本特征来生成二进制的语义特征?
  • 挑战2 :如何设计一个通用的模型框架来适应BCSA中不同的编译选项?

为了解决第一个挑战,我们首先详细验证 TIKNIB 中提出的基本特征的有效性。 然后我们使用注意力机制来关注在不同编译条件下仍然具有鲁棒性的基本特征,并学习基本特征之间的相关性。为了解决第二个挑战,我们将流行的 Transformer 模型的编码器部分重新设计为 Siamese 网络,以计算一对函数的相似度得分,并使用关键特征注意层中的掩码(KFM)用于处理不同的编译选项。

  • 贡献1 :我们提出了一种通过注意力机制将可解释的基本特征转换为自适应语义特征的新方法。 我们在保留原始特征信息的基础上关注特征之间的关系。
  • 贡献2 :据我们所知,我们首次使用注意力机制在函数层面上合并基本特征。 我们发现函数级特征更加稳健和可扩展。
  • 贡献3 :我们实现了一个原型系统 IFAttn4,它将基本特征的可解释性与注意力机制的可学习性结合起来,以检测二进制代码语义相似性。 我们证明,IFAttn 可以超越跨架构、交叉优化、交叉混淆和交叉编译器二进制文件之间的最先进方法。
  • 贡献4 :我们在基准 BINKIT5 上使用 IFAttn 研究了 FPSDT 和 FST 中自适应语义特征的有效性,并揭示了一些新颖的见解。

2. 研究动机

考虑到之前的大部分研究缺乏足够的可解释性和可扩展性,我们有强烈的动机探索可解释的特征和可扩展的特征融合。大多数现有方法往往侧重于复杂的语义分析,但可能忽视了一些稳健的基础特征。例如,某些有效的基本特征,无论目标架构或编译器如何变化,都能够稳定地优于所谓的语义特征。

进一步来说,我们发现 TIKNIB 所选的鲁棒基本特征在 FPSDT 上表现良好,并且与最先进的方法相当。然而,值得注意的是,鲁棒特征的数量仅约为十个,这在一定程度上压缩了可解释的特征空间,并削弱了特征向量区分不同函数的能力。换句话说,特征数量较少可能导致不同函数之间具有相似的特征表示。

受 TIKNIB 启发,我们对基本特征之间的关系产生了浓厚兴趣。我们发现,不同的基本特征具有不同的表达能力,且它们之间的相互关系可能为提高特征表达能力提供重要线索。基于这一发现,我们进一步考虑将 Transformer 中的注意力机制应用于基本特征的融合过程。该机制能够有效捕捉特征之间的相关性,并有助于生成更具表达力的语义特征。以交叉混淆为例,我们将从两个方面展示利用注意力机制的优势:

同一函数的不同混淆方法 :下图显示了编译选项 (x86_32_O0) 下函数 a2ps:set_quoting_style 在伪控制流 (BCF) 混淆前后的 CFG。可以看出,相同功能的CFG在BCF混淆前后有显着差异。因此,同一函数混淆前后的特征向量越相似,特征提取方法就越鲁棒。下图展示了同一函数混淆前后特征向量的变化。下图上半部分展示了TIKNIB选择的基本特征的变化,下半部分展示了结合注意力机制的语义特征的变化。我们可以看到,混淆前后的基本特征有明显的差异,而语义特征整体上更加稳健。

不同的函数有不同的混淆方法 :混淆前后不同函数的特征向量差异越大,特征提取方法就越鲁棒。 下图展示了不同函数(a2ps:dict_entry_table_dump和a2ps:ps_status_free)混淆前后特征向量的差异。 我们可以看到,即使经过混淆,不同函数的基本特征也大多相同,但语义特征大多不同。我们认为,注意力机制可以通过结合以上两个方面来学习基本特征之间的内在联系。 特征融合生成的语义特征保留了可解释性并提高了可扩展性。

3. 基础定义

3.1 可解释特征

3.1.1 前语义特征

由于基本特征提取不是本文的主要工作,因此我们采用 TIKNIB 中语义前特征的定义,并简要介绍如下。 如图下所示,语义前特征是通过代码语法和结构分析直接或间接获得的。 数值形式的特征称为数值前语义特征,其他特征称为非数值前语义特征。

数值前语义特征 : 从程序中提取数值特征在BCSA中非常常见,因为这些数值特征可以直接表示为数值向量以进行相似性比较。 根据特征提取的粒度,数值前语义特征可以分为三组。首先,许多先前的工作从每个基本的二进制函数块中提取数值特征。其次,可以从函数控制流图(CFG)中提取数值特征。 这些数值特征可以反映CFG的结构信息。最后,一些方法考虑提取调用图(CG)的数值特征,主要测量CG中调用者和被调用者的数量。

非数字语义特征 :比较二进制文件的原始字节是最直接的方法。 然而,研究人员通常不考虑这种方法,因为即使是简单的代码修改,字节级匹配也不鲁棒。另一种简单的方法是在汇编指令级别考虑操作码和操作数。 考虑到操作数的实际值可能因不同的编译器选项而有很大差异,研究人员需要对操作数进行标准化。最后,一些研究人员直接从函数中提取特征。他们考虑导入函数的名称、函数输入的交集和其他特征来显示函数之间的相似性。

3.1.2 语义特征

先前的许多研究使用复杂的分析来生成语义特征,例如基于深度学习的符号执行或嵌入。本文通过注意力机制分析前语义特征的内部关联信息,融合前语义特征生成语义嵌入。

3.2 注意力机制

注意力机制是目前自然语言处理中最常用的方法之一。 它可以显着提高模型在一系列任务上的性能,特别是基于循环神经网络结构的seq-to-seq模型。 Google 提出的完全基于注意力的Transformer 模型显示了注意力机制的优势。 注意力机制直观地模拟了人类在理解语言时关注某些关键词的行为。 同样,使用注意力机制融合功能特征可以集中于主要的鲁棒特征。

3.2.1 KFM 缩放点积注意力

在 KFM 缩放点积注意力种,查询(queries) 和键(key)的维度为d_k,值(values)的维度为d_v,这些都代表了输入信息。首先,计算 queries 与 key 的点积,然后将结果除以 (d_k)^1/2,以进行缩放,接下来,使用 KFM(Key Feature Mask)进一步提高对关键特征的注意力。KFM 通过使用 TIKNIB 中采用贪心算法选择的鲁棒特征来增强对这些特征的关注。最后,应用 softmax 函数来获得每个值的权重。

在实际应用中,我们使用 GPU 并行计算一组查询的注意力函数,并将其打包成矩阵 Q。同样,键和值也被打包成矩阵 K 和 V。缩放因子有助于减少相关矩阵的方差,这对于模型训练非常有利。通过这种方式,实数矩阵的数值不会过大。最终,输出矩阵的计算公式如下:
ext{Attention} = ext{softmax}eftight V

3.2.2 多头注意力机制

Transformer 模型中提出多头注意力将模型划分为多个头(heads),每个头对应不同的子空间,从而使模型能够关注信息的不同方面。在执行特征融合时,使用多头注意力尤为有效。它能够使模型自适应的集中注意力于不同编译选项下的更鲁棒的函数特征,从而提高注意力计算的效率。
ext{MultiHead} = ext{Concat} W_O
ext{head}_i = ext{Attention}

其中,W_Qi,W_Ki,W_Vi 是投影参数矩阵,W_O 是最终输出的投影矩阵。

4. 系统结构

如下图所示,我们提出的系统,即 IFAttn(带注意力的可解释特征)由三个主要阶段组成:静态分析、特征融合和相似性检测。

  • 静态分析 :此阶段的目标是手动提取函数的代表性前语义特征。
  • 特征融合 :在这个阶段,我们使用注意力机制来融合前语义特征来生成语义嵌入。
  • 相似度检测 :我们将一对函数的相应语义嵌入输入到 Siamese 网络中。输出是这两个函数的相似度得分,范围从0到1。如果相似度得分接近1,我们判断它们相似。

4.1 静态分析

我们更关注二元函数级相似性分析,因此我们从每个函数中提取数值前语义特征作为注意机制分析的原始特征。

下表总结的特征由CFG、CG、指令和类型数字特征组成。 这些特征会随着代码结构的变化而变化,这有助于我们发现代码之间的结构差异。 我们从 CFG 的多个方面提取特征,包括基本块、CFG 边缘、强连通分量(SCC)和循环。 基于 TIKNIB 中的方法,我们将指令分为几个普遍认可的语义组。 然后我们使用每个语义组中的指令总数作为 CFG 的特征。 我们从 CG 中提取了六个特征。 包括调用者(代表传出边缘)和被调用者(代表传入边缘)的数量。

此外,我们从函数参数类型和返回类型中提取了三个特征。 我们考虑与 TIKNIB 相同的基本类型:char、short、int、float、enum、struct、void 和 void *。 参数类型的数量表示函数参数的总数。 参数类型编号的乘积组合了所有参数。 我们使用 IDA Pro、NetworkX 和 Capstone 来提取特征。

4.2 特征融合

编码器由 N = 6 个相同层的堆栈组成。 每层的键、值和查询输入都来自同一个地方,在本例中是前一层的输出,即通过静态分析获得的 d_pre = 50 个语义前特征。 为了融合前语义特征之间的关联信息,我们通过填充 0 将单个数值特征的维度从 1 扩展到 50。每层由两个子层组成。 第一个子层是多头注意力机制。 下一个子层是一个全连接的前馈网络,由两个线性变换和中间的 ReLU 激活组成。 虽然不同位置的线性变换是相同的,但不同层之间使用不同的参数。 输入和输出的维度为d_model = 50,内层的维度为d_ff = 512。

我们在子层之间使用残差连接和层归一化。 每个子层的输出是 LayerNorm(x + Sublayer(x)),其中Sublayer(x)是子层本身实现的函数。 为了促进这些残差连接,模型中的所有子层和嵌入层都会产生维度 dmodel = 50 的输出。

编码器由 N = 6 层相同的多头注意力子层和前馈网络子层组成。 在编码器之后,我们通过求和将维度 dpre = 50 的输入前语义特征向量抽象为维度 dsem = 50 的语义特征向量作为输出,将单个特征的维度从 50 压缩到 1。

4.3 相似性检测

为了检测相似对,我们使用 Siamese 网络,最适合比较两个二进制函数的相似性。 Siamese 网络由两个相同的子网络组成,这两个子网络是共享相同参数和权重的两个编码器。 Siamese 网络可以通过成对输入而不是单个输入来扩展数据集。 此外,Siamese 网络中的两个子网络共享权重和参数,有效减少了模型训练时的参数数量。

编码器网络的输入是通过静态分析获得的语义前特征。 特征融合后,前语义特征转化为语义特征。 最后,比较器网络使用这两个子网络的输出作为输入来计算相似度。 考虑到与相关工作的可比性,我们像大多数论文一样使用余弦相似度作为我们的相似度检测算法。 值得一提的是,该模型可以利用多种相似性检测算法,包括欧氏距离、曼哈顿距离、皮尔逊相关系数等。

另外,这两个子网络的损失函数是均方误差(MSE)。 Siamese网络的输出是两个输入函数相似的概率。 我们认为如果该值越接近 1,这两个函数就越相似。

5. 实验结果

在本节中,我们旨在探讨两个研究问题:首先,研究不同编译选项下IFAttn对BCSA的效果;其次,探讨如何通过使用注意力机制来提升IFAttn在BCSA上的性能。

5.1 实验数据集

我们使用了由Kim等人(2020)提供的BINKIT数据集的一部分进行评估。BINKIT是一个全面的基准数据集,包含243,128个二进制文件,这些文件是从51个软件包源代码编译而来,涵盖了1352种不同的编译器、编译选项和编译目标组合。该数据集包含了为八种架构和五个优化级别(从O0到O3以及Os)编译的二进制文件,并考虑了混淆选项。BINKIT分为七个子数据集:NORMAL、SIZEOPT、NOINLINE、PIE、LTO、OBFUSCATION和ASE。在本研究中,我们选择了OBFUSCATION数据集的一部分构建了我们的Obfus数据集,该数据集包括四种混淆选项:虚假控制流(BCF)、指令替换(SUB)、控制流扁平化(FLA)以及所有混淆方法的组合。BCF混淆通过添加虚假控制流显著改变特征;SUB混淆替换算术指令同时保持语义不变;FLA混淆改变控制结构的谓词。此外,我们还使用了ASE数据集的一部分构建了我们的Mix_options数据集,该数据集包括六种不同架构、四个优化级别和两种编译器。

5.2 实验设置

我们从源代码中提取N个独特函数,并基于不同的编译选项生成一个最多包含 N×MN \times M 个函数的数据集,其中M代表编译选项的组合数量。函数内联可能导致数据集中实际的函数数量少于 N×MN \times M。对于每个独特函数f,随机选择另外两个函数,满足以下条件:一个真阳性(TP)函数 fTPf_{TP},它来自与f相同的源代码,但编译选项不同;一个真阴性(TN)函数 fTNf_{TN},它来自不同的源代码,并使用与 fTPf_{TP} 相同的编译选项。我们为每个独特函数生成这样的函数对,用于函数对相似度检测任务(FPSDT),从而获得大约 2×N2 \times N 个函数对。此外,对于函数搜索任务(FST),我们将N个函数对分为查询集和数据集,来自相同源代码但使用不同编译选项的函数被分配到不同的集合。然后,我们遍历查询集中的函数,在数据集中找到最相似的前K个函数。如果找到实际相似的函数,则查询成功。所有实验均在配备12核心CPU和Quadro RTX 5000 GPU的服务器上进行。我们将Obfus和Mix_option两个数据集随机分为十个子集,每个数据集使用八个子集进行模型训练,另一个子集用于验证,最后一个子集用于测试。在划分测试数据集时,我们确保相同名称的函数不会同时出现在训练集和测试集中。此外,表3展示了本文用于衡量检测性能的评估指标。

5.3 基线方法

本文中的前语义特征参考了TIKNIB,并且TIKNIB在跨架构、跨优化、跨混淆和跨编译器的FPSDT任务中,仅使用前语义特征就能取得良好的效果。因此,我们将TIKNIB作为评估中的主要比较基准。考虑到BCSA研究方法的多样性,我们选择了几项以前的BCSA研究作为比较基准,包括Gemini、Codee 和 Asteria。Gemini 首次将 Siamese 网络与图嵌入应用于 BCSA,证明其比其他方法更为准确和有效;Codee 首次在 BCSA 中使用张量编码函数,并且独特地在函数编码阶段未使用神经网络;Asteria 则使用函数的抽象语法树(AST)作为计算相似性的特征,这与本文选择的前语义特征大不相同,因此我们也将其作为比较基准。需要注意的是,我们在比较 TIKNIB 时使用了相同的数据集,而在与 Gemini、Codee 和 Asteria 的实验中,仅使用了部分数据集。这是因为除 TIKNIB 外,其他方法只提供了部分实验数据集,因此我们只比较了它们提供数据集的部分实验结果。

5.4 RQ1:总体有效性

从整体实验结果分析可以看出,IFAttn的整体效果相比基线方法有显著提升。与TIKNIB、Gemini、Asteria和Codee相比,IFAttn的平均AUC分别提高了0.13%、4.56%、19.81%和2.86%;同时,平均AP分别提高了0.25%、5.50%、54.06%和2.95%。令人兴奋的是,IFAttn的平均TOP-1和TOP-5分别比TIKNIB提高了73.75%和87.72%。尽管在某些场景(跨混淆)中,IFAttn的AUC值略低于TIKNIB,但在其他指标(AP、TOP-1、TOP-5)中,IFAttn的表现更优。

5.5 RQ2:通过注意力机制进行特征融合

通过消融实验结果,我们可以看出注意力机制在模型中起到了至关重要的作用。与No-Attn相比,整个模型IFAttn的AUC、AP、TOP-1和TOP-5分别提高了3.51%、3.28%、16.38%和26.56%;与No-Net相比,分别其次,本文探讨了利用注意力机制将前语义特征抽象为语义特征。 在AUC和AP指标达到state-of-the-art的同时,TOP-K的性能显着提高,证明了注意力机制在BCSA中的有效应用。 然而,语义特征的有效性需要在该领域进行更深入的研究。 特别是,最近的许多研究都采用了 NLP 技术,在 BCSA 中测试这些方法的功效将是另一项关键研究。提高了9.22%、8.15%、22.61%和46.54%。

6. 总结

在本文中,我们在 BCSA 中设计了一种新颖的方法,它将可解​​释的特征与注意力机制结合起来。 首先,我们提取二进制函数的前语义特征,然后利用注意力机制进行特征融合,获得函数的语义特征(即带有注意力信息的特征)。 最后,使用 Siamese 网络根据这些语义特征训练模型。 我们在两个数据集上针对不同编译选项训练独特的模型,以检测函数对的相似性并测试函数搜索性能。 令人兴奋的是,我们发现我们的模型生成的语义特征可以在不同的架构、优化级别、混淆和编译器上保持稳健,并且优于最先进的方法。

---------------------------------------------------------------------------------------------------------------------------------

融合基本特征生成语义特征 :通过融合基本特征并利用注意力机制等方法,能够有效地将低级的、局部的基本特征转化为高级的、具备更强表现力的语义特征。这一过程使得模型能够更好地理解和处理函数的复杂行为和相似性,有助于提升二进制函数相似性检测和其他相关任务的性能。 验证基本特征融合后包含语义特征

特征重要性可视化 :在训练过程中,注意力机制通过计算不同特征之间的关联性,分配不同的注意力权重。通过查看这些权重,我们能够识别出模型在做出判断时,重点关注了哪些特征。具体来说,可以通过绘制注意力权重的热力图来可视化每个特征的重要性。 分析不同情况下的关键特征

全部评论 (0)

还没有任何评论哟~