论文名称 | 发表时间 | 发表期刊 | 期刊等级 | 研究单位 |
How Machine Learning Is Solving the Binary Function Similarity Problem |
2022年 | USENIX | 安全顶会 | 思科公司 |
0. 摘要
研究背景:在各种不同的问题中,精准计算两段二进制代码相似性(代码相似性检测)的能力发挥着非常重要的作用。安全、编程语言分析、机器学习等多个研究社区,专注于这一主题长达五年之久,并且发表了数百篇关于该主题的论文。
现存问题:从微观角度来讲,相关研究从可重复性到结果透明性均存在不同程度的问题。从宏观角度来讲,现有研究大部分关心非常具体的细分领域,无法有效的推广到整个研究领域。
研究内容:对代码相似性检测领域的最新研究进行测试,(1)系统化现有的研究体系,(2)对三类代码相似性检测技术进行深入研究,(3)构建新的数据集对上述三类技术进行测试,(4)针对该领域提出新问题并解答。
1. 引言
二进制函数相似性检测定义:二进制函数相似性检测是将一堆函数的二进制表示作为输入,并输出可以表示它们之间“相似性”的一个数值。由于,(1)软件使用不同的工具链、编译器优化、编译器标志进行编译,(2)物联网设备等场景中,软件被编译为不同的架构,二进制函数的相似性的有效检测变得相当困难。
二进制函数相似性检测的现实意义:二进制函数相似性检测在不同的系统安全领域起着非常重要的作用,(1)逆向工程师使用二进制代码相似性检测方法将目标函数与先前生成的数据库中的函数进行匹配,(2)运维人员使用二进制代码相似性检测方法将目标函数与漏洞函数进行匹配,(3)该技术还与binary diffing与binary patch相关。
二进制相似性检测研究面临的挑战:(1)研究内容复现困难,提供源代码的研究较少,且这些源代码大都存在可用性差的问题。(2)评估结果透明性差,不同研究采用不同的评价指标,无法有效比较不同的研究成果。某些工作建立在特定的pipelines,无法确定pipeline对实验结果的影响(3)前面的两个挑战导致二进制代码相似性研究方向发散,同一领域内存在数十种不同的技术。
2. 二进制函数相似性检测问题
二进制相似检测旨在计算一个数值,该数值可以表示两个二进制之间的“相似性”。其中,二进制代码是由编译器生成的机器码,二进制代码可以是二进制函数、二进制基本块、二进制程序(一般为二进制函数),由同一份源码编译而成的不同二进制函数(不同架构,不同编译器设置)被定义为同源二进制函数。
2.1 函数相似性检测
函数相似性检测方法:直接检测 vs. 间接检测
函数相似性检测可分为直接检测与间接检测两大类,直接检测通过原始输入数据或原始输入数据的特征实现函数相似性检测,间接检测通过输入特征的低维表示实现函数相似性检测。
直接检测:这类方法需要从看似不相关的输入特征(原始数据或原始输入数据的特征表示)中识别出相似性指标,由于存在无法通过输入特征线性表示的相似性指标,研究人员建议使用机器学习方法进行相似性检测。常见的机器学习方法包括,贝叶斯网络、卷积神经网络、图匹配网络、前馈神经网络。
为了找到相似的函数,这些方法需要搜索整个数据集,并将目标函数与数据集中的所有函数进行比较,这不是一个可扩展的方案。许多方法实施索引策略,如基于树的数据结构、局部敏感哈希、布隆过滤器、自定义过滤器、聚类技术、分布式搜索方法等。
间接检测:这类方法将输入特征映射到“压缩”的低维表示,可以使用距离度量(欧几里得距离、余弦距离)轻松地相互比较。这些解决方案运行有效地一对多比较。例如,如果需要将目标函数与整个数据集进行比较,可以首先将数据集中的所有函数映射到其各自的低维表示,然后对目标函数执行相同地操作,最后通过使用近似最近邻等有效技术来比较这些表示。
间接检测中输入特征的低维表示:模糊哈希 vs. 嵌入技术
通过间接检测实现函数相似性检测的过程中,一般通过模糊哈希或者嵌入技术生成输入特征的低维表示。模糊哈希算法不同于传统加密哈希算法,通过专门的设计将相似的输入值映射到相似的哈希值。嵌入技术属于机器学习技术,通过机器学习模型将语义相似的输入映射到低维空间中相近的点。
模糊哈希:Pagani等人深入研究模糊哈希对原始可执行文件低维表示的有效性,发现原始字节的微小变化会显著影响低维输出。Thomas等人提出定制化更强的FunctionSimSearch技术,通过模糊哈希实现原始可执行文件的高效表示。
嵌入技术:机器学习模型的目标是学习如何生成嵌入向量,以最大化同源函数之间的相似性并最小化非同源函数之间的相似性。常见的嵌入技术包括代码嵌入技术于图嵌入技术。
常见的嵌入技术:代码嵌入技术 vs. 图嵌入技术
代码嵌入技术:许多研究人员尝试采用现有的自然语言处理(NLP)技术,通过将汇编代码视为文本来解决二进制函数相似性检测的问题。这些解决方法处理标记流(例如指令、助记符、操作数、标准化指令)并输出对应的嵌入向量,其具体实现可分为三类:(1)基于word2vec,这类方法不能直接应用于跨架构二进制函数相似性检测&#