1.GANFuzz,提出了一种新的测试用例生成方法,并在此基础上构建了一个模糊框架。
2.为了提高代码覆盖率和测试深度,提出了三种从不同维度对协议消息进行分类的聚类策略,利用这三种策略,所学习的生成模型可以生成更为多样化和格式良好的测试用例。
3.在实验中,使用GANFuzz原型测试了几个Modbus-TCP模拟器,成功地揭示了一些新的缺陷和已知的问题。
GAN
RNN作为generator
CNN作为discriminator
1.对msg进行聚类。在给定一个真实的协议msg集作为训练数据的情况下,我们采用三种聚类策略来提供三种方法来对数据进行分类。对于每一种策略,我们所关注的特征和功能w.r.t协议消息是不同的。它允许我们从不同的维度进行模糊处理。它有助于提高代码覆盖率和测试深度。
2.学习协议语法。我们使用生成对抗网络和SeqGan算法对将协议语法学习问题进行建模为估计生成模型的过程。通过深度学习训练,生成模型从真实的协议消息中自动揭示协议语法。
3.生成测试用例。学习的生成模型能够生成类似于真实协议消息的序列。利用生成模型可以生成模糊测试用例。
给定一组协议消息,把每个消息都可以看作是来自样本结果的未知分布函数Qm。由此,协议文法的学习问题转化为求解分布函数Qm的问题。
为了求解Qm函数,我们训练生成模型Gθ来产生新的消息,而训练判别模型Dφ作为分类器来区分生成的消息和实际的消息,其中θ,φ是生成器和鉴别器的参数。Qm可以通过适当地训练GAN来近似,直到生成器能够生成与真实消息非常相似的数据。
然而,由于协议消息是离散数据,不可微分,因此在训练过程中不能直接应用反向传播。为了解决这个问题,我们使用Seq-Gan算法,它使用强化学习技术来更新生成器的参数,而不是从鉴别器直接反向传播到生成器。
图1:应用GAN来模拟INPs的语法学习问题,其中G表示生成器,D表示鉴别器。$x_i$
,$y_i $
是集合V中的字符,这些字符串,如$x_1x_2x_3…x_{42}$
和$y_1y_2y_3…y_{43}$
分别表示真实的消息和生成的消息。生成器被建模为一个随机决策过程,其中状态是到目前为止生成的消息片段,而动作是下一个要生成的字符。生成器使用来自鉴别器的rewards更新其参数。奖励是概率值$p^n_y$
,这表示鉴别器将假消息视为真实消息的可能性有多大。rewards来自两方面。一个是来自完全生成的消息,其奖励是鉴别器的输出,另一个是来自中间令牌,其奖励是通过使用带有推出策略的蒙特卡罗搜索从鉴别器获得的。采用Policy gradient方法对带rewards的生成器参数进行更新。
一旦生成器更新,就可以改进鉴别器了。我们使用从生成器生成的假消息和真实消息作为鉴别器的训练数据。我们训练鉴别器以最大化真实数据和生成数据被正确分类的概率。
综上所述,通过采用GAN和SeqGan算法,我们可以对上述协议语法学习问题进行建模。
在进行实际的模型训练之前,我们必须先确定GAN的两个组成部分。在我们的设置中,我们使用RNN作为生成器,LSTM作为cell,CNN作为判别模型。CNN和RNN的结构细节应根据协议消息的结构复杂度来确定。通常,协议消息越长,RNN模型应该包含的隐藏状态越多,CNN模型中可能会添加更多的卷积层。在我们的实验中,RNN由一个嵌入层和一个包含32个隐藏状态的LSTM层组成,CNN由一个嵌入层、卷积层、max池和softmax层组成。
由于我们要求训练数据长度相等,为了保持消息的完整性,我们首先计算最大消息长度,然后使用不包含在字符集V中的特殊字符将短于最大长度的消息填充到最大长度。然后,将训练数据转化为数值表示。
训练分三步进行。首先,在真实的消息数据集上对多次epoch的生成器进行预训练。epoch是指对训练数据集中的所有协议消息进行迭代。然后,我们使用预先训练的生成器生成与训练数据集相同数量的数据。这些生成的数据和真实的消息一起被用以预先训练判别器。在预训练后,我们交替训练判别器和生成器,即每次训练完一次epoch的生成模型后,我们就开始训练多次epoch的判别模型。我们重复这个过程,直到生成模型能够创建与真实消息非常相似的数据。
一般来说,训练GAN的目的是估计能够产生尽可能接近原始数据的生成模型。但在这项工作中,由于学习的最终目的是执行模糊测试,我们不仅要得到最佳的生成模型,还要得到半好的生成模型。不同的模型对协议语法有不同程度的理解,可以生成不同相似度的测试数据,增加了测试用例的随机性,增加了测试用例的多样性,从而提高了模糊结果。为此,我们将交替过程重复不同的时间(例如,5、10、15、20次)。
通过这一对抗性训练过程,我们可以获得能够生成类似于协议消息的序列的生成模型。换言之,学习的生成函数$G_θ$
接近于分布函数$Q_m$
,这意味着我们的学习模型很好地掌握了协议语法。
到目前为止,对于每一种聚类策略,我们都得到了不同程度地覆盖语法的生成模型。我们准备使用学习的生成模型来生成新的数据,这些数据是我们方法中的测试用例。通过使用RNN,我们可以学习输入序列的条件分布。因此,为了生成新的数据,我们需要首先给出一个前缀字符$x_1$
,然后查询条件分布来采样下一个token,并重复这个过程直到达到最大长度。一旦有了生成模型,就可以生成任意多的新序列。
GANFuzz,工业网络协议模糊化框架。
如图2所示,GAN-Fuzz由消息捕获和分析模块(MCAM)、消息预处理模块(MPM)、训练和消息生成模块(TMGM)、消息发送模块(MSM)、日志模块(LM)和监控模块(MM)组成。这些模块相互协作完成整个模糊测试过程。在运行GANFuzz时,首先启动消息捕获和分析模块准备训练数据,并收集当前工业网络中工业设备的地址信息。之后,消息预处理模块将训练数据转化为数值表示,并传递给训练和消息生成模块。然后,训练和消息生成模块启动了深度学习训练。训练后,训练和消息生成模块查询学习到的生成器生成测试数据,由消息发送模块发送到目标工业设备。同时,监控模块监督异常事件的发生,日志模块记录所有发生的事件。我们详细阐述了每个组件的工作流程和实现细节如下。
GANFuzz的一个显著特点是它包含了一个再培训阶段。这个阶段基于这样的逻辑:相似的测试输入可能触发相似的甚至更严重的问题,这有助于获取更多关于错误的信息,从而有助于错误分析。在此期间,采用数据扩展策略获得新的训练数据,包括单点变异和多点变异。单点变异是指在种子消息中随机改变一个字符,而多点变异是指同时改变多个令牌。GANFuzz对LM选择的有问题的消息执行数据扩展策略,以获得新的训练数据,并开始新一轮的训练,进一步对这些数据进行模糊化。
实验对象:MOD_RSSIM v8.01、Modbus Slave v3.10a和Diaslave v2.12,以及Modbus pal v1.6b(最流行的Modbus TCP模拟器)
评价指标:
${AoVD} =\frac {100b}{n}$
,其中b是产生的异常数量,n是使用的测试输入。它的直观含义是每100个测试用例中发现的异常数。训练数据:Pymodbus生成的Modbus-TCP请求,并通过调用相应的函数进行响应。随机调用程序中的函数生成50000个请求字符串。
模型训练:使用GANFuzz的默认设置进行模型训练。我们先对生成器进行1次epoch的预训练,然后对鉴别器进行5次历元的预训练,并整体进行3次。其次,我们进行交替训练过程,每次训练生成器1次epoch,训练鉴别器5次epoch。我们通过重复5、10、15、20次交替训练来评估实验结果。
训练配置:英伟达GeForce GTX TITAN X GPU
实验结果:
1.bug
2.评价指标
Clutering | Training | Generating |
---|---|---|
No Clustering | 15.7h | 6.5min |
Same Length Clustering | 36.3h | 4.6min |
Advanced Clustering | 17.6h | 1.8min |
为了更好地比较我们的聚类策略,我们在表1中给出了20个阶段重复交替训练过程的训练时间和生成时间。我们可以看到,Advanced Clutering在训练时间和生成时间上都明显优于SameLengthClustering策略。对于NoClustering策略,虽然它在TIRR和AoVD值方面表现最差,但它的训练时间最短。
总之,尽管GANFuzz仍处于原型版本中,但它能够揭示INPs实现中的错误。我们获得的良好的TIRR和AoVD值也证明了我们方法的潜力和有效性。此外,发现的错误的多样性表明生成的测试用例是多样的,并且结构良好,这表明我们在3.2节中提出的聚类策略能够在实际中获得良好的代码覆盖率和测试深度。如前所述,Advanced Clutering优于其他两种策略。对于SameLengthClustering,尽管它很简单,但它工作得很好。总之,这三种聚类策略都是有效的。
本文提出了一种测试工业网络协议实现的测试用例生成方法。我们的方法通过在生成-对抗网络中训练生成模型来估计协议消息的潜在分布函数,从而学习协议语法。有了这样一个生成模型,我们就能够生成格式良好的测试用例。为了提高代码覆盖率和测试深度,我们提出了三种划分训练数据的聚类策略。在此基础上,我们提出了一个自动模糊化框架GANFuzz,它可以应用于公共或私有的工业协议,其性能优于以前的许多模糊化工具。最后,通过对Modbus-TCP协议应用的测试,对本文提出的方法进行了评价。
今后,我们的工作将朝着以下方向开展。首先,我们计划使用WGAN改进。其次,我们打算将我们的方法应用于有状态协议,例如会话初始化协议最后,我们希望为GANFuzz开发一个用户友好的界面,使其更易于使用。