当前位置:   article > 正文

阅读笔记——《GANFuzz: A GAN-based industrial network protocol fuzzing framework》

阅读笔记——《GANFuzz: A GAN-based industrial network protocol fuzzing framework》

  • 【参考文献】Hu Z, Shi J, Huang Y H, et al. GANFuzz: a GAN-based industrial network protocol fuzzing framework[C]//Proceedings of the 15th ACM International Conference on Computing Frontiers. 2018: 138-145.
  • 【注】本文仅为作者个人学习笔记,如有冒犯,请联系作者删除。

目录

摘要

一、介绍

二、预备知识

1、生成对抗网络

2、循环神经网络

3、卷积神经网络

 三、方法

1、方法概述

2、消息聚类 (Clustering the messages)

3、学习协议语法 (Learning the  protocol grammar)

3.1、基于GAN对协议语法进行建模

3.2、确定模型

3.3、训练模型

4、生成测试用例 (Generating test cases)

四、模糊测试框架架构

1、MSG Capturing And Analyzing Module (MCAM) 消息捕获和分析模块

2、MSG Preprocessing Module (MPM) 消息预处理模块

3、Training and MSG Generating Module (TMGM) 训练和消息生成模块

4、MSG Sending Module (MSM) 消息发送模块

5、Monitoring Module (MM) 监测模块

6、Logging Module (LM) 日志记录模块

五、实验

1、Modbus-TCP协议

2、评估指标

2.1、Test inputs reject rate (TIRR) 测试输入废弃率

2.2、Ability of vulnerability detecting (AoVD) 漏洞检测能力

3、训练数据和模型训练

4、实验结果

4.1、错误和异常

4.2、TIRR和AoVD

六、总结


摘要

  • 本文为了从通信安全的角度提高工业安全,通过对协议进行模糊测试来发现工业网络协议 (INPs)中的错误和漏洞。
  • 传统的协议模糊测试必须在协议语法的指导下生成测试数据,协议语法可以通过解释协议规范,或通过对网络痕迹逆向来获取。本文提出了一种自动化的测试用例生成方法,其中协议语法通过深度学习来学习。采用生成对抗网络 (GAN)对真实协议消息进行学习训练,使其能够学习协议语法。然后使用经过训练的生成模型来生成虚假但可信的消息,即测试用例。
  • 基于这种方法,本文提出了一个自动智能模糊测试框架(GANFuzz)来测试INPs。与以往的工作相比,GANFuzz为发现工业协议漏洞供了一种新的解决方法。此外,GANFuzz不依赖于协议规范,因此它可以应用于公共和专有的协议,这优于许多以前的框架。

一、介绍

  • 工业控制系统 (ICS)是石油石化工业、电力系统、核电站等关键基础设施正常运行的必要设备。工业网络协议 (INPs)是为了实现ICS各部分的互连而开发的,而ICS的实现通常存在安全漏洞和缺陷。因此,它们已经成为网络攻击的主要目标。
  • 事实上,大量针对工业控制系统的网络攻击都是由工业网络协议的安全漏洞造成的。因此,找到INPs中潜在的漏洞是非常重要的。本文的主要贡献如下:
    • 提出了一种新的测试用例生成方法,并在此基础上构建了一个模糊测试框GANFuzz。
    • 为了提高代码覆盖率和测试深度,提出了三种聚类策略,对不同维度的协议消息进行分类,使用这些聚类策略,模型可以生成更多样化和格式良好的测试用例。
    • 使用GANFuzz测试了几个Modbus-TCP模拟器,并成功地揭示了一些新的缺陷和已知的问题。

二、预备知识

