VSim:为高效二进制代码相似性分析提供语义感知的价值提取方法
Huaijin Wang, Zhiqiang Lin(俄亥俄州立大学)
发表信息:该研究发表于网络与分布式系统安全研讨会(Network and Distributed System Security (NDSS) Symposium),会议举办时间为2026年2月23-27日,地点为美国加州圣地亚哥。论文收录于NDSS 2026会议论文集,其数字对象标识符(DOI)为https://dx.doi.org/10.14722/ndss.2026.240213。
学术背景:
二进制代码相似性分析(Binary Code Similarity Analysis,BCSA)是信息安全领域中的一项核心技术,广泛应用于恶意软件分析、漏洞检测、软件抄袭识别以及软件供应链安全等关键任务。然而,由于编译过程丢失了高级语义信息(如变量名、函数符号等),且不同的编译器、优化选项和硬件架构会导致相同源代码生成语法迥异的二进制代码,这使得准确、鲁棒且可扩展的BCSA极具挑战性。传统的基于机器学习(ML)的嵌入方法虽然提升了分析速度,但在面对未见过的编译器或优化选项时,常因分布外(Out-of-Distribution,OOD)问题导致准确性下降。现有的一些基于具体数值(value-based)的方法,通常只关注编译过程中保持不变的特定值(如函数返回值),而忽略了大量中间寄存器与内存操作所产生的丰富语义信息。此外,这些方法在提取数值时面临状态爆炸、难以筛选语义相关值以及数值比较效率低下三大核心挑战。因此,本研究旨在探索并实践一种新型的、基于语义感知数值的BCSA方法,以克服现有技术的局限性,实现高精度、高鲁棒性及可扩展的分析。
研究详细流程:
本研究提出了一个名为VSim的全新框架,其工作流程主要包括六个核心步骤:数值提取、数值过滤、数值归一化、数值具体化、指纹传播以及相似性计算。研究评估对象为大规模的真实世界二进制数据集,包括PEM数据集、BinKit数据集和GMN数据集-2及漏洞数据集,共涉及超过5000个二进制文件,涵盖GCC和Clang两种工具链、多个编译器版本以及x86、amd64、arm32、arm64和mips32五种架构。
步骤一:数值提取
VSim首先对输入的二进制可执行文件进行反汇编,识别函数入口。针对每个查询函数,研究团队定制化了一个基于基本块(basic-block)级别的欠约束符号执行(under-constrained symbolic execution)引擎。选择基本块作为分析粒度,是因为每个基本块仅需模拟执行一次,避免了路径分析中的状态爆炸问题,且无需检查路径约束的可满足性,从而保证了提取过程的可扩展性。在执行模拟时,引擎将所有对寄存器和内存的加载(load)与存储(store)操作记录下来。对于内存地址,如果遇到符号化地址(如ptr+8),引擎会将其具体化为一个临时具体值以继续执行,虽然这牺牲了部分内存访问可行性检查的完备性,但后续的过滤步骤会消除这类无关地址值的影响。最终,对于每个基本块,VSim收集到三组数值:1)寄存器操作值(寄存器名及加载/存储的值);2)内存操作值(内存地址及加载/存储的值);3)分支条件(由标志寄存器存储的布尔型符号表达式)。
步骤二:数值过滤
初始提取的数值集合中包含大量与核心功能语义无关的信息,例如指向全局变量或代码段的指针地址。VSim并未直接定义何为“语义相关值”,而是采用了一种逆向过滤策略,即识别并剔除语义无关的数值。算法基于逆向工程中常见的启发式规则:1)若一个具体值落在已知的数据段(如.data、.bss)或代码段(如.text)地址范围内,或其值与栈指针(base pointer)接近,则判定为地址值;2)对于一个符号表达式,如果其表达式树中的任何叶子节点是具体地址值,或其子树已被识别为地址,或该表达式本身是某个指针运算表达式的一部分,则判定该表达式为地址值。所有被识别为地址的数值均被过滤掉,剩余的数值(包括具体常数、符号表达式和分支条件操作符)被视为“语义感知值”,用于后续分析。
步骤三:数值归一化
为了使不同架构和编译设置下语义等价的数值能够直接比较,VSim对过滤后的数值进行归一化处理。对于具体数值,忽略其位宽(bit-width)信息,统一视为有符号整数。对于符号表达式,同样丢弃位宽注释,并将表达式树中的特定操作(如concat)转换为更通用的算术形式(例如concat(0, e)简化为e)。对于分支条件,由于它们总是成对出现(如y≥8和y<8),VSim仅保留其中一个条件表达式,并进一步将其拆分为符号部分和比较操作符-操作数对(如(≥, 8)),仅保留后者作为代表,因为符号部分通常已在其他操作中体现。
步骤四:数值具体化
为了进行高效快速的相似性比较,避免使用耗时的定理证明器(SMT Solver),VSim将归一化后的符号表达式和分支条件进行具体化。对于符号表达式,VSim为其中出现的每个符号变量分配一组预定义的随机测试输入值(例如一个包含5个整数的数组[57, 44, 13, 81, 52]),计算表达式在所有输入下的具体结果,将结果排序后形成一个有序元组,作为该表达式的“指纹”元素。为了平衡效率和覆盖率,VSim设定了一个阈值β=6,即仅处理符号变量数α≤6的表达式,因为超过6个变量的表达式占比不足1%。对于分支条件操作符对(如(≥, 8)),VSim通过分析大量二进制代码中观察到的编译器优化模式,将其扩展为等价的模式集合(例如,(≥, 8)可扩展为{(≥, 8), (>, 7)}),以应对不同优化级别下条件表达式的变形。
步骤五:指纹传播
为了解决函数内联(function inlining)对BCSA的影响,VSim将内联的调用者(callee)函数的指纹集合传播(合并)到调用者(caller)函数的指纹中。研究设定了一个传播深度阈值γ(默认值为3),基于先前研究指出深度为3的内联已能覆盖超过90%的情况。通过这种简单的并集操作,可以更准确地比较在不同编译设置下因内联策略不同而形态各异的函数。
步骤六:相似性计算
经过上述步骤,每个二进制函数被表示为一个由具体值元组、符号表达式具体化元组和分支条件模式集合构成的指纹(一个值的集合)。在构建函数池(function pool)时,VSim统计每个值在整个池中出现的频率,并根据公式w(v) = 1 / ln(occ(v)+1)为其分配权重,以降低常见值(如0)的重要性,提升罕见但具有区分性值(如特定计算表达式)的贡献度。在相似性检索阶段,给定一个查询函数f_q,VSim计算其指纹与池中每个函数指纹之间的加权Jaccard相似度Jaccard_w(A, B) = Σ(v∈A∩B) w(v) / Σ(v∈A∪B) w(v),并返回相似度最高的Top-K函数。
主要研究结果:
研究团队在跨优化、跨编译器和跨架构三种最具挑战性的场景下,将VSim与多种先进的BCSA工具(JTrans、CLAP、GMN、PEM-S)进行了全面对比评估,主要使用平均倒数排名(Mean Reciprocal Rank, MRR)和Recall@1作为评估指标。
在跨优化场景(使用PEM数据集,查询函数为-O0编译,池函数为-O2/-O3编译,池大小10k)下,VSim取得了最佳的MRR(O0-vs-O3: 0.621;O0-vs-O2: 0.709),其Recall@1(O0-vs-O3: 0.545;O0-vs-O2: 0.642)与表现最好的CLAP(Recall@1: 0.548)相当或更优,同时显著优于JTrans和PEM-S。更重要的是,VSim的检索时间(87秒)远低于需要大量动态执行的PEM-S(1853秒)。
在跨编译器场景(使用BinKit数据集,查询函数为-O0编译,池函数为-O3编译,涉及GCC-4.9.4⁄11.2和Clang-4/13等版本组合,池大小10k)下,VSim展示了卓越的鲁棒性和准确性。其Recall@1在不同编译器组合间稳定在0.611至0.711之间(标准差0.026),而基于ML的JTrans的Recall@1则波动巨大(0.078至0.441,标准差0.107),这证实了ML方法在面对未见编译器(OOD问题)时性能会显著下降。VSim不依赖于特定训练集,直接从数值语义出发,因此不受编译器演化的影响。
在跨架构场景(使用GMN数据集-2,池大小101)下,VSim在纯跨优化(XO)场景下显著优于GMN(MRR@10: 0.86 vs. 0.75;Recall@1: 0.79 vs. 0.66)。在跨架构加跨优化(XA+XO)的混合挑战场景下,VSim取得了与GMN相当的精度(MRR@10: 0.70 vs. 0.71;Recall@1: 0.63 vs. 0.61),但检索效率高出两个数量级(VSim: 15秒, GMN: 1005秒)。
消融实验(Ablation Study)结果清晰地展示了VSim各设计组件的贡献:禁用具体值导致性能大幅下降(Recall@1平均下降24.2%),表明具体常数是强有力的语义指纹;禁用符号值或分支条件也会导致性能损失;禁用数值过滤会使Recall@1下降15.7%且时间成本增加2.8倍;禁用指纹传播(γ=0)使Recall@1下降近15%;禁用基于频率的权重分配也会导致约2个百分点的精度下降。此外,对传播深度γ的测试表明,当γ=3时已达到性能与效率的最佳平衡点。
在真实安全应用评估(使用GMN漏洞数据集,检测真实固件中的漏洞函数)中,VSim在8个CVE漏洞函数的检测任务中,在5种设置下优于或匹配了GMN的最佳模型,平均MRR@10更高(例如,在Netgear R7000固件上平均为0.86 vs. 0.80)。案例分析表明,VSim能够成功匹配跨架构(arm32 vs. amd64)且控制流图(CFG)略有不同的同一漏洞函数,这得益于其提取的语义等价值(如(≥, 8)和(>, 7)分支条件对,以及r4 & ~7和r12 & (-8)的具体化元组)具有强大的鲁棒性。
性能开销分析显示,VSim的主要开销在于一次性的数值提取和指纹生成阶段,平均每个函数约需2.07秒。而检索阶段的效率极高,在32核服务器上,每对函数比较仅需约2.7×10^-6秒,使得在10k函数池中进行100亿次比较的总检索时间仅为87秒,远低于基于比较模型的GMN和基于动态执行的PEM-S,与基于嵌入的ML方法(如JTrans、CLAP)的检索速度相当,但VSim在精度和鲁棒性上更具优势。
研究结论与价值:
本研究的核心结论是,系统性地提取、过滤和利用二进制代码执行过程中产生的“语义感知值”,是实现高精度、高鲁棒性且可扩展的二进制代码相似性分析的有效途径。VSim框架成功解决了阻碍基于数值的BCSA方法发展的三大挑战:1)通过基本块级欠约束符号执行实现了可扩展的数值提取;2)通过启发式规则过滤掉语义无关的地址值,聚焦于核心计算逻辑;3)通过归一化和基于测试输入的具体化,实现了快速、可靠的数值比较,避免了昂贵的定理证明。
该研究的科学价值在于,它深入探索并验证了“数值语义”作为二进制代码分析基石的可行性,为BCSA领域开辟了一条不依赖于特定训练数据、解释性强且对编译器变化鲁棒的新研究方向。其应用价值显著:VSim能够有效应对软件供应链安全分析中常见的跨编译器、跨版本、跨架构的二进制成分识别问题,并在漏洞函数检测等实际安全任务中展现出优异性能。开源实现的发布(https://github.com/osuseclab/vsim)将进一步促进该领域的研究和应用。
研究亮点:
1. 新颖的研究视角:首次系统性地提出并实现了“语义感知值”作为BCSA的核心特征,突破了以往方法仅关注不变值或全量程序状态的局限。
2. 创新的技术框架:结合了欠约束符号执行、基于逆向工程启发的过滤规则、以及高效的数值具体化与加权集合相似度比较,构成了一套完整且高效的解决方案。
3. 卓越的性能表现:在跨优化、跨编译器场景下,VSim的准确率显著超越现有最先进的ML和非ML方法;在跨架构场景下达到可比精度,且检索效率极高。
4. 强大的鲁棒性与可解释性:不依赖于ML模型,避免了OOD问题,对编译器差异和优化策略变化具有天然鲁棒性。同时,其指纹由人类可读的数值和表达式构成,分析结果具有很好的可解释性。
5. 充分的实验验证:研究在包含多种架构、工具链和大规模真实代码的数据集上进行了全面评估,并通过详尽的消融实验证明了各个设计组件的必要性和有效性。
其他有价值内容:
论文还坦诚地讨论了VSim当前的一些局限性及未来工作方向,例如:1)目前未利用字符串字面量,虽然它们对克隆检测有帮助,但多数BCSA工作认为其与核心行为语义关联较弱;2)对跨架构分析中因系统调用号等常量差异导致的指纹变化,未来可结合反编译知识恢复高级抽象来缓解;3)面对高度混淆的二进制代码,VSim的现有技术可能需要进一步扩展。这些讨论为后续研究指明了潜在的发展路径。