科恩实验室自研二进制安全智能分析平台- BinaryAI技术分享:全新功能“二进制比对”的设计与实现。本文介绍了BinaryAI如何在大模型 BAI-2.0基础上叠加启发式算法,以函数粒度的语义匹配提高了复杂场景下二进制比对准确率及召回率。 体验地址:https://www.binaryai.cn
科恩实验室在2021年8月首次发布二进制安全智能分析平台—BinaryAI,BinaryAI可精准高效识别二进制文件的第三方组件及其版本号,旨在推动SCA(Software Composition Analysis,软件成分分析)技术在DevSecOps、威胁情报、安全研究等应用场景发展。
二进制 可执行文件比对是计算机安全的经典问题,通过比对两个二进制文件的异同,即使源代码不可用,也能够进行程序版本变更分析及第三方组件识别等任务。但现有工具大多依赖于人工选定的特征,对函数语义理解不足,在跨版本或优化级别的复杂场景下识别效果不佳。
科恩实验室凝聚多年“AI+算法”研究成果经验,推出函数相似度匹配模型 BAI-2.0(BinaryAI全新代码匹配模型BAI-2.0上线, “大模型”时代的安全实践),并在此基础上叠加启发式算法,实现了BinaryAI最新的二进制文件比对功能,以函数粒度的语义匹配提高了复杂场景下二进制比对准确率及召回率。
该功能底层比对算法代码现已开源,欢迎复现:https://github.com/binaryai/bindiffmatch 平台比对功能体验传送门:https://www.binaryai.cn/
四大使用场景
(1)比较新老版本软件功能变更 软件迭代代码变更有限,在面对新老版本时,可以迅速识别并排除相似的部分,从而集中精力在变更的函数上。
(2)识别组件库的使用情况及风险 分析大型程序时,处理集成的开源组件代码需要花费大量精力。手动构建带有符号信息的开源库程序,并借助二进制文件比对技术匹配函数以完成符号标注,可以快速理解程序的局部逻辑,形成对程序整体结构的认识,有助于进一步分析核心逻辑和组件可能引入的安全缺陷、许可证问题等。
(3)鉴定软件抄袭侵权 在无法获得源代码的场景下,通过二进制文件比对也可以判断待测程序是否与已知程序雷同,可以用于版权调查或者剽窃抄袭判定。
(4)分析恶意软件变体 同一家族的恶意软件在实现上会有一定的共同特征。通过二进制文件比对可以将相似的样本归类,有利于找到具有类似行为的恶意软件变体。
二进制比对相关工具及研究
目前工业界和学术界有大量针对二进制比对任务的工具及研究,几个有代表性的工作如下:
BinDiff
BinDiff[1]是zynamics团队开发的产品,可以和IDA、Ghidra、Binary Ninja工具结合使用,对两个二进制文件执行细粒度的比对。BinDiff采用的是基于图结构(控制流图和调用图)的匹配以及若干启发式特征匹配技术。截至目前,BinDiff的最新版本为2021年发布的7.0版本,其特征导出模块BinExport已经开源。
Diaphora
Diaphora[2]是一款流行的开源二进制比对工具,目前仍在积极维护中,最新版本为上月发布的3.0版本。其分析过程分为两个阶段,第一阶段:作为IDA Script运行, 导出文件和函数的各种特征存入数据库;第二阶段:可以作为IDA Script运行或者离线运行,在导出的特征上运行各种策略(heuristics),最终生成完全匹配、部分匹配、无法匹配的函数列表。匹配结果导入IDA后,能够以函数、伪代码、汇编、调用图等多种粒度展示。
Diaphora的核心能力在于其策略,这些策略大多是基于人为选定的特征,用于判断单个函数的匹配性,例如"Same KOKA hash and constants"、"Same nodes, edges and strongly connected components"等。此外,Diaphora还包含少量实验性质的文件级别特征,例如“Call address sequence”等。
DEEPBINDIFF: Learning Program-Wide Code Representations for Binary Diffing
这是发表于2020年的论文[3],特点是可以在整个二进制文件上执行基本块级别的比对。作者应用了机器学习自然语言处理技术,结合汇编指令和控制流图结构为每个基本块生成一个embedding向量,然后结合图结构,通过迭代寻找匹配的基本块。相比于先前的同类工作,DEEPBINDIFF取得了较大的效果提升,但缺点是它受编译条件影响较大,对于基本块和控制流结构敏感,对跨架构支持不足。
对以上工具/研究及BinaryAI最新比对算法进行简单的对比:
总的来说,目前现有的二进制比对工具/研究存在以下共性问题:
1.很大程度上依赖特征工程,这意味着人工介入较多。
2.在信息提取和嵌入方面主要关注汇编指令或控制流等低层次特征,对函数的语义逻辑体现不足。当架构、优化级别、版本相差过大时,将难以保证匹配效果。
比对功能算法设计
两个二进制函数是否匹配,应当以它们的逻辑是否相同来定义。然而,现有的很多工具主要基于传统特征工程来判断函数的相似度,例如基本块、指令序列、字符串等低层次语义特征或者控制流图等函数内的结构特征。这些方法在分析局部代码微小修改方面较为有效,但涉及到不同编译器、优化选项、指令架构等情况时,即使是同一份源码,低层次特征也可能存在巨大差异,从而导致难以准确匹配。此外,当匹配范围从单一函数扩展到整个二进制文件时,函数内部的细节特征对全局的直接影响较小,而函数自身的相似性以及函数间的关系等宏观特征变得更为重要。
基于上述分析,科恩实验室将函数作为匹配的最小单元,以函数的语义相似度作为基础,同时结合函数间的关系,实现了BinaryAI的二进制文件比对功能。