注意:ESfunfuzz需要一台安装了 Docker 的 Ubuntu18.04 服务器,并要求内存不小于16G。
Step1.下载镜像压缩文件
为了便于使用,ESfunfuzz的源代码以及所需的所有相关环境依赖已配置在了Docker容器中。你首先需要下载此镜像压缩文件(即 ty_esfunfuzz_3.0.tar.gz),并上传到你的服务器。
Step2.将压缩文件恢复成镜像
进入你的服务器中该文件的同级目录中,执行以下命令恢复镜像:
gunzip -c ty_esfunfuzz_3.0.tar.gz | docker loadStep3.为Docker添加GPU支持(可选)
ESfunfuzz可以通过调用GPU来加速程序执行,但你必须先为Docker添加GPU支持。配置方法请参考此处。如果这对你来说很困难,你可以选择跳过此步骤。
注意:NISL的26/87/113服务器已经添加了GPU支持,可跳过此步骤;
Step4.启动该镜像对应的容器
启动CPU的容器(通用):
docker run -it --name ESfunfuzz -p 3821:3821 ty_esfunfuzz:3.0或者,启动支持GPU的容器(要求必须执行了Step3):
docker run -it --name ESfunfuzz -p 3821:3821 --gpus all ty_esfunfuzz:3.0通常,启动容器后会自动进入该容器,即可开始使用。但假如你的Docker并未进入该容器,则需要再使用如下命令手动进入容器:
docker attach ESfunfuzz按照以下说明即可开始使用ESfunfuzz。注意:ESfunfuzz会自动判断是否启用GPU支持,所以GPU版本与CPU版本的运行命令完全一致。
ES标准解析(可选)
执行以下命令以进行ES标准的解析过程,即从标准中提取出有效的语义信息并写入文件。
cd /root/ESfunfuzz/CaseMutator/StandardParser/src/main
node parsing.js执行结果实例如下:
[2021-05-13T09:05:56.943] [INFO] run - 正在加载document,请稍等...
[2021-05-13T09:06:02.184] [INFO] run - 映射失败的API列表为:
...
[2021-05-13T09:06:02.186] [INFO] run - ***************************
[2021-05-13T09:06:02.186] [INFO] run - 当前处理的API是: Array.from
...
[2021-05-13T09:16:13.790] [INFO] run - 解析成功,结果文件存放在 /root/ESfunfuzz/CaseMutator/StandardParser/resources/result_new.json模型训练(可选)
cd ~/ESfunfuzz
python CodeGenerator/train.py --workspace=test --save_every_epoch=10 --batch_size=32 --embedding_size=32 --gpu=0 --epoch=50 --n_layers=2 --data_path=/root/ESfunfuzz/Data/after07.db训练过程可以调整更多参数,详情参考 /root/ESfunfuzz/CodeGenerator/conf.py 配置文件。
执行结果实例如下,训练过程大概需要40个小时,此处仅作演示,确认执行无误后按 Ctrl+c 提前终止。
[train]2021-05-13 09:06:17 - INFO: 本次执行的工作路径为: CodeGenerator/workspace/test
[train]2021-05-13 09:06:17 - INFO: 正在进行数据预处理,请稍等...
[train]2021-05-13 09:06:18 - INFO: 不启用长度过滤.
[train]2021-05-13 09:06:18 - INFO: 不启用数量过滤.
[train]2021-05-13 09:06:18 - INFO: 不启用数据切分.
[train]2021-05-13 09:06:18 - INFO: 正在进行tokenize...
100%|█████████████████████████████| 125966/125966 [00:02<00:00, 48956.03it/s]
[train]2021-05-13 09:06:26 - INFO: 训练集信息统计:
[train]2021-05-13 09:06:26 - INFO: 训练数据来自于: /root/ESfunfuzz/Data/after07.db
[train]2021-05-13 09:06:26 - INFO: 初始的训练数据条数: 125966
[train]2021-05-13 09:06:26 - INFO: 最终使用的切分后的训练数据条数: 125966
[train]2021-05-13 09:06:26 - INFO: 训练数据的最大token长度: 999
[train]2021-05-13 09:06:26 - INFO: 训练数据词汇表总个数: 101
模型训练中,请耐心等待...
0%| | 0/50 [00:00<?, ?it/s]执行生成式Fuzzing
cd ~/ESfunfuzz
python Fuzzer/run.py生成式Fuzzing过程可以调整更多参数,详情参考 /root/ESfunfuzz/CodeGenerator/conf.py 配置文件。 执行结果实例如下,可以通过按 Ctrl+c 提前终止。
正在进行运行环境验证,请稍等...
[1]node以及npm包安装正确.
[2]数据库连接正确.
[3]待测引擎配置正确.
所有环境检查无误,即将开始Fuzzing.
正在恢复词汇表和模型,请稍等...
词汇表和模型已恢复,开始Fuzzing.
----------------------------------------
Fuzzing已持续: 00时00分02秒
已Fuzzing种子用例: 1
已Fuzzing新生成用例: 3
新生成用例中语法正确的用例及占比: 2(66.67%)
新生成的种子用例数量: 0
被过滤的用例数量: 0
Fuzzing的速度为: 1.50个/秒
----------------------------------------
Fuzzing已持续: 00时01分36秒
已Fuzzing种子用例: 30
已Fuzzing新生成用例: 110
新生成用例中语法正确的用例及占比: 73(66.36%)
新生成的种子用例数量: 0
被过滤的用例数量: 6
Fuzzing的速度为: 1.15个/秒
----------------------------------------
...执行突变式Fuzzing
cd ~/ESfunfuzz
python Fuzzer/run_with_mutate.py执行结果与上述类似,可以通过按 Ctrl+c 提前终止。
启动Jupyter Notebook(可选)
jupyter notebook --port=3821 --notebook-dir=~/ESfunfuzz启动后,可以使用浏览器访问 本机ip:3821 访问部署好的Jupyter演示笔记,比如 10.15.0.88:3821 (注意ip需要换成你本机的),访问密码为 nisl8830 ;进入Jupyter笔记后可通过 main.ipynb 进行演示。
演示完毕后,使用Ctrl+c退出Jupyter笔记,整个过程结束。
清理容器和镜像
所有步骤演示完毕,按以下方式收尾:
# 退出该容器
exit
# 删除容器
docker rm ESfunfuzz
# 删除镜像
docker rmi ty_esfunfuzz:3.0此处对项目整体组织结构进行描述(仅目录和极个别重要文件)
.
├── CaseMutator:用例突变模块
│ ├── APIs:ES标准解析模块需要的文件
│ ├── StandardParser:ES标准解析模块
├── CodeGenerator:代码生成模块
│ ├── train.py:生成模型训练程序入口
├── Data:相关数据
├── Evaluation:评估模块
│ ├── Chapter_5_3_2:论文章节5.3.2的数据及评估
│ ├── Chapter_5_4_1
│ ├── Chapter_5_4_2
│ └── Chapter_5_5
├── Fuzzer:模糊测试模块
│ ├── run.py:生成式Fuzzing程序入口
│ ├── run_with_mutate.py:突变式Fuzzing程序入口
├── Images:图片
├── Preprocess:数据预处理模块
│ ├── CorpusPreprocess:模型训练数据预处理
│ └── SeedPreprocess:种子数据预处理
├── README.md:项目说明文件
├── main.ipynb:Jupyter Notebook演示入口文件
├── requirements.txt:Python第三方库依赖缺陷结果汇总,在线PPT:https://docs.qq.com/slide/DTGx5UUlyaU95R1hv
| No. | Version | Link | Contributor | State | Description |
|---|---|---|---|---|---|
| 1 | v1.11.12 | #issue | Yang Tian | 复现&未修复 | 重声明变量未报错 |
| 2 | v1.11.12/24 | #issue | Yang Tian | 复现&已修复 | this++未报错 |
| 3 | V1.11.24 | #issue | Yang Tian | 复现&未修复 | if(1)未报错 |
| 6 | 9e2f198 | #issue | Wen Yi | 新发现&已修复 | 重定义TypeError异常 |
| 7 | 9e2f198 | #issue | Wen Yi | 复现&未修复 | RegExp.prototype.toString实现错误 |
| 9 | 1_11_latest | #issue | Yang Tian | 复现&未修复 | %TypedArray%.prototype.sort实现错误 |
| 14 | 1_11_latest | None | Wen Yi | 复现&未修复 | Proxy对象拦截defineProperty实现错误 |
| 16 | 1_11_latest | None | Wen Yi | 复现&未修复 | RegExp.prototype[Symbol.match]与String.prototype.match不关联 |
| 17 | 1_11_latest | #issue | Wen Yi | 新发现&已修复 | 调用Array.prototype.push时不使用自定义的set方法 |
| 20 | 1_11_latest | #issue | Wen Yi | 引擎特性 | 原型链与对象不匹配未报错 |
| 21 | 1_11_latest | #issue | Wen Yi | 新发现&未修复 | const声明常量后可修改 |
| 24 | V1.11.19 | #issue | Haobin-Lee | 复现&已修复 | %Typed% |
| No. | Version | Link | Contributor | State | Description |
|---|---|---|---|---|---|
| 4 | d940b47 | #report | Yang Tian | 复现&未修复 | 重声明变量未报错 |
| 8 | d940b47 | None | Yang Tian | 复现&已修复 | 对freezed对象修改length未报错 |
| 10 | d940b47 | None | Yang Tian | 复现&已修复 | 同5(需要在JSC新版本验证) |
| 11 | d940b47 | #report | Wen Yi | 复现&已修复 | for...of...语法错误未报错 |
| 12 | d940b47 | #report | Wen Yi | 待确认 | 已有属性重赋值不调用set方法 |
| 13 | d940b47 | #report | Wen Yi | 复现&已修复 | %TypedArray%.prototype.sort实现错误 |
| 15 | d940b47 | None | Wen Yi | 复现&未修复 | Proxy对象拦截defineProperty实现错误 |
| 18 | d940b47 | #report | Wen Yi | 复现&未修复 | x与this.x指向不同 |
| 22 | d940b47 | #report | Wen Yi | 新发现&未修复 | Array.prototype.push实现异常 |
| 23 | d940b47 | #report | Jinqiu Wang | 复现&未修复 | 重定义属性时未更新属性 |
| No. | Version | Link | Contributor | State | Description |
|---|---|---|---|---|---|
| 5 | d891c59 | #report | Wen Yi | 待确认 | %TypedArray%.prototype.set实现错误 |
| 19 | e39c701 | #report | Wen Yi | 待确认 | new实现异常 |
为了提高分析可疑用例的效率专门开发的一个Web系统,源码地址:https://github.com/ty5491003/bug-parser