论文学习_Asteria: Deep Learning-based AST-Encoding for Cross-platform Binary Code Similarity Detection

ASTERIA是利用深度学习的AST编码方法,针对跨平台二进制代码相似性检测。通过抽象语法树表示二进制代码,结合Tree-LSTM捕获语义信息,并使用Siamese Network计算相似度。实验表明,ASTERIA在准确性和速度上均优于现有基线方法。
摘要由CSDN通过智能技术生成
论文名称发表时间发表期刊期刊等级研究单位

Asteria: Deep Learning-based AST-Encoding for Cross-platform Binary Code Similarity Detection

2021年IEEE DSNCCF B

中科院信工所

0. 摘要

研究背景二进制代码相似性检测是许多安全应用程序的基本技术,例如漏洞搜索、补丁分析和恶意软件检测。随着物联网设备中关键漏洞的增加,越来越需要检测类似的代码以进行跨架构的漏洞搜索。
现存问题各种物联网硬件架构和软件平台需要在相似性检测中捕获代码片段的语义等价性。然而,现有的方法不足以捕获语义相似性。
核心思想函数的抽象语法树(AST)包含丰富的语义信息,自然语言处理(NLP)技术具有强大的语义理解能力。通过结合AST与NLP,提出一种基于深度学习的AST编码方法ASTERIA,进而识别跨平台函数间的语义等价性。
研究内容用 Tree-LSTM 网络从 AST 中学习函数的语义表示。然后通过测量两个表示向量之间的相似度可以高效、准确地进行相似度检测。
实验结果评估结果表明,论文的方法在二元相似性检测方面大幅优于基于 AST 的工具 Diaphora 和最先进的方法 Gemini。我们的方法在相似度计算方面比 Diaphora 和 Gemini 快几个数量级。在漏洞搜索应用中,我们的工具成功识别了 5,979 个物联网固件镜像中的 75 个漏洞函数。

1. 引言

研究背景:物联网设备的固件可能包含漏洞,这些漏洞已经引起了破坏性攻击。物联网固件安全分析被认为是确保物联网设备安全的有效方法。

现存问题:在嵌入式固件开发过程中,采用代码重用的手段可以有效的提升软件开发的效率,但也可能导致漏洞在不同供应商和不同版本的固件之间传播。为了实现嵌入式固件中同源漏洞的快速检测,二进制代码相似性检测技术应运而生。该技术可以确定两个二进制代码片段之间的相似性,可用于在给定已知漏洞函数的情况下寻找其他同源漏洞函数。

研究动机:二进制代码相似性检测技术通常可以分为,基于动态分析的方法和基于静态分析的方法:

  • 基于动态分析的方法通过运行程序来捕获运行时行为作为函数特征,在大规模固件分析任务中存在可扩展性差的问题(运行固件需要特定的设备,并且模拟固件也非常困难)。
  • 基于静态分析的方法主要从汇编代码中提取函数特征。这些方法包括,(1)计算汇编代码之间的编辑距离,由于不同架构指令存在差异,因此该方法不适用于跨架构二进制代码相似性检测;(2)计算架构无关的函数统计特征,解决了跨架构二进制代码相似性检测的问题;(3)通过图同构技术比较汇编代码级别的控制流图,进一步提升了代码相似性检测的能力。基于静态分析的方法对于大规模固件分析来说速度更快且更具可扩展性,但由于语义信息的匮乏经常会产生误报。

由于不同架构中的同源易受攻击的函数通常共享相同的语义,因此跨平台的BCSD能够以可扩展的方式捕获函数语义信息是可取的。

研究方法:论文通过抽象语法树(AST)实现二进制代码的语义表示,通过 Tree-LSTM 实现二进制代码语义表示进行编码,通过 Siamese Network 完成二进制代码相似性检测任务。

  • 抽象语法树(AST):AST 是一种代码的树状表示,通常用于源代码编译的语义分析,并保留明确定义的语句组件、显示语句顺序和执行逻辑。AST 包含丰富的语义信息,并且很容易在二进制分析时通过反编译函数生成。因此,AST 中包含的语义可以潜在地用于识别跨架构的同源函数。
  • 树状长短期记忆网络(Tree-LSTM):Tree-LSTM 网络已被证明在预测两个句子的语义相关性方面比普通 LSTM 具有更好的性能,论文通过Siamese Network 集成两个 Tree-LSTM 网络来计算编码向量之间的相似度作为 AST 相似度。

