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整体框架
漏洞预测模型
- 输出一个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
4.2数据预处理
---- 将binary program转换成数值向量
使用Attributed Control Flow Graph (ACFG)来表示binary函数:
- ACFG是一个有向图(g = <V, E, φ >)
- 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:
每个基本块都表示为一个数值向量,向量的每一维表示指定属性的值。
因此,一个函数可以表示为一组向量。
数据预处理工作流程:
反汇编binary得到每个函数的CFG,然后提取基本块的属性并转换成数值向量。
这些属性用来特征化一个基本块,属性可以是统计的,语义的,结构化的。–这里只使用统计属性。
- 效率。语义特征如IO对太expensive。
- graph embedding网络可以自动学习结构化属性。
- 共提取了255个属性,见table1.
4.3 模型结构
图嵌入网络
- 将graph转换成vector
- 可以认为是一个映射函数,将函数的ACFG映射为一个向量
本文使用神经网络近似这个映射函数;
网络结构
- graph embedding 网络+ pooling layer + softmax layer
- graph embedding – ACFG–>vector
- pooling layer – 将输出的embedding vector转换为2维的向量
- softmax layer – 将2维向量转换为概率
图4中的流程:
-
model输入为binary程序中一个函数的ACFG g
-
ACFG中每个基本块v有一个属性vector xv
- 基本块的属性总数为a,因此xv是一个a维的vector
-
对每个基本块v,图嵌入网络计算一个embedding vector uv,其中包含了graph中的信息。
- uv的维度为d
- Nv可以认为是v的前置节点集合
- 然后使用下面的公式计算embedding vector uv
- 其中F函数可以是sigmoid,tanh等
-
然后经过T轮iteration,得到每个顶点(即每个基本块)的最终的graph embedding向量 uv(T)
-
整个ACFG的embedding 向量 ug 表示为每个基本块embedding向量uv(T)*之和,即对应下面的公式,其中W2是一个 d * d 维的矩阵:
-
然后将得到的 ug 使用pooling layer转换成2维的向量
-
然后使用softmax layer转换成概率(p, 1-p)
- p为这个函数有漏洞的概率
- p是整个模型的最终输出
-
最终转换为求最小化loss函数即最小化问题
4.4 训练和使用模型
label为0或者1
- l=1 代表函数是secure
- l=0 代表函数至少含有一个漏洞
训练:
- 最小化问题
- 使用交叉熵(二值交叉熵)
- 优化方法:SGD
5、漏洞导向的fuzz
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除了使用计算得到的 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
- 基于vuzzer
- 虚拟机:
- Ubuntu 14.04
- 32bit
- 单核CPU
- 4GB RAM
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)
使用的数据集数量:
-
train set:随机选择40000个
-
test set:随机选择4000个
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
-
unique crash
- 有限时间内,更多crash
- 相同数量的crash,更快
-
漏洞发现能力
- 比vuzzer更强
- 比vuzzer更强
-
LAVA数据集中触发的bug ID
-
发现的CVE漏洞
- 代码覆盖率
V-Fuzz既不是基于覆盖率的fuzzer也不是定向fuzzer。
目标是在更短的时间内找到更多的bug。
尽管目标不是覆盖率,但是仍能在实现目标的情况下,不降低代码覆盖率。
可以降低漏洞预测模型的漏报率。
8、讨论
8.1漏洞导向的fuzz的idea
- 降低fuzz的盲目性
- 提供更多的信息
- 结合其他的技术(如符号执行)
- 使用静态漏洞分析技术来辅助提高fuzzer寻找漏洞的效率;
- 静态分析技术可以提供更多的信息
- 大多数静态分析技术有较高的误报率(false positive )和漏报率(false negative )。可以通过结合fuzz来降低这些缺陷
8.2 limitations
- 数据集只使用NIST,训练数据不足;
- 只针对binary program,不直接支持开源代码;
- 插桩方法:最好的是基于编译器的(gcc,clang),但是需要源码;
方向:
尝试构建针对开源软件的,使用基于编译器插桩的fuzzer。
这样可以与AFL、libfuzzer等较好的fuzzer进行结合。
相关工作
漏洞预测
- Automatic feature learning for vulnerability prediction --2017 arxiv
- 使用LSTM
- 自动学习code中的语法、语义特征
- Software vulnerability prediction using text analysis techniques --2012 ACM
- 使用文本分析技术(将raw code作为text进行分析)进行漏洞预测–机器学习技术
- Automatically learning semanticfeatures for defect prediction – 2016 ICSE
- 使用Deep Belief Network (DBN)
- 自动从源码中学习程序的语义表示
- Deep learning for just-in-time defect prediction – 2015
- 利用深度学习技术,学习特征进行缺陷预测
- DeepSoft: A vision for a deep model of software – 2016 SIGSOFT
- 端到端的LSTM网络对软件进行建模,预测未来的风险??
- Learning unified features from natural and programming languages for locating buggy source code
- 使用基于CNN的模型从自然语言和源码中unified特征,来定位潜在的buggy代码。
- Automatically learning semantic features for defect prediction – 2016 ICSE
- 学习语义特征进行缺陷预测
Fuzz with ML
- Learn & Fuzz
- Not all bytes are equal: Neural byte sieve for fuzzing
- Faster fuzzing: Reinitialization with deep neural models – 2017 arXiv
- 使用GAN模型重新初始化种子文件来提高性能
- Deep reinforcement fuzzing – 2018 arXiv
- 将fuzz转换为强化学习问题
ACFG+graph embedding network
对于ACFG的了解及使用可以参考下面paper
- 介绍ACFG
- Scalable graph-based bug search for firmware images – 2016 CCS
- 使用CFG来寻找bug:
- Cross architecture bug search in binary executables (2015 S&P)
- discovre:Efficient cross-architecture identification of bugs in binary code (NDSS 2016)
- 图嵌入网络
- 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