于颖超(1983-),女,工程师,主要研究领域为网络安全,嵌入式设备固件安全分析
甘水滔(1986-),男,博士,副研究员,主要研究领域为系统安全,软件脆弱性分析
邱俊洋(1989-),男,博士,工程师,主要研究领域为系统安全,软件脆弱性分析,机器学习
秦晓军(1975- ),男,博士,工程师,主要研究领域为系统安全,软件脆弱性分析,人工智能
陈左宁(1957-),女,博士生导师,CCF会士, 主要研究领域为操作系统,高性能计算,网络和信息安全,人工智能
在当今“万物互联”的时代, 嵌入式系统逐渐成为接入云端的重要组件, 常用于安全和隐私敏感的应用或设备中. 然而, 其底层软件(即固件)也在频繁遭受着安全漏洞的影响. 由于嵌入式设备底层硬件平台的复杂异构, 软硬件实现差异较大, 且其专用性强、源码/文档等往往不会公开, 加之其运行环境受限等原因, 使得一些在桌面系统上运行良好的动态测试工具很难(或根本不可能)直接适配到嵌入式设备/固件环境中. 近年来, 研究人员逐渐开始探索基于二进制相似度分析技术来检测嵌入式设备固件中存在的已知漏洞, 并且取得了较大的进展. 围绕二进制代码相似度分析面临的关键技术挑战, 系统研究了现有的二进制代码相似度分析技术, 对其通用流程、技术特征、评估标准进行了综合分析和比较; 然后分析并总结了现有二进制代码相似度分析技术在嵌入式设备固件漏洞搜索领域的应用; 最后, 提出了该领域应用仍然存在的一些技术挑战及未来的一些开放性的研究方向.
In the era of today’s Internet of Things, embedded systems are becoming important components for accessing the cloud, which are used in both secure and privacy-sensitive applications or devices frequently. However, the underlying software (a.k.a. firmware) often suffered from a wide range of security vulnerabilities. The complexity and heterogeneous of the underlying hardware platform, the difference of the hardware and software implementation, the specificity and limited document, together with limited running environment made some of very good dynamic testing tools for desktop systems hard to (even impossible) be adapted to embedded devices/firmware environment directly. In recent years, researchers have made great progress in detecting well-known vulnerabilities in embedded device firmware based on binary code similarity analysis. Focusing on the key technical challenges of binary code similarity analysis, the existing binary code similarity analysis technologies are studied systematically; the general process, technical characteristics, and evaluation criteria of these technologies are analyzed and compared comprehensively. Then, the application of these technologies is analyzed and summarized in the field of embedded device firmware vulnerability search. At last, some technical challenges in this field are presented and some open future research directions are proposed for the related researchers.
近年来, 开源社区的规模迅速扩大, 提升了软件开发行业的能力, 缩短了软件开发周期, 与此同时, 也加速了漏洞的传播能力. 尤其是在嵌入式设备领域, 出于成本考虑, 设备制造商通常会复用大量的第三方组件(开源社区、历史代码库, 第三方公司等), 将成熟的x86终端设备上的软件程序平滑移植到ARM或MIPS等平台上, 这些都将会导致同一厂商不同型号的产品甚至是不同厂商不同型号的产品都有可能受到同一个复用组件漏洞/已经固件漏洞的影响, 而作为产品使用人员甚至是安全分析人员(非厂商)很难对设备固件的内部关联有一个很清晰的认识, 无疑也加剧了潜在漏洞的传播.
Cui等人[
由于嵌入式设备底层硬件平台的种类繁多、厂商众多、软硬件实现差异巨大, 且其专用性强、源码/文档等往往不会公开, 加之其运行环境受限等原因, 使得一些在桌面系统上运行良好的动态测试工具很难(或根本不可能)直接适配到嵌入式设备/固件环境中. 在这种形势下, 研究人员逐渐开始探索如何基于二进制相似度分析技术来检测嵌入式设备固件中存在的已知漏洞, 并且取得了较大的进展. 然而, 相比于普通桌面应用程序的二进制相似度分析, 将二进制相似度分析技术应用于嵌入式设备固件的漏洞搜索, 面临着巨大的挑战: (1)固件源代码通常是无法获取的; (2)固件的指令集架构多种多样, 所使用的编译器和编译优化级别也不统一, 相同的源代码, 使用不同的编译参数, 甚至是不同的编译器, 针对不同的目标平台可以编译生成不同的二进制文件, 虽然其实现的功能是一样的, 但其语法和结构特征各异. 针对这些挑战, 近年来, 跨平台/跨体系结构的二进制固件漏洞搜索受到了越来越多的关注, 先后提出了若干表现良好的工作[
本文关注到, 虽然文献[
本文首先分析了基于二进制相似度分析的固件漏洞搜索的必要性(第1.1节)及基本思路(第1.2节), 列出了其关键技术挑战(第2节)及现有工作分类(第3节). 然后, 围绕统一的“四阶段”分析框架(第4.1节), 详细阐述了各阶段的技术特征(第4.2–4.5节)及各工具所使用的评估标准(第4.6节), 并对其进行了一个横向的综合比较(第4.7节). 第5节对二进制代码相似度分析技术在嵌入式设备固件漏洞搜索中的应用进行了综合分析和评估, 比较了相关工作所使用的数据集、用于搜索的CVE以及搜索精度和搜索开销. 最后, 对现有技术进行了总结(第6.1节)、提出了将二进制代码相似度分析技术应用在嵌入式设备固件漏洞搜索中面临的进一步挑战(第6.2节), 并提出了一些未来的研究方向(第6.3节).
与桌面二进制分析相比, 嵌入式设备固件安全分析更具挑战性[
针对嵌入式设备固件的漏洞挖掘问题, 学术界和工业界不断尝试通过基于仿真[
近年来, 随着人工智能技术的发展, 学术界和工业界逐渐尝试探索将应用良好的一些机器学习算法应用到软件的漏洞挖掘/发现[
嵌入式设备固件漏洞搜索示意图
与源代码的相似度分析不同, 二进制代码相似度分析的唯一输入来源只可能是可执行的二进制程序. 源代码通过编译、链接和优化等步骤编译成可执行的二进制程序, 然而, 任何一个步骤上的些微区别都有可能会导致程序的详细执行行为严重区别于其源代码.
文献[
以
源代码与不同体系架构下的反汇编代码的区别
挑战1 (C1): 信息损失. 显然, 在编译过程中, 一些在源代码中可用的信息, 比如函数名、变量名等都会丢失. 因此, 分析二进制代码将会比分析源代码更具挑战性和复杂性. 此外, 在缺少调试信息(比如标识符名称)的去符号的二进制情况下, 二进制分析任务更具挑战性.
挑战2 (C2): 指令集架构影响. 显然, x86、ARM和MIPS等架构的指令集是截然不同的. 除此之外, 调用约定、通用和特殊目的的CPU寄存器(参数传递或数据存储)以及内存访问策略也会因体系结构不同而不同. 因此, 即使二进制文件来自于相同的源代码, 不同体系构架下的二进制代码表示也是非常不同的, 因此是难以比较的.
跨体系、跨编译器、跨优化级别、使用混淆技术的二进制的区别
挑战3 (C3): 编译器影响. 不同编译配置(编译器、优化选项、目标平台)的控制流图非常不一致. 以
挑战4 (C4): 函数内联影响. 作为优化技术的一种, 内联技术可以将一个小的函数嵌入到其调用方函数中. 由于内联函数和函数的其他部分之间没有明显的区分, 因此使得函数内联识别任务非常具有挑战性. 当内联函数的汇编指令由于指令对齐和流水线而不连续时, 这项任务就变得更具挑战性.
挑战5 (C5): 混淆技术影响. 混淆技术会大大改变原有的控制流图. 如
挑战6 (C6): 脆弱代码逻辑通常分散在多个基本块中, 甚至跨多个函数. 此示例中的漏洞是由该函数的参数的错误版本检查造成的, 从图中可以看出这个代码逻辑跨越了多个基本块, 并且是与此函数外的其他代码逻辑混合在一起的.
源代码程序和补丁代码程序控制流图区别
挑战7 (C7): 补丁影响. 补丁代码和脆弱代码的控制流图可能不会出现明显的差别. 如
挑战8 (C8): 精确度. 静态分析方法通常会直接分析目标二进制代码而不会直接执行它, 因此, 可以分析整个二进制代码并且可以探测到所有潜在的执行路径. 然而, 由于其不会实际执行代码, 因此容易出现高误报率(假的漏洞)或者高漏报率(不能发现全部漏洞)的情况.
挑战9 (C9): 效率. 如第1.2节所述, 二进制固件漏洞搜索不仅要考虑两个二进制代码片段的相似度分值比较, 而且还要高效地从目标语料库中查询出与查询代码相同或相似的代码, 由于目标语料库的规模较大, 因此其查询效率也是一个很大的挑战.
挑战10 (C10): 可伸缩性. 随着桌面应用程序、IoT设备、嵌入式系统以及它们之间的互联互通的急剧增长, 部署的软件数量正在呈指数级的增长, 因此, 大规模的漏洞检测是绝对有必要的, 特别是应对嵌入式设备固件时, 所提方法的可伸缩性将是一个巨大的挑战.
本文依据提取二进制代码特征的方式将现有的二进制代码相似度分析工作划分为以下几类: 基于静态分析[
二进制相似度分析技术分类
静态分析方法的一种常用方法是将二进制代码转化为图, 然后再执行比较[
动态分析方法通过其执行行为来评估一个给定的软件应用程序, 这可以通过在一个真实或仿真设备上通过一组特定输入组成的测试用例来执行/模块执行这个程序以监控其行为, 获取其输入输出信息或程序的行为信息等来实现. 早期的Blanket Execution[
混合分析方法将动态分析和静态分析相结合, 同时兼顾代码覆盖率、检测准确率以及方法本身的可伸缩性. BinGo-E[
基于学习的方法. 虽然先前有些二进制相似度分析工作也使用了机器学习算法, 比如Zeek[
静态分析无需实际执行, 能够覆盖所有的代码, 但其往往只能依赖语法或结构特征, 而无法获取强大的语义信息的支撑, 因此, 检测准确率相对较低. 动态分析及混合分析通过实际执行/模拟执行二进制代码, 获取输入输出信息或者程序的运行时行为信息, 能够获取比静态分析更精确的语义信息来代表二进制代码, 因此, 能发现静态分析不能发现的漏洞. 然而, 其开销大, 可伸缩性差, 往往需要足够的输入才能保证其代码覆盖率, 而且它们往往只分析执行过的代码, 因此不适用于大规模的嵌入式设备固件漏洞分析. 相比于传统的静态和动态方法, 基于学习的方法: 1)具有更高的准确度. 它们在分析中充分融合了代码的特征(语法特征、语义特征或结构特征等). 2)具有更好的可扩展性. 避免了繁重的图匹配算法或动态执行, 更重要的是, 学习过程可以通过GPUs显著加速, 因此吸引了业界的广泛关注, 也是近年来这方面的研究的一个主要发展趋势.
为了充分说明二进制相似度分析的相关技术特征, 本文使用一个统一的“四阶段”分析框架来分析、总结本文所涉及的二进制相似度分析工作, 如
统一的“四阶段”工作流分析框架
阶段1: 数据准备和预处理阶段. 此阶段用于收集大量的用于训练/评估/比对的二进制代码相关数据(往往是二进制文件), 然后根据要比对的粒度(程序、函数、基本块)对数据进行切分. 与源代码的数据切分不同, 二进制代码的数据切分需要分析人员使用相应的工具(IDA Pro、BAP (binary analysis framework)[
阶段2: 特征提取阶段. 此阶段对阶段1切分出来的二进制代码片段(可以是程序、函数或基本块), 提取出其语法/结构/语义信息, 作为反映这个二进制代码片段的特征(也即唯一表示), 分别称之为语法特征、结构特征、语义特征.
阶段3: 特征表示阶段. 此阶段会对阶段2提取出来的特征进行“向量化”表示, 以方便阶段4进行相似度计算. 特征表示阶段的输出结果才是最终计算相似度分值的输入. 可以将其分为使用嵌入的特征表示, 以及不使用嵌入的特征表示. 本文将在第4.4节中详细描述这两种类型的特征表示方法.
阶段4: 相似度计算阶段. 相似度计算阶段所使用的比较方法会根据所使用的特征表示的不同而有所不同, 比如, 分析人员可以计算特征集合之间的Jaccard距离[
接下来, 本节将从这个“四阶段”分析框架出发, 对每一个阶段的技术特征进行详细分析.
数据准备阶段的目的是准备后续进行处理、学习、训练及评估的数据, 根据数据来源不同, 可以将其分为3类.
I型数据集: 基线数据集. 由于目标设备固件的闭源属性, 要逆向目标设备固件中的二进制程序所使用的编译器、优化选项以及混淆技术等是极其困难的. 因此, 分析人员通过构造一些数据集以进行分析和评估. 如
数据准备和预处理
II型数据集: 固件镜像数据集. 固件镜像数据集的来源有以下途径: (1) 从真实的物理设备中获取; (2)使用公开可用的固件镜像数据集[
III型数据集: 漏洞数据集. 漏洞数据集是漏洞编号(通常是CVE)和实际引入这个漏洞的对应函数之间的一个映射. 漏洞数据集是对目标搜索数据集进行搜索的查询函数集合. 其构建方式如下: 首先, 收集对应CVE编号的漏洞列表, 然后, 下载存在漏洞的软件源代码码, 对其进行编译, 并使用符号名从二进制代码中提取出脆弱函数, 存储在漏洞数据集中. 后续会与基线数据集一样, 经过特征提取和特征表示, 形成相应的特征向量.
数据预处理阶段的主要目的是根据要匹配的粒度从可执行二进制程序中提取出待匹配的函数/基本块/指令, 其处理方式可以分为以下几种.
(1) 转化成中间表示(IR)
大多数处理二进制可执行文件的工具使用的第一步就是将可执行文件程序提升到某种IR以缩小不同指令集架构的二进制可执行文件的语法表示的差距, 使得分析人员可以关注二进制指令中表达的语义, 而不必关注编译器发出二进制指令的方式或链接器的排列方式.
二进制相似度分析方法所使用的分析平台及IR表示
方法 | 分析平台 | IR表示 |
Multi-MH[ |
Valgrind[ |
VEX-IR |
GitZ[ |
Valgrind, 自定义的转换器 | VEX-IR, LLVM-IR |
FirmUp[ |
Valgrind | VEX-IR |
CACompare[ |
Valgrind | VEX-IR |
BinMatch[ |
Valgrind | VEX-IR |
VulSeeker-pro[ |
Valgrind | VEX-IR |
BinGo[ |
- | REIL |
Esh[ |
BAP[ |
LLVM-IR, Boogie IVL |
CoP[ |
BAP | BIL |
ImOpt[ |
BAP | BIL |
Xmatch[ |
McSema[ |
LLVM-IR |
BinSim[ |
TEMU[ |
VineIL |
如
IR的引入统一了二进制代码的表示, 为函数语义特征提取带来了极大的便利, 比如所有的内存读和内存写都统一用VEX-IR的操作码load和store表示, 分析人员只需专注于IR某些特定的操作即可, 而无需在不同指令架构集的多种表达上耗费过多精力. 因此, 极大促进了跨体系架构二进制相似度分析工作.
(2) 转化成图表示
图是二进制代码结构特征的直观表示, 其在形式上可以表示为控制流图(control flow graph, CFG)、数据流图(data flow graph, DFG) 以及函数调用图(function call graph, FCG)等.
二进制相似度分析方法使用的图表示类型
方法 | 图类型 | 表示 | ||
CFG | DFG | FCG | ||
discovRE[ |
√ | - | - | - |
Genius[ |
√ | - | - | ACFG |
Gemini[ |
√ | - | - | ACFG |
Patchecko[ |
√ | - | - | ACFG |
VulSeeker-pro[ |
√ | - | - | ACFG |
|
- | - | √ | - |
VulSeeker[ |
√ | √ | - | LSFG |
BiN[ |
√ | √ | √ | ACFG |
FIT[ |
√ | - | - | 3LACFG |
OrderMatters[ |
√ | - | - | - |
DeepBinDiff[ |
√ | - | √ | ICFG |
CVSSA[ |
√ | - | - | ACFG |
Genius[
(3) 生成trace
执行trace一般是指CFG中连续的基本块组成的序列, 用于表示程序的执行轨迹, 携带了程序的部分控制流信息. BinGo[
(4) 汇编代码序列
discovRE[
如
汇编指令序列以及指令清洗方法
方法 | 粒度 | 序列生成 | tokens | 清洗 |
FIT[ |
函数 | 反汇编 | 指令 | 原始指令, 未做清洗 |
Asm2Vec[ |
函数 | 随机游走 | 操作码, 操作数 | 原始指令, 未做清洗 |
InnerEye[ |
基本块 | 反汇编 | 指令 | 常量值->0, 字符串-><STR>, 函数名->FOO, 其他标签-><TAG> |
Instr[ |
指令 | 反汇编 | 指令 | 同InnerEye |
SAFE[ |
函数 | 反汇编 | 指令 | 基内存地址->MEM, 绝对值超过5000的立即数->IMM |
MIRROR[ |
基本块 | 反汇编 | 操作码, 操作数 | 变量->VAR, 立即数->IMM, 地址名->ADDRESS, 函数名->FUNC |
OrderMatters[ |
函数 | 反汇编 | 指令 | 原始指令序列, 添加特殊token [CLS]和[SEP] |
TREX[ |
函数 | micro-trace | 所有符号 | 数值->num |
DeepBinDiff[ |
基本块 | 随机游走 | 操作码, 操作数 | 数值常量->im, 通用寄存器根据其长度重命名, 指针->str |
在tokens的粒度方面, Asm2Vec[
在指令清洗上, FIT[
指令清洗示例
特征提取阶段是从预处理之后的数据中提取出能够表示程序/函数/基本块语义信息的特征, 以作为后续相似度评估的计算单位. 根据特征提取的智能化水平, 本文将特征提取方法划分为: 基于人工逆向的统计方法, 基于动态执行的语义特征提取和基于学习的自动化特征提取方法.
(1) 人工逆向的统计方法
很多研究使用逆向的方法从目标代码片段的每一个基本块中提取数值特征或结构特征作为目标代码的标识. 数值特征包括指令数目、局部变量的大小、基本块的数量等. 结构特征包括函数的CFG以及其基本块的其他特征等. 这种数值形式或结构形式的特征可以直接作为相似度比较的基础, 也可以通过机器学习做后续处理. Genius[
(2) 基于动态执行的语义特征提取
为了获取语义特征, 需要执行较为复杂的分析, 比如符号执行, 动态仿真或基于机器学习的嵌入学习. 这里将前两种归纳为动态特征提取. 动态提取出来的特征常与其他的特征一起使用. 一种直接的方法是使用符号约束条件来表示给定的代码片段. 符号约束条件可以表达基本块[
(3) 基于学习的自动化学习方法
近年来, 开始有一些基于机器学习的工作利用机器学习网络从原始二进制代码中提取语义信息以构建特征向量表示. 基于学习的特征学习方法可以构建于人工逆向的统计特征或者通过符号执行/仿真计算出来的动态特征之上, 也可以直接从原始的二进制代码中自动学习. 在Genius[
特征提取的目的是将目标代码提升为可进行比较的形式, 这里将其称为特征表示, 可以划分为: 非嵌入表示和嵌入表示两种形式, 如
二进制代码相似度分析中使用的特征表示方法
特征表示方法 | 方法 | |
非嵌入表示 | 输入输出对 | Multi-MH[ |
执行trace | IMF[ |
|
strands | Esh[ |
|
符号表达式 | Xmatch[ |
|
图 | discovRE[ |
|
嵌入表示 | Gemini[ |
(1) 非嵌入表示
1)输入输出对. 直观上语义相似的代码片段, 给定相同输入, 其行为也会相似. Multi-MH[
2)执行trace/运行时行为. 执行trace表示程序的执行轨迹, 携带了程序的部分控制流信息. 因此, 常用来表示目标代码. IMF[
3) strands. 程序切片是指从程序中提取满足一定约束条件的代码片段. strands是指通过某个变量向后切片, 获取与计算该变量相关的指令序列. 它在某种程度上代表了部分数据流信息. 文献[
4)符号表达式. Xmatch[
5)图表示. 对于二进制相似度分析来说, 最直观的便是对结构信息即CFG进行比较. discovRE[
(2) 嵌入表示
“嵌入”[
ACFG和图嵌入示意图(摘自Gemini[
如
基于学习的方法中嵌入生成所使用的模型
方法 | 嵌入粒度 | 嵌入生成模型 |
Gemini[ |
函数 | Structure2Vec[ |
VulSeeker-pro[ |
函数 | Structure2Vec |
函数 | Structure2Vec | |
VulSeeker[ |
函数 | Structure2Vec |
IoTSeeker[ |
函数 | Structure2Vec |
BiN[ |
函数 | Structure2Vec |
FIT[ |
函数 | SGNS[ |
Asm2Vec[ |
函数 | PV-DM[ |
InnerEye[ |
基本块 | Word2Vec[ |
Instr[ |
指令 | CBOW[ |
SAFE[ |
函数 | skip-gram[ |
MIRROR[ |
基本块 | NMT (Transformer)[ |
OrderMatters[ |
函数 | BERT[ |
Trex[ |
函数 | BERT, 2-layer MLP |
DeepBinDiff[ |
基本块 | CBOW[ |
如
二进制相似度分析方法所使用的相似度匹配算法
相似度匹配算法 | 二进制相似度分析方法 | 相似度计算公式 | |
注: BHB: best-hit-broadening, JCS: Jaccard containment similarity, JI: Jaccard index, MCS: maximum common subgraph isomorphism | |||
基于哈希匹配 | BHB | Multi-MH[ |
未明确 |
strands归一化 | GitZ[ |
公式(1) | |
JCS[ |
BinGo[ |
公式(2) | |
JI[ |
IMF[ |
公式(3) | |
SimHash[ |
BinMatch[ |
公式(4) | |
指令间距离 | BinXray[ |
公式(5), 公式(6) | |
线性求解 | Xmatch[ |
公式(7) | |
统计相似性 | 约束求解 | Esh[ |
SMT求解 |
平均值 | BinSim[ |
公式(8) | |
图匹配 | MCS[ |
discovRE[ |
公式(9), 公式(10) |
bipartite图匹配[ |
Genius[ |
公式(11), 公式(12) | |
基于学习 | cosine距离[ |
Gemini[ |
公式(13), 公式(14) |
嵌入距离 | OrderMatters[ |
未明确 | |
深度学习分类器 | Zeek[ |
未明确 | |
Manhattan距离[ |
InnerEye[ |
公式(15), 公式(16) | |
Euclidean距离[ |
MIRROR[ |
公式(17), 公式(18) | |
k-Hop贪婪算法 | DeepBinDiff[ |
未明确 | |
综合相似度 | 相似度组合 | αDiff[ |
公式(19) |
相似度平均 | Patchecko[ |
公式(20), 公式(21) | |
相对差的平均值 | TiKNib[ |
公式(22) |
(1) 基于哈希的匹配
Multi-MH[
BinGo[
IMF[
其中,
BinMatch[
虽然BinXray[
其中,
Xmatch[
其中,
(2) 基于统计相似性的匹配
虽然Esh[
BinSim[
其中,
(3) 基于图匹配的匹配
图匹配试图在两个或多个图结构之间, 建立结点与节点之间的对应关系. 在计算机视觉领域, 图匹配算法通常被用于求解多个图像之间, 关键点到关键点的匹配关系. 相比于只考虑节点与节点之间的一阶相似度关系的点匹配, 图匹配还考虑了图结构中边到边的二阶相似度.
discovRE[
其中,
Genius和CVSSA则使用了bipartite图匹配算法[
其中,
其中,
(4) 基于学习的匹配
基于学习的方法通过将训练样本
Gemini[
为了训练模型参数, 它们将问题转化为下面的目标函数:
Asm2Vec[
Zeek[
InnerEye[
与Gemini[
MIRROR[
其中,
DeepBinDeep[
(5) 基于综合相似度的匹配
由于
同样, Patchecko[
其中,
TiKNib[
(1) 评估数据集
如第4.2.1节所示, 二进制相似度分析技术用于评估其所提方法的数据集通常来源于3个方面: 基线数据集、固件数据集和漏洞数据集. 基线数据集常常是由一些开源项目通过不同的配置场景(编译器、优化选项、混淆、平台等)编译而来的二进制可执行文件组成的数据集, 现有工作中常用到的开源项目有: OpenSSL (
(2) 评估标准
在评估标准方面, 现有工作大多从: (1)精确度, (2)性能, (3)漏洞搜索通力, (4)跨编译器/跨体系结构/跨优化选项/跨版本的相似度比对能力等几个方面进行实验验证. 精确度常用来衡量所提方法在验证数据集上的表现. 不同的方法会使用不同的评估指标, 常用的方法有: 准确率(accuracy), 即模型预测正确数量所占总量的比例; 精确率(precision), 即识别为正类别的样本中, 为正类别的比率; 召回率(recall), 即所有正类别的样本中, 被正确识别为正类别的比率;
本文对所研究的论文列表中用于评估的基准数据集进行了详细分析, 得出了以下结论.
(1)到目前为止, 尚不存在任何两个工作使用了相同的评估基准数据集(除了同一作者的改进工作之外, 比如VulSeeker[
(2) BINKIT[
(3)正如第(1)点所述, 现有二进制相似度分析工作所使用的基准数据集、评估标准并不完全相同, 因此, 很难横向比较现有工作的优劣程度(也无法对评估标准的准确性进行评估), 加之篇幅的限制, 所以, 本文并未对现有工作的评估标准和评估结果进行详细的阐述.
后文
二进制相似度分析技术比较
时间 | 方法 | OS | 处理器 | 编译器 | 优化 | 混淆 | 函数内联 | 补丁 | 分析
|
分析粒度 | 预处理工具 | IR | 特征提取
|
特征表示 | 特征
|
相似度算法 | |||||||||||||||||
Windows | Linux | 98X | ARM | MIPS | clang | gcc | 二进制 | 固件 | 程序 | 函数 | 基本块 | IDA Pro | BAP | Angr | 动态插桩 | 逆向统计 | 动态提取 | 基于学习 | 非嵌入 | 嵌入 | |||||||||||||
I/O对 | 符号表达式 | strands | traces | 图 | |||||||||||||||||||||||||||||
注: JD: Jaccard distance, GES: global evidence score, SE: symbolic expressions, JIR: Jaccard index rates, FDD: function difference degree, NNC: neural network classifier, SGA: similarity game algorithm, JSC: Jaccard similarity coefficient, MD: Manhattan distance, LCS: longest common subsequence, RN: residual network, LCGS: local call graph similarity, SAN: self-attention network, TADW: text-associated DeepWalk, k-Hop GMA: k-Hop greedy matching algorithm, ED: Euclidean distance, SF: symbol formula
|
|||||||||||||||||||||||||||||||||
2015 | Multi-MH[ |
○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | - | - | ○ | ○ | ○ | - | ○ | - | ○ | - | - | - | ○ | ○ | - | - | ○ | - | - | - | - | - | MinHash | BHB |
2016 | discovRE[ |
○ | ○ | ○ | ○ | - | ○ | ○ | A | - | - | - | ○ | ○ | - | ○ | ○ | ○ | - | - | - | - | ○ | - | - | - | - | - | - | ○ | - | kNN | MCS |
Genius[ |
- | ○ | ○ | ○ | ○ | ○ | ○ | ○ | - | - | - | ○ | ○ | - | ○ | - | ○ | - | - | - | - | ○ | - | - | - | - | - | - | ○ | - | LSH | JD | |
Esh[ |
- | ○ | ○ | - | - | ○ | ○ | D | - | - | ○ | ○ | - | - | ○ | - | ○ | ○ | - | - | ○ | - | - | - | - | - | ○ | - | - | - | VCP | GES | |
BinGo[ |
○ | ○ | ○ | ○ | - | ○ | ○ | ○ | - | ○ | - | ○ | - | - | ○ | - | ○ | - | - | - | ○ | - | ○ | - | ○ | - | - | ○ | - | - | SE | JCS | |
MockingBird[ |
- | ○ | ○ | ○ | ○ | ○ | ○ | ○ | - | - | - | ○ | - | - | ○ | - | - | - | - | ○ | ○ | - | ○ | - | - | - | - | ○ | - | - | MD5 | JI | |
2017 | Xmatch[ |
○ | ○ | ○ | - | ○ | ○ | ○ | D | - | - | ○ | ○ | ○ | - | ○ | - | ○ | - | - | - | ○ | - | - | - | - | ○ | - | - | - | - | CF | 自定义 |
Gemini[ |
○ | ○ | ○ | ○ | ○ | - | ○ | ○ | - | - | - | ○ | ○ | - | ○ | - | ○ | - | - | - | - | ○ | - | ○ | - | - | - | - | ○ | ○ | DNN | cosine | |
GitZ[ |
- | ○ | ○ | ○ | - | ○ | ○ | ○ | - | - | - | ○ | - | - | ○ | - | - | ○ | - | - | ○ | - | - | - | - | ○ | ○ | - | - | - | MD5 | 自定义 | |
BinSim[ |
○ | ○ | ○ | - | - | - | - | - | ○ | - | - | ○ | - | ○ | - | - | - | - | - | ○ | ○ | - | ○ | - | - | - | - | ○ | - | - | - | 自定义 | |
IMF[ |
- | ○ | ○ | - | - | ○ | ○ | ○ | ○ | - | - | ○ | - | - | ○ | - | - | - | - | ○ | - | - | ○ | - | - | - | - | ○ | - | ○ | JIR | Extra-trees | |
CACompare[ |
- | ○ | ○ | ○ | ○ | ○ | ○ | ○ | - | - | - | ○ | - | - | ○ | - | ○ | - | - | ○ | ○ | - | ○ | - | ○ | - | - | - | - | - | MinHash | JI | |
CoP[ |
- | ○ | ○ | - | - | - | ○ | ○ | - | ○ | - | ○ | - | ○ | ○ | ○ | ○ | - | ○ | - | ○ | - | - | - | - | ○ | - | - | - | - | SF | LCS | |
2018 | BinArm[ |
- | ○ | - | ○ | - | - | ○ | ○ | - | - | - | - | ○ | - | ○ | - | ○ | - | - | - | - | ○ | - | - | ○ | - | - | - | ○ | - | 多维特征 | 自定义 |
BinGo-E[ |
○ | ○ | ○ | ○ | - | ○ | ○ | ○ | ○ | ○ | - | ○ | - | - | ○ | - | ○ | - | ○ | - | - | ○ | ○ | - | - | - | - | ○ | - | - | 多维特征 | JCS, FDD | |
BinMatch[ |
- | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | - | ○ | - | - | ○ | - | ○ | - | - | ○ | - | - | ○ | - | - | - | - | ○ | - | - | SimHash | JI | |
Zeek[ |
- | ○ | ○ | ○ | - | ○ | ○ | ○ | - | - | - | ○ | - | - | ○ | - | ○ | - | - | - | ○ | - | - | - | - | - | ○ | - | - | ○ | prov2vec | NNC | |
FirmUP[ |
- | ○ | ○ | ○ | ○ | - | ○ | D | - | - | - | ○ | ○ | - | ○ | - | ○ | - | ○ | - | ○ | - | - | - | - | - | ○ | - | ○ | - | strand | SGA | |
- | ○ | ○ | - | - | - | ○ | D | - | - | ○ | ○ | - | - | ○ | - | ○ | - | - | - | - | ○ | - | - | - | - | - | - | ○ | ○ | CNN | 嵌入距离 | ||
VulSeeker[ |
- | ○ | ○ | ○ | ○ | - | ○ | ○ | - | - | - | ○ | ○ | - | ○ | - | ○ | - | - | - | - | ○ | - | - | - | - | - | - | ○ | ○ | DNN | cosine | |
VulSeekerPro[ |
- | ○ | ○ | ○ | ○ | - | ○ | ○ | - | - | - | ○ | ○ | - | ○ | - | ○ | - | - | - | - | ○ | ○ | - | - | - | - | - | ○ | ○ | DNN | cosine, JSC | |
2019 | InnerEye[ |
- | ○ | ○ | ○ | - | ○ | ○ | ○ | - | - | - | ○ | - | - | ○ | ○ | - | ○ | - | - | - | - | - | ○ | - | - | - | - | - | ○ | LSTM | MD, LCS |
Asm2Vec[ |
- | ○ | ○ | - | - | ○ | ○ | ○ | ○ | ○ | - | ○ | - | - | ○ | ○ | ○ | - | - | - | - | - | - | ○ | - | - | - | - | - | ○ | PV-DM | 嵌入距离 | |
BiN[ |
- | ○ | ○ | ○ | ○ | ○ | ○ | ○ | - | - | - | ○ | ○ | - | ○ | - | ○ | - | - | - | - | ○ | - | - | - | - | - | - | - | ○ | RN | cosine, LCGS | |
SAFE[ |
- | ○ | ○ | ○ | - | ○ | ○ | ○ | - | - | - | ○ | - | - | ○ | - | ○ | - | ○ | - | - | - | - | ○ | - | - | - | - | - | ○ | SAN | cosine | |
Instr[ |
- | ○ | ○ | ○ | - | ○ | - | ○ | - | - | - | ○ | - | - | ○ | ○ | ○ | - | - | - | - | - | - | ○ | - | - | - | - | - | ○ | CBOW | 分类 | |
FIT[ |
- | ○ | ○ | ○ | ○ | - | ○ | ○ | - | - | - | ○ | ○ | - | ○ | - | ○ | - | - | - | - | ○ | - | - | - | - | - | - | ○ | ○ | DNN, GAT | cosine | |
2020 | DeepBinDiff[ |
- | ○ | ○ | - | - | - | ○ | ○ | - | - | - | ○ | - | ○ | - | - | ○ | - | - | - | - | - | - | ○ | - | - | - | - | ○ | ○ | TADW | k-Hop GMA |
MIRROR[ |
- | ○ | ○ | ○ | - | ○ | - | ○ | - | - | - | ○ | - | - | - | ○ | ○ | - | - | - | - | - | - | ○ | - | - | - | - | - | ○ | NMT | ED | |
OrderMatters[ |
- | ○ | ○ | ○ | - | - | ○ | ○ | - | - | - | ○ | - | - | ○ | ○ | ○ | - | - | - | - | - | - | ○ | - | - | - | - | ○ | ○ | BERT, MPNN, CNN | 嵌入
|
|
ImOpt[ |
- | ○ | ○ | - | - | - | ○ | ○ | ○ | - | - | ○ | - | - | ○ | - | ○ | ○ | - | - | ○ | - | - | ○ | - | - | - | - | - | - | - | - | |
Trex[ |
- | ○ | ○ | ○ | ○ | - | ○ | ○ | ○ | - | - | ○ | ○ | - | ○ | - | - | - | - | - | - | - | - | ○ | - | - | - | - | - | ○ | BERT | cosine | |
Patchecko[ |
- | ○ | ○ | ○ | - | ○ | - | ○ | - | - | ○ | ○ | ○ | - | ○ | - | ○ | - | - | ○ | - | ○ | ○ | - | - | - | - | - | ○ | ○ | DNN | Minkowski | |
BINKIT[ |
- | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | - | ○ | - | - | ○ | - | ○ | - | - | - | - | ○ | - | - | - | - | - | - | - | - | 数字 | 相对差 | |
总量 | 34 | 7 | 34 | 33 | 25 | 24 | 21 | 30 | 29 | 8 | 6 | 5 | 33 | 13 | 3 | 31 | 7 | 28 | 4 | 3 | 5 | 12 | 12 | 9 | 10 | 4 | 3 | 4 | 6 | 12 | 17 | - | - |
解决的挑战 | C1 | C1, C2 | C3 | C3 | C5 | C4 | C7 | C10 | C6, C8 | C1, C2, C8, C9, C10 | C2 | C8, C9 | C8, C9, C10 | - | - |
如
在预处理过程中, 79.4% (28/34)的工具使用了IDA Pro作为其静态反汇编工具, 11.8%的工具使用了BAP[
在特征提取方法中, 逆向统计、静态分析、动态提取和基于学习的占比差不多, 分别为35.3%, 23.5%, 26.5%和26.5%. 在特征表示中, 以嵌入为表示方法的工具最多, 占47%, 并且大多分布在2018–2020年, 这也充分说明了近年来, 深度学习技术在二进制相似度分析领域逐渐得到了广泛的应用.
作为一种典型应用, 二进制代码相似度分析特别是跨体系架构的二进制代码相似度分析技术常被用于嵌入式设备固件漏洞搜索. 尽管理论上来说, 跨体系结构的二进制相似度分析技术都可以应用到嵌入式设备固件的漏洞搜索中, 然而, 在本文分析的文献列表中, 只有13篇论文(约38.2%)将在固件中的漏洞搜索作为其典型应用进行了阐述. 本文单独抽取了这38.2%的工具来阐述二进制代码相似度分析在嵌入式设备固件漏洞搜索中的应用, 如后文
二进制相似度分析技术在嵌入式设备固件漏洞搜索中的应用
工具 | 数据集 | CVE | 查询样本开源库 | 受影响的设备固件 | 查询结果 | 时间开销 | 开源 | |||
基线数据集(项目;编译器;优化选项;处理器;最后生成的数据集规模) | 固件(#) | 漏洞数据集(#) | 其他
|
|||||||
Multi-MH[ |
OpenSSL:v1.0.1f, BusyBox:v1.21.1; gcc v4.6.2/v4.8.1, O0-O3; x86, MIPS, ARM; 60个二进制 | 8 | 无 | 无 | 2014-0160 | openssl-1.0.1f | DD-WRT | 成功 | 未明确 | 否 |
2013-1813 | busybox-1.20.0 | NetgearNAS v6.1.6 | 成功 | |||||||
SerComm后门 | socket_read() | Netgear | 后门 | |||||||
2013-6484 | Pidgin-2.10.8 | Windows, macOS x | 成功 | |||||||
Genius[ |
OpenSSL:v1.0.1f, v1.0.1a, BusyBox:v1.21, v1.20, coreutils:v6.5, v6.7; gcc v4.6.2/v4.8.1, clang v3.0;O0–O3;x86, MIPS, ARM; 568 134个函数 | 8 128 | 154 | 无 | 2015-1791 | 基线数据库 | D-Link, Belkin | 14/50 (28%) |
|
部分 |
2014-3508 | 基线数据库 | CenturyLink, D-Link, Actiontec | 24/50 (48%) | |||||||
Gemini[ |
OpenSSL: v1.0.1f, 1.0.1u; gcc v5.4; O0-O3; x86, MIPS, ARM; 18 269个二进制文件, 129 365个ACFGs | 8 128 | 154 | IV-1 | 2015-1791 | 基线数据库 | 固件数据库 | 42/50 (84%) | 未明确 | 部分 |
2014-3508 | 基线数据库 | 固件数据库 | 41/50 (82%) | |||||||
Xmatch[ |
OpenSSL:v1.0.1a, v1.0.2d, BusyBox:v1.19.0, 1.20.0;gcc v4.8.4/4.8.1, clang v3.4;缺省优化级别; x86, MIPS; 72个二进制文件, 216 000个函数 | 1 | 10 | 无 | 2013-6449 | 基线数据库 | DD-WRT(r21676) | 87% | 未明确 | 否 |
IoTSeeker[ |
OpenSSL: v1.0.1f, 1.0.1u, BusyBox:v1.21.0, coreutils:v6.5, v6.7;gcc:v4.9, v5.5; O0–O3;x86, x64, MIPS32, MIPS64, ARM32, ARM64; 240个二进制, 735 540个函数 | 4 643 | 无 | 无 | 2015-1791 | 基线数据库 | 未知 | 39/50 (78%) | 0.2s/函数对 | 否 |
2014-3508 | 基线数据库 | 未知 | 41/50 (82%) | |||||||
discovRE[ |
BitDHT, GnuPG, ImageMagick, MAME, OpenCV, SQlite, stunnel; gcc 4.8.2, clang 3.3, ICC14.0.1, VC16.00; 排除函数内联; x86, x64, ARM v7, MIPS; 31 000个函数 | 3 | 无 | 无 | 2014-0160 | openssl-1.0.1e | DD-WRT | heartbleed |
|
否 |
2014-3566 | openssl-1.0.1e | ReadyNAS | POODLE | |||||||
BinARM[ |
无 | 2 628 | 235 | 无 | 漏洞库脆弱
|
无 | 固件数据集 | 精确度: 92% | 0.00027 s | 否 |
FirmUP[ |
无 | ~2 000 | 7 | 无 | 2011-0762 | vsftpd | Asus, Netgear | 在固件库中发现了373个脆弱函数, 成功率高达93% | 未明确 | 否 |
2009-4593 | bftpd | Netgear | ||||||||
2012-0036 | libcurl | Netgear | ||||||||
2013-1944 | libcurl | Asus, D-Link | ||||||||
2013-2168 | dbus | D-Link, Netgear | ||||||||
2014-4877 | Wget 1.15 | Asus, Netgear | ||||||||
2016-8618 | libcurl | Asus, D-Link, Netgear | ||||||||
FIT[ |
OpenSSL:v1.0.1f, v1.0.1u, BusyBox:v1.27.2, findutils:v4.6.0; gcc v5.4;O0-O3;x86, MIPS, ARM;72个二进制文件, 254 391个3LACFGs | 8 122 | 无 | IV-2
|
2016-5681 | main() | 固件数据集中的
|
最高97.79% |
|
部分 |
2013-1813 | BusyBox | |||||||||
2014-3508 | OpenSSL | |||||||||
2017-15873 | BusyBox | |||||||||
BiN[ |
OpenSSL:v1.0.1e, v1.0.1u, BusyBox:v1.27.2; gcc v5.4; O0-O3;x86, AMD64, MIPS, MIPS64, ARM, ARM64;-- | 8 753 | 84 | 无 | 2015-1791 | OpenSSL | D-Link, TP-Link, Netgear, Cisco | 42.6/50 (85.2%) | 未明确 | 否 |
2014-3508 | OpenSSL | 87.9/100 (87.9%) | ||||||||
Patchecko[ |
100个Android库(来自Android 8.1.0 r36);clang; O1, O2, O3, Oz, Ofast; x86, AMD64, ARM32, ARM64;2 108个库二进制, 2 037 772个函数 | Android和iOS固件 | 2 076 | 无 | 25个CVE | CVE脆弱
|
Andorid Things, Google Pixel | 训练: 96%, 检测: 93%, 动态分析: ~100% | 检测约3s/函数 | 否 |
Trex[ |
OpenSSL:v1.0.1f, v1.0.1u, binutils:2.34, coreutils:8.32, curl:7.71.1, diffutils:3.7, findutils: 4.7.0, GMP:6.2.0, ImageMagick:7.0.10, libmicrohttpd:0.9.71, libTomCrypt:1.18.2, PuTTy-0.74, SQLite-3.34.0, Zlib-1.2.11;gcc-7.5, O0-O3; x86, x64, ARM (32-bit), MIPS (32-bit);
|
180 | 16 | 无 | 2019-1563 | OpenSSL | Ubiquiti sunMax
|
AUC>0.958 | 未明确 | 部分 |
2017-16544 | BusyBox | |||||||||
2016-6303 | OpenSSL | |||||||||
2016-6302 | OpenSSL | |||||||||
2016-2842 | OpenSSL | |||||||||
2016-2182 | OpenSSL | |||||||||
2016-2180 | OpenSSL | |||||||||
2016-2178 | OpenSSL | |||||||||
2016-2176 | OpenSSL | |||||||||
2016-2109 | OpenSSL | |||||||||
2016-2106 | OpenSSL | |||||||||
2016-2105 | OpenSSL | |||||||||
2016-0799 | OpenSSL | |||||||||
2016-0798 | OpenSSL | |||||||||
2016-0797 | OpenSSL | |||||||||
2016-0705 | OpenSSL |
(1) 2015–2020年间, 基于二进制代码相似度分析的嵌入式设备固件漏洞搜索包含但不仅限于这38.2%的分析工具. 比如, Costin等人[
(2)
如
在这12项工作中, 有2项工作(2/12, 16.7%)没有使用基线数据集: BinARM[
在这12项工作中, Patchecko[
在固件数据集方面, BiN[
在漏洞数据集方面, Patchecko[
在用于搜索的CVE方面,
在时间开销方面, 由于其检测的粒度、数据集规模等方面存在差异, 很难使用一种统一的评估标准来评估不同的工具在时间开销方面的优劣度, 本文在
本文通过对现有二进制相似度分析工作的总结与对比, 发现: 随着AI的发展, 基于机器学习的漏洞检测已经成为安全领域的研究热点, 特别是将二进制代码相似度分析技术应用在漏洞检测领域取得了一系列的研究成果, 主要体现在以下几个方面.
(1) 检测的粒度越来越细: 从早期的文件级, 到函数级, 再到基本块级;
(2) 特征表示越来越有效: 从早期的以文件的模糊哈希为特征表示, 到人工逆向统计出来的静态数据作为特征表示, 再到以控制流图或数据流图为单位的图表示, 到以深度学习模型的嵌入表示为目标的特征自动化学习, 使得特征表示越来越能表达目标代码所蕴含的更深层次的语义信息, 更能表征目标代码;
(3) 适用场景越来越具有普适性: 从初始的单一架构(x86)到跨架构(x86, ARM, MIPS等), 从单一特征到混合特征, 从仅应对一种编译选项, 到可以应对多种编译器、多种优化级别、混淆技术, 甚至跨版本, 使得二进制分析工具的普适性越来越强, 越来越能充分应对复杂多变的嵌入式设备固件环境;
(4) 方法选择越来越灵活: 静态分析无法衡量语义, 对一些特征的变化比较敏感; 动态执行复杂度高, 可伸缩性差; 深度学习的自动化程度高, 但存在误报; 近年来, 逐渐出现了将多种方法混合在一起发挥其各自优势, 从单一的静态分析, 到静、动结合, 到融合深度学习和动态分析, 提升漏洞搜索的精确度;
(5) 机器学习新理论新技术的出现促进了漏洞检测的发展: 从早期的支持向量机、逻辑回归等典型分类模型的应用, 到LSTM、NLP等新型深度学习模型的应用, 机器学习模型理论和技术的不断发展, 也在一步步地促进其在漏洞挖掘领域更具针对性且更精确地使用.
二进制代码相似度分析技术在嵌入式设备固件漏洞搜索领域获取了一定的效果, 从最初的文件相似度比较, 到细粒度的函数比较, 再到更细粒度的基本块级的比较, 编码方案从最初的模糊哈希, 到基于神经网络的图嵌入, 到基于NLP的指令及基本块嵌入, 漏洞关联速度和准确度都有了很大的提升. 然而, 现阶段二进制相似度分析技术在嵌入式设备固件漏洞搜索领域的发展并不十分成熟, 还面临着以下挑战.
(1) 嵌入式设备固件逆向. 固件逆向的准确度直接决定了二进制相似度匹配的结果, 现有工作大多建立在“逆向能够获得精确的结果”这一假设基础之上, 然而, 事实上, 固件逆向是一项耗时且极具挑战性的任务, 并且通常需要专家知识. 完全精确且完备的二进制固件逆向几乎是不可能实现的[
(2) 嵌入式设备固件二进制代码的存储及高效查询. 嵌入式设备固件种类繁多, 每一个固件中提取出来的二进制文件几乎都有数百个, 每一个二进制文件可以提取出数百甚至上千个函数, 因此固件数据集的存储和查询直接影响到其查询的性能, 目前尚没有工作提及对固件数据集的存储和查询的优化.
(3) 针对嵌入式设备固件的漏洞数据集的构建. 除了BinARM[
(4) 无法应对跨函数/跨二进制文件的漏洞检测. 目前的解决方案仅限于单个函数之间的相似度比对为依据的漏洞搜索. 然而, 由于嵌入式设备固件的特有性, 其漏洞经常是跨函数, 甚至是跨二进制文件的, 对于这类漏洞的搜索仍然是嵌入式设备固件漏洞搜索急需解决的难题, 像Karnote[
(5) 误报或漏报问题是固有问题. 虽然Patchecko[
(6) 缺乏统一的评估标准. 从
正如第6.2节所述, 现阶段基于二进制相似度分析技术的嵌入式设备固件漏洞搜索尚处于初步发展阶段, 仍然存在很多挑战, 但是新的挑战也会产生新的机遇. 本文提出了一些开放性的研究方向.
(1) 提升二进制相似度分析技术应对不同配置的能力
虽然现有的二进制相似度分析技术在跨体系、跨编译器和跨优化选项方面都有所考虑且取得了显著的成果(
(2) 提升二进制逆向的准确度
如第4.2节所述, 大多数的二进制代码相似度分析工具严重依赖于二进制逆向工具(比如IDA Pro/Angr). 然而, 即使是IDA Pro这种相对成熟的反汇编工具也并不完美[
● 入口点和函数边界识别. 反汇编器通常使用符号表来识别函数边界以及构建控制流图. 然而, 当符号表不准确或者不可用时, 寻找函数边界就变得很有挑战[
● 代码混淆/变换. 合法/良性程序的作者可能会出于不同的原因保护他们的程序, 比如知识产权保护或者防止其程序被重新打包或作为恶意软件发布. 同样, 恶意软件作者会在其恶意代码上应用某些技术以逃避分析. 用于这些目的的混淆[
● 应对编译选项的特殊配置. 比如, 在处理clang加上PIC选项编译而来的MIPS二进制文件时, IDA Pro是无法分析间接分支的. 特别地, 编译器使用寄存器-间接分支指令(比如jalr)以一种独立于位置的方式调用函数. 再比如, 当调用一个函数时, gcc会在gp寄存器中存储 GOT的基地址, 并且在运行时使用它来计算函数地址, 而clang则使用s0或v0寄存器来存储这样的基地址. 这种微小的差异会混淆IDA Pro, 使其不能获取GOT的基地址, 因此不能计算间接分支的目标地址. 系统发现这样的错误是一项困难的任务, 因为很多逆向工具的内部细节并没有完全公开, 而且它们之间的差异很大.
(3) 构建更符合嵌入式设备固件漏洞场景的搜索模型
现有研究工作主要集中在根据第三方库中暴出来的已知漏洞, 提取出其语义特征, 与存储在固件数据集中的语义特征进行一对一的比对, 选择出最接近于已知漏洞语义特征的候选对象作为可疑对象, 然而本文认为还可以在以下几个方面对这个流程进行改进.
● 深度学习模型的选择. 现有研究工作大多使用有监督的学习方法, 数据集的标记需要很大的工作量, 且需要考虑训练样本的平衡问题. 文献[
● 漏洞的形成机理分析. 现有研究工作大多仅考虑单个函数内发生漏洞的情况, 并没有对漏洞的形成机理进行深入分析, 提出类似于漏洞模板一样的查询函数, 因此, 其在实际应用于, 只能做一对一的搜索, 可扩展性不强. 且无法应对跨函数或跨二进制文件的漏洞. 未来的研究工作中, 对漏洞的形成机理进行深入分析, 构建能够精确表达漏洞代码业务流程的代码特征也必将是一个重要的研究方向.
● 泛化漏洞签名. 正如上面所述, 现有的大多数分析方法都为每一个漏洞函数以不同的表示和特定级别提供了一种特定模式, 并且利用匹配技术或相似性度量来识别它. 为每一种类型的漏洞(比如, 缓冲区溢出)提供一个通用签名而不是与已经具有特定漏洞的函数相匹配是未来的研究方向之一.
(4) 构建统一且规范的数据集集合
为了更好地推进二进制相似度分析技术及其在嵌入式设备固件漏洞搜索领域的应用, 本文认为需要构建统一且规范的数据集集合, 包括: 用于训练的二进制数据集, 用于评估的真实固件二进制数据集, 以及用于搜索查询的漏洞数据库(含固件漏洞)以及相应的补丁数据库, 以解决:
● 代码库的多样性问题. 代码库决定了分析工具的搜索空间, 代码库的特征决定了分析工具可以在搜索空间中发现什么. 现有大多数工作以不同的方式构建其代码基, 这可能会影响到其工具的性能和可用性. 实际环境中的代码库规模(单个固件镜像)通常有数百万行代码, 然而, 许多现有的工具只在小规模的代码库中测试他们的工具, 因此, 其结果可能不能直接推广到大规模固件镜像组成的数据集.
● 搜索查询的数量问题.
● 工具的有效性和可扩展性评估问题. 从
(5) 构建集静态分析、动态验证和深度学习于一体的嵌入式设备固件综合分析模型
如第1.1节所示, 针对嵌入式设备及其固件的测试, 近年来, 学术界和工业界提出了很多不同的技术, 然而, 这些技术大多数都仅适用于特定的设置和环境, 比如FirmAFL[
● 自动化的重新托管. 目前在嵌入式设备固件领域可用的重新托管技术[
● 面向嵌入式设备固件的(增强的)模糊测试方法. 尽管重新托管技术确实可以帮助模糊测试技术应用于嵌入式设备固件的测试, 但目前为止, 并没有更好的针对嵌入式设备固件漏洞的模糊测试方法提出(比如测试例生成、动态插桩和错误监测等). 这是因为大多数的嵌入式设备固件并没有实现内存管理, 即便发生了内存崩溃, 其错误也不会报告出来. 因此, 构建一个仿真器, 能够报告内存破坏, 并且可以在实现的模糊测试方法上提供反馈, 将会为分析不同的模糊测试方法在嵌入式设备上的效果提供机遇.
● 融合不同的方法到嵌入式设备固件的测试. 尽管目前提出了很多不同的方法用于嵌入式设备固件的测试, 但融合不同的方法仍然极具挑战但可以进一步研究. 比如以二进制相似度分析报告出来的脆弱点作为模糊测试的“兴趣点”, 将模糊测试导向到脆弱点做进一步的执行测试, 以确定漏洞以及触发漏洞的输入. 比如, 使用符号执行来求解需要什么样的外设值才可以使模糊测试继续执行. 比如, 使用深度学习为测试生成针对性的输入样本等.
2: A multi-target orchestration platform. In: Proc. of the Workshop on Binary Analysis Research. Cham: Springer, 2018. 1–11.]]>
et al. DICE: Automatic emulation of DMA input channels for dynamic firmware analysis. In: Proc. of the 2021 IEEE Symp. on Security and Privacy (SP). San Francisco: IEEE, 2021. 1938–1954.]]>
Wang HT, Ye GX, Tang ZY, Tan SH, Haung SF, Fang DY, Feng YS, Bian L Z, Wang Z. Combining graph-based learning with automated data collection for code vulnerability detection. IEEE Transactions on Information Forensics and Security, 2021, 16: 1943–1958. [doi: 10.1109/TIFS.2020.3044773]
Zou DQ, Wang SJ, Xu SH, Li Z, Jin H.
David Y, Partush N, Yahav E. Statistical similarity of binaries. ACM Sigplan Notices, 2016, 51(6): 266–280. [doi: 10.1145/2980983.2908126]
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]
Luo LN, Ming J, Wu DH, Liu P, Zhu SC. 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]
Xue YX, Xu ZZ, Chandramohan M, Liu Y. Accurate and scalable cross-architecture cross-OS binary code search with emulation. IEEE Transactions on Software Engineering, 2018, 45(11): 1125–1149. [doi: 10.1109/TSE.2018.2827379]
Gao J, Yang X, Jiang Y, Song HB, Choo KKR, Sun JG. Semantic learning based cross-platform binary vulnerability search for IOT devices. IEEE Transactions on Industrial Informatics, 2019, 17(2): 971–979. [doi: 10.1109/TII.2019.2947432]
Wu H, Shu H, Kang F, Xiong XB. BiN: A two-level learning-based bug search for cross-architecture binary. IEEE Access, 2019, 7: 169548–169564. [doi: 10.1109/ACCESS.2019.2953173]
Liang HL, Xie ZS, Chen YX, Ning H, Wang JL. FIT: Inspect vulnerabilities in cross-architecture firmware by deep learning and bipartite matching. Computers & Security, 2020, 99: 102032. [doi: 10.1016/j.cose.2020.102032]
et al. Safe: Self-attentive function embeddings for binary similarity. In: Proc. of the 16th Int’l Conf. on Detection of Intrusions and Malware, and Vulnerability Assessment. Gothenburg: Springer, 2019. 309–329.]]>
Yu ZP, Cao R, Tang QY, Nie S, Huang JZ, Wu S. Order matters: Semantic-aware neural networks for binary code similarity detection. Proceedings of the AAAI Conference on Artificial Intelligence, 2020, 34(1): 1145–1152. [doi: 10.1609/aaai.v34i01.5466]
Kuhn HW. The Hungarian method for the assignment problem. Naval Research Logistics Quarterly, 1955, 2(1–2): 83–97. [doi: 10.1002/nav.3800020109]
David Y, Yahav E. Tracelet-based code search in executables. ACM Sigplan Notices, 2014, 49(6): 349–360. [doi: 10.1145/2666356.2594343]
Nethercote N, Seward J. Valgrind: A framework for heavyweight dynamic binary instrumentation. ACM SIGPLAN Notices, 2007, 42(6): 89–100. [doi: 10.1145/1273442.1250746]
Kosub S. A note on the triangle inequality for the Jaccard distance. Pattern Recognition Letters, 2019, 120: 36–38. [doi: 10.1016/j.patrec.2018.12.007]
Gao XB, Xiao B, Tao DC, Li XL. A survey of graph edit distance. Pattern Analysis and Applications, 2010, 13(1): 113–129. [doi: 10.1007/s10044-008-0141-y]
Appel AW. SSA is functional programming. ACM SIGPLAN Notices, 1998, 33(4): 17–20. [doi: 10.1145/278283.278285]
Quynh NA, Vu DH. Unicorn: Next generation CPU emulator framework. BlackHat USA, 2015, 476.
Church KW. Word2Vec. Natural Language Engineering, 2017, 23(1): 155–162. [doi: 10.1017/S1351324916000334]
Li Y D, Hao Z B, Lei H. Survey of convolutional neural network. Journal of Computer Applications, 2016, 36(9): 2515–2516.
Young T, Hazarika D, Poria S, Cambria E. Recent trends in deep learning based natural language processing. IEEE Computational Intelligence Magazine, 2018, 13(3): 55–75. [doi: 10.1109/MCI.2018.2840738]
Marimont RB, Shapiro MB. Nearest neighbour searches and the curse of dimensionality. IMA Journal of Applied Mathematics, 1979, 24(1): 59–70. [doi: 10.1093/imamat/24.1.59]
Bouchard M, Jousselme AL, Doré PE. A proof for the positive definiteness of the Jaccard index matrix. International Journal of Approximate Reasoning, 2013, 54(5): 615–626. [doi: 10.1016/j.ijar.2013.01.006]
Raymond JW, Willett P. Maximum common subgraph isomorphism algorithms for the matching of chemical structures. Journal of Computer-Aided Molecular Design, 2002, 16(7): 521–533. [doi: 10.1023/A:1021271615909]
Riesen K, Bunke H. Approximate graph edit distance computation by means of bipartite graph matching. Image and Vision Computing, 2009, 27(7): 950–959. [doi: 10.1016/j.imavis.2008.04.004]
Bottou L. Stochastic gradient learning in neural networks. Proceedings of Neuro-Nımes, 1991, 91(8): 12.
Luk CK, Cohn RS, Muth RM, Patil HG, Klauser AW, Lowney GN, Wallace S, Reddi VJ, Hazelwood KM. Pin: Building customized program analysis tools with dynamic instrumentation. ACM SIGPLAN Notices, 2005, 40(6): 190–200. [doi: 10.1145/1064978.1065034]
Stallman R, Pesch R, Shebs S. Debugging with GDB. Free Software Foundation, 1988, 675.
Kornblum J. Identifying almost identical files using context triggered piecewise hashing. Digital Investigation, 2006, 3: 91–97. [doi: 10.1016/j.diin.2006.06.015]
李登, 尹青, 林键, 吕雪峰. 基于同源性分析的嵌入式设备固件漏洞检测. 计算机工程, 2017, 43(1): 72–78. (in Chinese with English Abstract)
Li D, Yin Q, LIN J, Lv XF. Firmware vulnerability detection in embedded devicebased on homology analysis[J]. Computer Engineering, 2017, 43(1): 72-78. (in Chinese with English Abstract)