V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析

V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析

  • 针对二进制程序,也可以用于开源软件(需要将其编译成二进制程序)
  • 类似于定向fuzz–不是定向fuzz,而是找到目标辅助种子选择
  • V-Fuzz结合了漏洞预测和进化fuzz的优势,同时减小了劣势(由于漏洞预测模型不是精确的,所以对脆弱代码使用大权重,对其他代码使用较小的权重,以防止模型出现错误预测时导致误报)
  • 实质上使用漏洞预测模型的结果来优化seed file的选择

2、背景

2.2二进制程序漏洞预测

使用深度学习模型:

  • 因为使用静态分析工具的话,(1)只能针对开源软件,(2)会有较高的误报率和漏报率。

如何表示binary

  • 表示binary program–使用汇编语言,分析程序的CFG(控制流图,包含丰富的语义和结构信息);
  • 为了便于训练,需要表示成向量–使用Attributed Control Flow Graph (ACFG) [Scalable graph-based bug search for firmware images];

合适的分析粒度

  • 不能太粗(不够准确)也不能太细(很难提取),最终选择函数粒度进行分析;

合适的神经网络模型

  • graph embedding network图嵌入网络
  • 已经有paper将该网络应用于提取结构化数据的有效特征和检测binary代码相似性,因此选择该种网络模型,并进行适当修改,以适应本文的工作目标。

discovre: Efficient cross-architecture identification of bugs in binary code(2016NDSS)

3、V-FUZZ: SYSTEM OVERVIEW

V-Fuzz整体框架

V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第1张图片

漏洞预测模型

  • 输出一个binary中可能存在漏洞的函数,并给出这个函数存在漏洞的概率。

训练数据:

  • 标签分别设置为secure和vulnerable;
  • 可以将标签设置更加细致,以识别不同类型的漏洞。-----可以改进的地方

漏洞导向的进化fuzzer

  • 使用vulnerable概率表示有漏洞的概率。
  • 对于每个有vulnerable 概率的函数,V-Fuzz将会给函数中的每个基本块设置一个**SVS(Static Vulnerable Score)**来表示基本块的重要性。
  • V-Fuzz利用进化算法生成正确的测试用例。对每个执行的输入,给定一个fitness score,即执行路径上所有基本块的SVS之和。
  • 然后选取具有较高的fitness score或产生crash的输入作为新的种子输入

目前分析–问题

  • 相当于对binary程序分析一次,得到可能存在漏洞的函数,并为其中的基本块标注SVS;
  • 然后使用基本块的SVS和crash作为选取新种子的标准;
  • 变异策略?? – 类似AFL

4、漏洞预测

4.1问题定义

  • 预测模型为M
  • 程序中的函数集合为F = {f1,f2, …, fτ}
  • 函数集合F中的每个函数 fi 作为M的输入,对应的输出为 fi 的vulnerable probability – PVfi

P V f i = M ( f i ) PVfi = M(fi) PVfi=M(fi)

4.2数据预处理

---- 将binary program转换成数值向量

