Proj. THUIoTFuzz Paper: POSTER: AFL-based Fuzzing for Java with Kelinci

Abstract:

本文实现了在Java上进行模糊测试的工具Kelinci(格林奇,印尼语:野兔),基本方法是调用asm对java进行插桩,然后通过TCP链接和AFL交互。Kelinci具有不需要修改AFL且能够高度并行化(?fork?)的优点。

文章进行了一个实验,在apache commons imaging上进行测试,在1小时内就找到了bug。

Introduction:

 基本流程如下:

1. interface.c从AFL处得到fork request

2. interface.c创建一个forked线程,并加载input文件

3. 该forked线程通过TCP将input文件的内容传输给Kelinci server

4. java方: kelinci接受该input文件,先存在队列里

5. kelinci从队列中提出一个input文件,建立一个新线程并调用target app的main函数,为这个main函数输入input,监视该新线程的运行。如果该线程throw an exception,(该异常没能被target app的main函数捕获),就认为是找到了一个bug。此外,如果规定时间内没能停止,认为是找到了一个hang。

6. Kelinci将结果返回给c side,包括结果状态(OK, ERROR, TIMEOUT)和memory bitmap

7. 在c端,接收到的bitmap写入afl shared memory。AFL会根据该结果发出接下来的指令。

Java端的代码主要是一个TCP server和名为Mem的class。

在插桩的时候,使用的是AFL-style,也即使用64kB shared memory来存储bitmap,为每个基本块随机分配一个id,同时每当一个基本块被调用的时候,就调用以下代码:

这里实际记录的是两个具有先后调用关系的基本块id1和id2的异或。文中认为这样做能够在不损害性能的同时大大减少基本块id重复所造成的精度下降。

原文地址:https://www.cnblogs.com/xuesu/p/14025612.html