1、h t t p:/ww w.j s j k x.c o mD O I:1 0.1 1 8 9 6/j s j k x.2 2 0 3 0 0 2 7 1到稿日期:2 0 2 2-0 3-2 9 返修日期:2 0 2 2-0 7-2 2基金项目:国家重点研发计划(2 0 2 1 Y F B 3 1 0 0 5 0 0)T h i sw o r kw a ss u p p o r t e db yt h eN a t i o n a lK e yR&DP r o g r a mo fC h i n a(2 0 2 1 Y F B 3 1 0 0 5 0 0).通信作者:潘祖烈(p a n z u
2、l i e 1 7n u d t.e d u.c n)基于预训练汇编指令表征的二进制代码相似性检测方法王泰彦1,2潘祖烈1,2于 璐1,2宋景彬31国防科技大学电子对抗学院 合肥2 3 0 0 3 72网络空间安全态势感知与评估安徽省重点实验室 合肥2 3 0 0 3 733 1 4 0 1部队 长春1 3 0 0 2 2(w a n g t y n u d t.e d u.c n)摘 要 二进制代码相似性检测技术近年来被广泛用于漏洞函数搜索、恶意代码检测与高级程序分析等领域,而由于程序代码与自然语言有一定程度的相似性,研究人员开始借助预训练等自然语言处理的相关技术来提高检测准确度。针对现有方
3、法中未考虑程序指令概率特征导致的准确率提升瓶颈,提出了一种基于预训练汇编指令表征技术的二进制代码相似性检测方法。设计了面向多架构汇编指令的分词方法,并在控制流与数据流关系基础上,考虑指令间顺序出现的概率与各个指令单元使用的频率等特征设计预训练任务,以实现对指令更好的向量化表征;结合预训练汇编指令表征方法,对二进制代码相似性检测下游任务进行改进,使用表征向量替换统计特征作为指令与基本块的表征,以提高检测准确率。实验结果表明,与现有方法相比,所提方法在指令表征能力方面最高提升2 3.7%,在基本块搜索准确度上最高提升3 3.9 7%,在二进制代码相似性检测的检出数量上最高增加4倍。关键词:二进制代
4、码;相似性检测;指令表征;分词方法;预训练任务中图法分类号 T P 3 1 3 B i n a r yC o d eS i m i l a r i t yD e t e c t i o nM e t h o dB a s e do nP r e-t r a i n i n gA s s e m b l yI n s t r u c t i o nR e p r e s e n t a t i o nWANGT a i y a n1,2,P ANZ u l i e1,2,YUL u1,2a n dS ON GJ i n g b i n31C o l l e g eo fE l e c t r o
5、 n i cE n g i n e e r i n g,N a t i o n a lU n i v e r s i t yo fD e f e n s eT e c h n o l o g y,H e f e i 2 3 0 0 3 7,C h i n a2A n h u iP r o v i n c eK e yL a b o r a t o r yo fC y b e r s p a c eS e c u r i t yS i t u a t i o nAw a r e n e s sa n dE v a l u a t i o n,H e f e i 2 3 0 0 3 7,C h i
6、 n a3P L A3 1 4 0 1,C h a n g c h u n1 3 0 0 2 2,C h i n a A b s t r a c t B i n a r yc o d es i m i l a r i t yd e t e c t i o nh a sb e e nw i d e l yu s e di nv u l n e r a b i l i t ys e a r c h i n g,m a l w a r ed e t e c t i o n,a d v a n c e dp r o g r a ma n a l y s i s a n do t h e r f i e
7、 l d s i n r e c e n t y e a r s,w h i l ep r o g r a mc o d e i s s i m i l a r t on a t u r a l l a n g u a g e i nad e g r e e,r e s e a r c h e r s s t a r t t ou s ep r e-t r a i n i n ga n do t h e rn a t u r a l l a n g u a g ep r o c e s s i n gr e l a t e d t e c h n o l o g i e s t o i m p
8、 r o v e a c c u r a c y.Ab i n a r yc o d e s i m i l a r i t yd e t e c t i o nm e t h o db a s e do np r e-t r a i n i n ga s s e m b l y i n s t r u c t i o nr e p r e s e n t a t i o n i sp r o p o s e d t od e a lw i t h t h e a c c u r a c yb o t t l e n e c kd u e t o i n s u f f i c i e n t
9、 c o n-s i d e r a t i o no f i n s t r u c t i o np r o b a b i l i t yf e a t u r e s.I t i n c l u d e st o k e n i z a t i o nm e t h o df o rm u l t i-a r c ha s s e m b l yi n s t r u c t i o n s,a n dp r e-t r a i-n i n g t a s k s t h a t c o n s i d e r i n gc o n t r o l f l o w,d a t a f
10、l o w,i n s t r u c t i o n l o g i c a n dp r o b a b i l i t yo f o c c u r r e n c e,t oa c h i e v eb e t t e r v e c t o r i z e dr e p-r e s e n t a t i o no f i n s t r u c t i o n s.D o w n s t r e a mb i n a r yc o d es i m i l a r i t yd e t e c t i o nt a s ki si m p r o v e db yc o m b i
11、 n i n gp r e-t r a i n i n gm e t h o dt og a i na c c u r a c yb o o s t.E x p e r i m e n t ss h o wt h a t,c o m p a r e dw i t ht h ee x i s t i n gm e t h o d s,t h ep r o p o s e dm e t h o di m p r o v e s i n s t r u c t i o nr e-p r e s e n t i n gp e r f o r m a n c eb y2 3.7%a t t h em a
12、 x i m u m,a n d i m p r o v e sb l o c ks e a r c h i n ga b i l i t ya n ds i m i l a r i t yd e t e c t i o np e r f o r m a n c eb yu pt o3 3.9 7%a n d4 0 0%r e s p e c t i v e l y.K e y w o r d s B i n a r yc o d e,S i m i l a r i t yd e t e c t i o n,I n s t r u c t i o nr e p r e s e n t a t
13、i o n,T o k e n i z a t i o n,P r e-t r a i n i n gt a s k 1 引言近年来开源软件逐渐普及,代码复用越来越普遍,这大幅提高了软件行业的生产效率,也为开源社区带来了活力。在代码复用的过程中,如果没有对引入代码的质量进行持续把控,会出现大量软件问题,如使用重复代码、常函数等产生的代码坏味1,以及引入漏洞代码所导致的供应链安全问题。学术界针对诸类问题提出了大量代码相似性检测技术,并将其广泛应用于漏洞代码搜索2、恶意代码检测3、函数边界识别与值集分析等领域,且在学术界与工业界的应用中都有较好表现,成为应用深度学习解决软件问题很好的范例。在软件安
14、全分析与研究中,由于涉及知识产权保护等其他原因,研究人员通常无法获取源代码,这时,研究能够在二进制代码层面进行软件相似性检测的技术尤为重要4。研究人员将由同一份源代码通过不同编译方式形成的二进制代码视为相似代码,二进制代码相似性检测是为了对由不同编译方式编译出的程序代码进行相似度比较,以满足跨架构、跨编译器与编译选项等情况,最终实现漏洞代码搜索与代码克隆检测等任务。然而,使用不同编译器的不同优化选项在不同平台下进行编译,形成的可执行程序往往差异极大,这为二进制代码相似性检测带来了很大困难5。为解决这一问题,现有方法将检测过程分为3步:1)特征提取,研究人 员 通 过 逆 向 分 析 提 取 二
15、 进 制 程 序 代 码 的 特征;2)特征表征,选择合适 的方 式对 代码 特 征进 行自 动化表征;3)根据表征形式使用相应的相似度计算方法,最终实现二进制代码相似性检测。在相似性检测部分,大多数方法使用深度学习技术,而提取怎样的特征以及将怎样的程序代码表征形式输入深度学习模型是研究重点。当前对程序代码的特征提取与表征有3种选择:1)利用 D i f f6等工具提取程序的原始字节码,直接输入深度神经网络;2)将G e m i n i7,V u l S e e k e r8等工具使用人工选取的统计特征,结合到程序的控制流图等图结构中,作为神经网络的输入;3)W o r d 2 V e c9,
16、A s m 2 V e c1 0,P a l m T r e e1 1等使用自然语言处理技术自动化地学习得到程序指令表征,生成的指令表现形式为特征向量,之后将其输入到用于相似性检测的深度学习模型中。但现阶段的方法仍面临跨架构检测准确率低、未充分考虑指令间顺序出现的概率、未考虑各个单元在不同位置的出现频率等问题。诸多问题导致方法本身的指令表征能力在实用与可扩展方面存在局限性,应用指令表征方法的二进制代码相似性检测技术的准确率在提升过程中存在瓶颈。本文提出了一种基于预训练汇编指令表征的二进制代码相似性检测方法,设计针对多架构汇编指令的分词方法,并在控制流与数据流基础上考虑指令的出现概率,设计预训练任务,实现预训练汇编指令的表征,并结合基于图嵌入孪生神经网络的二进制代码相似性检测方法,实现更高的相似性检测准确度。实验结果表明,所设计的预训练方法在跨架构汇编指令表征方面相比现有方法最高有2 3.7%的提升。使用指令表征向量的均值表示基本块时,在各个架构下进行基本块搜索的准确度都在8 7%以上,且相比现有方法最高有3 3.9 7%的提升。在二进制代码相似性检测下游任务中,针对C V E漏洞函数搜