实验结果:论文进行了一系列评估,结果表明论文的方法优于基线方法。在相似性检测精度方面,我们的方法 ASTERIA 比 Diaphora 好 77%,比 Gemini 好 4.4%。同时 ASTERIA 的检测速度比 Gemini 快 104 倍,比 Diaphora 快 106 倍。

2. 准备工作

抽象语法树(AST)

AST概述:AST 是编译和反编译过程中代码抽象语法结构的树状表示,AST 中的不同子树对应于源码中不同的代码范围。图1左侧为zsh v5.6.2中函数histsizesetfn源代码,右侧为histsizesetfn源代码对应的 AST,连接源代码和 AST 的线表明 AST 中的节点对应于源代码中的表达式或语句。

图1. 函数histsizesetfn的源代码以及对应的x86架构的反编译AST

AST 中的节点可分为,控制函数执行流程的语句节点与执行各种计算的表达式节点。语句节点包括if、for、while、return、break等,表达式节点包括常见的算数运算符和位运算符。

图2. 不同架构下函数 histsizesetfn 的 AST 和 CFG

AST vs. CFG:CFG 和 AST 都是函数的结构表示。CFG 包含线性代码序列基本块之间的跳转关系,受不同架构的影响很大。AST 是由架构无关的中间表示生成的,在跨架构中表现出更好的稳定性,如图2所示。

树状长短期记忆网络(Tree-LSTM)

递归神经网络(RNN):在自然语言处理中,递归神经网络(RNN)应用广泛,并且性能优于卷积神经网络。 考虑到句子可以包含任意数量的单词,RNN 将任意长度的序列作为输入。 然而,由于梯度消失和梯度爆炸问题,标准 RNN 无法处理长期依赖性。

长短期记忆网络(LSTM):作为 RNN 的变体之一,长短期记忆(LSTM)被提出来解决此类问题。 LSTM 引入了门机制,包括输入门、遗忘门和输出门以避免梯度消失和爆炸。 然而,LSTM只能处理序列输入,不能处理结构化输入。

树状长短期记忆网络(Tree-LSTM):Tree-LSTM 被提出来处理树结构输入。 Tree-LSTM模型的计算是自下而上的。 对于树中的每个非叶节点,来自子节点的所有信息都会被收集并用于当前节点的计算。Tree-LSTM 主要可分为 Child-Sum Tree-LSTM 与 Binary Tree-LSTM,其中Binary Tree-LSTM考虑子节点的顺序,可以更好的提取 AST 中的语义信息,因此论文使用Binary Tree-LSTM 对 AST 进行编码。

相似性计算问题

给定两个二进制函数 F1 和 F2,令 T1T2 表示这两个二进制函数的 AST(通过反编译二进制函数提取对于的 AST)。AST 表示为 T = <V, E>,其中 VE 分别是节点和边的集合。在节点集合V = {v1v2,... , vn } 中每个节点对应一个数字,如下表所示。

Node TypeLabel

Statement

(语句节点)

if, block, for, while, switch, return, goto, continue, break1,2,3,4,5,6,7,8,9

Expression

(表达式节点)

asgs(赋值运算符)10~17
cmps(比较运算符)18~23
ariths(算数运算符)24~34
other(其他运算符)34~43

E 集合中的每一条边对应两个节点之间的连接,前一个节点为父节点,后一个节点为子节点。 给定两个 AST T1T2,可以定义一个模型 M(T1, T2) 来计算它们之间的相似度,其中相似度得分范围从0 到 1。在理想情况下,同源函数 F1F2 对应的 AST 的模型输出 M(T1, T2) 为1,非同源函数 F1F2 对应的 AST 的模型输出 M(T1, T2) 为0。

在相似性分数的基础上,论文进一步利用 F1F2 的被调用函数数量进行相似性校准。具体来说,令 C1C2 分别表示函数 F1F2 调用函数的数量,定义校准函数 S(C1, C2) ,范围从0到1。最终函数相似度计算定义为,F(F1, F2) = M(T1, T2) × S(C1, C2),该分数越大则说明两个函数相似度越高。

3. 研究内容

 ASTERIA概述

图3描述了 ASTERIA 的工作流程。给定两个二进制函数,首先对它们进行反汇编与反编译以提取AST。之后对 AST 进行数字化(节点映射为整数值)与格式转换(转化为二叉树格式)。然后,两个 AST 由 Siamese Network 中的两个 Binary Tree-LSTM 进行编码,并通过两个编码计算相似度。最后,使用函数调用关系来校准 AST 相似度。

