二进制代码相似性检测技术被广泛应用于漏洞搜索[1–4]、代码复用检测[5]、恶意软件检测[6]等领域. 随着物联网技术的发展, 越来越多的软件被部署到不同指令集架构(instruction set architecture, ISA)(如ARM、MIPS、RISC-V等)的平台上运行. 由于函数调用约定、CPU寄存器和内存访问策略在不同ISA中具有较大差异, 使得相同的源代码经过编译后得到的二进制代码也非常不同, 给跨ISA的相似性检测带来了较大的挑战[7].
神经机器翻译(neural machine translation, NMT)的思想已被用于跨ISA的相似性检测任务, 文献[8,9]使用LSTM[10]、Transformer[11]等神经网络训练跨ISA的指令序列编码器, 较传统方法展现出了良好的准确性和扩展性. 但是检测方法[9]使用的神经网络在特征级别添加位置嵌入, 且假设单个指令位置是独立的, 并未考虑相邻指令之间关系. 然而, 汇编基本块中指令的全局绝对位置及其内部顺序和相邻关系在汇编代码中具有重要作用, 如: PUSH和POP指令通常固定搭配使用并且通常分布于汇编基本块序列的两端; 跳转指令如JMP通常在序列中处于MOV和ADD等指令助记符之后.
针对上述问题, 将指令嵌入拓展为以位置为变量的连续函数的词序嵌入(word order embedding, WOE). 词序嵌入能够根据同一指令的向量推导出位置的相对距离, 也能推导出不同指令间的位置关系. 基于NMT的思想, 将词序嵌入后的指令序列输入Transformer神经网络中, 源ISA汇编基本块序列在训练过程中被转换为目标ISA汇编基本块序列, 得到能够提取源ISA汇编基本块语义特征的编码器; 然后通过三元组损失训练目标ISA编码器和源ISA编码器; 两阶段训练得到的跨ISA编码器用于相似性检测任务.
本文实现了跨ISA二进制基本块粒度的相似性检测方法WOE-MIRROR. 实验结果表明, 在相似基本块搜索任务中, P@1精度(目标在前1个结果中的准确率)达到69.5%, 比对比方法MIRROR提升了4.6%, 证明了本文检测方法的有效性.
1 相关研究 1.1 二进制代码相似性检测基于静态分析的检测方法主要通过人工选取二进制的统计特征、结构特征等. 统计特征主要包括按类别划分的指令统计数目; 结构特征主要包括函数的控制流图(control flow graph, CFG)[12,13]、数据流图(data flow graph, DFG)[2]、属性控制流图(attributed control flow graph, ACFG)[13] 等. 基于统计特征的方法依赖于测试者的领域知识, 难以精确捕获二进制代码语义特征, 因此这些方法往往具有较低的精度.
自然语言处理技术已应用于二进制分析领域, 优势在于神经网络能够自动学习代码序列的语义特征, 并且避免了复杂的图匹配算法或者动态执行开销.
基本块粒度的检测任务可以作为函数级别相似性检测的子任务, 也可以直接用于二进制分析任务. 文献[14]使用图神经网络学习二进制函数ACFG特征; jTrans[15]将跳转指令预测任务融合BERT[16]的预训练方法, 训练函数级的汇编代码的程序语言模型. 但是这些模型是为单一ISA的函数粒度检测而设计, 难以应用于跨ISA的二进制基本块相似性检测.
1.2 神经机器翻译NMT技术能够以端到端的方式学习输入文本到输出文本的映射, 常用于不同词表的文本转化任务. 使用的神经网络结构为Seq2Seq结构, 主要包含两个部分: 编码器和解码器, 一个用于输入源文本序列, 另一个用于生成翻译后的输出文本. 编码器-解码器架构(以Transformer为例)如图1所示.
编码器能够将文本序列嵌入到向量空间, 由解码器对输出序列进行逐词预测, 实现跨语言翻译, 所以NMT技术可用于解决跨ISA的二进制代码相似性检测. 并且使用Seq2Seq神经网络(如LSTM[10]、Transformer[11]等)的跨指令集的检测方法已取得了比传统的静态相似性检测方法更高的准确度[8,9]. LSTM模型在长序列中表现不佳, 而基于注意力机制的Transformer虽然在长文本序列建模中效果较好, 但是绝对位置编码难以区分指令助记符和操作数对模型的贡献度, 使得检测模型在学习指令序列的位置信息上存在欠缺.
1.3 位置编码自Transformer出现以来, 一些自然语言处理领域的工作研究位置编码[17–20]. 相对位置编码和绝对位置编码以不同的方式向网络中加入位置信息, 以提升网络模型对于文本位置信息的学习能力. 针对不同的任务, 不同位置编码的效果具有差异性.
Vaswani[11]采用编码器-解码器结构, 将基于变频正弦波的位置编码添加到第1层之前的编码器和解码器的输入中, 正弦位置编码可以让模型学习相对位置来帮助模型推广到训练过程中神经网络无法看到的序列长度. BERT[16]、GPT[20]等模型采用训练式的相对位置编码, 通过初始化一个固定维度的矩阵作为位置向量, 并且矩阵可以随着训练过程进行更新.
Show[18]提出了一种相对位置编码, 通过扩展自注意力机制, 将注意力矩阵中的位置向量转化为二维位置信息, 因为对序列进行了截断, 所以这种方式能够使用有限个位置编码表示任意长度的相对位置; XLNET[19]、T5[21]等则将相对位置加入注意力矩阵中.
2 模型的框架和训练流程本文的二进制基本块相似性检测模型共包括3个模块: 数据预处理模块、语义嵌入模块和相似性计算模块, 如图2所示. ① 数据预处理模块主要是对二进制文件进行反汇编和数据规范化处理; ② 语义嵌入模块主要对汇编指令序列进行指令和位置信息编码, 然后经过词序嵌入模块后, 输入编码器进行语义嵌入, 得到汇编基本块的语义向量; ③ 相似性计算模块通过计算语义向量之间的欧氏距离后用于衡量二进制基本块的语义相似程度.
为了得到汇编基本块嵌入向量, 需要训练一个源ISA编码器和一个目标ISA编码器, 选用代表性的x86指令集和ARM指令集作为检测对象. 通过训练两个不同ISA的语义编码器, 可以将源指令序列和目标指令序列映射到同一个向量空间.
模型训练流程包含3个阶段: 数据预处理阶段, 源编码器训练阶段, 目标编码器训练阶段, 如图3所示. Seq2Seq的神经网络能够将源ISA的汇编语言翻译成目标ISA的汇编语言, 经由编码器得到的多维向量包含源ISA的语义特征; 为了得到目标ISA的编码器, 通过三元组损失训练目标ISA编码器和源ISA编码器. 三元组损失中负样本的加入可以推动样本的语义向量在空间中的分布更加均匀.
2.1 数据预处理阶段
模型训练阶段需要大量的相似基本块对, 本文使用开源数据集MISA[9]中的x86-ARM汇编基本块相似对. 该数据集的生成方法为: 修改LLVM, 为LLVM IR中的每个基本块分配唯一的ID, 面向不同指令集架构编译之后(如x86和ARM等), 所生成的汇编基本块只要源自同一ID, 相互之间就构成相似对.
由于汇编代码中包含大量的指针、地址、函数名等信息, 这些信息将产生不可预测的词表, 直接将原始的指令序列输入机器学习模型进行训练极易引发词汇表溢出问题, 因此需要指令规范化处理, 如图4所示. 在指令规范化步骤中将汇编代码中的常量分为5类: 立即数、地址、变量名、函数名和基本块标签; 将x86指令集的寄存器分为14类: 指针寄存器、浮点寄存器、4类通用寄存器、4类数据寄存器和4类地址寄存器; 将ARM指令集寄存器分为通用寄存器和指针寄存器2类.
三元组中的负样本采用随机采样和困难负样本采样结合的方式生成[9,22,23]. 困难负样本通过正样本与随机筛选的相同ISA基本块代码计算相似性得分, 相似性排序高的作为困难负样本, 向量距离如式(1)所示:
$ {{D}}\left( {{E_1}, {E_2}} \right) = \sqrt {\sum\limits_{i = 1}^d {{{\left( {{e_{1i}} - {e_{2i}}} \right)}^2}} } $ | (1) |
其中,
$ {\textit{Sim}}\left( {Bloc{k_1}, Bloc{k_2}} \right) = \exp \left( - \frac{{{{D}}\left( {{E_1}, {E_2}} \right)}}{d}\right) $ | (2) |
2.2 词序嵌入
为了得到源ISA编码器, 需要对数据进行词表映射生成指令编码和位置编码, 然后输入神经网络. 文献[9]使用原始Transformer网络, 将指令序列映射到词表进行编码后, 以指令嵌入和词序嵌入以求和的方式输入到神经网络, 形式如下:
$ f\left( {l, p} \right) = {f_{{\rm{ins}}}}\left( l \right) + {f_p}\left( p \right) $ | (3) |
其中,
受Wang等人[24]的启发, 为了建模不同位置指令的相对关系, 将位置嵌入拓展为一个以位置为变量的连续函数, 不同位置的指令嵌入可以在连续函数中相互关联. 指令嵌入函数的形式如下:
$ f\left( {l, p} \right) = {h_l}\left( p \right) \in {\mathbb{R}^D} $ | (4) |
其中,
$ \left[ {{h_{l, 1}}\left( p \right), {h_{l, 2}}\left( p \right), \cdots , {h_{l, D}}\left( p \right)} \right] \in {\mathbb{R}^D} $ | (5) |
其中,
$ \left[ {{r_{l, 1}}{{\rm{e}}^{i\left( {{\omega _{l, 1}}p + {\theta _{l, 1}}} \right)}}, \cdots , {r_{l, 2}}{{\rm{e}}^{i\left( {{\omega _{l, 2}}p + {\theta _{l, 2}}} \right)}}, \cdots , {r_{l, D}}{{\rm{e}}^{i\left( {{\omega _{l, D}}p + {\theta _{l, D}}} \right)}}} \right] $ | (6) |
其中, 每个坐标
本文把独立指令当作单词, 按照地址序列化的汇编基本块当作句子. 编码得到x86指令序列
编码器的输出作为解码器的输入, 在解码器中正向传播, 以预测生成目标指令. 在解码器部分, 将初始位置1到预测位置
$ {Loss} = - \sum\limits_{l = 1}^m {\sum\limits_{j = 1}^{\left| {{V_{{\rm{target}}}}} \right|} {{{\hat y}_{lj}}} } \log \left( {{y_{lj}}} \right) $ | (7) |
其中,
目标编码器训练阶段是为了得到两种架构的编码器进行后续相似性分析任务. 得到x86源编码器后, 本文通过构建<目标、正例、负例>的三元组训练ARM语义编码器和x86语义编码器, 训练的目标是目标样本和正例样本在向量空间的距离比目标样本和负例样本间的距离更小.
三元组中正例和负例来源于同一指令集架构, 目标样本来自于另一个指令集架构, 通过第2.1节所述方法进行采样, 三元组损失训练过程如图5所示.
三元组损失函数能够优化目标和正例与目标和负例之间的距离差范围, 所用损失函数如下:
$ {Loss} = \max \left\{ {0, \alpha + {D} \left( {{E_a}, {E_p}} \right) - {D} ({E_a}, {E_n})} \right\} $ | (8) |
其中,
3 实验验证 3.1 实验环境
将WOE-MIRROR和MIRROR模型均部署于如下环境中进行训练评估: 一台搭载Ubuntu Server 18.04 LTS 64位操作系统的服务器, 硬件配置包括: CPU为1个Intel(R) Xeon(R) Gold 6133 CPU @ 2.50 GHz, 显卡为1块Tesla V100 GPU, 内存大小为40 GB.
3.2 数据集和训练参数设置用于训练和评估的数据集为开源数据集MISA, 共包含1122171个语义相等的x86架构和ARM架构二进制基本块对. 该数据集由5个不同领域的C/C++开源项目使用4种不同的优化选项(O0–O3)编译得到, 具体如表1所示. 本文从数据集中随机选取240000个相似基本块对用于源编码器训练, 随机选取60000个相似对作为测试集; 通过第2.1节所述负样本生成方法生成三元组用于目标编码器训练, 随机样本和困难负样本比例为2:1. 在训练过程中使用和MIRROR相同的训练数据集和超参数,
3.3 训练过程比较
源编码器训练阶段使用交叉熵损失, 交叉熵损失能够度量模型预测结果和实际情况之间的差异; 训练阶段的三元组损失则可以计算目标和正负样本之间的距离损失, 损失越低表明模型对于负样本的区分度越好, 源编码器训练阶段和目标编码器训练阶段的轮数均为20, 为图7–图9的横坐标.
图7、图8所示曲线表明, 在源编码器训练阶段中WOE-MIRROR的损失曲线较低, 精度曲线较高, 即在损失和精度表现上均优于MIRROR.
图9所示曲线表明, 在目标编码器训练阶段, WOE-MIRROR的三元组损失曲线比MIRROR更低, 即加入词序嵌入模块后对模型训练具有较强的促进作用, 表明本方法对于指令语义特征的差异性具有更好的区分能力.
3.4 相似代码检索为了衡量模型的相似性搜索效果, 通过在离线状态下评估模型在测试集搜索目标基本块的能力. 相似基本块搜索任务为给定一个相似基本块对
由于现有跨ISA二进制基本块相似性检测研究中源码不开放和数据集不统一等情况, 同时文献[9]已经证明使用Transformer的模型检测效果优于LSTM[8], 所以本文选择文献[12,13]中基本块特征提取方法作为对比方法进行比较. 选择的基本块属性表2所示.
P@N任务共包含两部分: x86-ARM任务和ARM-x86任务. x86-ARM任务即给定x86基本块, 在目标中寻找目标ARM基本块; ARM-x86任务即给定ARM基本块寻找目标x86 基本块. 将搜索池设置为100, 即在测试集中随机选择100个样本用于与查询样本计算相似性并排序.
P@N任务实验结果如表3、表4所示. 其中, Genius-b表示文献[12]中手工提取基本块特征的方法. 结果显示, 本模型在P@N指标均优于对比模型.
3.5 相似性得分可视化
从测试数据集中随机选取10个语义相似的跨ISA基本块对, 输入模型后得到语义向量, 计算相似度得分后进行可视化展示, 如图10所示. 结果显示, 对角线的向量相似性评分高于其他行列的得分, 表明模型具备对二进制基本块进行语义特征提取能力并且产生了较好的相似性区分度.
4 结论与展望
本文以位置为变量的函数编码二进制汇编指令序列, 通过Transformer神经网络和三元组损失网络训练跨ISA的语义编码器. 实验表明, 以位置为变量的词序嵌入能够提升模型对二进制汇编基本块的语义嵌入能力. 未来的工作将在提高模型的拓展性等方面进行研究.
[1] |
David Y, Partush N, Yahav E. FirmUp: Precise static detection of common vulnerabilities in firmware. ACM SIGPLAN Notices, 2018, 53(2): 392-404. DOI:10.1145/3296957.3177157 |
[2] |
Gao J, Yang X, Fu Y, et al. VulSeeker: A semantic learning based vulnerability seeker for cross-platform binary. Proceedings of the 33rd IEEE/ACM International Conference on Automated Software Engineering. Montpellier: IEEE, 2018. 896–899.
|
[3] |
Gao J, Yang X, Fu Y, et al. Vulseeker-pro: Enhanced semantic learning based binary vulnerability seeker with emulation. Proceedings of the 26th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering. Lake Buena Vista: ACM, 2018. 803–808.
|
[4] |
陈斌, 刘胜利, 胡安祥, 等. 基于神经机器翻译的二进制函数相似性检测方法. 信息工程大学学报, 2021, 22(6): 675-682. DOI:10.3969/j.issn.1671-0673.2021.06.007 |
[5] |
Luo LN, Ming J, Wu DH, et al. Semantics-based obfuscation-resilient binary code similarity comparison with applications to software and algorithm plagiarism detection. IEEE Transactions on Software Engineering, 2017, 43(12): 1157-1177. DOI:10.1109/TSE.2017.2655046 |
[6] |
Alrabaee S, Shirani P, Wang LY, et al. FOSSIL: A resilient and efficient system for identifying FOSS functions in malware binaries
. ACM Transactions on Privacy and Security, 2018, 21(2): 8. |
[7] |
于颖超, 甘水滔, 邱俊洋, 等. 二进制代码相似度分析及在嵌入式设备固件漏洞搜索中的应用. 软件学报, 2022, 33(11): 4137-4172. DOI:10.13328/j.cnki.jos.006540 |
[8] |
Zuo F, Li XP, Young P, et al. Neural machine translation inspired binary code similarity comparison beyond function pairs. Proceedings of the 26th Annual Network and Distributed System Security Symposium. San Diego: The Internet Society, 2019.
|
[9] |
Zhang XC, Sun WJ, Pang JM, et al. Similarity metric method for binary basic blocks of cross-instruction set architecture. Proceedings of the 2020 Workshop on Binary Analysis Research. San Diego, 2020. 23–26.
|
[10] |
Hochreiter S, Schmidhuber J. Long short-term memory. Proceedings of the 2015 International Conference on Machine Learning. PMLR, 2015. 1604–1612.
|
[11] |
Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need. Proceedings of the 31st International Conference on Neural Information Processing Systems. Long Beach: Curran Associates Inc., 2017. 6000–6010.
|
[12] |
Feng Q, Zhou RD, Xu CC, et al. Scalable graph-based bug search for firmware images. Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security. ACM, 2016. 480–491.
|
[13] |
Xu XJ, Liu C, Feng Q, et al. Neural network-based graph embedding for cross-platform binary code similarity detection. Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communications Security. Dallas: ACM, 2017. 363–376.
|
[14] |
Massarelli L, Di Luna GA, Petroni F, et al. Investigating graph embedding neural networks with unsupervised features extraction for binary analysis. Proceedings of the 2nd Workshop on Binary Analysis Research (BAR). 2019. 1–11.
|
[15] |
Wang H, Qu WJ, Katz G, et al. jTrans: Jump-aware transformer for binary code similarity detection. Proceedings of the 31st ACM SIGSOFT International Symposium on Software Testing and Analysis. ACM, 2022. 1–13.
|
[16] |
Devlin J, Chang MW, Lee K, et al. BERT: Pre-training of deep bidirectional transformers for language understanding. Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies. Minneapolis: ACL, 2018. 4171–4186.
|
[17] |
Huang ZH, Liang D, Xu P, et al. Improve transformer models with better relative position embeddings. Proceedings of the 2020 Findings of the Association for Computational Linguistics: EMNLP 2020. ACL, 2020. 3327–3335.
|
[18] |
Shaw P, Uszkoreit J, Vaswani A. Self-attention with relative position representations. Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies. New Orleans: ACL, 2018. 464–468.
|
[19] |
Yang ZL, Dai ZH, Yang YM, et al. XLNet: Generalized autoregressive pretraining for language understanding. Proceedings of the 33rd International Conference on Neural Information Processing Systems. Vancouver, 2019. 517.
|
[20] |
Radford A, Wu J, Child R, et al. Language models are unsupervised multitask learners. OpenAI Blog, 2019, 1(8): 9. |
[21] |
Raffel C, Shazeer N, Roberts A, et al. Exploring the limits of transfer learning with a unified text-to-text Transformer. The Journal of Machine Learning Research, 2020, 21(1): 140. |
[22] |
Chen WH, Chen XT, Zhang JG, et al. Beyond triplet loss: A deep quadruplet network for person re-identification. Proceedings of the 2017 IEEE Conference on Computer Vision and Pattern Recognition. Honolulu: IEEE, 2017. 1320–1329.
|
[23] |
Xiao QQ, Luo H, Zhang C. Margin sample mining loss: A deep learning based method for person re-identification. arXiv:1710.00478, 2017.
|
[24] |
Wang B, Donghao Z, Christina L, et al. Encoding word order in complex embeddings. Proceedings of the International Conference on Learning Representations (ICLR). 2020.
|
[25] |
Kinga D, Adam JB. A method for stochastic optimization. Proceedings of the International Conference on Learning Representations (ICLR). 2015.
|