浅析二进制代码相似性检测技术

admin 2022年10月20日23:14:56评论127 views字数 3359阅读11分11秒阅读模式

一、背景

代码相似性检测是指通过一定手段比较两段代码在语义、语法、程序逻辑等方面的相似性,包括源代码相似性检测和二进制代码相似性检测。由于源代码的获取难度较大,目前应用较为广泛的是二进制代码相似性检测。二进制代码相似性检测作为一种辅助分析技术,不仅在代码抄袭检测、代码预测有广泛应用,在漏洞搜索方面也有广阔的应用空间。

目前由于网络的高速发展,大量开源和第三方代码为工业化带来便利的同时,也不可避免地引入了许多同源漏洞。根据Sonatype发布的《2021年软件供应链状况报告》,仅是开源项目方面,相比2020年,供应就增加了20%,前四大开源生态系统(Java、JavaScript、Python和.NET)包含37,451,682个不同版本的组件;开源需求增加了73%,到2021年,世界各地的开发者从前四大生态系统下载了超过2.2万亿次开源包或组件;针对开源包和组件的攻击则是增加了650%,呈爆炸式增长,在四大开源生态系统中排名10%的项目里,其中29%的项目都至少包含一个已知的安全漏洞,在其余90%的项目中。也有6.5%的项目中包含至少一个已知漏洞。面对如此多变复杂的安全现状,应用代码相似性检测技术,可快速实现脆弱代码定位,进而评估漏洞带来的影响。



二、现有技术分析

由于二进制代码的分析难度较大,目前常规意义上的二进制代码相似性检测通常将二进制代码反汇编为汇编代码进行分析。有研究人员根据关注信息种类的不同,将二进制代码相似性检测分为4类:基于文本、基于属性度量、基于程序逻辑、基于语义

  • 最简单的基于文本的二进制代码相似性检测仅对汇编代码进行一定预处理,模糊化寄存器和内存地址进行序列匹配以进行代码相似性检测,其不考虑语义和程序逻辑信息,具有极低的时空复杂度,但在精确度上难以保证。尽管后来有研究者通过神经网络提高了精确度,但由于基于文本的二进制代码相似性检测对混淆代码的抵抗性较弱,目前更多是作为一种高效的辅助检测手段

  • 基于属性度量的二进制代码相似性检测主要是提取代码的属性特征,简单的属性特征包括算术指令、条件转移指令的数量等,构成多维度向量,通过不同代码片段特征向量距离的大小来表示代码之间的相似程度。但由于属性特征都是人为设计的,提取特征有限且无法保证其在不同平台的兼容性,目前同样更多地是作为一种辅助检测手段

  • 基于程序逻辑的二进制代码相似性检测更加关注程序的数据流和控制流信息,用控制流图(CFG)等方式包含数据流和控制流信息,通过图匹配方法计算控制流图之间的相似度,进而得出控制流图对应代码片段的相似程度。基于程序逻辑进行代码相似性检测拥有较高的准确度和不同编译器、平台的高兼容性,但代码的控制流图提取代价较大,图匹配算法的时空复杂度相比其他二进制代码相似性检测方法所采用的相似度计算方法要高很多。近年来,研究人员将神经网络应用到基于程序逻辑的代码相似性检测中,极大地提高了效率,在近些年逐渐成为新的研究方向。

  • 基于语义的二进制代码相似性检测充分借鉴自然语言处理,提取程序间的语义信息。由于汇编代码和高级语言在结构上具有相当程度的相似性,汇编代码的操作码和操作数、基本块、函数可类比为高级语言中的词、句和段,经过改进后的自然语言处理模型在提取汇编代码的语义上有着出色的表现。使用包含相似、不相似标签的代码对片段训练改进后的自然语言处理模型,通过比较模型输出的多维向量间的距离,即可判断代码片段之间的相似程度。

早期的检测方式只是提取代码的低级特征,并且需要人为设计提取哪些特征,准确度难以保证。后来研究人员逐渐将关注点转移到代码的高级特征,其能够更加准确地代表待检测代码,并且在跨平台检测上也有了更佳的表现。同时,研究人员也会同时将多种特征结合在一起,例如先后提取语义特征和程序逻辑特征并结合到一起,以更加全面地涵盖代码的总体特征并增加检测准确度。



