一种基于动态污点分析的Modbus协议漏洞挖掘方法

文档序号:26057075发布日期:2021-07-27 15:35阅读:208来源:国知局
一种基于动态污点分析的Modbus协议漏洞挖掘方法

本发明属于动态污点分析技术领域,具体涉及一种基于动态污点分析的modbus协议漏洞挖掘方法。



背景技术:

由于工控系统通讯协议最初只从使用需求的角度出发,在协议的安全性上并没有做过多设计,这就造成工控协议会很容易被找到漏洞,成为了攻击者的攻击手段,使工控系统的安全防护受到了巨大的威胁。同时,目前广泛用于工控协议漏洞挖掘的模糊测试技术,目前存在盲目生成测试用例、数据变异方法不够复杂,以及代码覆盖率较低三个问题,因此会导致模糊测试的效率不高。



技术实现要素:

本发明的目的在于解决目前模糊测试效率较低的问题,提供一种基于动态污点分析的modbus协议漏洞挖掘方法。

本发明的目的通过如下技术方案来实现:包括以下步骤:

步骤1:配置好工控协议通信环境,使工控协议进行正常通信;对通信报文进行抓取,并将部分正常通信报文进行变异处理;

所述的对正常通信报文进行变异处理的方法具体为:以正常工控协议格式为模板,根据变异方法,将协议中的字段替换为变异数据,利用协议生成器,逐一生成大量的变异后的协议;所述的变异数据包括字节域数据变异元素和数据域变异元素;

所述的字节域数据变异元素是把协议中各字段的字节特征作为单位,把其中的特殊字节数据从各字段所要求的取值范围中提取出来,并分为数值边界值变异元素、格式化字符变异元素以及特殊值变异元素,作为变异元素生成变异后的协议报文;所述的字节域数据变异元素分为数值边界值变异元素、格式化字符变异元素以及特殊值变异元素;

所述的数值边界值变异元素是将协议中的字节值修改为字节的边界值;所述的格式化字符变异元素是将协议中各个字节的数值修改为特殊的字符;所述的特殊值变异元素包含的是在协议的取值范围中,将数值边界值变异元素以及格式化字符变异元素去除,剩下的可以取值的元素;

所述的数据域变异元素是通过以数据域长度的不同,将不同功能类型码f的长度值进行分类,确定生成的变异协议中数据域的长度,再利用不同类型的字节变异元素来填充数据域中的字节值;数据域变异元素分为空指针变异元素、功能区的缓冲区溢出变异元素、协议的缓冲区变异元素;

所述的空指针变异元素的取值范围表示为[0,min(f)],min(f)表示功能类型码f对应的数据域的最小长度;所述的功能区的缓冲区溢出变异元素的取值范围是[max(f),max(all)],max(f)表示功能类型码f对应的数据域的最大长度,max(all)表示工控协议中所有的功能类型码中数据域的最大长度;所述的协议的缓冲区变异元素的取值范围是[max(all),+∞);

步骤2:对正常通信报文和变异报文分别进行污点源数据标记;

通过采取细粒度大小,以modbus协议中各个字节作为污点标记单位,一个字节被标记为一个污点源数据taintdata;以一个三元组的形式对每一个污点数据进行描述,三元组中包含协议通信报文序号pid、协议字段编号pfid、字段偏移位置fop,污点源数据表示为:

taintdata=<pid,pfid,fop>

其中,pid是通信报文作为污点数据的唯一序号;fop是对工控协议结构中各个字段进行编号;fop是污点源数据在各个字段中的字节偏移量;

步骤3:将完成污点源数据标记后的正常通信报文和变异报文分别发送到协议服务器中;

步骤4:协议服务器对正常通信报文和变异报文的污点源数据标记进行识别,获得当前污点源的操作数执行的指令类型;依据指定的细粒度污点传播规则,进行污点传播;

步骤5:判断当前操作数的污染情况;如果当前操作数仍保持被污染状态,则根据当前危险函数的污染状态,更新危险函数的调用状态信息,返回步骤4;如果当前操作数的污染情况被消除,则结束。

本发明还可以包括:

所述的步骤4中指令类型包括赋值复制指令、算数计算指令以及特殊指令,特殊指令中又包含清零指令和单操作数指令;将所有的指令操作过程,抽象为一个映射过程f,表示为:

f(ins):y=f(x)

其中,ins被定义为程序中的指令集合{insi};x被定义为指令中源操作数的集合{xi};y被定义为指令中目的操作数的集合{yi};f被定义为指令的运算方式;

针对污点传播规则来说,也同样将其看作是一个映射关系,表示为公式:

ft(ins):yt=ft(xt)

其中,xt被定义为指令的源操作数当前存在的污点的集合{xti};yt被定义为被传递的指令目的操作数的污点集合{ytj};对于其中任意取值的i和j对应的xti以及ytj,分别表示为指令的源操作数集合、指令的目的操作数集合中当前的污点状态;xt1=0表示指令中第一个源操作数不是污点数据,yt1=1表示指令运算后,第一个目的操作数被传播为污点数据;

根据复制规则进行污点传播的赋值复制指令包括:mov、cmov、movsz、repmovs、replpds;赋值复制指令mov对应的映射过程为公式:

f(movdest,src):dest=src

赋值复制指令mov的污点传播规则为公式:

ft(movdest,src):destt=srct

依据计算规则进行污点传播的算数计算指令包括:add、inc、div、mul;

算数计算指令add对应的映射过程为公式:

f(adddest,src):dest=dest+src

算数计算指令add的污点传播规则为公式:

其中,dest0与dest1是为了将源操作数和目的操作数集合中的元素区分开;

需要指定特殊污点传播规则的特殊指令包括sub、movsd、push、pop、call、ret;

当sub指令的源操作数和目的操作数是同一个数据,进行相减操作后,得出的结果为0,是个常数,这时对于污点传播过程来说,需要将源操作数的污点状态漂白,运算结果不再带有污点属性;

movsd指令的污点传播规则按照复制规则进行传播,规则为公式:

ft(movsd):[dest]t=[src]t。

本发明的有益效果在于:

本发明解决了目前模糊测试效率较低的问题,使用动态污点分析技术设计出一种modbus协议关键字段定位方法,通过对modbus协议中关键字段进行定位,与模糊测试技术相结合,可以使模糊测试生成的测试用例更具有针对性,进而有效的提高针对modbus协议进行漏洞挖掘的效率。

附图说明

图1为本发明的整体框架图。

具体实施方式

下面结合附图对本发明做进一步描述。

本发明涉及了动态污点分析技术,通过对modbus协议中关键字段进行定位,与模糊测试技术相结合,进而有效的提高针对modbus协议进行漏洞挖掘的效率。本发明描述的是一种基于动态污点分析的modbus协议漏洞挖掘方法。本发明的目的是解决目前模糊测试效率较低的问题,使用动态污点分析技术设计出一种modbus协议关键字段定位方法,可以使模糊测试生成的测试用例更具有针对性,从而提高漏洞挖掘的效率。

1、工控协议数据变异方法:

工控协议的组成结构通常包括协议的报头和传输的数据,报文头部主要包含事务处理标识、功能类型码、长度信息等参数,这些参数的长度是固定的字节。数据域存储了协议发送的具体的控制信息,该部分长度不固定。根据协议中字段是否固定的区别,分别设计了不同的变异元素,分别是字节域数据变异元素以及数据域变异元素。

(1)字节域数据变异元素

字节域数据变异元素是把协议中各字段的字节特征作为单位,把其中的特殊字节数据,从各字段所要求的取值范围中提取出来,并分为多个类别。在进行数据变异时,从提取出来的特殊字节数据中进行挑选,作为变异元素生成变异后的协议报文。根据提取出的特殊字节的特征,以及可能会造成的漏洞,将其分为三种类别,分别是数值边界值变异元素,格式化字符变异元素,以及特殊值变异元素。

1)数值边界值变异元素

数值边界值变异元素是通过把协议中的字节值,修改为字节的边界值,当测试目标收到这些字节的边界值时,监控测试目标是否能正确处理这些数值。

2)格式化字符变异元素

通过将协议中各个字节的数值,修改为例如:#、&等特殊的字符,通过检测这些特殊字符,是否会导致测试目标产生运行异常等错误,从而判断测试目标是否具备正确处理特殊字符的能力。

3)特殊值变异元素

特殊值变异元素包含的是在协议的取值范围中,将数值边界值变异元素以及格式化字符变异元素去除,剩下的可以取值的元素。如果以集合的形式来表示,用setall表示协议中对应字段的字节取值集合,setboun用来表示数值边界值变异元素所在的集合,setformat表示为格式化字符变异元素所在的集合,setrest表示为特殊值变异元素所在的集合,那么可以得到setrest的计算方式:

setrest=setall-setboun-setformat

(2)数据域变异元素