1、生成对抗网络

  • 生成对抗网络 (GAN)是一种深度神经网络架构,已被广泛应用于生成逼真的数据,例如图像、视频、文本,并取得了显著的成果。GAN由一个生成模型(生成器)和一个判别模型(判别器)组成,其中生成器的目标是欺骗判别器,使其相信由生成器创建的数据来自真实数据分布,而判别器的目标是区分合成数据和真实数据。
  • 为了实现这一目标,生成器被输入来自先验分布的随机噪声,例如服从高斯分布的随机噪声,以得到一个逼近真实数据分布的生成器G。训练判别器D使生成的数据和真实数据被正确分类的概率最大化。相反,训练生成器G使生成的数据被错误分类的概率最大化。
    • 【注】先验分布:描述了在观测到任何数据之前对该参数可能取值的概率分布。
  • 通过这种对抗性的训练方式,可以得到一个生成模型,它覆盖了真实世界数据的分布函数。本文使用GAN来训练生成模型,以学习协议消息的协议语法。

2、循环神经网络

  • 循环神经网络 (RNN)是一种广泛用于各种自然语言处理 (NLP)任务的神经网络。RNN能够通过捕捉上下文信息并将其存储在一个记忆单元(隐藏状态)中,从而学习输入序列的长期依赖关系。
  • 本文使用RNN作为生成对抗网络中的生成器。

3、卷积神经网络

  • 卷积神经网络 (CNN)是一种广泛应用与计算机视觉领域的神经网络。一个CNN通常由很多层组成,包括输入层、卷积层、池化层、全连接层、输出层等。CNN擅长从输入数据中提取特征,并且在各种文本分类任务中表现良好。
  • 本文使用CNN作为生成对抗网络中的判别器。

 三、方法

1、方法概述

  • 本文的最终目标是对工业联网协议 (INPs)的进行模糊测试。首要解决的问题之一是找到生成测试数据的有效方法。在这项工作中,我们使用生成对抗网络在协议消息的数据集上训练生成模型。通过利用生成模型,可以生成与真实消息具有不同相似度的虚假协议消息,以发现协议中的潜在漏洞。主要步骤如下:
    • 消息聚类 (Clustering the messages)
      • 给定一个实际协议消息种子池作为训练数据,采用三种聚类策略分类这些数据。每种策略关注的协议消息的特征和功能是不同的,这使得我们能够从不同的维度进行模糊测试,有助于提高代码覆盖率和测试深度。
    • 学习协议语法 (Learning the protocol grammar)
      • 本文将协议语法学习问题建模为使用生成对抗网络和SeqGan算法估计生成模型的过程。通过深度学习训练,生成模型自动从真实协议消息中揭示协议语法。
    • 生成测试用例 (Generating test cases)
      • 训练完毕的生成模型能够生成类似真实协议消息的序列。通过利用生成模型,我们可以为模糊测试生成测试用例。

2、消息聚类 (Clustering the messages)

  • 代码覆盖率和测试深度是模糊测试中的两个基本概念。代码覆盖率和测试深度越高,模糊测试的结果就越完全。一般来说,测试用例越多样化,可能达到的代码覆盖率就越高,而对协议语法的理解越深,就能实现更好的测试深度。
  • 【注】聚类和分类相似,但不等同于分类。区别在于聚类所要求划分的类是未知的。
  • 本文提出了NoClustering、SameLengthClustering和AdvancedClustering三种聚类策略来划分训练数据。NoClustering策略的目标是增加测试用例的多样性,旨在实现更高的代码覆盖率;而另外两种策略的目标是更好地掌握协议语法,旨在实现更好的测试深度。从而提高了模糊效果。
    • NoClustering
      • 使用该策略时,训练数据集中的所有消息都会被视为同一类别,即在一个生成模型中捕捉所有消息类型的语法。这是困难的,因为不同类别的协议消息的长度和结构可能有很大的差异,这样训练出的模型生成的消息格式不会十分准确,系统可能会拒绝其中的绝大部分。
      • 尽管这种策略的弱点非常明显,但仍然值得执行,因为与其他两种策略相比,这样训练的模型倾向于产生最多样化的测试用例,能达到更高的代码覆盖率。
    • SameLengthClustering
      • 该策略通过使用消息长度作为度量对消息进行分类。
      • 首先,我们将相同长度的消息分到同一组中。然后,数据量小于给定阈值(例如,2000)的组被移到更长的相邻组,而超过阈值的组则保持不变。
      • 这种策略看起来粗糙,但在许多情况下,它确实是高效而简洁的。因为对于许多工业网络协议 (INPs),它们相同消息类型的长度是相似或相同的。与NoClustering策略相比,这种策略可以更好地理解协议语法,从而实现更好的测试深度。
    • AdvancedClustering
      • 使用该策略,首先构建消息的字符集,并建立一个从字符到唯一整数编号的映射。然后,将每条消息转换为向量表示,其中每个字符由相应的整数编号表示。之后,通过除以最大整数编号来对向量进行归一化。最后,我们通过应用k均值聚类算法,使用欧几里得距离作为相似度度量,对向量进行分类。
      • 与其他两种聚类策略相比,这种聚类策略提供了对消息更为合理的分区。使用这种策略,我们更有可能将具有相同功能的消息分在一起,这使我们能够分别处理各种消息类型的语法,从而使生成模型更好地理解协议语法,才更有可能获得最规范的测试数据。

