希望二进制漏洞版主不要拒绝这篇文章放在此处,二进制相似性分析最主要的应用场景是在漏洞搜索或者漏洞补丁对比分析上,所以还是跟二进制漏洞息息相关的,如果看雪能加一个机器学习的板块那再好不过了。
本文介绍了3篇二进制代码相似性分析的顶会技术,他们体现了二进制代码相似性分析中一些最先进的思想。第一篇是Genius技术,是在《基于神经网络图嵌入的跨平台二进制代码相似性检测》论文中作为对比技术介绍,它首次使用图嵌入这个机器学习的概念去做二进制代码相似性分析,它涉及到了聚类算法、图比对、密码本等技术,也为后两篇论文打下了基础;第二篇是Gemini技术,它使用了更先进的Structure2vec算法计算图嵌入,并融合Siamese网络和神经网络;第三篇是腾讯科恩实验室最近的顶会技术,它以Gemini的思路作为基础,使用了更多的自然言语处理和深度学习算法去训练程序控制流图中基本块语义信息、结构信息、顺序信息。
最近,科恩实验室顶会《基于语义感知的神经网络的二进制代码相似度检测》让我眼前一亮。因为当时我也正尝试在二进制代码分析中引入机器学习,正在试用的是随机森林和adaboost算法(相较之下太low了),打算用它们做一个独立于IDA的func_split,用来识别二进制代码的函数。然后,就去看了一下这个论文,看上去很高大上。但郁闷的是,对提到的二进制相关知识都很熟悉,但对算法应用的原因和意义都很懵逼。就这样,深度学习在二进制分析上的应用让我产生了极大兴趣,我决定好好研究下。但是这个论文用的机器学习算法太多了,而且工作是基于另一篇论文的基础,为了搞懂这个论文,我决定先去读它的基线论文 《基于神经网络图嵌入的跨平台二进制代码相似性检测》,然后再来看看科恩顶会的创新和精妙之处 。
加入神经网络的图嵌入
到这里,Gemini做二进制代码的相似性分析基础架构都有了(即基于Structure2vec算法生成2个二进制函数的ACFG图嵌入,然后通过比较2个嵌入向量的相似性),神经网络有什么用?这时,神经网络算法就该出场了,给它安排的活是训练Structure2vec算法的参数,这时候有公式可能更直观些。
如公式2所示,这是Gemini选定用来在Structure2vec模型中做非线性映射的模型,这个非线性映射的输入xv是节点的基本块属性信息,u∈N(v)是节点的邻接节点信息,经过映射可得到一个节点的特征向量,而整个ACFG特征向量是通过所有节点聚合得来。其中,σ(·)是一个非线性变化, Gemini为了使非线性变化较为强大,就把σ(·)设计成n层全连接神经网络;W1是一个d*p矩阵,d是xv(基本块属性)的长度,p是生成的嵌入长度,W1也是待训练参数。
目前,总结来说就是,基础是Structure2vec模型中加入神经网络来训练其非线性变化的模型,再用聚合函数将ACFG节点的特征向量聚合成ACFG的图嵌入,结合神经网络的图嵌入最终输出的依然是ACFG图嵌入(也可以称为ACFG的特征向量)。
Siamese网络
在前面已经介绍过本文采用的二进制代码相似比对的方式就是比较图嵌入,那么图嵌入计算出来后,如何处理可以得到相似度的结果,答案就是Siamese网络,其模型特点是在样本量少的情况下识别类型.
如上图所示,Siamese模型本身包括了目标降维模块,正好上文的融入神经网络的图嵌入即可作为模型中的降维模块。整体模型的输入是两个待比较二进制函数的ACFG,经过嵌入网络得到降维的特征向量u1和u2,然后计算二者余弦距离,通过阈值判定结果是-1(非相似),还是1(相似)。当然,训练过程都有真实的标签,以便整个模型不断调整参数。
注:论文翻译可在博客的历史文章中找到。
现在来看看科恩的论文,着重说说它与Gemini的不同之处吧。
Gemini沿用了它的基线论文Genius提取CFG属性后(即ACFG)做图嵌入,该篇论文认为这将损失大量的语义信息,故而在形成类似Gemini中ACFG的过程前,引入了NLP(自然语言处理),即使用BERT算法对每个基本块序列进行训练,语义训练模型包含4个子任务,期望训练出的模型包含以下4个维度的信息:
MPNN(消息传递网络)是由Google科学家提出的一种模型,它本质上还是利用卷积神经网络学习图结构信息,只是形式框架上较为新颖,它通过收到邻居的消息来更新自己的状态,所以叫作消息传递网络。(目前还没有对卷积神经网络和MPNN进行细致学习,能理解的就是这么多,可能有不准确的地方)。不过,简单的理解,该模型的作用可以类比Gemini的Structure2vec模型,他们的输入都是CFG图(其中基本块属性被量化成有限维特征向量),输出都是图嵌入, 但这个图嵌入不是最终的图嵌入,它还要融入节点顺序模型的训练成果。
使用CNN(卷积神经网络)对CFG中节点相应顺序或者说布局进行训练也是该论文的一个重要创新部分。由于前面已经包含了基本块的属性信息和CFG整体结构信息,这个模型就专注于训练CFG的节点顺序信息。具体做法是,先把CFG节点布局抽象成01矩阵,然后对矩阵做卷积神经网络,学习CFG节点顺序相关特征,最后输出是一个特征向量。
该篇论文使用了三个模型从不同角度去训练二进制代码CFG中的信息,其中语义感知模型和结构感知模型是串联的,顺序模型可以与前面两个并连,最后使用MLP(多层神经网络)将两条线上输出的特征向量映射为一个特征向量。 融入三种模型后输出的这个特征向量才是和Gemini中基于神经网络的Structure2vec模型训练出的特征向量是类似地位。
在漏洞挖掘领域中,当一门新技术、一个新工具、一些新代码出现时,厉害的人往往可以收获一大批CVE,靠的是日益累积的技术能力和漏洞挖掘领域中敏锐的嗅觉。我看顶级研究也是靠这两样,以2016年Genius论文为基础,它使用了图比对和密码本去计算CFG图嵌入。到2017年Structure2vec论文出现时,Gemini能第一个想到用Structure2vec算法去替代图比对和密码本。BERT和MPNN也是2017年以后才出现的,科恩的论文能想到它们适应于解决ACFG人工生成问题和图嵌入计算的问题。 一个有前途的基础研究出来后,必定是遍地开花的结果,不过果实是留给准备充分的人!
本文另外发布在个人博客上。
2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!
最后于 1天前 被heyiuo编辑 ,原因: