本文发表于USENIX Secuirty 2022,第一作者是Cisco公司的Andrea Marcelli,论文链接:https://www.s3.eurecom.fr/docs/usenixsec22_marcelli.pdf
一、背景
二进制函数相似度旨在准确计算两端二进制代码之间的相似性程度,将一对函数的二进制表示作为输入,并生成一个捕捉它们之间“相似性”的数值作为输出。这个问题一般是很有挑战性的。事实上,软件通常使用不同的工具链、不同的编译器优化设置和flag进行编译,并且,在一些场景(如物联网设备)中,软件被编译到不同的架构,这使得一般的二进制相似性计算方法无效。
二进制函数相似度在不同的系统安全研究领域中起着至关重要的作用,因为许多研究问题都需要将函数相似度的度量作为核心部分。例如,逆向工程师经常处理被静态链接(没有符号)的被分离的二进制文件,而二进制代码相似性方法可以用于将未知的函数与先前生成的数据库中的函数匹配,从而节省大量的逆向工程工作时间。
二、系统性研究
1、函数表示方法总结
二进制函数本质上是对应于特定于体系结构的机器代码和数据的字节流。从这个原始输入开始,研究人员使用了许多方法来提取高级信息,这些方法按照抽象级别排序如下:
原始数据
汇编
规范化汇编
中间层表示IR
函数结构(控制流图)
数据流分析
动态分析
符号执行和分析
2、计算相似度方法总结
文章将现有评估二进制函数相似度的技术分为两类:直接比较和间接比较。
直接比较:采用函数的原始输入数据进行比较,或者对函数实现某种特征提取然后进行比较。特征提取方案通常需要学习和训练模型。此类模型用于输出一对函数之间的相似度。
间接比较:此类技术将输入特征映射为一个“浓缩”的低维表示(embeding),可以很容易地通过距离度量(如欧氏距离或余弦距离)进行比较。这些解决方案允许有效的一对多比较。
文章选取了三类最具代表性的二进制函数相似度比较方法:
模糊哈希:不同于传统密码哈希,它们被特意设计成相似的输入值映射到相似的哈希。
Code embedding试图采用现有的自然语言处理(NLP)技术,通过将汇编代码作为文本处理来解决二进制函数相似问题。
Graph embedding基于功能控制流图来捕获特性,而且这些特性是能够跨架构的。这些embedding可以通过自定义算法或更复杂的机器学习技术生成,如图神经网络(GNN)。Graph embedding还经常将每个基本块的信息编码到图的相应节点中,以增加更多的表达能力。
PS:embedding是深度学习领域的一个术语,将target表示成特征向量的形式。
3、参考的论文和选择的方法
下图展示了作者选取的论文以及作者,标识说明:[S]安全,[PL]编程语言,[ML]机器学习,[SE]软件工程。[Mono]和[Cross]单一架构场景还是跨架构场景。
作者在综合考虑了现实的可用性、代表性、覆盖社区的范围以及最新的研究趋势,选出了最具代表性的十种方法进行重新实现和评估。
三、实现与评估
实现
作者在一个公共框架之上重新实现了选取的这些方法的核心模型,具体实现如下:
在二进制分析阶段,作者使用IDA Pro 7.3;
在特征提取方面,依赖于一组Python脚本,使用了IDA Pro api、Capstone和NetworkX;
在Tensorflow1.14中实现了所有的神经网络模型。
Trex例外,它是建立在Fairseq之上的,这是一个用于PyTorch的序列建模工具包。
使用Gensim3.8实现Asm2Vec并运行instructionembedding models。
评估
数据集设置
作者创建了两个数据集,Dataset-1和Dataset-2,旨在捕捉现实世界软件的复杂性和可变性,涵盖了二进制函数相似性的不同挑战:
(i)多种编译器家族和版本,
(ii)多种编译器优化
(iii)多种架构和位
(iv)不同性质的软件(命令行实用程序vs. GUI应用程序)。
实验设置
作者在实验阶段设置了六个不同的实验任务,不同的实验任务控制不同的变量进行相互对照。具体如下:
(1)XO:不同的编译优化设置,但编译器、编译器版本和体系结构相同。
(2) XC:不同的编译器、编译器版本和编译优化设置,但具有相同的体系结构和位数。
(3) XC+XB:不同的编译器、编译器版本、编译优化设置和位数,但架构相同。
前三个任务评估仅局限于单一体系结构的技术。
(4) XA:不同的体系结构和位数,但编译器、编译器版本和编译优化设置相同。
第四项任务是分析固件映像,因为它们始终使用相同的编译器和编译器选项进行交叉编译。
(5) XA+XO:不同的体系结构、位数和编译优化设置,但编译器和编译器版本相同。
第五个任务旨在支持Dataset-2,它只使用一个编译器和编译器版本进行编译。
(6) XM:任意体系结构、位数、编译器、编译器版本和编译优化设置。
还考虑了XM的三个子数据集:XM- s、XM- m和XM- l,它们分别包括小型函数(少于20个基本块)、中型函数(在20到100之间)和大型函数(超过100个块)。
(1) 受试者工作特征曲线(ROC)的AUC值(area under curve, AUC),这是一个总体衡量指标,越接近1表示性能越好。
(2) 两种常用的排名指标,平均倒数排名(MRR)和不同的K阈值下的召回率(Recall@K)。
对于第一个测试,作者为每个任务构建了一个包含50k的positive pairs和50k的negative pairs的数据集,在dataset -1和dataset -2上总共有700k个函数对。
在排名测试中,作者选择了1400对positive pairs和140k对negative pairs,即每一个positive pairs对应100对negative pairs。
测试覆盖了438,981个独特的二进制函数,并限制至少有5个基本块。在每个任务中,根据相应的约束条件随机抽样。
实验结果
1、模糊哈希间的比较
实验说明了当一次只考虑一个自由变量时,即使是像模糊哈希这样的简单方法也是有效的,当受测函数同时包含多个自由变量时(不同架构、编译器、编译器设置和位数等),模糊哈希这样一种简单的方法不再有效,不能够有效反映出包含不同类别特征的函数间二进制代码相似度。
2、机器学习方法间以及与模糊哈希的比较
结果表明,在生成函数(即embedding)向量表示的模型中,来自论文[40]Y ujia Li,Chenjie Gu, Thomas Dullien, Oriol Vinyals, and Pushmeet Kohli. Graph matchingnetworks for learning the similarity of graph structured objects. InInternational conference on machine learning,pages 3835–3845. PMLR, 2019.的GNN在所有度量和所有任务中都达到了最佳值。当在AUC指标上比较时,大多数机器学习模型的表现非常相似,但在排名指标(MRR10和recall@1)上有所不同。
3、腾讯CodeCMR实验
四、总结
文章首次在二进制函数相似度研究领域中对前人研究成果进行了系统性的Measurement,通过在公共的基础框架上重新实现了挑选的具有代表性的方法,在具有现实意义的数据集上训练和评估这些方法的效果,实现了一个相对公平的评估,然后在文章的discussion部分,经由实验数据得出的结论,回答了为什么机器学习算法在此领域相比模糊哈希更具优势、哪些方向值得研究等研究问题。具体内容见Q&A in Discussion。
五、Q&A in Discussion
1、与更简单的模糊哈希方法相比,新的基于机器学习的解决方案的主要贡献是什么?
2、不同的函数特征集会有什么影响?
由于缺乏训练阶段,模糊哈希方法对函数的特征类型更敏感。
3、不同的方法能更好地完成不同的任务吗?特别是,跨架构的比较是否比使用单一架构更困难?
4、有没有什么特定的研究方向看起来更有希望成为未来设计新技术的方向?
文案:许嘉浩
排版:LC
戳“阅读原文”即可查看论文原文哦~
复旦白泽战队
一个有情怀的安全团队
还没有关注复旦白泽战队?
公众号、知乎、微博搜索:复旦白泽战队也能找到我们哦~
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...