二进制漏洞扫描

黎 浩然/ 22 10 月, 2023/ 研究生/POSTGRADUATE, 静态分析/STATICANALYSIS/ 0 comments


技术背景

  • 针对当前现网存量老旧版本,缺乏有效的构建工程支撑开源软件漏洞追溯,导致产品已知的开源软件漏洞扫描发现手段缺乏、开源软件漏洞维护修复能力缺失等问题
  • 当前有针对源码和针对二进制的两种扫描手段,其中针对源码的漏洞扫描手段在公司已有工具支撑,但是针对二进制的漏洞扫描还需要持续提升能力

二进制漏洞扫描的特点

  • 不依赖于源码和构建工程
  • 便于第三方机构进行实施
  • 准确率低、且技术复杂高

技术挑战

二进制代码漏洞检测面临以下技术挑战:

  • 漏洞是否修复难以判断:具有漏洞的代码有可能已经被补丁修复,然而其修复之后的版本和具有漏洞的版本之间往往区别不大,如何判断检测的代码是否已经被修复也是一大难点
  • 编译过程的信息的损失:编译过程存在信息丢失,如:语法特征(如,变量名和注释)、数据结构的大小等
  • 编译优化导致代码差异:编译优化可能使得同一段代码在不同的配置下生成的二进制代码表示存在不同

静态分析

  • 符号执行:通过对程序进行符号执行,可以精确地了解其可能的执行路径和状态
  • 数据流分析:这种分析用于跟踪数据在程序中的流动,以检测例如缓冲区溢出等潜在问题
  • 控制流分析:这种分析用于确定程序中各种操作的执行顺序,以便了解程序行为

动态分析

  • 模糊测试:通过随机或半随机输入来运行程序,观察是否有异常或崩溃发生
  • 运行时监控:使用各种工具和技术(例如沙箱)来实时监控程序行为

开源工具:

  • IDA Pro:虽然不是开源,但经常被用于高级的二进制分析
  • Ghidra:美国国家安全局(NSA)开发的开源软件逆向工程工具
  • Radare2:一个开源的UNIX-like反汇编器和调试器

人工审计/人工智能

精度和效率:

一般来说,高精度通常需要更多的计算资源和时间。因此,在设计算法时,需要在精度和效率之间找到平衡


华为自研二进制漏洞扫描技术

基于二进制相似度匹配的二进制漏洞扫描

jTrans: jump-aware transformer for binary code similarity detection

jTrans: jump-aware transformer for binary code similarity detection | Proceedings of the 31st ACM SIGSOFT International Symposium on Software Testing and Analysis

核心:二进制代码相似性检测(Binary Code Similarity Detection,BCSD)

二进制代码相似性检测(Binary Code Similarity Detection,BCSD)

  • Traditional BCSD:依靠二进制代码的某些特性,如函数控制流图(Control Flow Graph,CFG)
  1. 基于图(CG/CFG)相似技术(e.g. 比较两个函数控制流的相似性/寻找二进制函数匹配)

1.1 BinHunt

BinHunt: Automatically Finding Semantic Differences in Binary Programs

CG:Call Graph;CFG:Control Flow Graph

Graph isomorphism engine to find:① a matching between functions, and matching strengths for each pair of matched functions;② a matching between basic blocks in matched functions, and matching strengths for each pair of matched basic blocks

1.2 iBinHunt

iBinHunt: Binary Hunting with Inter-procedural Control Flow

→ 对抗函数混淆(Function Obfuscation)BinHunt改进,CFG相似分析不局限于函数内部

→ 使用深度污点(Deep Taint)分析将程序分为不同的部分,降低Basic Blocks匹配复杂度

→ 除此之外,与 BinHunt 不同的地方是,iBinHunt的 Deep Taint 模块使用了动态分析技术

其它基于图相似性比较的二进制/汇编代码漏洞检测研究

1.3 BinDiff

zynamics.com – BinDiff

要比较两个二进制文件的相似性,需要尽可能地匹配两个二进制文件的函数。BinDiff根据函数

①(基本)代码块数量;② 代码块之间的边数量;③ 调用的子函数的数量;为每一个函数生成一个签名(signature);结合函数签名以及调用图来匹配两个二进制文件间的函数

基于汇编(CFG)代码相似的BCSD(二进制搜索引擎)

    2.1 BinGo

    BinGo: cross-architecture cross-OS binary search | Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering

    2.2 Esh

    Statistical similarity of binaries | ACM SIGPLAN Notices

    从图像(images)相似性的工作中汲取灵感,其关键思想是:如果一个图像可以通过使用另一个图像的区域来组成,那么这两个图像就是相似的,并且这种相似性可以通过统计推理来量化

    • Learning-based BCSD:将目标二进制代码(例如函数)表示为(embeded into)向量,在向量空间中计算函数相似性

    Siamese (GNN to learn the presentation of CFG)

    使用带属性控制流图(Attributed Control Flow Graph, ACFG)余弦相似性来训练图嵌入网络Φ

    基于Structure2Vec改进的模型,修改其$\textit{F}$ 函数为:

    jTrans

    jTrans基于BERT架构;BERT架构是用于自然语言处理的预训练语言模型

    jTrans的输入处理

    Parameter Sharing:将JUMP指令的Token Embedding作为目的指令的Positional Embedding

    jTrans的预训练(Pre-train)

    ① 掩码语言模型(Masked Language Model,MLM)

    ② 跳转目标预测(Jump Target Prediction,JTP)

    损失函数:

    jTrans的微调(Fine Tuning)


    其它的静态分析方法


    二进制级别的符号执行

    Share this Post

    Leave a Comment

    您的邮箱地址不会被公开。 必填项已用 * 标注

    *
    *