三、检测方法

目前研究人员越来越多地使用神经网络来进行代码相似性检测以提升检测速度和准确度,尤其是自然语言处理模型和图神经网络的发展,极大地助力了汇编代码的语义特征和程序逻辑特征的提取。同时,使用神经网络具有更加广阔的应用场景,对于不同平台或编译器产生的二进制代码同样能达到不错的检测效果,并能降低人工设计和筛选特征带来的拟合。

使用神经网络进行二进制代码相似性检测的步骤大致可分为:代码预处理、模型训练、特征提取、相似性判断四步。

  • 预处理:在函数的汇编代码中,汇编代码的操作码种类基本固定且都含有一定的语义,而汇编代码的操作数可能会很多,但他们代表的语义特征基本相同,同时部分基本块不包含有效的语义等特征信息,因此为了减少特征提取难度,提高模型训练效率,对汇编代码进行归一化、无效指令过滤、同名函数合并等操作。例如:部分基本块只有单个指令,特征提取模型不能从这部分基本块中提取到有效信息,因此丢弃这部分指令及基本块。

  • 模型训练:使用经过预处理的函数汇编代码训练自然语言处理模型以提取代码的语义特征,或使用以基本块为节点的控制流图训练图神经网络以提取代码的逻辑特征。

  • 特征提取:使用训练好的模型提取代码的语义特征嵌入或图嵌入,目前越来越多的研究人员将语义特征和逻辑特征结合到一起,先提取基本块的语义特征生成语义特征嵌入向量,并将语义特征向量作为控制流图中基本块的属性之一输入到图神经网络中,以输出的图嵌入作为代码片段的特征嵌入。

  • 相似性判断:通过余弦相似度等方式对提取出的特征嵌入进行距离计算,从而进行相似性度量并判断代码相似性。



四、总结

二进制代码相似性检测技术在代码脆弱性检查、漏洞搜索等安全方面具有广阔的应用空间,随着二进制代码相似性检测技术的发展,引入高级代码特征以及综合多种特征维度进行相似性检测使得检测的准确度大幅提升,神经网络的引入则使二进制代码相似性检测的速度和准确度都得以保障,二进制代码相似性检测在安全方面正逐渐具有更大的应用价值。


参考文献:

[1] 方磊,武泽慧,魏强. 二进制代码相似性检测技术综述[J].计算机科学,2021,48(05):1-8.

[2] 方磊. 基于神经网络的二进制代码相似性检测关键技术研究[D].战略支援部队信息工程大学,2021.DOI:10.27188/d.cnki.gzjxu.2021.000034.

[3] 程蕾蓉. 面向漏洞检测的二进制代码相似性分析技术[D]. 哈尔滨工业大学, 2021.

[4] Sonatype. 2021 state of the software supply chain. https://www.sonatype.com/resources/state-of-the-software-supply-chain-2021

[5] Google.Tool for computing continuous distributed representations of words[EB/OL].(2013G07G30)[2020G03G07]. https://code.google.com/archive/p/word2vec/.

[6] Luo Z, Wang B, Tang Y, et al. Semantic-based representation binary clone detection for cross-architectures in the internet of things[J]. Applied Sciences, 2019, 9(16): 3283.

[7] Xu X, Liu C, Feng Q, et al. Neural network-based graph embedding for cross-platform binary code similarity detection[C]//Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communications Security. 2017: 363-376.


往期推荐:





浅析数据安全之密态化计算


PendingIntent劫持问题分析


vivo鲁京辉:数据安全与隐私保护是消费者的基本权利,是企业的“铁律”


vivo“千镜杯”作品提交通道已开启!大赛持续报名中,20万元奖金等你来战!


浅析二进制代码相似性检测技术
关注我们,了解更多安全内容

原文始发于微信公众号(vivo千镜):浅析二进制代码相似性检测技术

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月20日23:14:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   浅析二进制代码相似性检测技术http://cn-sec.com/archives/1361190.html

发表评论

匿名网友 填写信息