首页> 中国专利> 一种基于协议状态的工控协议模糊测试方法

一种基于协议状态的工控协议模糊测试方法

摘要

本发明提供一种基于协议状态的工控协议模糊测试方法,包括以下步骤:协议状态机提取、报文序列库的构建、协议状态的引导、测试用例的发送与存储、基于心跳的异常监测、以及导致异常的测试报文定位。本发明针对工控协议模糊测试盲目性较大、测试效率低下的问题,依据工控组件所处的协议状态,向工控组件发送属于该协议状态的测试用例,有效扩展模糊测试的覆盖范围,提高测试用例的针对性。本发明基于心跳的异常监测具有广泛的适用性。此外,本发明对导致异常的测试报文的定位方法,能够高效准确的定位引发工控协议异常的单个报文或者报文序列,便于安全漏洞的挖掘和分析。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-03-08

    授权

    授权

  • 2016-08-10

    实质审查的生效 IPC(主分类):H04L12/26 申请日:20160219

    实质审查的生效

  • 2016-07-13

    公开

    公开

说明书

技术领域

本发明涉及工控协议技术领域,具体而言涉及一种在获取工控协议协议状 态机的基础上,依据协议状态,向运行工控协议实体程序的工控组件发送测试 报文,挖掘工控协议实体程序存在的安全漏洞的方法。

背景技术

工业控制系统(ICS,IndustrialControlSystem,简称“工控系统”)是由计算 机设备与工业过程控制组件构成的智能控制系统,广泛应用于电力、水处理、 石油与天然气、化工、交通运输、制造业等行业,它通过对机械装置、交通工 具、实验装置、仪器仪表等工业设备进行自动化监测、指挥、控制和调节,保 证工业设施的正常运转,是国家关键基础设施的大脑和中枢。工控系统主要包 括数据采集与监控系统(SCADA,SupervisoryControlandDataAcquisition)、分布 式过程控制系统(DCS,DistributedControlSystem)、可编程逻辑控制器(PLC, ProgrammableLogicController)、远程测控单元(RTU,RemoteTerminalUnit)等等。

传统的工控系统由于运行环境封闭、专用性强,在系统设计上注重功能的 完整性,较少关注系统的安全性,风险防护能力薄弱。随着工业革命步伐的加 快,工控系统由相对封闭的运行环境加速向网络化和信息化转变,新一代的工 控系统逐步兼容以太网,使之能够与ERP乃至互联网相连。

工控系统的工业化和信息化的深度融合,在提高工业生产效率的同时,也 使工控系统的脆弱点暴露出来,一旦遭受不法分子的恶意攻击,将会造成不可 估量的经济损失,甚至影响到社会的安全稳定。2010年以来,世界范围出现了 多起工控安全事件。2010年攻击伊朗布什尔核电站的“震网(Stuxnet)”病毒被 认为是全球首个投入实战的网络超级武器。2011年发现的恶性蠕虫“Duqu”病 毒,专门攻击工控系统并收集情报。2012年发现的“火焰(Flame)”病毒,其设 计更为复杂,破坏力更强,可能已经潜伏5年之久。2014年,“蜻蜓组织”利用 “Havex”病毒,对欧美地区的一千多家能源企业实施了攻击。

同普通计算机网络或信息系统一样,攻击者之所以能够对工控系统实施攻 击,其核心原因是工控网络或系统中的软硬件存在可利用的安全漏洞。对工控 系统中的软硬件进行安全性测试,挖掘其中可能存在的安全漏洞,先于攻击者 采取相应补救措施,对提高工控系统的安全具有重要意义。

模糊测试,也称Fuzzing测试,它使用大量半有效的数据作为目标程序的输 入,通过监控程序出现的异常来发现潜在的安全漏洞。基于知识的Fuzzing技术 依据文件或者协议格式知识构造测试用例,具有简单高效的优点,是当前Fuzzing 测试领域的主要研究方向。

工控系统中,各组件之间命令与控制信息、以及监测数据的传递都是通过 工控网络协议来实现。在工控系统中,有专门的系统组件负责解析、处理工控 网络协议,这些组件包含了解析工控协议的实体程序,它们的安全直接影响到 工控系统的安全。将模糊测试技术应用于工控软硬件的脆弱性分析是当前工控 安全领域的一个重要研究方向。