3、学习协议语法 (Learning the  protocol grammar)

3.1、基于GAN对协议语法进行建模
  • 给定一个协议消息种子池,将其中的每个消息视为字符序列。GAN的思想是将每条消息视为未知分布函数Q的样本结果,即将协议语法的学习问题转化为分布函数Q的估计问题。
  • 为了求解函数Q,我们训练了一个生成器G来生成新的消息,训练了一个判别器D来区分生成的消息和真实的消息。通过训练GAN,直到生成器生成的消息与真实消息高度相似。
  • 由于协议消息是离散数据,不可微,故在训练过程中不能直接利用反向传播。为了解决该问题,我们采用SeqGan算法。该算法使用强化学习技术来更新生成器的参数,而不是直接从判别器反向传播到生成器。
  • GAN对协议语法的学习问题进行建模如图1所示,其中G为生成器,D为判别器。x为真实消息,y为生成消息。
  • 状态是到目前为止生成的消息片段,动作是要生成的下一个字符。
  • 生成器也会使用来自判别器的奖励来更新其参数。奖励是概率值,表示判别器将生成信息视为真实信息的可能性。生成器更新之后,判别器也会随之更新。我们使用生成器生成的假消息和真实消息作为判别器的训练数据,并训练判别器来最大化真实数据和生成数据被正确分类的概率。
3.2、确定模型
  • GAN仅提供了训练生成模型的一般框架。在进行实际的模型训练之前,必须确定其两个组成部分。
  • 本文使用带有LSTM单元的循环神经网络 (RNN)作为生成器,使用卷积神经网络 (CNN)作为判别器。
  • CNN和RNN的结构细节应根据协议消息的结构复杂性来确定。通常,协议消息越长,RNN模型包含的隐藏状态越多,CNN模型需要添加卷积层越多。
3.3、训练模型
  • 由于要求训练数据长度相等,为了保持消息的完整性,首先需要计算最大消息的长度,然后将小于最大长度的消息用不包含在字符集中的特殊字符填充到最大长度。然后将训练数据转换成数字表示形式,进行模型训练。
  • ​训练分为三步:
    • 首先,在真实消息数据集上对生成器进行几个epoch的预训练。一个epoch是指对训练数据集中的所有协议消息进行一次迭代。
    • 然后,我们使用预训练的生成模型生成与训练数据集相同数量的数据。将这些生成的数据与真实消息一起用于训练判别器。
    • 预训练后,再交替训练判别器和生成器,每当完成一个epoch的生成器训练时,再继续进行几个epoch的判别器训练。重复这个过程,直到生成器能够生成与真实消息非常相似的数据。
  • 通常,训练GAN的目的是估计一个生成模型,该模型能够生成与原始数据尽可能相似的数据。但在这项工作中,由于学习的最终目的是执行模糊测试,我们不仅想要获得最佳的生成模型,还希望得到不同训练程度的生成模型。对协议语法具有不同理解程度的不同模型可以生成具有不同相似度的测试数据,引入更多的随机性来增加测试用例的多样性,从而提高模糊测试结果。因此,我们尝试了不同的交替训练次数(例如,5次、10次、15次、20次)。
  • 通过这个对抗性训练过程,学得的生成函数接近于分布函数,这意味着学得的模型对协议语法有很好的理解。

