论文阅读<IFuzzer: An Evolutionary Interpreter Fuzzer using Genetic Programming>

0x00:关于

最近在阅读一些漏洞挖掘相关技术的论文,正好读到这篇,做个记录。
这篇论文是IFuzzer: An Evolutionary Interpreter Fuzzer using Genetic Programming
主要是介绍IFuzzer的一篇论文,主要是利用antlr4+遗传算法搞js fuzz。

0x01:论文阅读

该论文主要是针对脚本引擎的fuzz,只是文中使用了js engine作为目标。

核心思想就是:收集大量的测试代码,使用antlr4编写好的语法解析器解析出非终结符片段,把输入解析成AST后,在AST上进行变异。

变异的方式主要是利用收集的“片段”去替换解析树中相同非终结符,由于采用了遗传算法,通过对每个个体的评估,筛选优秀的个体进行“杂交”产生新的个体进入下一轮fuzz,“杂交”的方法是交换两个个体中相同的非终结符节点,产生两棵新的输。

采用遗传算法必须面对膨胀控制的问题。这里论文作者对每个个体评估时,采用了如下的公式:

1
2
fb(x) = score_structure + score_feedback
ffinal(x) = fb(x) − c ∗ (l(x))

即:

基础得分=结构得分+(解释器)回馈得分
最终得分=基础的分-膨胀控制

这样的话的确有效的控制了遗传算法在迭代中的膨胀问题。

论文中测试部分没仔细看,我只关注了核心的算法和一些问题的解决,剩下的工作就是去阅读IFuzzer代码去体会了。

0x02:个人想法

首先感觉这个东西没那么完善,或者说没放全。

变异的策略其实可以更多的,这种替换的方式感觉还是有局限性,其实就是类似于用一大堆积木,去组合,是从现有的东西生成一些组合性的东西;如果可以加入创造性的东西就好了,比如积木的形状、材质改变,然后去创造新的组合。

记得几个月前看过韩国一个大佬(BoB计划的导师)的slide,他做的类似的事情,但是不一样的是:他把收集的测试代码、poc解析后到AST然后到IR,直接在IR上操作,之后从IR再生成js代码,效果也不错,但是那个没放出源码所以也不好与IFuzzer比较。

从身边的大佬的说法来看,IFuzzer很有限,需要改进的地方很多- 。- 不过我个人认为,这样的思路值得借鉴,虽然很好想,但是难做啊。。去年就想这么搞了,然而一些基础知识跟不上,现如今可以试一试啦~

0x03:引用

IFuzzer: An Evolutionary Interpreter Fuzzer using Genetic Programming