目前,国内外已有研究大都是将TCP/IP网络协议的Fuzzing测试工具经过 改进后用于工控协议的Fuzzing测试。美国TippingPoint公司的研究员Devarajan 专门为Sulley开发了工控协议ICCP、Modbus、DNP3的模糊测试模块。德国奥 格斯堡应用技术大学的RolandKoch等人在Scapyfuzzer的基础上研制了 ProFuzz,专门针对Profinet协议族进行模糊测试。Wurldtech公司的Byres等人 设计并实现了BlackPeer测试框架,对两款PLC设备的Modbus/TCP协议栈进行 测试,成功发现了60多个安全漏洞。Bratus等人在通用Fuzzing测试器GPF基 础上实现了一个简单的工控协议模糊测试器LZFuzz。

目前,Fuzzing技术在工控系统中的应用主要存在以下两方面不足。第一, 模糊测试的覆盖率低。工控协议大多面向会话,具备交互状态,如果在测试过 程中没有考虑协议的交互状态,测试往往局限于协议交互的初始阶段。此外, 如果协议报文与协议状态不匹配,也会被协议实体视为无效报文,无法触发漏 洞。第二,测试方式和监控手段受限。工控系统中的很多漏洞并不是由于单个 报文所造成,而是由于报文序列逐步将协议实体从某一协议状态逐步引导到漏 洞触发的协议状态,现有监控方法难以有效定位引发漏洞的报文序列。

发明内容

针对现有技术中存在的问题,本发明旨在提供一种基于协议状态的工控协 议模糊测试方法。针对模糊测试过程没有充分考虑协议状态,造成测试效率低 下的问题,采用XML脚本对协议状态机进行描述,在协议状态机的基础上,通 过测试用例生成算法对被测对象进行状态引导,将协议实体程序设置为希望进 行测试的候选状态,以达到更高的模糊测试覆盖率。通过基于心跳的监测方法 对被测嵌入式工控设备实施便捷、有效的异常行为监测,采用报文回溯判定的 方法实现对引起安全漏洞的报文序列的准确定位。

为达成上述目的,本发明所采用的技术方案如下:

一种基于协议状态的工控协议模糊测试方法,包括以下步骤:

(1)协议状态机提取:采用协议状态机提取方法,即采用开源协议逆向分析项 目Netzob的协议状态机提取方法,其基本流程是:在协议通信报文样本集的基 础上,利用请求询问和应答反馈不断扩充原始通信报文样本集,判断所推断的 候选协议状态机是否与真实协议状态机一致,当满足协议状态机等价条件时输 出协议状态机;在获得待测工控协议的协议状态机后,将协议状态机表示为XML 语言描述的脚本文件;

(2)报文序列库的构建:基于协议状态机,收集并存储工控协议实体程序间的 正常交互报文;确保对于一个工控协议实体程序,当其处于初始状态时,能够 通过一系列的正常交互报文,将工控协议实体程序引导至协议状态机中的任意 一个工控协议状态,或者说,报文序列库收集并存储了足够多的正常交互报文, 能够将协议实体由初始状态引导到任意一个后续协议状态;

(3)协议状态的引导:为了提高测试的深度,增加覆盖率,需要对协议状态机 包含的各个协议状态进行测试,从而有效发现工控组件处于不同协议状态时存 在的安全漏洞;在测试过程中,需要将工控组件通过正常的交互报文引导至需 要测试的某一个工控协议状态,在该协议状态下对工控组件实施模糊测试;

(4)测试用例的发送与存储:在将工控协议实体程序引导到待测状态后,基于 模糊测试的报文变异知识对工控协议报文进行变异,向工控协议实体程序发送 经过变异的报文实施测试;此外,为了便于后续分析,将存储所发送的测试用 例;

(5)基于心跳的异常监测:在发送完一个测试用例后,需要发送用于探测工控 组件活跃情况的心跳报文,对被测工控组件进行监测,判断被测对象是否处于 正常活跃状态,从而及时发现由于测试用例发送而导致的协议异常;

(6)导致异常的测试报文定位:工控协议的处理异常可能由单个报文引起,也 可能由报文序列导致;为了准确定位导致异常的测试报文,需要在测试端存储 近期所发送的测试报文;当出现异常时,将被测工控组件重置为正常工作状态, 依据所存储的报文进行回溯,确定导致异常的报文或者报文序列。

前述步骤(2)报文序列库的构建阶段的工作流程如下:基于协议状态机, 采用网络监听技术进行报文信息收集;每个工控协议状态,往往需要一系列的 报文交互才会到达;采用网络监听技术,捕获从工控协议初始状态开始,到达 每个特定协议状态的报文交互序列,并将报文交互序列以及它们所能够到达的 报文状态一并存储在报文序列库中;