4、生成测试用例 (Generating test cases)

  • 使用三种消息聚类的策略,我们最终都得到了三种不同程度覆盖语法的生成器。
  • 使用学得的生成器生成新数据时,即使用RNN生成测试用例,首先需要给定一个前缀字符,然后查询条件分布以采样下一个标记,并重复此过程直到达到最大长度。
  • 【注】RNN能够通过捕捉上下文信息并将其存储在一个记忆单元(隐藏状态)中,从而学习输入序列的长期依赖关系。

四、模糊测试框架架构

  • 基于上述提出的测试用例生成方法,本文提出了一个智能的、可扩展的工业网络协议模糊框架,即GANFuzz。如图2所示,GANFuzz由MSG(消息)捕获和分析模块(MCAM)、MSG预处理模块(MPM)、训练和MSG生成模块(TMGM)、MSG发送模块(MSM)、日志模块(LM)和监控模块(MM)组成。这些模块相互协作以完成整个模糊测试过程。
  • 运行GANFuzz时,首先启动消息捕获和分析模块 (MCAM)准备训练数据,并收集当前工业网络中工业设备的地址信息。然后,消息预处理模块 (MPM)将训练数据转换成数字表示形式,传递给训练和消息生成模块 (TMGM),然后TMGM启动训练。训练完成后,TMGM查询学习到的生成模型,生成测试数据,由消息发送模块 (MSM)发送到目标工业设备。同时,监测模块 (MM)监督异常事件的发生,日志记录模块 (LM)记录所有发生的事件。

1、MSG Capturing And Analyzing Module (MCAM) 消息捕获和分析模块

  • 负责收集和分析网络通信。
  • 首先,实时捕获网络流量以收集通信数据。其次,MCAM从数据中提取设备地址,并存储为IP地址和端口号,这将在测试阶段由MSM使用。最后,MCAM剥离消息的TCP/IP头部,提取协议特定的命令,并以每行一条消息的格式存储为文本文件。
  • 除了数据包捕获,另一个选项是从本地文件中读取数据,包括pcap文件和文本文件。对于pcap文件,MCAM执行与捕获数据包相同的步骤。对于文本文件,GANFuzz不对其进行任何操作,直接发送到MPM。
    • 【注】PCAP文件是一种网络数据捕获文件格式,它记录了通过计算机网络传输的数据包信息。
  • MCAM是使用pcapy库实现的。

2、MSG Preprocessing Module (MPM) 消息预处理模块

  • 负责准备训练数据集。
  • 首先,MPM执行AdvancedClustering策略来识别异常数据,这些数据将从原始数据集中移除。之后,其他两个聚类策略将在处理过的数据上进行。对于每个聚类策略,GANFuzz将结果保存在不同的目录中。最后,MPM将这些训练数据转换成数值矩阵的形式,通过将消息字符集的每个字符映射到唯一的整数来实现,对于不同的聚类结果,转换的结果将保留在单独预定义的全局变量中。

3、Training and MSG Generating Module (TMGM) 训练和消息生成模块

  • 负责模型训练和测试用例生成。
  • 首先,TMGM将所有训练数据加载为数字表示,然后根据训练设置进行训练。由于训练通常需要很长时间,而且在此期间可能发生异常,TMGM会定期自动将模型参数导出到检查点文件,以防止之前的工作丢失。如果在训练期间发生任何异常,GANFuzz将从最近的系统检查点恢复。
  • 训练后,TMGM通过从不同的检查点文件中读取参数,即利用不同的模型生成测试用例。所有生成的测试用例将存储在文本文件中,然后由MSM读取。
  • TMGM是使用TensorFlow开发的,TensorFlow是由Google拥有的用于深度学习的开源软件库。

4、MSG Sending Module (MSM) 消息发送模块

  • 负责向工业网络发送消息并接收其返回。
  • 一方面,TMGM生成的每个测试用例都交付给MSM。MSM使用MCAM获得的地址信息,用TCP/IP报头包装这些数据。另一方面,MSM接收来自工业设备的响应。
  • 在完成测试用例发送后,所有的通信信息将被传送到日志模块中。