数据域变异元素是通过以数据域长度的不同,将不同功能类型码的长度值进行分类,确定生成的变异协议中数据域的长度,再利用不同类型的字节变异元素来填充数据域中的字节值。数据域变异元素被分为三类:分别是空指针变异元素,以及缓冲区溢出变异元素。以工控协议中功能类型码f为例,将功能类型码f对应的数据域的最大长度用max(f)表示,最小长度用min(f)表示,将该协议所有的功能类型码中数据域的最大长度表示为max(all)。

1)空指针变异元素

空指针变异元素用来测试在协议的功能类型码为f时,数据域的长度大于等于0,但小于协议中所规定的数据域的最小长度的情况,因此空指针变异元素的取值范围就可以表示为[0,min(f)]。该变异元素可以用来测试当发送过来的协议数据域长度不足时,测试目标是否会发生空指针异常错误。

2)缓冲区溢出变异元素

根据构造的数据域的长度的不同,又可以将缓冲区溢出变异元素分类为针对功能区的变异元素和针对协议缓冲区的变异元素。功能区的缓冲区溢出变异元素的取值范围是[max(f),max(all)],通过将变异的协议中的数据域长度超出功能类型码f的最大长度,进而检测是否会导致测试目标出现缓冲区溢出问题;协议的缓冲区变异元素的取值范围是[max(all),+∞),这种变异元素会使得生成的变异协议超出该工控协议所规定的最大长度,同样可以检测是否测试目标会出现缓冲区溢出问题。

根据以上的数据变异方式,以正常工控协议格式为模板,针对协议中的某一字段,根据变异方法,将协议中的字段替换为变异数据,利用协议生成器,逐一生成大量的变异后的协议。

2、污点源识别:

通过采取细粒度大小,以modbus协议中各个字节作为污点标记单位,一个字节被标记为一个污点源数据(taintdata)。以一个三元组的形式对每一个污点数据进行描述,三元组中包含:协议通信报文序号(protocolid,pid)、协议字段编号(protocolfieldsid,pfid)以及字段偏移位置(fieldsoffsetposition,fop),因此,污点源数据可以表示为:

taintdata=<pid,pfid,fop>

其中,pid是协议通信报文作为污点数据的唯一序号,fop是对工控协议结构中各个字段进行编号,fop是污点源数据在各个字段中的字节偏移量。

利用对污点源数据设置的数据结构,污点源识别的具体流程为:

(1)配置好工控协议通信环境,使工控协议进行正常通信。

(2)对通信报文进行抓取,并将部分正常通信报文进行变异处理。

(3)针对正常通信报文和变异报文,分别对报文进行污点源数据的三个属性进行标记。

(4)标记完成后将正常通信报文和变异报文分别发送到协议服务器中,并对报文的标记进行识别。

(5)识别完毕后依据污点传播规则,进行污点传播。

3、污点传播规则的设计。通过对x86指令集中的指令根据其语义类型,分为以下三类:赋值复制指令、算数计算指令以及特殊指令,特殊指令中又包含清零指令和单操作数指令,本文针对以上指令类型制定了完整的污点传播规则。将所有的指令操作过程,抽象为一个映射过程f,表示为:

f(ins):y=f(x)

其中,ins被定义为程序中的指令集合{insi},x被定义为指令中源操作数的集合{xi},y被定义为指令中目的操作数的集合{yi},f被定义为指令的运算方式。针对污点传播规则来说,也同样将其看作是一个映射关系,表示为公式:

ft(ins):yt=ft(xt)

其中,ins被定义为相同指令的集合,xt被定义为指令的源操作数当前存在的污点的集合{xti},yt被定义为被传递的指令目的操作数的污点集合{ytj}。对于其中任意取值的i和j对应的xti以及ytj,分别表示为指令的源操作数集合,或是指令的目的操作数集合中当前的污点状态,例如:xt1=0的含义是指令中第一个源操作数不是污点数据,yt1=1表示指令运算后,第一个目的操作数被传播为污点数据。通过以上定义,可以将赋值复制指令、算数计算指令以及特殊指令分别制定具体的污点传播规则。

(1)复制规则

针对赋值复制类指令,可以直接将映射关系ft设定为简单的一对一映射,在进行指令操作中,直接将源操作数的污点状态传递给目的操作数,使目的操作数的污点状态与源操作数保持一致。以mov指令为例:

movdest,src

针对mov指令,根据其语义,仅有一个源操作数和一个目的操作数,源操作数直接将数据传递给目的操作数,因此对于源操作数集合x,有x={src},同样的,对于目的操作数集合y,有y={dest}。因此mov指令对应的映射过程为公式:

f(movdest,src):dest=src

这样便得到mov指令的污点传播规则为公式:

ft(movdest,src):destt=srct

其中,xt=(srct),yt=(destt)。

根据复制规则进行污点传播的主要赋值复制类指令主要包括:mov、cmov、movsz、repmovs、replpds等。

(2)计算规则

对于算数计算指令,以add为例,add的指令假设为:

adddest,src

依据add指令的语义,映射关系为公式:

f(adddest,src):dest=dest+src

其中,对于源操作数集合x,有x=(dest0,src),对于目的操作数集合y,有y=(dest1),集合中的dest0与dest1,是为了将源操作数和目的操作数集合中的元素区分开。因此,把ft定义成运算规则映射,指令add的污点传播规则可以设置为公式:

其中,

依据计算规则进行污点传播的主要算数计算指令主要包括:add、inc、div、mul等。

(3)特殊规则

特殊指令中包含清零指令和单操作数指令,对这类指令进行污点传播时,需要针对其中可能存在的常数结果、具有隐含的操作数等情况进行特殊说明,例如sub指令和movsd指令。

对于sub指令,假设有指令:

subdest,src

当sub指令的源操作数和目的操作数是同一个数据,进行相减操作后,得出的结果为0,是个常数,这时对于污点传播过程来说,需要将源操作数的污点状态漂白,运算结果不再带有污点属性。

对于movsd指令,在指令中会将源操作数和目的操作数隐含起来,在进行污点传播时,需要将其中隐含的操作数,显式地加入到对应的源操作数集合x以及目的操作数集合y,即x={[src]},y={[dest]},f(movsd):[dest]=[src],因此,可以将movsd指令的污点传播规则按照复制规则进行传播,规则为公式:

ft(movsd):[dest]t=[src]t

其中,xt=([src]t),yt=(destt)。

除了sub指令和movsd指令外,还有push、pop、call、ret等需要指定特殊污点传播规则的指令。

4、针对危险函数进行监控。具体描述为:

程序运行中对于函数的调用,涉及到push指令和call指令,其中push指令的作用是把函数参数放入到堆栈当中,call指令包括push指令和jmp指令两种含义,作用是把返回的地址压入栈中,并跳转回到函数的起始地址。因为jmp指令不会对污点信息进行传播,因此对于危险函数的污点传播监控,主要是通过分析push指令的污点传播方式。

基于以上制定的污点传播规则,针对危险函数的污点监控,具体的实现方法为:

(1)对污点源进行识别后,获得当前污点源的操作数执行的指令类型。

(2)依据指定的细粒度污点传播规则,进行污点传播。

(3)判断当前操作数的污染情况。如果当前操作数的污染情况被消除,则直接跳出,并进行下一条指令;如果操作数仍保持被污染状态,则更新危险函数的污染属性。

(4)根据当前危险函数的污染状态,不断更新危险函数的调用状态信息。

5、利用peach模糊测试框架进行工控协议模糊测试操作。

1)工控协议的解析

将模糊测试的对象确定为工控协议后,首先需要做的便是对工控协议的报文结构进行解析。为了使测试目标能够对输入的测试用例进行处理,需要测试用例的结构,符合测试目标所规定的协议要求。所以,模糊测试工作开始之前,要对被测试的工控协议的相关内容进行研究,依据工控协议的报文结构特征,生成能够被测试目标所接受的测试用例,然后开始之后的测试过程。

2)测试用例的生成

利用关键字段定位方法得出的信息,编写peachpits脚本文件,生成具有针对性的测试用例,并将测试用例发送到协议服务器中。

3)异常状态的监控

模糊测试的目标是挖掘出测试目标中隐藏的漏洞,因此,对测试目标进行模糊测试时,要实时检测测试目标的运行状态是否正常,当运行出现异常状态时,要对异常状态进行及时的捕获,以便于后续针对漏洞的分析。

本发明针对正常工控协议,分析协议在服务器中的运行过程,并记录其中所包含的危险函数;结合数据变异方法,对协议中的字段进行逐个变异,得出变异后的协议在服务器中的运行过程以及其中包括的危险函数;最后,将分别得到的正常协议与变异后的协议的运行跟踪数据进行对比,得到关键字段的定位。本发明使测试用例更加具有针对性,进而提高模糊测试的效率,能够更加有效的挖掘出工控协议中未知的漏洞。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1