前述步骤(3)协议状态的引导阶段的工作流程如下:为了便于将工控组件 设置为不同的协议状态进行模糊测试,需要进行协议状态的引导;对于选定的 任意一个协议状态,首先将工控组件设置为初始状态,依据报文序列库中的信 息,向工控组件发送报文,通过一系列的报文交互,使工控组件到达指定的被 测状态;即需要测试的工控协议状态。

前述步骤(4)测试用例的发送与存储阶段的工作流程如下:在将工控组件 引导到待测状态后,将对属于该协议状态的正常网络报文进行变异,生成测试 用例;报文的变异将依据模糊测试的变异知识实施,对于字符串类型的数据采 用超长(超短)字符串、格式化字符串进行替代;数值类型采用0xff+1、0xffff 等能够触发整数溢出漏洞的数值替换;在测试用例生成以后,将用例由测试端 发送给被测的工控组件,以期在被测端触发异常;同时,由于在触发异常时需 要对近期发送的测试用例加以分析,因此,采用先进先出的队列对发送的测试 用例进行存储。

前述步骤(5)基于心跳的异常监测阶段的工作流程如下:在模糊测试过程 中,需要及时发现被测对象的异常,从而针对性的进行分析处理;由于PLC、 RTU等工控组件属于嵌入式系统,计算能力和存储资源受到严格制约,难以在 工控组件上安装第三方调试工具监测异常事件,或者形成日志记录异常信息; 鉴于工控嵌入式组件经常由于无法正确处理异常报文而导致PLC、RTU等组件 无法响应,因此可以采用基于心跳的异常监测方法;所谓心跳报文,指的是向 被测设备发送的探测报文,判断向被测设备是否处于活跃状态;在模糊测试过 程中,每向被测设备发送一个测试报文,就在设定的一小段时间之后,向被测 设备发送心跳报文,依据被测设备是否发回预期的响应报文来判断被测设备是 否处于活跃状态;如果收到的响应报文,认为设备没有出现异常;如果没有收 到响应,则认为测试用例在设备端触发了异常;

前述步骤(6)导致异常的测试报文定位阶段的工作流程如下:在模糊测试 过程中,如果发现被测设备出现异常,需要停止测试,确定是由于哪个报文或 者哪个报文序列导致的异常;为了便于分析,在测试端存储近期所发送的测试 报文,同时记录最近所测试的工控协议状态;当出现异常时,首先依据最近所 测试的工控协议状态,重置被测工控组件;依据报文序列库,通过正常的报文 交互,将工控组件引导到最近测试的协议状态,而后开始回溯判定;首先发送 最近发送的第一个测试报文,观察被测工控组件是否表现异常;如果没有出现 异常,则将被测工控组件重置为正常工作状态,并依次发送最近发送的两个测 试报文,观察被测工控组件是否出现异常;如果没有出现异常,则将被测工控 组件进行状态重置,并依次发送最近发送的三个测试报文;以此类推,直到确 定导致异常的报文序列。

由本发明的技术方案可知,本发明的有益效果在于依据协议状态,对工控 组件实施模糊测试,有利于降低测试的盲目性,扩展测试的覆盖范围,同时避 免由于状态不匹配而导致的无效用例,提高测试效率。此外,方法可以有效发 现工控组件在测试中的异常,并准确定位触发异常的测试报文或者报文序列, 便于安全漏洞的挖掘和分析。

附图说明

图1为本发明的整体实现流程示意图。

图2为本发明中Modbus/TCP工控协议状态机以XML格式描述的示例。

具体实施方式

为了更好的了解本发明的技术内容,特举具体实施例并配合附图说明如下。

如图1所示,根据本发明的较优实施例,基于协议知识的协议状态机主动 推断方法,包括以下步骤:

(1)协议状态机提取:采用协议逆向领域协议状态机提取方法获得待测工控协 议的协议状态机,并采用XML脚本的形式对协议状态机进行描述;

(2)报文序列库的构建:报文序列库将发挥将协议实体程序从初始状态引导到 任意指定协议状态的作用。为了构建报文序列库,需要采用网络监听技术收集 协议实体间的正常交互报文。确保对于作为协议实体程序的工控组件,当其处 于初始状态时,可以通过一系列的交互报文,使其到达协议状态机中的任意协 议状态。

(3)协议状态的引导:依据报文序列库,将工控组件通过正常的交互报文引导 至其需要测试的协议状态,以此作为模糊测试的基础。

