发明内容
本发明的一个目的是提供一种二进制代码相似性检测方法及物联网固件漏洞检测方法,该二进制代码相似性检测方法能够跨指令架构检测二进制代码是否相似,可以用于恶意软件分析、版权纠纷、漏洞检测等领域。
为了实现根据本发明的这些目的和其它优点,根据本发明的一个方面,提供了二进制代码相似性检测方法,包括:构建二进制文件数据集,并对所述二进制文件数据集内的二进制文件进行反编译,得到二进制文件的二进制函数;利用所述二进制函数的汇编代码对bert模型进行训练,得到insbert模型;利用不同架构下的两个相同的所述二进制函数构建正样本函数对,利用不同的两个所述二进制函数构建负样本函数对,利用正样本函数对和负样本函数对对所述insbert模型进行训练,得到funcbert模型;利用所述funcbert模型计算待检测二进制代码与已知二进制代码的相似度,以判断所述待检测二进制代码与已知二进制代码的相似性。
进一步地,使用编译器GCCv7.5在O0~O3四种不同优化选项下针对三种不同架构ARM、MIPS和x86编译源代码文件,以得到所述二进制文件数据集。
进一步地,将所述汇编代码中的基本块照按照DFS算法确定顺序,并按照顺序重新排列。
进一步地,还包括:将所述汇编代码中的立即数、寄存器、内存引用、基址寄存器加间址寄存器、寄存器加数字偏移、基本块名、函数名用预定标识替代。进一步地,还包括:将用预定标识替代后的所述汇编代码中的汇编指令加入所述bert模型的词汇表。
进一步地,将所述待检测二进制代码和已知二进制代码输入所述funcbert模型,分别得到所述待检测二进制代码的语义向量和已知二进制函数的语义向量,然后计算两个向量的余弦相似度。
进一步地,获取新增的二进制文件数据集,根据特定任务,建立对新增的二进制文件数据集,对新增的二进制文件数据集内的二进制文件进行反编译,得到二进制文件的二进制函数,构建正样本函数对和负样本函数对,直接对funcbert模型进行微调。
根据本发明的另一个方面,还提供了物联网固件漏洞检测方法,包括:对物联网固件进行解压得到文件系统,在文件系统中提取出可疑执行文件,对所述可疑执行文件进行反汇编,获取可疑执行文件的所有二进制函数,并从中选取待检测漏洞函数;将所述待检测漏洞函数和已知漏洞函数输入所述的funcbert模型,得到相似度,若相似度大于预定阈值,则表明所述物联网固件中存在已知漏洞。
进一步地,对所述待检测漏洞函数和所述已知漏洞函数的汇编代码中的基本块按照DFS算法确定顺序,并按照顺序重新排列。
进一步地,还包括:将所述汇编代码中的立即数、寄存器、内存引用、基址寄存器加间址寄存器、寄存器加数字偏移、基本块名、函数名用预定标识替代。本发明至少包括以下有益效果:
本发明利用funcbert模型获取二进制函数的特征向量,能够较为完善地表达二进制函数的语义信息,从而能够检测跨指令架构、不同编译配置下的二进制代码是否相似,进而可以用于恶意软件分析、版权纠纷、漏洞检测等领域。
本发明的其它优点、目标和特征将部分通过下面的说明体现,部分还将通过对本发明的研究和实践而为本领域的技术人员所理解。
具体实施方式
下面结合附图对本发明做进一步的详细说明,以令本领域技术人员参照说明书文字能够据以实施。
应当理解,本文所使用的诸如“具有”、“包含”以及“包括”术语并不排除一个或多个其它元件或其组合的存在或添加。
如图1所示,本申请的实施例提供了二进制代码相似性检测方法,包括:
S1:构建二进制文件数据集,并对所述二进制文件数据集内的二进制文件进行反编译,得到二进制文件的二进制函数;可选地,通过逆向工具binwalk和IDA Pro对二进制文件进行反编译得到二进制函数,同时去除不能识别函数名的函数以及外部函数;
S2:利用所述二进制函数的汇编代码对bert模型进行训练,得到insbert模型;bert模型是一种自监督模型,训练数据无需标签;可选地,具体可使用huggingface(自然语言处理框架)的bert-base-cased预训练模型进行训练;可选地,如图4所示,将汇编代码作为一个文本,进行训练,训练得到的insbert模型能够识别汇编代码语义信息;
S3:利用不同架构下的两个相同的所述二进制函数构建正样本函数对,利用不同的两个所述二进制函数构建负样本函数对,利用正样本函数对和负样本函数对对所述insbert模型进行训练,得到funcbert模型;可选地,将同一源码经过不同编译器配置编译出来的二进制代码定义为相同函数,将不同架构下的两个相同函数构建成一个正样本函数对<fn,fm,1>,随机选择两个名称不同的函数构建成负样本函数对<fn,fm,0>,按照此定义,得到汇编代码函数对数据集,并将数据集分为三个互不相交的数据子集,分别用于模型的训练(80%)、验证(10%)和测试(10%),可参见如图5;将二进制函数对训练集<FuncA,FuncB,label>输入到共享参数的insbert模型中,经过insbert模型输出二进制函数的所有指令向量;如图6所示,将二进制函数代码的所有指令向量传入pooling层进行平均池化(计算所有指令向量的平均值作为整个二进制函数向量,可选地,将二进制函数向量固定为512维)获取每个二进制函数的语义向量u以及v;然后计算两个向量的余弦相似度,公式如下:
模型的损失函数采用均方误差(mean-square error,MSE),公式如下:
其中,fa,fb表示两个二进制函数汇编代码,sim(fa,fb)表示fa和fb经过模型后输出的余弦相似度,π(fa,fb)表示fa和fb的真实标签,若fa和fb为正样本,则π(fa,fb)=1,若fa和fb为负样本,则π(fa,fb)=0;K表示训练集中一个batch的大小;通过计算训练数据的损失进行反向传播和随机梯度下降更新模型的参数,最终得到能够识别跨架构二进制函数语义信息的funcbert模型;
S4:利用所述funcbert模型计算待检测二进制代码与已知二进制代码的相似度,以判断所述待检测二进制代码与已知二进制代码的相似性;将待检测二进制代码和已知二进制代码一起输入funcbert模型,得到两者的语义向量,进而计算两者的相似度,根据相似度即可确定待检测二进制代码与已知二进制代码的相似性,判断待检测二进制代码是否为恶意软件,是否存在抄袭,是否存在漏洞等。
在另一些实施例中,提供了具体的二进制文件数据集的构建方式,使用编译器GCCv7.5在O0、O1、O2、O3四种不同优化选项下针对三种不同架构ARM、MIPS和x86编译源代码文件,以得到所述二进制文件数据集。
在另一些实施例中,如图3所示,将所述汇编代码中的基本块照按照DFS算法确定顺序,并按照顺序重新排列;二进制函数的执行流程不是按照顺依从上到下依次执行的,代码中存在的分支和跳转指令会改变二进制函数的执行流程;本实施例将函数的基本块按照DFS算法(深度优先遍历)重新排列,转化为汇编指令的线性序列;其优势在于摒弃了以CFG作为中间表示,又能一定程度上保留CFG的特性。
在另一些实施例中,还包括:将所述汇编代码中的立即数、寄存器、内存引用、基址寄存器加间址寄存器、寄存器加数字偏移、基本块名、函数名用预定标识替代;;汇编代码指令操作数中存在大量的立即数、地址、函数名以及反汇编工具自动识别的变量名,此外不同体系架构具有不同数量和大小的寄存器;如果不对汇编指令操作数进行标准化处理,一方面,在对汇编代码指令进行编码时会遇到词汇外溢(OOV)的问题;另一方面,这些操作数基本不包含汇编代码的语义信息,对其进行标准化处理,能够一定程度上消除汇编代码异构从而提高模型的准确度;因此,本实施例对汇编指令中的立即数、地址、寄存器、基本块名以及函数名进行了标准化处理;例如,本实施例将汇编指令操作数划分为七类,即立即数、寄存器、内存引用、基址寄存器加间址寄存器、寄存器加数字偏移、基本块名、函数名,分别用oimm、oreg、omem、ophrase、oispl、bb、func标识代替;二进制函数的汇编代码通过预处理的前后对比如图3所示。
在另一些实施例中,还包括:将用预定标识替代后的所述汇编代码的汇编指令加入所述bert模型的词汇表;汇编代码经过标准化之后形成的代码文本与自然语言文本在表现形式上具有相似之处;自然语言文本的语义是由多个句子的语义共同构成的;本发明将一条汇编指令视为自然语言文本中的一个单词,将二进制函数的基本块视为一个句子,将整个二进制函数的汇编代码视为一个文本,具体如图4所示;汇编代码进行标准化处理之后,得到的汇编指令词汇不在预训练模型的词汇表中,因此要将汇编指令词汇添加进词汇表中,然后使用汇编代码数据集(图2所示)对bert预训练模型进行增量训练。
在另一些实施例中,将所述待检测二进制代码和已知二进制代码输入所述funcbert模型,分别得到所述待检测二进制代码的语义向量和已知二进制代码的语义向量,然后计算两个语义向量的余弦相似度,当余弦相似度大于预定阈值,则判断待检测二进制代码和已知二进制代码是否相似,从而判断待检测二进制代码是否为恶意软件,是否存在抄袭,是否存在漏洞等;预定阈值可以根据经验、专家确定或通过数据分析确定。
在另一些实施例中,根据特定任务,建立新增的二进制文件数据集,对新增的二进制文件数据集内的二进制文件进行反编译,得到二进制文件的二进制函数,构建正样本函数对和负样本函数对,直接对funcbert模型进行微调;当存在新的特定任务,获取新增的相关二进制文件数据集,构建特定任务的函数对<fi,fi′>以及函数对的真实标签π(fi,fi′),特定任务使用的策略可能会偏离前几个实施例训练得到的funcbert模型的默认策略;在这种情况下,使用少量附加数据建立新增的二进制文件数据集,进而构建<fi,fi′,π(fi,fi′)>来微调funcbert模型中的学习参数,使其适应新的特定任务,而无需重新训练insbert模型。
如图7所示,本申请的实施例还提供了物联网固件漏洞检测方法,包括:对物联网固件进行解压得到文件系统,在文件系统中提取出可疑执行文件,对所述可疑执行文件进行反汇编,获取可疑执行文件的所有二进制函数,并从中选取待检测漏洞函数;将所述待检测漏洞函数和已知漏洞函数输入所述的funcbert模型,得到相似度,若相似度大于预定阈值,则表明所述物联网固件中存在已知漏洞;具体地,步骤一:固件解析模块使用逆向工具(如binwalk)对固件进行解压得到文件系统,在文件系统中提取出可疑执行文件(与已知漏洞函数所在的二进制文件同名),还可以参考申请人之前申请的专利CN202210086936.5;步骤二:函数预筛选模块使用反汇编工具(如IDA Pro)对步骤一中提取的可疑执行文件进行反汇编,获取可疑执行文件的所有函数;在可疑执行文件的函数中查找与已知漏洞函数同名的函数作为待检测漏洞函数;步骤三:函数相似度匹配模块将待检测漏洞函数和已知漏洞函数的汇编代码文本输入到funcbert模型中,得到待检测漏洞函数和已知漏洞函数的语义向量u以及v,然后计算两个向量的余弦相似度,公式如下:
其中f代表已知漏洞函数,f′代表待检测漏洞函数;由图5中的数据集训练得出的funcbert模型,同源函数(同一函数源码经过不同编译器配置编译出来的不同二进制函数)经过funcbert模型得到的函数相似度的预定阈值为0.84;即如果已知漏洞函数和待检测漏洞函数的sim(f,f′)大于0.84,就说明他们是同源函数,进一步说明,固件中存在该已知漏洞;如果sim(f,f′)小于0.84,则认为两个函数是不相似,因此固件中不包含该已知漏洞。
在另一些实施例中,对手所述待检测漏洞函数和所述已知漏洞函数的汇编代码中的基本块按照DFS算法确定顺序,并按照顺序重新排列;将待检测漏洞函数和已知漏洞函的基本块按照DFS算法重新排列,转化为汇编指令的线性序列,参见前文。
在另一些实施例中,还包括:将所述汇编代码中的立即数、寄存器、内存引用、基址寄存器加间址寄存器、寄存器加数字偏移、基本块名、函数名用预定标识替代,参见前文。
这里说明的设备数量和处理规模是用来简化本发明的说明的。对本发明二进制代码相似性检测方法及物联网固件漏洞检测方法的应用、修改和变化对本领域的技术人员来说是显而易见的。
尽管本发明的实施方案已公开如上,但其并不仅仅限于说明书和实施方式中所列运用,它完全可以被适用于各种适合本发明的领域,对于熟悉本领域的人员而言,可容易地实现另外的修改,因此在不背离权利要求及等同范围所限定的一般概念下,本发明并不限于特定的细节和这里示出与描述的图例。