大纲
Background
-
准确的覆盖率信息可以提高发现漏洞的概率,但同时会带来极大的开销。
-
实验表明超过75%的边会与其他边碰撞在同一个应用中。(AFL存在哈希碰撞问题)
-
极少模糊测试工具利用代码覆盖率信息来直接模糊测试未探索过的路
-
由于AFL的成功,覆盖率不准确的后果被忽视了
为什么覆盖率准确性会影响找bug?
- 覆盖率不准确使得在某些情况下模糊测试难以区分两条不同路径
- 如果一个测试用例与先前探索过的路径相碰撞,就会错误的被归类为先前的那一类
- 路径碰撞可以理解为认错路
- 覆盖率不准确会导致模糊测试对于种子选择很难做出最优决策
- 从而减慢找到bug的速度
如何提高覆盖率准确性?
-
track edge coverage(lower runtime overhead)
-
AFL自身的边覆盖率略低(由于哈希碰撞的原因)
-
CollAFL解决了哈希碰撞问题:通过确保每条边有一个唯一的hash值。
- 分析控制流图获取已知边,然会为每条已知边分配哈希值。
- 这样确保已知边不会发生哈希碰撞
覆盖率敏感的模糊测试性能如何?
-
测试环境:LAVA-M数据集和24款开源软件
-
结果表明:
- 超过75%边会与其他的产生冲突
- 碰撞缓解方案解决已知边所有的冲突问题。能找更多的bug
- 未接触分支的种子选择方案可以提高模糊测试的效率和bug发现能力
Methods/Results
- 提高覆盖率准确性
- 前提:bitmap大于edge size
- 对于一般情况,计算Fmul
- 对于block with single precedent,计算Fsingle(离线计算)。这种情况占60%,主要就是在这里提高的性能
- 对于block with multiple precedent,计算Fmulti,也是离线生成一个哈希表来计算的。
- 种子选择策略(针对以下三种路径进行突变)
- 有很多没有探索过的邻近分支的路径
- 有很多没有探索过的邻近子节点的路径
- 有很多内存权限操作的路径
Conclusion
- 提出了覆盖率敏感的CollAFL
- 能找到更多的漏洞,同时保持低开销(高效且有效)
Tips:
- 追踪代码覆盖率对于覆盖率引导的模糊器是至关重要的
- 模糊测试在覆盖精度和性能之间权衡
- hash collision issue : 两个不同边会有相同的hash值,导致在覆盖率bitmap中共享一个记录,从而导致边覆盖率的丢失
- bitmap要大于edge的数量,否则会导致很高的hash collison
- bitmap越大,hash collison会降低,但同时AFL的运行时间就要越长
参考
-
https://paper.seebug.org/496/#auto-extras-over
-
https://www.cnblogs.com/jg01/p/9772700.html
-
https://bbs.pediy.com/thread-249912.htm
-
https://blog.csdn.net/Chen_zju/article/details/80791268
-
https://www.cnpanda.net/sci/257.html