5、Monitoring Module (MM) 监测模块

  • 负责监控工业网络在模糊过程中的异常情况。
  • 这主要是通过监测和分析交互数据来实现的。MM试图找出是否有任何故障和错误的表现。具体来说,MM在当前原型工具中查找三种异常,包括超时连接、超时返回和异常消息。如果发现这些异常行为的任何迹象,就会发出警报。
  • 为了获得更好的模糊结果,人工检查也是必要的,因为一些异常可能在系统运行轨迹中没有直接的指示,只能通过观察其运行来发现。

6、Logging Module (LM) 日志记录模块

  • 负责记录模糊测试过程中发生的所有事件。
  • 一旦第一个测试用例被发送出去,LM就会被激活。然后LM按顺序写下每个测试用例及其返回的信息。同时,LM接收MM发送的信息,MM发现的任何异常和异常也都会被写入日志文件。LM还使用聚类算法,例如k-means、k-medoids等,来执行日志分析,帮助发现漏洞。LM还会挑选出那些触发系统错误或异常行为的消息,以备后续使用。
  • GANFuzz具有一个显著的特点,即它包含一个重新训练阶段。该阶段的原理是相似的测试输入可能触发相似或甚至更严重的问题,这有助于获取有关错误的更多信息,有助于错误分析。在此期间,GANFuzz对LM选择的有问题的消息执行数据扩展策略,以获取新的训练数据,包括单变异点和多变异点。单变异点就是随机更改种子消息中的一个字符,而多变异点则是指同时更改多个字符。然后使用这些数据进行新一轮的训练和更进一步的模糊测试。

五、实验

  • 本文通过测试Modbus- tcp协议的几种实现来评估GANFuzz,包括MOD_RSSIM v8.01、Modbus Slave v3.10a、diasave v2.12以及Modbus pal v1.6b,它们是最流行的Modbus- tcp模拟器。

1、Modbus-TCP协议

  • Modbus是Modicon公司于1979年开发的一种应用层协议。目前,Modbus协议已经成为许多工业网络事实上的标准通信协议。Modbus-TCP是为了满足工业以太网的应用需求而发明的,它利用TCP/IP协议栈为Modbus RTU协议配备TCP接口,使其能够在以太网上运行。
  • 如图3所示,Modbus- tcp消息由Modbus应用协议(MBAP)报头和协议数据单元(PDU)组成。MBAP报头长度为7字节,由事务标识字段、协议标识字段等4个数据字段组成,PDU由功能码字段和数据字段组成。Modbus-TCP报文的最大长度为260字节。

2、评估指标

  • 为了定性和定量地评价实验结果,我们采用了以下两个指标。
2.1、Test inputs reject rate (TIRR) 测试输入废弃率
  • TIRR是指测试用例被系统拒绝的百分比。
  • 如果系统将测试用例视为非法并返回错误消息,则将其视为被拒绝的测试用例。低TIRR表示测试用例质量良好,表明训练的模型很好地掌握了协议语法,有助于产生良好的模糊测试结果。相反,高TIRR表示测试用例质量较差,表明训练的模型没有很好的掌握协议语法,这将导致模糊测试结果不理想。
2.2、Ability of vulnerability detecting (AoVD) 漏洞检测能力
  • AoVD显示为测试期间系统发生的异常或崩溃的数量。其中异常主要是指异常的系统行为,但不包括测试用例拒绝。
  • 在评估AoVD时,除了考虑异常的数量外,我们还考虑了所使用的测试用例的数量。计算公式如下:
    • ,其中b为注意到的异常数量,n为使用的测试输入。
  • 含义是每100个测试用例中发现的异常数量。给定相同数量的测试用例,AoVD值越高表示发现的异常越多,这意味着测试结果越好。

3、训练数据和模型训练

  • 训练数据是利用Pymodbus生成的。通过使用Pymodbus,调用相应的函数,很容易进行Modbus-TCP请求和响应。在我们的程序中,我们随机调用这些函数生成了50000个请求字符串,并放置在GANFuzz的消息捕获和分析模块的目录中。
    • 【注】Pymodbus是一个用于Python编程语言的Modbus通信协议的库。该库提供了方便的方法来创建Modbus主机和从机,以便进行数据读写、寄存器读写等操作。通过使用Pymodbus,开发人员可以轻松地与支持Modbus协议的设备进行通信,从而实现设备之间的数据交换和控制。
  • 我们使用GANFuzz的默认设置进行模型训练。首先,我们对生成器进行一轮预训练,然后对判别器进行五轮预训练,并重复这个过程三次。其次,我们进行交替训练过程,每次训练生成器一轮,然后训练判别器五轮。我们通过重复进行5、10、15、20次的交替训练过程来评估实验结果。训练是在NVIDIA GeForce GTX TITAN X GPU上进行的。

4、实验结果

  • 实验展示了在测试过程中发现的错误和异常,并通过使用TIRR和AoVD度量(测试用例大小为50000)来评估结果。同时,对三种聚类策略进行了比较。
4.1、错误和异常
  • MOD_RSSIM(Modbus- tcp模拟器)模拟器接收到一些生成的消息后,第一个被检测到的错误返回了一条异常消息:"Station ID XX off-line, no response sent." 。由于单元"XX"仍然在线,我们认为这可能是其中存在的缺陷。为了证明我们的猜测,我们首先将相同的命令发送给Modbus从机,但Modbus从机正确响应。之后,我们随机修改了有问题消息的单元字段,但保持其他区域不变,然后将它们发送给MOD_RSSIM,结果MOD_RSSIM可以正确处理这些消息。最后,为了排除在测试期间从机"XX"被关闭的可能性,我们重新启动了MOD_RSSIM并向其发送相同的消息,得到了相同的返回。基于这些分析,我们认为MOD_RSSIM的从机定义存在一些实现缺陷。
  • 在MOD_RSSIM接收到一些测试用例后,发现了第二个异常。发送的消息的长度与其长度字段不匹配,但MOD_RSSIM将它们视为合法,并正常响应。这是典型的由于与协议规范不一致而引起的错误。
  • 第三个异常是在测试ModbusPal时发现的,其图形界面在接收约200个测试用例后崩溃。在其图形界面上拖动或点击没有任何效果。这种现象可能是在处理图形用户界面时发生的内存泄漏引起的。第四个异常是在测试MOD_RSSIM时发现的。MOD_RSSIM偶尔引发"文件未找到"的错误,这是由于程序未正确处理文件操作。上述两个问题并不是协议实现的错误,但它们显示了将我们的方法应用于发现更一般的软件错误的潜力。
4.2、TIRR和AoVD
  • 三种不同聚类策略下执行5~20次交替训练过程的TIRR和AoVD值如图4所示。
  • 可以看出,交替训练阶段的迭代次数越多,得到的TIRR越低,这证实了我们可以通过改变训练次数来调整生成消息的相似度。
  • 此外,在每个训练阶段中,AdvancedClustering策略都优于其他两种策略。最终经过20次训练,我们从advanced clustering策略中获得了最低的TIRR(43%),从NoClustering策略中获得了最高的TIRR(90%)。
  • 为了更好地比较这三种聚类策略,我们在表1中给出了重复交替训练过程20个epoch的训练时间和生成时间。正如我们所看到的,AdvancedClustering策略在训练时间和生成时间上都明显优于SameLengthClustering策略。对于NoClustering策略,虽然它在TIRR和AoVD值方面表现最差,但它的训练时间最短。

六、总结

  • 本文提出了一种测试用例生成方法来测试工业网络协议。我们的方法通过在生成对抗网络中训练生成模型来学习协议语法,以估计协议消息的底层分布函数。有了这样一个生成模型,就能够生成格式良好的测试用例。
  • 为了提高代码覆盖率和测试深度,我们提出了三种聚类策略来划分训练数据。基于这些方法,我们提出了一个名为GANFuzz的自动模糊测试框架,它可以应用于公共或私有工业协议,优于以前的许多模糊测试工具。
  • 最后,通过测试Modbus-TCP协议的应用来评估GANFuzz。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/166302
推荐阅读
相关标签
  

闽ICP备14008679号