(4)测试用例的发送与存储:基于模糊测试的报文变异知识,对特定协议状态 下的协议报文进行变异,产生测试用例。而后,向作为被测对象的工控组件发 送测试用例实施测试。为了便于分析测试用例与程序异常之间的关联关系,将 存储所发送的测试用例。

(5)基于心跳的异常监测:在发送完一个测试用例后,需要发送用于探测的心 跳报文,对被测工控组件进行监测。如果工控组件处于正常活跃状态,将返回 应答报文;如果工控组件出现异常,将不会给予回应。利用心跳报文进行探测, 可以及时发现由于测试用例发送而导致的协议异常。

(6)导致异常的测试报文定位:一旦发现工控组件在处理测试用例时产生了异 常,需要定位导致异常的测试报文。首先,将被测工控组件重置为正常工作状 态,而后,依据所存储的报文进行回溯,确定导致异常的报文或者报文序列。

参考图1所示的整体实现流程,本实施例的协议状态机推断方法主要包括 协议状态机提取、报文序列库的构建、协议状态的引导、测试用例的发送与存 储、基于心跳的异常监测、以及导致异常的测试报文定位等6个部分,具体的 实施方式以下分别说明。

(1)协议状态机提取

本发明实施例首先充分收集作为工控协议实体程序的工控组件在网络通信 过程中产生的输入输出报文,采用开源协议逆向分析项目Netzob (www.netzob.org)的协议状态机提取方法,获取协议状态机。

协议状态机提取首先要求推断通信报文的具体格式,在此基础上,以会话 为单位,对网络通信行为进行抽象。会话表示通信参与者之间进行的一次完整 数据交换,能够反映在通信过程中协议状态的迁移情况。基于大量的工控协议 会话样本,利用Netzob的协议状态机主动推断方法,推断得出目标工控协议的 协议状态机。

所生成的协议状态机采用专门的XML脚本进行描述。以Modbus/TCP工控 协议为例,其状态机的描述脚本StateMachine.xml如图2所示。在协议状态机描 述脚本中,<SCADA-Fuzz>是脚本的根元素,用type属性来标识脚本类型,属 性type="StateMachine"表示描述是协议状态机。<StateMachine>元素的name属 性用来定义状态机名称。在元素<StateMachine>中包含描述状态节点的子元素 <State>和描述状态迁移的子元素<Trans>。<State>元素用name属性定义状态节 点名称。<Trans>元素具有name、from、to等属性,其中name是状态转移边的 命名,from表示协议实体的当前状态,to表示在执行<Action>动作之后,协议 实体迁移到的状态。<Action>元素表示状态迁移时对应的执行动作,name属性 表示执行动作名称。每一个<Action>动作对应于一条测试报文的发送或者接收。 <Message>元素表示协议报文的描述模型,其中的ref属性表示引用的消息类型。

(2)报文序列库的构建

为了高效的依据协议状态对运行协议实体程序的工控组件实施模糊测试, 需要构建报文序列库。报文序列库将记录协议实体间正常的交互报文。报文序 列库中的信息可以确保协议实体程序从初始状态开始,经过一系列的交互报文, 能够到达协议状态机中的任意协议状态。

报文序列库采用网络监听的方法进行构建。在此过程中,通过网络监听工 控协议的网络通信,依据已经掌握的协议状态机信息,确定被测端工控组件目 前所处的协议状态。如果到达了一个新的协议状态m,则将从初始状态到达该 状态的交互报文都记录在报文序列库中,形成从初始状态到协议状态m的引导 记录。在记录完一个协议状态的引导信息后,将被测端工控组件重置到初始状 态,开始新一轮的交互。以此类推,直到报文序列库中存储了引导工控组件从 初始状态到所有其他协议状态的记录。

(3)协议状态的引导

对工控协议的模糊测试,将依据协议状态实施,这样可以保证测试用例覆 盖所有的协议状态,充分挖掘各个协议状态所存在的安全漏洞。

协议状态的引导依据报文序列库来实施。首先将工控组件重置到初始状态, 而后在报文序列库中定位需要到达的目标协议状态,根据报文序列库中所存储 的报文序列,按照顺序向工控组件发送报文,引导工控组件到达目标协议状态。

(4)测试用例的发送与存储

为了针对运行工控协议实体程序的工控组件实施模糊测试,需要高效的生 成测试用例。本发明实施例的方法是在已有报文的基础上实施变异,报文的变 异将依据模糊测试的变异知识实施,例如,对于字符串类型的数据采用超长或 超短字符串进行替代、以及采用格式化字符串替代(在字符串中添加类似%d、%x 和%s等格式化字符串);数值类型采用0xff+1、0xffff等能够触发整数溢出漏洞 的数值替换;没有通用语义的二进制类型字段,采用位变换方法,即随机选择 数据中的某些位进行翻转(将0变为1、或将1变为0),以及采用删除字段、 增加填充长度以及采用其他字符集填充的方法进行变异,等等。

测试用例与协议状态是紧密联系的,大部分类型的报文只有在特定协议状 态才会被协议程序接受处理。因此,必须依据协议状态,生成测试用例并实施 测试。具体而言,需要先将工控组件引导到特定协议状态后,再向其发送属于 该协议状态的测试用例。

测试用例的目的是触发程序处理的异常,但是在触发异常后,更关键的是 定位引起异常的测试用例或者测试用例序列。为了分析测试用例与程序异常之 间的关联关系,将对发送的测试用例进行存储,便于后续通过重放加以验证。

(5)基于心跳的异常监测

在工控领域,PLC、RTU等工控组件属于嵌入式系统,计算能力和存储资 源受到严格制约,难以通过第三方调试工具监测异常事件或者利用日志来记录 异常信息。但是PLC、RTU等嵌入式组件在测试过程中有这样一个特点,它们 往往由于无法正确处理模糊测试报文而无法响应外部消息,必须重启设备才能 继续测试。鉴于此,本发明采用基于心跳的异常监测方法,监测被测工控组件 是否处于正常活跃状态。

所谓心跳报文,指的向被测设备发送的探测报文,判断向被测设备是否处 于活跃状态。本发明实施例中,在模糊测试过程中,每向被测设备发送一个测 试报文,就在设定的时间后,向被测设备发送心跳报文,依据被测设备是否发 回预期的响应报文来判断被测设备是否处于活跃状态。如果收到的响应报文, 认为设备没有出现异常;如果没有收到响应,则认为测试用例在设备端触发了 异常,将暂停测试过程,分析哪个测试用例或者哪个测试用例序列触发了程序 异常。

(7)导致异常的测试报文定位

在模糊测试过程中,如果发现被测设备出现异常,需要停止测试,确定是 由于哪个报文或者哪个报文序列导致的异常。基于分析的需要,本发明实施例 在测试端存储最近发出的10条测试报文,同时记录工控组件在测试时所处的协 议状态。

当发现被测的工控组件出现异常时,首先重置工控组件为初始状态。而后 依据测试时工控组件所处的协议状态,基于报文序列库,通过正常的报文交互, 将工控组件引导到最近测试所处的协议状态,而后开始回溯判定。

在判定过程中,先发送最近发送的第一个测试报文,观察被测组件是否表 现异常;如果没有出现异常,则将被测工控组件重置为正常工作状态,并依次 发送最近发送的两个测试报文,观察被测组件是否出现异常;如果没有出现异 常,则将被测工控组件进行状态重置,并依次发送最近发送的三个测试报文。 以此类推,直到确定导致异常的报文序列。

由以上本发明的技术方案可知,本发明的基于协议状态的工控协议模糊测 试方法,将工控协议的协议状态机以XML脚本进行描述,构建报文序列库记录 将协议实体程序由初始状态引导到其他不同协议状态的正常通信报文,在此基 础上,依据协议状态对工控组件实施模糊测试。本发明基于心跳的异常监测方 法无需在被测端安装调试工具,适合在嵌入式系统上使用,符合工控系统的应 用场景。测试过程中,在触发工控组件的异常后,通过报文重放,能够有效定 位导致异常的测试报文或者测试报文序列,为异常分析提供依据。采用此方法 需要获得运行协议实体程序的工控组件,并能够根据需要运行工控组件,向其 发送报文并观察其响应,以此作为工控协议模糊测试的基础。

综上所述,本发明的基于协议状态的工控协议模糊测试方法,依据工控组 件所处的协议状态,向工控组件发送属于该协议状态的测试用例,能够有效扩 展模糊测试的覆盖范围,提高测试用例的针对性。其次,工控组件种类多样, 本发明基于心跳的异常监测方法具有广泛的适用性,能够应用于各类工控组件 的异常监测。此外,本发明对导致异常的测试报文的定位方法,能够高效准确 的定位引发工控协议异常的单个报文或者报文序列,便于安全漏洞的挖掘和分 析。

虽然本发明已以较佳实施例揭露如上,然其并非用以限定本发明。本发明 所属技术领域中具有通常知识者,在不脱离本发明的精神和范围内,当可作各 种的更动与润饰。因此,本发明的保护范围当视权利要求书所界定者为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号