图3. ASTERIA的工作流程

AST相似度计算

论文使用了 Tree-LSTM 网络和 Siamese 网络,其中 Tree-LSTM 用于对 AST 进行编码,Siamese网络利用 AST 编码计算 AST 相似度。

AST Encoding:Tree-LSTM 网络最初被用来对树状的句子进行编码,并总结其中的语义信息。该网络在处理树结构输入时可以保留普通 LSTM 门控机制的每个属性。普通 LSTM 和 Tree-LSTM之间的主要区别在于处理上一轮输出的方法,普通 LSTM 仅利用序列上一轮输出中的一个元素,Tree-LSTM 会利用上一轮输出的所有子节点,如图4所示。

 图4. 相似度计算过程详解

上图展示了节点 vk 进行编码的详细过程,由三部分组成的节点信息输入到 Tree-LSTM,这三部分分别是:节点嵌入 ek、隐藏状态 hkl hkr 以及细胞状态 ckrckl。其中,节点嵌入 ek 是通过节点 vk 嵌入到高位表示向量来生成的。隐藏状态 hkl 、隐藏状态 hkr 、细胞状态 ckr 以及 细胞状态ckl 是子节点编码的输出。Tree-LSTM有三个非常重要的门和状态(输入门、输出门以及遗忘门),用于避免梯度爆炸和梯度消失,计算公式如下。

Siamese Network:Siamese 网络 M(T1, T2) 利用 AST 编码来计算两个 AST之间的相似度,如图4所示。具体来说,该网络由两个共享参数的 Tree-LSTM 网络组成。在计算过程中,Siamese首先利用 TreeLSTM 将 AST 编码为向量,之后通过减法和乘法捕获两个编码向量之间的关系,最后通过 softmax 函数生成 2 维向量,其公式如下。

Siamese 网络的输出是一个 2 × 1 的向量,输出格式为 [dissimilarity score, similarity score],其中第一个值代码相异度得分,第二个值代码相似度得分。模型训练时,Siamese Network的输入格式为<T1,T2,label>。在论文中,标签向量 [1, 0] 表示 T1 和 T2 来自非同源函数对,向量 [0, 1] 表示同源。

AST相似度校准

在二进制函数中,许多潜在属性(例如变量和语句数量)会随着不同架构而变化,图2c与图2d。二进制函数的调用函数数量是一个独立于架构的特性(函数调用由编程语言和编译器绝对),并且可以通过逆向工程轻易的计算调用函数的数量。因此论文结合函数调用数量与 AST 相似度来计算函数相似度,如图5所示。

图5. AST 相似度校准概述

同源函数可能具有相同数量的调用函数,因为它们共享相同的源代码。考虑到编译期间可能会发生函数内联(可能减少调用函数的数量),论文对可能存在的内联函数进行过滤(过滤掉汇编指令小于阈值的调用函数)。通过上面的内容,论文对二进制函数的相似度进行了最终的校准,其公式如下。

4. 实验评估

实验设置

论文使用 IDA Pro 7.3 及其插件 Hexray Decomplier 对二进制代码进行反编译,并从中提取 AST。由于Hexray Decomplier 目前仅支持 x86、x64、PowerPC(PPC) 以及 ARM 架构,因此论文无法处理属于 MISP 架构的二进制文件。 AST 进行数字化(节点映射为整数值)与格式转换(转化为二叉树格式)。在 Tree-LSTM 进行 AST 编码之前,AST 中的节点通过 nn.Embedding 嵌入到 16 维向量中。除此之外,论文将状态向量hklhkrckl 以及 ckr分配为 0 向量。

模型训练的损失函数是BCELoss,它测量标签和预测之间的二元交叉熵。 AdaGrad 优化器用于梯度计算和损失计算后的权重矩阵更新。由于 Tree-LSTM 的计算步骤取决于 AST 的形状,因此,我们无法进行并行批量计算,这使得批量大小始终为1。模型训练了60个epoch。

实验在配备两个 Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz 的本地服务器上进行,每个 CPU 具有 16 核、128GB RAM 和 4T 存储。 ASTERIA的代码在Python 3.6环境中运行。我们使用 gcc v5.4.0 编译器编译数据集中的源代码,并使用 buildroot-2018.11.1 进行 Buildroot 数据集构建。我们使用工具 binwalk 来解压固件以获得二进制文件以进行进一步分析。

数据集构建

基线方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值