使用Attributed Control Flow Graph (ACFG)来表示binary函数:

  • ACFG是一个有向图(g =
    • V:点的集合
    • E:边的集合
    • φ :映射函数
    • 一个点v表示一个基本块
    • 一个边e表示两个基本块的连接
    • φ 表示将g中的基本块映射到属性集合

使用CFG来寻找bug:

Cross architecture bug search in binary executables (2015 S&P)

discovre:Efficient cross-architecture identification of bugs in binary code (NDSS 2016)

由于CFG不是数值向量,因此使用CFG的另一种形式ACFG(使用一些基本块级别的属性来描述CFG)

ACFG:

​ 每个基本块都表示为一个数值向量,向量的每一维表示指定属性的值。

​ 因此,一个函数可以表示为一组向量。

数据预处理工作流程:

V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第2张图片

反汇编binary得到每个函数的CFG,然后提取基本块的属性并转换成数值向量。

这些属性用来特征化一个基本块,属性可以是统计的,语义的,结构化的。–这里只使用统计属性

  • 效率。语义特征如IO对太expensive。
  • graph embedding网络可以自动学习结构化属性。
  • 共提取了255个属性,见table1.
    V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第3张图片

4.3 模型结构

V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第4张图片
图嵌入网络

  • 将graph转换成vector
  • 可以认为是一个映射函数,将函数的ACFG映射为一个向量

本文使用神经网络近似这个映射函数;

网络结构

  • graph embedding 网络+ pooling layer + softmax layer
    • graph embedding – ACFG–>vector
    • pooling layer – 将输出的embedding vector转换为2维的向量
    • softmax layer – 将2维向量转换为概率

V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第5张图片
图4中的流程:

  1. model输入为binary程序中一个函数的ACFG g

  2. ACFG中每个基本块v有一个属性vector xv

    • 基本块的属性总数为a,因此xv是一个a维的vector
  3. 对每个基本块v,图嵌入网络计算一个embedding vector uv,其中包含了graph中的信息。

    • uv的维度为d
    • Nv可以认为是v的前置节点集合
    • 然后使用下面的公式计算embedding vector uv
    • 其中F函数可以是sigmoid,tanh等

    µ v = F ( x v , ∑ j ∈ N v ( µ j ) ) µv = F (xv, \sum_{j\in Nv}(µj)) µv=F(xvjNv(µj))

  4. 然后经过T轮iteration,得到每个顶点(即每个基本块)的最终的graph embedding向量 uv(T)

  5. 整个ACFG的embedding 向量 ug 表示为每个基本块embedding向量uv(T)*之和,即对应下面的公式,其中W2是一个 d * d 维的矩阵:
    µ g = W 2 ( ∑ v ∈ V ( µ v T ) ) µg = W2(\sum_{v \in V} (µ_{v}^T )) µg=W2(vV(µvT))

  6. 然后将得到的 ug 使用pooling layer转换成2维的向量

  7. 然后使用softmax layer转换成概率(p, 1-p)

    • p为这个函数有漏洞的概率
    • p是整个模型的最终输出
  8. 最终转换为求最小化loss函数即最小化问题

4.4 训练和使用模型

label为0或者1

  • l=1 代表函数是secure
  • l=0 代表函数至少含有一个漏洞

训练:

  • 最小化问题
  • 使用交叉熵(二值交叉熵)
  • 优化方法:SGD

5、漏洞导向的fuzz

V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第6张图片

5.1 如何给每个基本块标注SVS

  • 基于存在漏洞的概率VP
  • SVS(bi) = κ ∗ pv + w
    • bi是函数f中的基本块
    • k和w是常数参数,通过实验得到
      • k属于[15, 25] 时效果最好,默认值设为20;
      • w是为了避免SVS为0,w=0.1
    • pv 是 f 存在漏洞的概率

问题:

​ 如果这样,那同一个函数的所有基本块的SVS都是相同的??

5.2 种子选择策略

种子选择算法

V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第7张图片
V-Fuzz除了使用计算得到的 fitness score,还考虑了程序真实执行状态,缓解了漏洞预测模型潜在的漏报、误报问题:

  • fitness score较高的input加入seed queue
  • 出现crash时,无论fitness score是多少,都加入seed queue

5.3 变异策略

变异操作与AFL类似:

  • bit/byte反转
  • 插入interesting bit/byte
  • 替换改变一些bits/bytes
  • 拼接等

fuzzer会遇到 stuck ,花费很多时间变异但是没有效果,因此fuzzer应该能够根据实际fuzzing状态,动态调整变异策略。

问题:

6、实验环境

6.1漏洞预测模型

  • IDA用于反汇编提取ACFG
  • pytorch用于构建模型
  • E5-2640v4 * 2
  • 4TB SSD
  • 64GB RAM
  • 1080Ti GPU
  • code:https://github.com/qian-feng/Gencoding

6.2 fuzzer

  1. 基于vuzzer
  2. 虚拟机:
    • Ubuntu 14.04
    • 32bit
    • 单核CPU
    • 4GB RAM

https://github.com/vusec/vuzzer

7、评估

7.1 漏洞预测评估

7.1.1 数据选择

数据集:

  • NIST-Juliet Test Suite v1.3 – for C/C++ code
  • label:每个函数标记为good或bad
    • good是没有问题的
    • bad还标记有CWE ID
  • 该数据集中有118个不同的CWE ID类型的samples
  • 选取了其中内存错误相关的samples–共111540个(78511个secure,33029个vulnerable)

V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第8张图片
使用的数据集数量:

  • train set:随机选择40000个

  • test set:随机选择4000个

    V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第9张图片

7.1.2 预先实验

为了得到模型的默认参数

  • SGD优化算法
  • 学习率0.0001
  • 网络深度(层数)5
  • embedding size 256
  • iterations 3

fuzz效果对比

  • 共13个程序

    • LAVA-M
    • libgxps
    • xpdf-2.0
    • MP3Gain-1.5.2
    • mpg321-0.3.2
    • cflow-1.5
  • 与其他fuzz工具对比

    • vuzzer
    • afl
    • aflfast
      V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第10张图片
  • unique crash

    • 有限时间内,更多crash
    • 相同数量的crash,更快
  • 漏洞发现能力

    • 比vuzzer更强
      V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第11张图片
  • LAVA数据集中触发的bug ID

    V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第12张图片

  • 发现的CVE漏洞

V-Fuzz: Vulnerability-Oriented Evolutionary Fuzzing论文分析_第13张图片

  • 代码覆盖率

V-Fuzz既不是基于覆盖率的fuzzer也不是定向fuzzer。

目标是在更短的时间内找到更多的bug。

​ 尽管目标不是覆盖率,但是仍能在实现目标的情况下,不降低代码覆盖率。

​ 可以降低漏洞预测模型的漏报率。

8、讨论

8.1漏洞导向的fuzz的idea

  • 降低fuzz的盲目性
    • 提供更多的信息
    • 结合其他的技术(如符号执行)
  • 使用静态漏洞分析技术来辅助提高fuzzer寻找漏洞的效率;
    • 静态分析技术可以提供更多的信息
    • 大多数静态分析技术有较高的误报率(false positive )和漏报率(false negative )。可以通过结合fuzz来降低这些缺陷

8.2 limitations

  1. 数据集只使用NIST,训练数据不足;
  2. 只针对binary program,不直接支持开源代码;
  3. 插桩方法:最好的是基于编译器的(gcc,clang),但是需要源码;

方向:

​ 尝试构建针对开源软件的,使用基于编译器插桩的fuzzer。

​ 这样可以与AFL、libfuzzer等较好的fuzzer进行结合。

相关工作

漏洞预测

  1. Automatic feature learning for vulnerability prediction --2017 arxiv
    • 使用LSTM
    • 自动学习code中的语法、语义特征
  2. Software vulnerability prediction using text analysis techniques --2012 ACM
    • 使用文本分析技术(将raw code作为text进行分析)进行漏洞预测–机器学习技术
  3. Automatically learning semanticfeatures for defect prediction – 2016 ICSE
    • 使用Deep Belief Network (DBN)
    • 自动从源码中学习程序的语义表示
  4. Deep learning for just-in-time defect prediction – 2015
    • 利用深度学习技术,学习特征进行缺陷预测
  5. DeepSoft: A vision for a deep model of software – 2016 SIGSOFT
    • 端到端的LSTM网络对软件进行建模,预测未来的风险??
  6. Learning unified features from natural and programming languages for locating buggy source code
    • 使用基于CNN的模型从自然语言和源码中unified特征,来定位潜在的buggy代码。
  7. Automatically learning semantic features for defect prediction – 2016 ICSE
    • 学习语义特征进行缺陷预测

Fuzz with ML

  1. Learn & Fuzz
  2. Not all bytes are equal: Neural byte sieve for fuzzing
  3. Faster fuzzing: Reinitialization with deep neural models – 2017 arXiv
    • 使用GAN模型重新初始化种子文件来提高性能
  4. Deep reinforcement fuzzing – 2018 arXiv
    • 将fuzz转换为强化学习问题

ACFG+graph embedding network

对于ACFG的了解及使用可以参考下面paper

  1. 介绍ACFG
    • Scalable graph-based bug search for firmware images – 2016 CCS
  2. 使用CFG来寻找bug:
    • Cross architecture bug search in binary executables (2015 S&P)
    • discovre:Efficient cross-architecture identification of bugs in binary code (NDSS 2016)
  3. 图嵌入网络
    • Discriminative embeddings of latent variable models for structured data – 2016
    • Neural network-based graph embedding for cross-platform binary code similarity detection – 2017 CCS(Dawn Song)
    • A comprehensive survey of graph embedding: problems, techniques and applications – 2018

你可能感兴趣的:(Fuzzing,漏洞挖掘,paper分析,DL+Fuzz)