| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 2021-7 论文阅读 [FuzzGuard: Filtering out Unreachable Inputs in Directed Grey-box Fuzzing through DL ] -> 正文阅读 |
|
[人工智能]2021-7 论文阅读 [FuzzGuard: Filtering out Unreachable Inputs in Directed Grey-box Fuzzing through DL ] |
0.前言对于DGF(directed grey-box fuzzing)来说,使用者总是希望产生的输入能够运行到buggy code,以此来减少程序无效运行时间,然而,在实际场景中这并不容易。在这篇论文中,作者提出用Deep Learning的方法来对产生的输入进行分类,来判断这是否是一个reachable input。 1.简介再往下将之前,我们先来了解一下两种常见的fuzzing形式: coverage-based fuzzing:希望产生的输入能够实现高代码覆盖率,以此来发现更多的程序BUG 那么啥又叫做灰盒呢,就是指在fuzzing过程中利用程序运行信息来生成reachable input。 作者说,之前这方面的结果都不是很理想,比如说AFLGo,其产生的input超过91.7%无法到达buggy code。还有传统的程序分析方法比如符号执行(symbolic execution),其面临的问题就是执行时间长,效率低。基于模式识别(比如猫狗分类),作者诞生了一个新的想法,能否透过输入数据的特征值来判断他是否是reachable的呢? 答案是可以的,但是其依然有很多挑战存在其中: 数据不平衡:对于一般的模式识别问题,要求不同Label的数据数目大致一致,但是对于这个问题而言,在随机出来的数据集中,reachable的数据通常明显较少。 同类数据差异大:对于不同的两组可达数据,其差异或许非常大,因为可以是走不同路径到达buggy code的 时间限制严格:你判断可达不可达是要有一个时间限制的,要知道,这个思想提出来的目的就是减少程序执行的时间。 模型不产生数据,模型只是数据的过滤器=.=作者是如何建立这个模型的呢,欲知后事如何,且听下节分解。 2.模型下节来了。。。话说看这个写的我好累,明天就开始了我还打算再看一篇别的,也不知道时间上够不够。 闲话少叙,我们先来看一下整体的模型,其结构如图所示,可分为模型初始化,模型预测,模型更新三部分。 1.模型初始化(Model Initialization)为啥要把英文写上呢,因为我并不确定我翻译的确不确切,在我看来,这部分一共干了两件事:构造标签数据集,训练模型。 首先我们先来说下数据集,说到数据集,就需要面对上文提到过的unblanced的问题,那么作者是如何解决这个问题的呢,我先来举个例子,着代码!
如果要想让程序执行到buggy code,那么必须b为1,a为奇数,这两个条件会使得难度较大,但是我们注意到,要想执行buggy code,首先必须要a%2成立,而很明显,代码有更大的概率到达第一个if语句块,所以,我们可以先筛选能到达第一个语句块的input,这样采集的数据就能更快的达到平衡,在达到平衡后,再向后进行进一步筛选。 作者给出了pre-dominating nodes的定义,即到达buggy code所必须经过的代码区域,我们可以先针对能否到达该node对模型进行初步训练。用一种最麻烦的方法,你可以想象是为每一个pre-dominating node进行一个模型训练,判断是否可以流向下一个model,流出最后一个model的可行数据即我们要寻找的输入。 当然,这样也过于麻烦了,因此作者的方法是为所有的node(包括buggy code)统一训练一个模型,若要如此实现,就需要对数据的标签进行一定的改进,这部分有兴趣的可以去看论文,由于我基础较浅,就不在此班门弄斧了。此外呢,对于输入的数据,作者也将其以字节为单位,使得该模型可以接收一个统一的数据输入。 深度学习模型作者选用的是3层的卷积神经网络,将均值平方差(MSE)作为损失函数,原因是其不会造成对于某一分类有着特别大误差的情况存在。 鉴于我贫瘠的深度学习知识以及想要更好的展现这篇论文的心情,我将在下面翻译出作者对于这个卷积神经网络的具体描述: 2.模型预测再进行了模型初始化之后,就可以根据模型对输入数据的可到达性做一个预测了,对于预测认为可以到达的数据,对其进行执行并将执行结果加入到数据集中。 与此同时,我们也迎来了第二个问题,即该模型与传统的模式识别是不一样的,可能有不同的执行路径到达buggy code,对于不同seed所产生的输入,其准确性可能不够。作者是这么干的,她采用了representative data selection的方法,即对于每一个seed,选取其部分mutant进行训练,以达到对于路径的覆盖(但是对于seed涉及不到的数据其还是没有办法处理,且你什么时候认为所有的seed都已经被完全找到了呢?我对于这个问题挺想不明白的,但是就我目前看到的而言作者并没说)。尽管对于每个seed选取了部分数据,其数据集依然过于庞大,训练时间较长,因此,作者提出了一个概念叫做SSD(seed similarity degree),对于那些seed相似度较高的input,其可以进一步减少采样量。 ?3.模型更新模型更新采用增量学习的方式,比较重要的是模型更新的时机,通常会在以下两种情况下进行更新: 当模型过时时,即其false positive到达某个阈值时对模型进行更新 当下一个node数据达到平衡时 4.总结上张图自行体会即可 算了还是照着图讲一遍:首先先将输入以字节为单位转化成一组数值串,以得到统一化的程序输入,同时,根据程序代码构建dominator tree,并根据node个数来决定标签维数,y<0,0,1,0>代表程序有四个node,该标签所指输入可以到达第三个node但无法到达最后的node。第三步是设置mid-target,即先让model判断输入能否到达mid-target,以期达到更快的数据平衡,第四步是根据seed生成输入数据,其中包含了代表性数据挑选方法,第五步是模型预测,然后对于认为是reachable的数据,进行执行以扩充数据集,对于unreachable的数据,存放在PUI中以备以后验证。等到数据积累到一定程度,比如下一个node数据趋于平衡,那么就对模型进行更新(增量学习方法)。 3.评估一般我是不写这部分的,为啥要写呢,因为组会要讲啊555 首先,总体上讲,有这个和没有这个使AFLGo的速度差距为17倍 测试的程序包括各种输入文件的10中常用程序。作者采用AFLGo产生测试数据,为保证两组实验的测试数据一致,测试者首先利用AFLGo生成一组数据并记录,然后进行测试。此外,作者还测试了在有时间限制的情况下程序的准确性,也取得了较好的效果。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/22 10:25:31- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |