关于《HAFormer:用于跨架构二进制漏洞检测的十六进制机器码与汇编代码语义融合》的学术研究报告
本文旨在向国内学术界同仁介绍哈尔滨工业大学网络空间安全学院江勋智、王*、宫雨欣、于廷岳、刘力、于骁战等研究人员在期刊《Computers & Security》2024年第145卷(文章ID 104029)上发表的一项原创性研究成果。该研究聚焦于计算机安全领域的关键问题——二进制漏洞检测,提出了一种名为HAFormer的创新模型,通过语义融合十六进制机器码与汇编代码,显著提升了跨优化级别、跨编译器、跨架构环境下的二进制代码相似性检测与漏洞识别能力。
一、 研究的学术背景
二进制漏洞检测是计算机安全研究的核心领域之一。由于商业软件或固件通常不公开源代码,因此直接在二进制代码层面进行漏洞检测至关重要。当前的主流方法依赖于二进制代码相似性检测(Binary Code Similarity Detection, BCSD),即通过比较目标二进制函数与已知漏洞函数的相似性来判断是否存在漏洞变体。然而,由于编译环境(如编译器、优化级别、指令集架构)的差异,同一份源代码可能生成语义等价但结构迥异的二进制代码,使得跨环境下的相似性判定极具挑战性。
近年来,基于深度学习的方法,特别是受自然语言处理(NLP)启发的模型,在该领域取得了显著进展。其中,Transformer模型因其在处理序列数据方面的优势,被应用于将汇编代码序列视为“句子”进行建模,以学习其语义表示。然而,现有基于Transformer的方法在处理汇编代码时,通常需要进行归一化(Normalization)以解决词汇表外(Out-Of-Vocabulary, OOV)问题,例如用特殊符号(如“NUM”)替换具体的数值(如立即数)和跳转地址。这种归一化过程不可避免地丢失了关键的数值和程序控制流信息,而这些信息对于理解函数语义至关重要(例如,特定的立即数值可能直接关联函数功能,跳转地址决定了基本块间的逻辑关系)。尽管有研究尝试通过引入跳转感知或微轨迹值序列来补充信息,但这些方法往往需要为不同架构设计特定的信息收集方式,且补充的信息仍不完整。
本研究的动机源于一个重要观察:在汇编代码归一化过程中丢失的数值和地址信息,在其对应的十六进制机器码中得到了完整保留,因为二者存在一一对应关系。同时,以字节(两个十六进制字符)为单位的机器码词汇表大小固定(256种可能),不存在OOV问题。然而,机器码本身语义抽象、对人类不友好,单独使用效果不佳。因此,本研究团队提出了核心研究问题:能否通过有效融合汇编代码(富含高层语义但信息有损)与十六进制机器码(信息完整但语义抽象),从而提取更丰富、更鲁棒的二进制代码语义表示,最终提升跨环境二进制漏洞检测的准确率?本研究的目标正是开发这样一个融合框架——HAFormer。
二、 研究工作的详细流程
HAFormer的研究流程主要包含三个核心阶段:预处理、预训练和微调。整个研究基于对大规模二进制函数数据集的构建与实验。
第一阶段:数据预处理与数据集构建 研究团队首先扩展了Binkit数据集,涵盖了51个GNU开源软件项目,使用2种编译器(GCC和Clang)、6种优化级别(O0-O3, Os, Ofast)、3种指令集架构(x86, ARM, MIPS)和2种字长(32位和64位)进行编译,最终生成了17,381个二进制文件。使用IDA Pro工具提取每个函数的十六进制机器码,并利用Capstone反汇编引擎将其转换为汇编代码。经过筛选(过滤掉基本块少于5个的函数)和截断(模型最大输入长度为512),共得到2,543,378个函数用于研究。其中50%的项目数据(1,266,339个函数)作为训练集,其余作为验证集,确保验证集中的二进制文件不出现在训练集中,以模拟真实应用场景。
本阶段的核心创新在于提出了名为SplitHex的汇编代码归一化方法。传统方法将数值替换为通用标记会导致信息丢失。SplitHex方法则反其道而行之:它将汇编指令中的数值信息(立即数、内存地址等,跳转地址除外)转换为其对应的十六进制字节序列形式。具体步骤包括:1)保留所有符号并用空格分隔;2)将数值(除无语义的跳转地址外)按字节(两位十六进制数)逆序分割,并在奇数长度数值前补零以对齐十六进制表示。例如,ARM汇编中的立即数“#0x8c0”会被转换为“c0 08”。这样做的目的是使归一化后的汇编代码在数值表示上与十六进制机器码最大程度对齐,便于模型后续学习二者间的关联,同时避免了OOV问题。
第二阶段:模型预训练(Pretrainer) 研究者构建了一个基于Transformer编码器的预训练模型。该模型采用与BERT-base相同的架构配置(嵌入维度768,最大序列长度512,12个注意力头,12个隐藏层)。预训练的目标是让模型同时理解十六进制机器码和经过SplitHex归一化的汇编代码的语义。
预训练任务采用经典的掩码语言模型(Masked Language Model, MLM)。在训练过程中,每个输入实例是单个函数的十六进制机器码序列或其归一化汇编代码序列。随机选择15%的令牌进行掩码预测:其中80%替换为[MASK],10%替换为随机令牌,10%保持不变。模型的目标是根据上下文预测被掩码的原始令牌。使用的损失函数是交叉熵损失。通过这种方式,模型能够从海量的二进制代码数据中学习到十六进制令牌和汇编指令的深层语义及其上下文关系,特别是由于汇编代码中已包含十六进制格式的数值,模型可以更好地理解这些数值在两种表示形式中的共同语义。
第三阶段:模型微调与向量融合(Fine-tuner) 在微调阶段,研究者构建了一个仅包含正样本对(语义相同的二进制函数对)的数据集,从训练集中随机选取了1,263,995个正样本对。
微调过程包含一个关键的向量融合步骤。首先,将一对语义相同的函数的十六进制机器码和汇编代码分别输入预训练好的编码器,得到各自的嵌入向量(Va和Vh)。然后,采用一个多头自注意力机制模块将这两个向量进行语义融合。具体而言,将汇编代码向量Va同时作为查询(Query)向量和值(Value)向量,将十六进制机器码向量Vh作为键(Key)向量。通过计算查询与键之间的相关性,得到注意力权重,然后用这些权重对值向量进行加权求和,最终输出一个融合了两种代码信息的单一表示向量。研究者通过消融实验发现,汇编代码在反映函数高级语义方面优于机器码,因此将汇编代码作为值向量,可以使输出直接继承其高级语义,同时通过注意力机制有选择地融入机器码提供的精确数值和跳转偏移信息,这比简单的向量相加或拼接更为有效。
获得正样本对的融合向量后,采用对比学习损失(Contrastive Learning Loss) 进行监督训练。该损失函数鼓励语义相似的函数对的嵌入向量在向量空间中彼此接近,而语义不同的函数对彼此远离。具体使用了一个基于余弦相似度的InfoNCE损失变体。相比于三元组损失,对比学习损失无需在数据收集中构造负样本对,训练时每个样本可与批次内其他样本自然形成负对,提高了训练效率。
第四阶段:评估与实验 研究设计了全面的实验来评估HAFormer的性能,并与六种前沿基线方法(Gemini, Asm2Vec, SAFE, Trex, JTrans, Asteria-Pro)进行比较。评估任务分为七种跨环境场景:跨优化级别(XO)、跨编译器(XC)、跨架构(XA)以及它们的组合。评估指标包括: 1. 一对一比较:使用平衡数据集(5万正对,5万负对),以ROC曲线下面积(AUC)为主要指标,衡量模型的分类判别能力。 2. 一对多比较:模拟真实漏洞检索场景,构建不平衡数据集(池大小从100到1000不等),以召回率@K(Recall@K)和平均倒数排名@10(MRR@10)为主要指标,衡量模型在大量候选函数中检索目标函数的能力。 3. 真实漏洞检测:选取6个已知CVE漏洞,在包含这些漏洞的6个真实固件样本上进行测试,计算Recall@5,验证模型在实际场景中的有效性。 4. 消融实验:设计了多个HAFormer变体(如仅用汇编码的AFormer、仅用机器码的HFormer、向量直接相加的HA-Add、向量拼接的HA-Concatenate),以验证模型各个组成部分(特别是SplitHex归一化和注意力融合机制)的有效性。 5. 执行时间对比:对比了各方法在预处理和嵌入生成阶段的时间开销。
三、 研究的主要结果
实验结果表明,HAFormer在几乎所有评估任务和指标上都显著优于所有基线方法。
在一对一比较中,HAFormer在七种跨环境任务上的AUC值均接近或超过99%,表现出了极高的分类准确性和鲁棒性。即使在最具挑战性的跨优化级别任务(如O0-O3)和跨架构任务中,其AUC也分别达到了99.31%和99.83%,相比表现次优的基线方法(如Trex)有大幅提升(在XA任务上领先超过10个百分点)。ROC曲线图显示,HAFormer的曲线最接近左上角,性能最优。
在一对多比较中,HAFormer的优势更加明显。在池大小为100的设定下,HAFormer在XO、XC、XA等所有七种任务上的Recall@1和MRR@10均排名第一。例如,在最复杂的XO+XC+XA任务中,Recall@1达到0.8929,MRR@10达到0.9357,而表现次优的Asteria-Pro分别为0.6374和0.7227。随着池大小增大(检索更困难),所有方法性能下降,但HAFormer下降相对平缓,在池大小为1000时,其在XO和XO+XC+XA任务上的Recall@1(0.773和0.686)仍远高于其他方法,显示了其在大规模函数库中准确检索的稳定性。Recall@K和MRR@K随K值变化的曲线也一致表明HAFormer性能最佳。
在真实漏洞检测实验中,针对6个CVE在真实固件(ARM/MIPS架构,编译器与优化未知)中的检测,HAFormer在多数CVE上的Recall@5表现最佳,例如对CVE-2016-6304达到了100%的召回率(找到了所有3个相关固件样本),而Trex和Asteria-Pro仅找到1个。这证明了HAFormer在贴近实际的、复杂的跨环境漏洞检测场景中具有卓越的适用性。
消融实验结果有力地验证了HAFormer设计决策的正确性:仅使用机器码的HFormer性能最差,说明机器码语义抽象;仅使用汇编码的AFormer优于HFormer但不如HAFormer;简单的向量相加(HA-Add)或拼接(HA-Concatenate)效果甚至不如单独的AFormer。这表明,单纯合并两种表示无法让模型学习到优越特征,甚至会引入噪声。而HAFormer采用的基于注意力的语义融合机制,能够有效地让模型学习并融合两种代码表示的优势,从而获得最佳性能。
执行时间方面,HAFormer的预处理时间与JTrans相近,嵌入时间因需要处理两种代码并融合而略长于仅处理汇编码的JTrans,但远快于需要构建复杂图结构的Gemini等方法。考虑到HAFormer在准确率上的巨大提升,这种时间开销的 trade-off 被认为是值得的。
四、 研究的结论与价值
本研究得出结论:HAFormer通过创新性地语义融合十六进制机器码与汇编代码,成功解决了传统汇编代码归一化导致的信息丢失问题,同时弥补了机器码语义抽象的不足,能够为二进制函数生成包含更丰富语义信息的嵌入向量。所提出的SplitHex归一化方法使汇编代码与机器码在数值表示上对齐,避免了OOV问题。基于多头注意力的向量融合方案能够有选择地整合两种表示的重要语义。大量实验证明,HAFormer在跨优化级别、跨编译器、跨架构的二进制代码相似性检测任务上,性能全面超越现有先进方法,并且在真实世界漏洞检测中表现出最高的准确率。
本研究的科学价值在于:1)首次系统性地探索并验证了在二进制代码分析中联合利用汇编代码与原始机器码的有效性,为BCSD领域开辟了新的特征融合思路。2)提出了SplitHex这一新颖的汇编代码表示方法,为处理二进制代码中的数值信息提供了新视角。3)设计了一套完整的预训练-微调框架,并验证了对比学习损失在该任务上的有效性。
其应用价值显著:HAFormer作为一个架构无关的漏洞检测方法,能够有效应对软件供应链中因编译环境差异导致的“同一漏洞,不同表现”的难题,提高了在异构二进制程序(如不同设备厂商的固件)中自动化发现已知漏洞变体的能力和效率,对于软件安全分析、漏洞挖掘、补丁比对等领域具有重要的实用意义。
五、 研究的亮点
六、 其他有价值的内容
研究在讨论部分指出了HAFormer可能面临的威胁,例如攻击者通过在函数前插入大量无意义代码以绕过基于长度截断的检测,或使用对抗样本攻击模型。作者提出了未来的防御方向,如优化长序列处理、代码清洗和对抗训练。此外,作者也分享了在模型设计过程中的一些探索经验(如尝试添加CFG图、按指令长度分段融合、添加架构标识前缀等并未取得更好效果),强调了“在最小化修改学习任务的前提下,明智地补充数据信息”这一设计原则的有效性,这对后续研究具有启发意义。最后,作者开源了代码和模型,促进了该领域的可重复研究和进一步发展。