Proj THUDBFuzz Paper Reading: A Review of Machine Learning Applications in Fuzzing
2 Overview of Fuzzing
Generation-based fuzzer
Peach, Sulley
Evolutionary Fuzzers
honggfuzz, AFL, libFuzzer
Mutation-based fuzzers
- where to mutate
- what new value to use for the mutation
常用变异方法: 随机生成,specific bit flips, integer increments, integer bound analysis, substitution
Symbolic Execution
- Driller
- SAGE
需要平衡符号执行的代价,The computational costs and path explosion remain significant hurdles.
Input test scheduling
FuzzSim: 能够通过多次迭代使用输入的性能信息快速比较选择输入的策略
SEC Consult通过人工分析忽略输入空间的一部分
Interesting Program State
- Valgrind等可以在程序没有崩溃的时候检测到memory corruption
- Heelan等使用fuzzing来确定潜在的memory allocators
The definition of what an interesting program state should be remains a research challenge
Evaluate Inputs
libFuzzer使用data coverage,如果一个输入引起新数据值出现在之前已经比较过的comparison中,也会有很高的打分
3. Applications of Machine Learning to Fuzzing
AFL就使用了genetic Algorithm来做input generation;
已有不少研究用来减少符号执行中constraint equation 处理的时间,crash triage(确定一大堆有趣的程序状态中和bug相关的), root cause categoritzation
Generate Inputs
Genetic Algo
fitness函数的选择非常关键,会影响fuzzer性能,fuzzer识别特定bug的能力,fuzzer卡在局部极小值的可能性
结合多个指标或者在指标之间切换可能是可行的方法
Deep learning
- Godefroid等使用LSTM来生成PDF的基本语法。
- Rajpal等将DL结合到AFL中通过选取需要mutate的input bytes增加fuzzer coverage。
- 实验比对了LSTM, biLSTM, Seq2Seq,认为是LSTM最好,不过标准AFL在png上比LSTM更好
- NEUZZ: 使用浅层网络将模型行为建模为连续函数,实验认为训练出的梯度可以用于识别input bytes对branching behavior的影响
- 获取了这个梯度之后,再去实现fuzzer,效果在某些program上超过angora和AFL
- Chen等,通过Angora对程序行为建模:使用离散函数来表示一条从程序开始点到特定branch constraint的路径。再在该离散函数的某个区间内部做梯度下降来找到满足该约束的输入,并把整个程序移到这个分支上。
- 效果: 在某些程序上比AFL或者符号执行更好
- Cheng等,通过RNN来预测新path,再将新path通过seq2seq转化为input。
- 效果: 在PDF, PNG和TFF上效果不错
- Rajpal等,只用一个小的输入数据集来训练
- She等,只保留最有用的data points来训练一个削减过的模型
本文提到DL方法在输入生成上的一个问题就是不同的文件格式上面的效果不同,在pdf等上面表现不错,但是png上就不如传统方法
Reinforcement Learning
- Becker等,SARSA算法,用来分析IPv6协议,考虑现在状态和agent action来确定optimal behavior
- Bottinger等: Q-Learning Network,为基于生成的fuzzer生成PDF格式的grammar describing inputs
Becker和Bottinger等展示1. program representation和reward function都非常重要
Becker等使用有限状态机来表示Ipv6协议的行为,状态表示协议对单个packet的反应和可能的mutation行为
Bottinger也是用有限状态自动机-Markov Decision Process,这里状态表示一个特殊的seed input,transition代表在某个状态对seed input的概率重写规则
Becker基于1. 单个input调用的program functions数目 2. 错误的展示 3. 潜在的corruption 4. 回应消息的延迟 来生成reward
Bottinger等测试了多种reward function,1. code coverage, 2. execution time 3. code coverage + execution time
当前挑战:
- a more robust understanding of reward functions
- the transferability of an agent
Machine Learning For Symbolic Execution
目前NN在符号执行上还比不过使用图算法的传统工具
- 使用图神经网络来检测constraint equations是否有valid solution
- Wu等使用logistic regression和Monte Carlo算法来识别能够增加找到可行解概率的initial input。Monte Carlo方法用于找到initial promising values,logistic regression则用来推测某个initial value找到约束可行解的概率。效果是能够增加Minisat Solver的runtimes
- LSTM来解决constraint equations,没有比过目前已有的符号执行工具,但是展示了未训练领域的迁移潜力
- Shiqi等使用梯度下降来学习约束可行解
- Mairy等使用RL来增加local neighborhood search。
- Li等将传统的路径约束转化为优化问题,尝试减少不可达路径,RACOS算法,只能分析小规模程序
Post-Fuzzing: Interesting Program States
用户triage的基本方法:
-
评估是否唯一
-
分析triaged states来确定可重复性和root cause
-
确定root cause是否是exploitability
-
Yan等使用贝叶斯方法和!exploitable工具来增强确定bug exploitability的可靠性
-
Dang等使用agglomerative hierarchical clustering通过call stack相似度来将crashes分组
-
Harsh等使用许多监督学习方法来做root cause分类
-
Long等发现root causes并尝试修补,工具Prophet
-
用SVM加速电路板上的错误定位