摘要--通过生成大量异常数据作为程序的输入,模糊测试是发现软件漏洞的有效方法。很难自动模糊协议,因为必须手动构造一个满足协议规范的模板以生成测试用例。在本文中,我们建立了堆叠的seq2seq注意模型来自动生成协议测试用例。Seq2seq-attention是一种机器学习技术,具有编码器-解码器结构以根据上下文输出文本序列。我们评估了不同层LSTM的seq2seq注意模型的训练效果,并指出测试案例的最高正确性是通过3层LSTM实现的。此外,我们基于堆叠的seq2seq注意模型实现了模糊器,并与基于语法的模糊器进行了比较。
一:介绍
模糊测试是通过使用不同的输入反复测试软件来发现软件漏洞的广泛使用的技术之一。根据其输入生成方法,模糊处理主要分为两种:(1)基于变异的模糊处理(2)基于语法的模糊处理。基于变异的模糊测试会通过不同的策略自动对初始测试输入进行变异。相反,基于语法的模糊测试需要特定的格式来生成测试输入,并且由于语法规范通常是人工编写的,因此很难完全自动化。然而,基于语法的模糊测试比基于变异的模糊测试更有效,特别是在构造复杂结构的输入格式(例如PDF格式的文件和包含HTML和Javascript文档的网页)时。
在协议模糊测试方面,基于语法的模糊测试和基于变异的模糊测试都起着重要的作用。SPIKE [3],Boofuzz [4]使用协议的规范来构造测试输入。Pulsar [5]和autofuzz [6]使用聚类算法和基于n-gram的方法来自动恢复协议以生成输入。基于语法的模糊器会花费时间来基于语法手动构建初始模板以生成测试用例。另一方面,Pulsar和自动模糊的生成受到有限长度的内容和传统聚类算法的时间开销的限制。因此,快速自动产生满足协议的输入是协议模糊化的重要问题。
在本文中,我们探讨了是否有可能使用机器学习来自动生成满足协议规范的模糊测试用例。具体来说,我们使用长短期记忆(LSTM)建立不同的层序列对序列注意(seq2seq-attention)[7]模型。单元以学习协议中字符的概率分布。我们收集由传统基于语法的模糊器产生的测试用例作为输入数据,并接受无监督的培训。而且,我们实现了基于机器学习的模糊器,该模糊器使用之前训练有素的模型来生成测试用例。对两个特定FTP程序的评估表明,使用机器学习自动构建符合协议规范的输入是可行的。并且我们研究了LSTM不同层对测试用例生成的影响。此外,我们发现基于机器学习的模糊器在代码覆盖率方面优于传统的基于语法的模糊器。
本文的贡献包括:
我们建立了一个堆叠的seq2seq-attention模型来自动学习协议规范,并使用它实现基于机器学习的模糊器。
我们比较了使用不同层LSTM的seq2seq注意模型生成的测试用例的正确性。
我们在两个FTP服务器程序上对基于机器学习的模糊器和传统的基于语法的模糊器进行了代码覆盖率评估,这表明我们的模糊器比基于语法的模糊器具有更好的性能。
本文的其余部分安排如下:第二部分介绍与seq2seq-attention相关的背景知识。第三节描述了我们的模型设计。我们在第四节介绍我们的实验结果。我们在第五节中总结了这篇论文。
第二节 背景
sequence(seq2seq)的基本序列是图1中的编码器-解码器体系结构,用于接收来自序列的输入并生成可变长度的输出。递归神经网络(RNN)用于编码器和解码器以处理序列。RNN单元通常由具有各种逻辑门操作的LSTM [8]或GRU [10]组成。隐藏的语义信息被编码为上下文向量C转移到解码器的隐藏状态。seq2seq在机器翻译,文本摘要和语音识别方面取得了巨大的成功,因为其编解码器体系结构不限制输入和输出的序列长度。但是,seq2seq将所有输入序列编码为统一的语义特征,然后对其进行解码。因此,C 必须包含原始序列中的所有信息,并且其长度成为限制模型性能的瓶颈。
图1.序列到序列的示意图
注意力机制通过每次输入不同的来解决这个问题。下面的图2是一个带有注意机制的解码器:每个
自动为当前输出的
选择最合适的上下文信息。具体来说,我们使用
来测量编码器第j阶段的
与解码第t阶段的相关性。解码器第t级输入的上下文信息
来自于所有
到
的加权和。
是一个输出到
的softmax函数。他们的表示如下:
图2.解码器中注意机制的示意图
和
是权重矩阵,其参数在编码器和解码器中学习。
的计算过程也称为点积矩阵法。
第三节 模型设计
在图3中,我们概述了堆叠的seq2seq-注意模型,它由三个模块组成:编码器模块,注意模块和解码器模块。
首先,编码器读取输入文本并将文本中的每个字符转换为一个独热编码向量。独热编码用于将每个特征表示为互斥的二进制元素向量。所以
。(
= 0或1)然后编码器使用LSTM与前向隐藏状态
接收独热编码向量
并输出下一步隐藏状态
。输出状态
不仅用于下一个输入词,也转移到注意模块。为了测量LSTM叠加的效果,我们在编码器阶段分别建立了2 ~ 5个隐藏层LSTM,每一层包含128个隐藏状态。由于我们的训练数据缺乏标签,我们采用无监督模式。为了确定在无监督模式下训练模型的效果,我们观察了不同时期的模型,这些模型代表了学习产生执行的次数。
在注意模块中,每个上下文信息是权重系数与编码器隐藏状态之和。权重系数采用第二节中提到的点积矩阵法计算。
最后,编码阶段LSTM只包含一层隐藏128个字符,与原始的seq2seq注意模块相同。当前的LSTM取注意力模块的上下文向量, LSTM之前的隐藏状态
和之前的输出向量
作为输入,在softmax函数后输出向量
。向量
是时间步长t (y1t, y2t, y3t,…,ymt)内每个字符的概率分布。
由于输出的是每个字符的概率分布,测试用例的生成有三种类型的抽样:无样本、样本、样本空间。无样本意味着根据分布选择最佳的特征。在样本策略下的概率分布中,并没有筛选出预测的最佳下一个字符。样本空间是上述两种方法的组合,仅在当前输入序列不以空格结尾时才选择最佳预测字符。在我们的模型中,我们选择了样本空间策略,该策略被证明是论文learning &fuzz中最有效的策略。
与一般的深度学习过程一样,我们在训练过程中计算模型的交叉熵损失函数,并尝试通过Adam算法在将输出L最小化,其中为实际值,
为预测值。
Adam是一种不同于随机梯度下降的优化算法。它通过计算梯度的一阶矩估计和二阶矩估计来计算不同参数的独立自适应学习速率,而不是保持单一的学习速率来更新所有的权值。
四.评估
A.数据集和实验设置
通过执行基于语法的模糊器Boofuzz[4]收集数据集。Boofuzz是Sulley[13]的基准之一,可以根据用户定义的协议规范构造网络数据包。我们给Boofuzz提供了FTP的RFC定义,最终得到了36871条消息。这36871条消息是堆叠seq2seq attention模型的语料库,由于训练开销,每个消息的最大长度被限制为150个字符。
seq2seq-attention模型培训是在Ubuntu 16.04系统上使用NVIDIA GeForce 1080 Ti进行的,并使用Keras[14]框架及其python绑定实现。在Keras中,训练过程默认拆分验证集。训练后,模型被我们实现的一个简单的模糊器调用来发送生成数据。
为了测量堆叠seq2seq-attention模型的效果,我们在两个FTP服务器程序上进行了实验:server - u 7.0.0.1和Filezilla 2.23,这两个程序运行在Windows server 2003上。第一个实验计算了模型生成的测试用例中有多少符合FTP规范。第二个实验使用工具PIN[15]比较了基于机器学习的fuzzer和Boofuzz的代码覆盖率。
B .正确性
判断测试用例正确性的原则是:测试用例的头字段为FTP协议指定的字段。不同层数的每个模型都有足够的时间来生成10,000个测试用例。我们根据上面提到的原则,通过内容匹配脚本计算出正确的测试用例的数量,并计算出正确的百分比。从图4可以看出,随着训练周期的增加,不同层次的模型所生成的测试用例正确率有所提高。实验结果还表明,3层LSTM堆叠的测试用例生成的正确性最高,而4层和5层的正确性反而下降。说明在3层以上使用堆叠LSTM并不能增强seq2seq-attention的效果。从一般机器学习的角度来看,其原因可以排除为在复杂模型中使用过多的参数会降低训练的效果。
图4所示.不同层次seq2seq-attention模型的正确率从10 ~ 50个时代。
C.代码覆盖率
本文采用唯一的基本块来度量代码覆盖率。我们自定义开发了一个pintool[15]来实现对唯一基本块的统计。
选取50个周期训练过的3层最高正确性模型,为发送网络数据包的简单模糊器生成测试用例。我们基于机器学习的fuzzer和boofuzz在windows server 2003主机上的server - u 7.0.0.1和Filezilla 2.23上进行4小时评估。
图5所示.基本块覆盖比较。
我们提出的模型的基本块覆盖率比图5中的ServU和Filezilla上的boofuzz高3.1%和2.2%。结果表明,seq2seq-attention模型能够学习生成发现新路径的测试用例。
五:结论
测试用例的生成是协议模糊化的关键。我们建立了带有LSTM单元的堆叠seq2seq-attention模型,自动学习协议格式。该模型在50个时代训练了3个堆叠层,生成了符合协议规范的测试用例,正确率为93%。而更多的层模型并不能在有限的时间内更好地了解协议的格式。同时,我们实现了一个基于训练好的seq2seq-attention模型的模糊器,并与Boofuzz进行了比较。比较结果表明,基于机器学习的方法可以生成具有更高代码覆盖率的样本。未来的工作包括从实际网络流量中提取数据,并使用代码覆盖标记标记训练数据来改进模型。