CN110232012A - 一种基于xml的模糊测试语言协议测试脚本和测试引擎 - Google Patents
一种基于xml的模糊测试语言协议测试脚本和测试引擎 Download PDFInfo
- Publication number
- CN110232012A CN110232012A CN201810182350.2A CN201810182350A CN110232012A CN 110232012 A CN110232012 A CN 110232012A CN 201810182350 A CN201810182350 A CN 201810182350A CN 110232012 A CN110232012 A CN 110232012A
- Authority
- CN
- China
- Prior art keywords
- test
- inject
- script
- testing
- language
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000012360 testing method Methods 0.000 title claims abstract description 234
- 238000012544 monitoring process Methods 0.000 claims abstract description 15
- 230000006870 function Effects 0.000 claims description 17
- 230000007547 defect Effects 0.000 claims description 8
- 238000002347 injection Methods 0.000 claims description 8
- 239000007924 injection Substances 0.000 claims description 8
- 230000004044 response Effects 0.000 claims description 8
- 238000012790 confirmation Methods 0.000 claims description 6
- 238000013461 design Methods 0.000 claims description 6
- 241001269238 Data Species 0.000 claims description 3
- 238000004458 analytical method Methods 0.000 claims description 3
- 230000007246 mechanism Effects 0.000 abstract description 4
- 238000001514 detection method Methods 0.000 abstract description 3
- 238000000034 method Methods 0.000 description 9
- 230000035772 mutation Effects 0.000 description 3
- 230000008569 process Effects 0.000 description 3
- 238000012546 transfer Methods 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 2
- 235000013399 edible fruits Nutrition 0.000 description 2
- XXUZFRDUEGQHOV-UHFFFAOYSA-J strontium ranelate Chemical compound [Sr+2].[Sr+2].[O-]C(=O)CN(CC([O-])=O)C=1SC(C([O-])=O)=C(CC([O-])=O)C=1C#N XXUZFRDUEGQHOV-UHFFFAOYSA-J 0.000 description 2
- 230000007704 transition Effects 0.000 description 2
- 241000208340 Araliaceae Species 0.000 description 1
- 235000005035 Panax pseudoginseng ssp. pseudoginseng Nutrition 0.000 description 1
- 235000003140 Panax quinquefolius Nutrition 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000002950 deficient Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000018109 developmental process Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 235000008434 ginseng Nutrition 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 238000005259 measurement Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000002265 prevention Effects 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000003672 processing method Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 230000011218 segmentation Effects 0.000 description 1
- 230000035939 shock Effects 0.000 description 1
- 239000000243 solution Substances 0.000 description 1
- 238000010998 test method Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开了一种基于xml的模糊测试语言协议测试脚本和测试引擎,所述协议测试脚本包括根据工控和物联网协议报文格式,基于模糊测试语言和状态机自动生成测试脚本和针对被测设备状态,基于模糊测试语言生成监测脚本。本发明提供一种基于xml的模糊测试语言协议测试脚本和测试引擎,基于此语言自动生成测试脚本和监测脚本,并且提供测试引擎能够自动解析脚本语言生成测试数据包并发送给被测设备,完成测试任务,这种高效的模糊测试语言使得检测系统扩展新协议非常方便,而测试引擎架构也保证了发包机制的灵活性和扩展性。
Description
技术领域
本发明涉及测试脚本和测试引擎技术领域,尤其涉及一种基于xml的模糊测试语言协议测试脚本和测试引擎。
背景技术
近年来,国际上发生了几起工业控制系统遭黑客攻击的重大事件,造成了严重后果,震惊全球,而且这种网络攻击事件日益增多,暴露出工业控制系统在安全防护方面的严重不足。国内也开始逐渐关注工业控制系统安全问题。随着工控网络的安全缺陷更多的暴露出来,安全问题已经成为了工控网络面临的重大问题。要提高工控网络的安全性,首先要提高工控网络中的各种设备的安全性。通过攻击测试,发现工控设备的缺陷漏洞,从而采取相应的措施预防或解决这些漏洞带来的网络安全问题,是一种提高工控网络安全性的有效方法。
目前国际上比较流行的Achilles测试平台可以进行多种负面测试,常用的包括:风暴测试、语法及一致性测试、模糊测试、漏洞攻击测试等等。通过多种负面测试方法的综合运用,能够全面的检测工控设备的安全性,防止网络攻击对工控网络造成的损害。
加拿大Wuridtech公司基于多年对工控安全的研究和测试经验,推出了Achilles认证,Achilles认证使用achilles测试平台作为工具,对工控网络设备进行安全性测试。Achilles认证已经得到了全球工控业界的广泛认可,成为了事实标准。一些工业领域的标准化组织也都借鉴了Achilles认证,作为其制定安全规范的依据。
尽管Achilles已经成为一个业界非常成熟的产品,可是它也存在明显的局限性,Achilles支持的工控协议有限,一旦需要增加协议类型,开发周期比较长,而设备厂商往往有新的协议或自定义协议的测试需求,并且需要根据不同的协议定制灵活的发包机制,所以Achilles很难满足这种灵活的测试需求。
发明内容
本发明的目的就在于为了解决上述问题而提供一种基于xml的模糊测试语言协议测试脚本和测试引擎。
本发明通过以下技术方案来实现上述目的:
本发明所述协议测试脚本包括根据工控和物联网协议报文格式,基于模糊测试语言和状态机自动生成测试脚本和针对被测设备状态,基于模糊测试语言生成监测脚本;
所述测试引擎包括
模糊测试引擎可实现对脚本的自动解析;
输入测试脚本和监测脚本自动生成的测试报文和监测报文并发送给被测设备;
测试引擎通过发送监测报文可对目标设备的存活状态、响应延迟等进行监测;
发送测试报文时,在对方出现响应超时和死机时测试引擎能够记录当前测试包最近的若干报文数据,有利于进行错误分析;
测试引擎可以通过区间测试、分段测试等灵活的方式进行漏洞确认,从而发现被测设备的协议设计、实现缺陷或安全漏洞。
本发明优选的,所述基于xml的高效模糊测试语言包括对象和函数定义及条件和循环语句,根据工控和物联网协议提供适用于工控和物联网协议FUZZ测试的结构变异、错误注入和违反内容语义,基于模糊测试语言并根据工控和物联网协议的报文格式和状态机生成测试脚本;模糊测试引擎对脚本自动解析,并自动生成包含结构变异、错误注入和违反内容语义模糊语言功能的测试报文发送给被测设备,同时利用模糊测试语言监测被测设备状态监测脚本,对目标的存活状态和响应延迟进行监测,在对方出现响应超时和死机时记录当前测试包最近的若干报文,并通过再次重放和分段测试的方式进行漏洞确认,确认被测设备的协议设计、实现缺陷或安全漏洞。
本发明优选的,所述基于xml的高效模糊测试语言支持对象和函数的定义,也支持常量和变量的基本数据类型,对象为动作,包括send(发送)、recv(接收)和assign(赋值),还包括数据定义。
本发明优选的,所述对象和函数包括
a、<increase>, <decrease>;
<increase>对属性variable指定的变量执行递增(+1)操作;
<decrease>对属性variable指定的变量执行递增(-1)操作;
b、<assign>,<assign>将元素的取值常量或表达式赋值给属性variable指定的变量;
c、<delay>,<delay>元素指定测试引擎延迟等待一段时间,具体等待的微秒数由属性msecond指定;
d、<flooding>,Flooding指示了一个重要的测试类别:压力测试,也叫洪泛测试;
e、<send>,<send>元素指示Acheron.Fuzzer执行发送报文的操作;
f、<recv>,<recv>元素指示Acheron.Fuzzer执行接收报文的操作。
本发明优选的,所述基于xml的高效模糊测试语言支持条件和循环语句,包括
1)<if> <else-if> <else>;
2)<while>。
本发明优选的,所述结构变异包括
delete,格式为delete(field1)和delete([field1, field2, field3]);
Swap,格式为swap(field1,field2)和swap([field1,field2],[ field1,field2]);
nested_struct,格式为nested_struct (field, struct)和nested_struct([field1, field2], struct)。
本发明优选的,所述错误注入包括
replace,格式为:
replace()
replace([value1,value2,…])replace(value,[n1,n2,…])
replace([faultType1, faultType2, …]);
replace_with_random,格式为:
replace_with_random(m,n)
replace_with_random(l,m,n)
replace_with_random(value1/p1, [value2,value3]/p2, …, n);
replace_with_type,格式为:
replace_with_type(Struct.Frankencert)
replace_with_type([faultType1, faultType2])。
本发明优选的,所述违反内容语义包括
section_inject,格式为:
section_inject(n)
section_inject(n,value1)
section_inject(n,[value1, value2, value3]);
inject_into,格式为:
inject_into( [n1, n2, …], [value1, value2])
inject_into( [n1, n2, …], [faultType1, faultType2]);
inject_after,格式为:
inject_after(value)
inject_after([value1, value2, value3])
inject_after([value1, value2, value3], [value4,value5,…])
inject_after([value1, value2, value3], [faultType1,faultType2,…]);
inject_before,格式为:
inject_before(value)
inject_before([value1, value2, value3])
inject_before([value1, value2, value3], [value4,value5,…])
inject_before([value1, value2, value3], [faultType1,faultType2,…])。
本发明优选的,所述测试脚本包括<script>、<data>和<model>。
本发明的有益效果在于:
本发明提供一种基于xml的模糊测试语言协议测试脚本和测试引擎,基于此语言自动生成测试脚本和监测脚本,并且提供测试引擎能够自动解析脚本语言生成测试数据包并发送给被测设备,完成测试任务,这种高效的模糊测试语言使得检测系统扩展新协议非常方便,而测试引擎架构也保证了发包机制的灵活性和扩展性。
具体实施方式
下面对本发明作进一步说明:
本发明所述协议测试脚本包括根据工控和物联网协议报文格式,基于模糊测试语言和状态机自动生成测试脚本和针对被测设备状态,基于模糊测试语言生成监测脚本;
所述测试引擎包括
模糊测试引擎可实现对脚本的自动解析;
输入测试脚本和监测脚本自动生成的测试报文和监测报文并发送给被测设备;
测试引擎通过发送监测报文可对目标设备的存活状态、响应延迟等进行监测;
发送测试报文时,在对方出现响应超时和死机时测试引擎能够记录当前测试包最近的若干报文数据,有利于进行错误分析;
测试引擎可以通过区间测试、分段测试等灵活的方式进行漏洞确认,从而发现被测设备的协议设计、实现缺陷或安全漏洞。
所述基于xml的高效模糊测试语言包括对象和函数定义及条件和循环语句,根据工控和物联网协议提供适用于工控和物联网协议FUZZ测试的结构变异、错误注入和违反内容语义,基于模糊测试语言并根据工控和物联网协议的报文格式和状态机生成测试脚本;模糊测试引擎对脚本自动解析,并自动生成包含结构变异、错误注入和违反内容语义模糊语言功能的测试报文发送给被测设备,同时利用模糊测试语言监测被测设备状态监测脚本,对目标的存活状态和响应延迟进行监测,在对方出现响应超时和死机时记录当前测试包最近的若干报文,并通过再次重放和分段测试的方式进行漏洞确认,确认被测设备的协议设计、实现缺陷或安全漏洞。
所述基于xml的高效模糊测试语言支持对象和函数的定义,也支持常量和变量的基本数据类型,对象为动作,包括send(发送)、recv(接收)和assign(赋值),还包括数据定义,如:PDU、struct、field等,函数则提供了丰富的逻辑功能,例如crc校验、协议值替换等。
本发明优选的,所述对象和函数包括
a、<increase>, <decrease>;
<increase variable="counter"/>
<decrease variable="counter"/>
<increase>对属性variable指定的变量执行递增(+1)操作;
<decrease>对属性variable指定的变量执行递增(-1)操作;
b、<assign>
<assign variable="$counter" type="Int">15000</assign>
<assign>将元素的取值常量或表达式赋值给属性variable指定的变量,如果variable预先定义了类型,就无需指定type属性。如果是初次使用此变量,则需要指定类型;如不指定type属性,就默认将其当做String类型。String类型的变量支持format属性;
支持的方法:random(n1, n2)
在区间[n1, n2]中(n1和n2都是正整数,且遵循范围规范)随机生成1个正整数,将该正整数的赋值给变量$counter. 如果在脚本中出现如下”refer($counter)”,则将$counter的值转换为HexString填入脚本中;例如:
<assign variable="$msgID" type="Int">random(4096, 32767)</assign>
<send>
<PDU>
<field constraint="refer($msgID)"/>
</PDU>
</send>
c、<delay>,
<delay msecond="1000"/>
<delay>元素指定测试引擎延迟等待一段时间,具体等待的微秒数由属性msecond指定;
d、<flooding>,Flooding指示了一个重要的测试类别:压力测试,也叫洪泛测试;
<flooding type=”TCP” parameter=””>
<send> </send>
</flooding>
parameter=“total”,对DUT进行洪泛(flooding)测试,总共需要发送total次;
parameter=” min, rate, max, duration”,对DUT进行洪泛(flooding)测试,其参数min为起始flooding的速率,单位为脚本/秒(当用于PDU的test属性时为报文/秒),即每秒执行此脚本多少次;rate为从min开始,每秒递增的速率,单位为脚本/秒(或报文/秒);max为最大的flooding速率(也是从min开始,以rate为速率递增,最终达到的速率),单位为脚本/秒(或报文/秒)。如在测试网络环境下,无法达到max速率,就应当达到该网络环境下可能达到的最大速率。duration为达到最大速率(包括网络可能的最大速率)后应当保持的时间,其单位为秒。
在此,如果是TCP测试,为提高flooding速率,需要复用已有的TCP连接进行flooding。但如果已有的TCP连接被断开,则需要重新建立。
如果在发送过程中达不到指定的速率,仍然只发送指定的时间。
对应用层Flooding,type属性可以为空,但对TCP类型的Flooding,type用于区分Flooding的类型:
type=”TCP.Syn”,表示对DUT进行TCP半连接洪泛测试。在每一次测试过程中,Acheron.Fuzzer先发一个Sync报文,当DUT回复Sync ACK时,由IPTables拦截此报文丢弃。
type=”TCP.Connection,表示对DUT进行TCP全连接洪泛测试。在每一次测试过程中,Acheron.Fuzzer先发一个Sync报文,当DUT回复Sync ACK时,由IPTables拦截此报文,提取出Sequence Number后,由Acheron.Fuzzer构造一个Ack报文,回复给DUT,构成一个完整的全连接。
e、<send>,<send>元素指示Acheron.Fuzzer执行发送报文的操作;
<send channel="" mode="reconnect()" >
<PDU> <PDU>
</send>
<send>元素的各属性的定义如下:
channel属性指定发送报文使用的(<test>中预定义的)信道<channel>的名字。如果既没有指定channel属性,也没有定义src、dst等属性,则表示使用默认default的信道;
mode属性指定在发送报文时可以执行的(正常)操作,支持的操作包括:
reconnect(),表示对传输层为TCP的情况,在<send>当前报文前需要重新建立连接(即便原先已经建立了TCP连接);
在<send>元素中,可以用<PDU>(或<encapsulate>)元素表示要发送的报文,并且可以发送多个<PDU>,发送的顺序由<PDU>出现的顺序决定。
f、<recv>,<recv>元素指示Acheron.Fuzzer执行接收报文的操作,
<recv channel="" mode=" ">
<PDU> <PDU>
</send>
<recv>元素的各属性的定义如下:
channel属性指定发送报文使用的(<test>中预定义的)信道<channel>的名字。如果既没有指定channel属性,也没有定义src、dst等属性,则表示使用默认default的信道;
mode属性指定在接收报文时可以执行的操作,支持的操作包括:
regroup(),在这种情况下,<recv>元素中包含有多个PDU,regroup指示将<recv>中的多个PDU进行重组,组合成一个完整的应用层数据后再进行比较。
在<recv>元素中,可以用<PDU>(或<encapsulate>)元素表示要接收的报文。
基于xml的高效模糊测试语言支持的对象、函数非常丰富,在此不赘述。这种方式扩展性非常好,测试引擎在增加测试套件或增加协议时非常灵活和方便,效率也很高,只需增加对象、函数接口,然后在测试引擎中增加对接口的识别、解析和相应的动作就可以完成。
所述基于xml的高效模糊测试语言支持条件和循环语句,包括
1)<if> <else-if> <else>;
分支语句,其定义方式如下:
<if exp="cotp_payload.pdu_type == 0xd0">
<!--Case1-->
<log>The return PDU is not the valide response</log>
<exit/>
</if>
<else-if exp="cotp_payload.pdu_type == 0xe0">
<!--Case2-->
<send-1/>
</else-if>
<else>
<!--Case3-->
<send-2/>
</else>
<if>元素的exp属性为分支语句需要判断的逻辑表达式,如其值为true,执行Case1分支,如其值为false,执行Case2或Case3分支。exp属性中逻辑表达式如果使用了>等XML中需要转义的字符,参照转义字符表。<else-if>元素的exp属性也为逻辑表达式,当<if>的exp表达式为false时,对其进行判断,如果为true就执行<else-if>分支中的语句序列。<else>元素定义了当<if>、<else-if>中逻辑表达式都为false时,应执行的语句序列。
转义字符表
数学符号 | xml中的表示 |
> | > |
>= | >= |
< | < |
<= | <= |
if内包含PDU的处理,如下例所示:
<send-1/> mutant={1,2,3};
<recv-1>
<PDU name="cotp_payload">
<field name="pdu_type">00</field>
……
</PDU>
</recv-1>
<if exp="cotp_payload.pdu_type" == 0xd0">
<!--Case1-->
<log>The return PDU is not the valide response</log>
<exit/>
<else-if exp="cotp_payload.pdu_type" == 0xe0">
<!--Case2-->
<send-2/> mutant={4,5,6,7};
<else-if>
<else>
<!--Case3-->
<send-3/> mutant={4,5};
<else>
</if>
<send-4/> mutant={start_sn, start_sn+1, start_sn+2, start_sn+3};
假定:对于无变异的<send-1/>,设备回复的值是确定不变的。
则测试引擎需要处理下列几种情况:
变异开始前,即可确定<send-2>和<send-3>中哪个会进行变异,也就能确定<send-4>的start_sn,进而计算出总的测试用例数。
对于变异的<send-1/>,cotp_payload.pdu_type的值是不确定的,<if/>的分支也就是不确定的。
Case1:exit
Case2:发送<send-2>的正常报文,之后发送<send-4>的正常报文
Case3:发送<send-3>的正常报文,之后发送<send-4>的正常报文
<send-1>已经完成变异,对于正常的<send-1/>,cotp_payload.pdu_type的值是确定的,<if/>的分支也就是确定的。
Case1:exit
Case2:当<send-1/>变异完成时,<send-2/>开始变异,发送<send-4>的正常报文,<send-4/>的start_sn = 8。
Case3:当<send-1/>变异完成时,<send-3/>开始变异,发送<send-4>的正常报文,<send-4/>的start_sn = 6。
对于以上各种情况计算出的测试用例数,有以下几种处理方法:
Case 1: 当前status文件中< sequence>标签的total属性值与<to_mutant>标签的content值相等,则意味着这是默认的测试情况,此时计算出的测试用例数如果与status文件中< sequence>标签的total属性值不一致,则需要修改< sequence>标签的total属性值和<to_mutant>标签的content值。
Case 2:当前status文件中<sequence>标签的total属性值大于<to_mutant>标签的content值,则意味着这是在执行经过--cmd-enumerate操作之后的测试,此时计算出的测试用例数如果与status文件中< sequence>标签的total属性值不一致,则只需要修改<sequence>标签的total属性值,不必修改<to_mutant>标签的content值。
Case 3:当前status文件中<sequence>标签的total属性值与此时计算出的总的测试用例数相等,则不对status做任何修改。
2)<while>
<while exp="$counter > 0">
</while>
<while>语句用于在测试脚本中定义循环语句,其exp属性为循环的判断条件,如其取值为true,则反复执行<while>元素所包含的语句序列,直至该表达式为false。
exp属性中逻辑表达式如果使用了>等XML中需要转义的字符,应参照转义字符表进行转义。
<while>语句不考虑对其中的报文的变异。也即,测试脚本的执行逻辑独立于报文的变异逻辑。如果其中一个<PDU>中有几个字段指定了变异策略,则表示将此<PDU>拷贝若干次,按照step等策略对其需要变异的字段逐一进行测试。
列举while的使用方法:
case1:while(i>=0)
<send-1/> mutant={1,2};
<recv-1/>
<assign variable=”i”>2</assign>
<while exp=”i >=0”>
<send-2/> mutant={3,4,5};
<recv-2/>
<decrease variable=”i”>
</while>
<send-3/> mutant={6,7,8};
<recv-3/>
该while方法的作用等价于将<send-2/>报文拷贝三次,引擎执行过程如下所示:
本发明优选的,所述结构变异包括
delete,格式为delete(field1)和delete([field1, field2, field3]);
描述:
在测试中删除field名所指示的字段(在此,字段可以是field、length、struct或PDU),可以用delete([field1, field2, field3])表示每个变体删除不同的字段。field命名参照name属性使用规范。
Swap,格式为swap(field1,field2)和swap([field1,field2],[ field1,field2]);
描述:
表示在测试中将field名所指示的字段(在此,字段可以是field、length或struct)重复n次,field参数也可表示为[field1, field2, …],表示(在不同的测试用例中)将指定的各个字段重复n次。
描述:
swap(field1,field2),表示在测试中将字段field1(在此,字段可以是field、length或struct)的位置与另一字段field2(或length、struct)的位置对调,其中field1或field2还可表示为[field1, field2, …],由swap函数组合出替换策略,即用第一个[]中的第一个字段与第二个[]中的第一、二、三个字段交换位置,再用第一个[]中的第二个字段交换,以此类推。
nested_struct,格式为nested_struct (field, struct)和nested_struct([field1, field2], struct)。
描述:
nested_struct(field,struct),表示在测试过程中在字段(在此,字段可以是field、length或struct)field位置处插入一个结构化的字段struct。而field也可表示为[f1,f2, …],表示将第二个参数struct插入到第一个字段f1处,在下一个mutant中,将struct插入到第二个字段f2前,以此类推。
本发明优选的,所述错误注入包括
replace,格式为:
replace()
replace([value1,value2,…])replace(value,[n1,n2,…])
replace([faultType1, faultType2, …]);
约束,用于<field>、<length>
描述:
replace():表示用fault属性中指示的缺陷数据替换当前字段的内容。
replace([value1, val ue2, …]):表示(直接)逐次用value替换原先的内容。如果只有一个常量,也可写成replace(value1)。其中,value可以为常量(见“常量使用规范”),也可以是$开头的变量。
replace(value, [n1,n2,…]):将value(形如”2a ab”)重复n1次,填充到当前字段作为一个mutant;然后将value重复n2次,填充为第二个mutant,如此类推。
replace([faultType1, faultType2, …]),表示将Fault数据库中的类型1、类型2…下的所有fault逐一替换当前字段。
replace_with_random,格式为:
replace_with_random(m,n)
replace_with_random(l,m,n)
replace_with_random(value1/p1, [value2,value3]/p2, …, n);
约束,用于<field>、<length>
描述:
重复n次。
replace_with_random(l,m,n):生成m-l+1个字节的随机数。并将这m-l+1个随机数写入本字段从l个字节到m个字节中,此变异操作重复n次。
replace_with_random(value1/p1, [value2-value3]/p2, …, n):按均匀分布概率生成一个[0.1]之间的概率,如果生成的随机数在[0,p1]之间就用value1替换原字段值;如果生成的随机数在(p1, p1+p2]之间,用另一个均匀分布计算该由value2~value3之间的那个值替换原字段值;如果还有更多的概率参数,如此类推,直到此变异操作共计重复n次。
replace_with_type,格式为:
replace_with_type(Struct.Frankencert)
replace_with_type([faultType1, faultType2])
约束,用于<field>、<length>
描述:
replace_with_type()只有一个参数,为fault类型或fault类型的列表。
在变异时,分两种情况处理:
如指定的fault类型下的元素为fault时,如同replace(),直接将其替换当前字段的内容;
如指定的fault类型下的元素为子fault类型时,则
(递归)查找该子类型下的所有fault(如有n个),并按其FaultID排序;
将当前字段复制n-1次;
依次将查找出的fault替换当前(及其复制出的)字段的原始内容。
所述违反内容语义包括
section_inject,格式为:
section_inject(n)
section_inject(n,value1)
section_inject(n,[value1, value2, value3]);
约束,用于<field>、<length>
描述:
表示将该字段分为n段,在每个分段的开头和结尾处插入fault。
section_inject (n,value1):表示fault取value。
section_inject (n,[value1, value2, value3]):表示fault依次取value1,value2,…。
section_inject(n,[faultType1,faultType2,…]): fault取值依次为faultType1 , faultType2, …的每一个fault。
inject_into,格式为:
inject_into( [n1, n2, …], [value1, value2])
inject_into( [n1, n2, …], [faultType1, faultType2]);
约束,用于<field>、<length>
描述:
找到该字段的第n1、n2(字节)位置,在每个测试用例中依次将value1,value2,…或faultType1, faultType2插入到该位置。
inject_after,格式为:
inject_after(value)
inject_after([value1, value2, value3])
inject_after([value1, value2, value3], [value4,value5,…])
inject_after([value1, value2, value3], [faultType1,faultType2,…]);
约束,用于<field>、<length
描述:
表示找到该字段中value出现的位置,在每个测试用例中依次将fault插入到value之后。
inject_after ([value1, value2, value3], [value4,value5,…]): fault取值依次为value4,value5,…。
inject_after([value1, value2, value3], [faultType1,faultType2,…]):fault取值依次为faultType1,faultType2,…的每一个fault。
第一个参数value也可以是正则表达式,regex(“\w”)),找到该字段与regex所提供的正则表达式相匹配的位置。先将字段内容转换为Ascii字符串,再使用正则表达式进行匹配。
inject_before,格式为:
inject_before(value)
inject_before([value1, value2, value3])
inject_before([value1, value2, value3], [value4,value5,…])
inject_before([value1, value2, value3], [faultType1,faultType2,…])。
约束,用于<field>、<length>
描述:
表示找到该字段中value出现的位置,在每个测试用例中依次将fault插入到value之前。
inject_before([value1, value2, value3], [value4,value5,…]): fault取值依次为value4,value5,…。
inject_before([value1, value2, value3], [faultType1,faultType2,…]):fault取值依次为faultType1,faultType2,…的每一个fault。
value也可以使用正则表达式,参照inject_after。
本发明优选的,所述测试脚本包括
<script>
Script文件结构如下:
<xml version="1.0" encoding="UTF-8">
<script name="" version="">
<data> </data>
<model> </model>
<test> </test>
</script>
script元素元素中各属性的含义如下:
name属性保存为此脚本的名称,如“S7-Communication.GetBlockInfo.FaultInjection”;
version属性为此脚本的版本号。
<data>
<data>元素用于定义模糊测试脚本中所要使用的数据及数据结构,如PDU模板等。
<data>
<template name="TPKT-COTP_Request">
<PDU name="TPKT_Data_Request_1" protocol="TPKT">
<struct name="tpkt_payload" type="Struct">
<field name="version" type="Unsigned8">03</field>
<field name="reserved" type="Unsigned8">00</field>
<length …>00 19</length>
<PDU name="COTP_Request" protocol="COTP">
<length …>02</length>
<struct name="cotp_payload" type="Struct">
<field name="pdu_type" type="Unsighed8">f0</field>
<field name="tpdu_number" type="Unsighed8">80</field>
</struct>
<payload></payload>
</PDU>
</struct>
</PDU>
</ template>
</data>
在<data>元素中可以定义不同的数据结构供其后的模型或测试序列脚本所引用:
<template>元素的各属性的定义如下:
name属性为此类(数据结构)的名字;
在<template>元素下,可以定义具体的<PDU>等数据结构。此<PDU>数据有两种类型:
<PDU>定义可一个完整的报文模板,在<test>中用于实例化(<instantiate>)成具体的某种类型的报文。
<PDU>定义是一个外层报文的“壳”,其中必包含<payload>元素,可用于封装(<encapsulate>)成完整的报文;<payload>元素定义了,在将此类PDU进行封装时,上层应用数据应该被封装到的位置。
<model>
<model>元素用于定义协议状态机模型,其下包括一个或多个<state_machine>元素。
<state_machine>
<state_machine>元素定义了一个协议状态机,其属性的定义如下:
name属性为状态机模型(在<model>中)的唯一名称;
initial属性指定此状态机的初始状态。
在<state_machine>元素下,可以采用下属子元素定义状态机。
<state>元素用于定义一个状态,此元素只有一个属性name,用于定义状态的名称。在<state>元素中,可以定义下列子元素:
1)<on_entry>元素定义进入当前状态时所需进行的检查和操作,其子元素包括:
<assert>元素为用户定义的断言,它只有一个属性exp,exp为此assert语句需要判断的表达式,如该表达式为假,则终端状态机的运行;
<assign>、<instantiate>等元素,其具体定义就不赘述了。
2)<transition>元素定义了当前状态的所有转移动作。此元素的属性包括:
event属性定义转移的事件触发器,描述引起状态转换的事件,只有当该事件发生时才会引起转移。
cond属性为一个布尔表达式,表示本次转移的守护条件(guard condition);如果存在,那么只有当它为true时,才会引起转移。
target属性描述状态转换时目标状态的名称。
在<transition>元素中,可以定义下列子元素:
<assign>、<instantiate>、<send>、<recv>等元素。
综上所述,本发明提供一种基于xml的模糊测试语言协议测试脚本和测试引擎,基于此语言自动生成测试脚本和监测脚本,并且提供测试引擎能够自动解析脚本语言生成测试数据包并发送给被测设备,完成测试任务,这种高效的模糊测试语言使得检测系统扩展新协议非常方便,而测试引擎架构也保证了发包机制的灵活性和扩展性。
本领域技术人员不脱离本发明的实质和精神,可以有多种变形方案实现本 发明,以上所述仅为本发明较佳可行的实施例而已,并非因此局限本发明的权 利范围,凡运用本发明说明书内容所作的等效结构变化,均包含于本发明的权 利范围之内。
Claims (9)
1.一种基于xml的模糊测试语言协议测试脚本和测试引擎,其特征在于,
所述协议测试脚本包括根据工控和物联网协议报文格式,基于模糊测试语言和状态机自动生成测试脚本和针对被测设备状态,基于模糊测试语言生成监测脚本;
所述测试引擎包括
模糊测试引擎可实现对脚本的自动解析;
输入测试脚本和监测脚本自动生成的测试报文和监测报文并发送给被测设备;
测试引擎通过发送监测报文可对目标设备的存活状态、响应延迟等进行监测;
发送测试报文时,在对方出现响应超时和死机时测试引擎能够记录当前测试包最近的若干报文数据,有利于进行错误分析;
测试引擎可以通过区间测试、分段测试等灵活的方式进行漏洞确认,从而发现被测设备的协议设计、实现缺陷或安全漏洞。
2.根据权利要求1所述的基于xml的模糊测试语言协议测试脚本和测试引擎,其特征在于:所述基于xml的高效模糊测试语言包括对象和函数定义及条件和循环语句,根据工控和物联网协议提供适用于工控和物联网协议FUZZ测试的结构变异、错误注入和违反内容语义,基于模糊测试语言并根据工控和物联网协议的报文格式和状态机生成测试脚本;模糊测试引擎对脚本自动解析,并自动生成包含结构变异、错误注入和违反内容语义模糊语言功能的测试报文发送给被测设备,同时利用模糊测试语言监测被测设备状态监测脚本,对目标的存活状态和响应延迟进行监测,在对方出现响应超时和死机时记录当前测试包最近的若干报文,并通过再次重放和分段测试的方式进行漏洞确认,确认被测设备的协议设计、实现缺陷或安全漏洞。
3.根据权利要求2所述的基于xml的模糊测试语言协议测试脚本和测试引擎,其特征在于:所述基于xml的高效模糊测试语言支持对象和函数的定义,也支持常量和变量的基本数据类型,对象为动作,包括send(发送)、recv(接收)和assign(赋值),还包括数据定义。
4.根据权利要求3所述的基于xml的模糊测试语言协议测试脚本和测试引擎,其特征在于:所述对象和函数包括
a、<increase>, <decrease>;
<increase>对属性variable指定的变量执行递增(+1)操作;
<decrease>对属性variable指定的变量执行递增(-1)操作;
b、<assign>,<assign>将元素的取值常量或表达式赋值给属性variable指定的变量;
c、<delay>,<delay>元素指定测试引擎延迟等待一段时间,具体等待的微秒数由属性msecond指定;
d、<flooding>,Flooding指示了一个重要的测试类别:压力测试,也叫洪泛测试;
e、<send>,<send>元素指示Acheron.Fuzzer执行发送报文的操作;
f、<recv>,<recv>元素指示Acheron.Fuzzer执行接收报文的操作。
5.根据权利要求3所述的基于xml的模糊测试语言协议测试脚本和测试引擎,其特征在于:所述基于xml的高效模糊测试语言支持条件和循环语句,包括
1)<if> <else-if> <else>;
2)<while>。
6.根据权利要求2所述的基于xml的模糊测试语言协议测试脚本和测试引擎,其特征在于:所述结构变异包括
delete,格式为delete(field1)和delete([field1, field2, field3]);
Swap,格式为swap(field1,field2)和swap([field1,field2],[ field1,field2]);
nested_struct,格式为nested_struct (field, struct)和nested_struct([field1, field2], struct)。
7.根据权利要求2所述的基于xml的模糊测试语言协议测试脚本和测试引擎,其特征在于:所述错误注入包括
replace,格式为:
replace()
replace([value1,value2,…])replace(value,[n1,n2,…])
replace([faultType1, faultType2, …]);
replace_with_random,格式为:
replace_with_random(m,n)
replace_with_random(l,m,n)
replace_with_random(value1/p1, [value2,value3]/p2, …, n);
replace_with_type,格式为:
replace_with_type(Struct.Frankencert)
replace_with_type([faultType1, faultType2])。
8.根据权利要求2所述的基于xml的模糊测试语言协议测试脚本和测试引擎,其特征在于:所述违反内容语义包括
section_inject,格式为:
section_inject(n)
section_inject(n,value1)
section_inject(n,[value1, value2, value3]);
inject_into,格式为:
inject_into( [n1, n2, …], [value1, value2])
inject_into( [n1, n2, …], [faultType1, faultType2]);
inject_after,格式为:
inject_after(value)
inject_after([value1, value2, value3])
inject_after([value1, value2, value3], [value4,value5,…])
inject_after([value1, value2, value3], [faultType1,faultType2,…]);
inject_before,格式为:
inject_before(value)
inject_before([value1, value2, value3])
inject_before([value1, value2, value3], [value4,value5,…])
inject_before([value1, value2, value3], [faultType1,faultType2,…])。
9.根据权利要求2所述的基于xml的模糊测试语言协议测试脚本和测试引擎,其特征在于:所述测试脚本包括<script>、<data>和<model>。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810182350.2A CN110232012A (zh) | 2018-03-06 | 2018-03-06 | 一种基于xml的模糊测试语言协议测试脚本和测试引擎 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810182350.2A CN110232012A (zh) | 2018-03-06 | 2018-03-06 | 一种基于xml的模糊测试语言协议测试脚本和测试引擎 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110232012A true CN110232012A (zh) | 2019-09-13 |
Family
ID=67862182
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810182350.2A Pending CN110232012A (zh) | 2018-03-06 | 2018-03-06 | 一种基于xml的模糊测试语言协议测试脚本和测试引擎 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110232012A (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110912944A (zh) * | 2019-12-31 | 2020-03-24 | 信联科技(南京)有限公司 | 一种can设备安全测试系统及测试方法 |
CN110912776A (zh) * | 2019-11-27 | 2020-03-24 | 中国科学院信息工程研究所 | 一种实体路由器管理协议的自动化模糊测试方法及装置 |
CN111901200A (zh) * | 2020-07-29 | 2020-11-06 | 许继集团有限公司 | 电力控制保护工控协议安全测试方法及系统 |
CN112052156A (zh) * | 2020-07-15 | 2020-12-08 | 杭州木链物联网科技有限公司 | 一种模糊测试方法、装置和系统 |
CN112104634A (zh) * | 2020-09-08 | 2020-12-18 | 中国电力科学研究院有限公司 | 数据报文处理方法、系统、设备及可读存储介质 |
CN114756474A (zh) * | 2022-04-27 | 2022-07-15 | 苏州睿芯集成电路科技有限公司 | 一种cpu验证中随机向量的生成方法、装置以及电子设备 |
CN115174441A (zh) * | 2022-09-06 | 2022-10-11 | 中国汽车技术研究中心有限公司 | 基于状态机的tcp模糊测试方法、设备和存储介质 |
CN117171052A (zh) * | 2023-10-30 | 2023-12-05 | 浙江禾川科技股份有限公司 | 一种基于xml语言的脚本测试方法、装置、设备及介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102087631A (zh) * | 2011-03-09 | 2011-06-08 | 中国人民解放军国发科学技术大学 | 一种面向状态协议实现软件的模糊测试方法 |
CN103036730A (zh) * | 2011-09-29 | 2013-04-10 | 西门子公司 | 一种对协议实现进行安全测试的方法及装置 |
US20130340083A1 (en) * | 2012-06-19 | 2013-12-19 | Lucian Petrica | Methods, systems, and computer readable media for automatically generating a fuzzer that implements functional and fuzz testing and testing a network device using the fuzzer |
CN104168288A (zh) * | 2014-08-27 | 2014-11-26 | 中国科学院软件研究所 | 一种基于协议逆向解析的自动化漏洞挖掘系统及方法 |
CN105763392A (zh) * | 2016-02-19 | 2016-07-13 | 中国人民解放军理工大学 | 一种基于协议状态的工控协议模糊测试方法 |
CN107046526A (zh) * | 2016-12-28 | 2017-08-15 | 北京邮电大学 | 基于Fuzzing算法的分布式异构网络漏洞挖掘方法 |
-
2018
- 2018-03-06 CN CN201810182350.2A patent/CN110232012A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102087631A (zh) * | 2011-03-09 | 2011-06-08 | 中国人民解放军国发科学技术大学 | 一种面向状态协议实现软件的模糊测试方法 |
CN103036730A (zh) * | 2011-09-29 | 2013-04-10 | 西门子公司 | 一种对协议实现进行安全测试的方法及装置 |
US20130340083A1 (en) * | 2012-06-19 | 2013-12-19 | Lucian Petrica | Methods, systems, and computer readable media for automatically generating a fuzzer that implements functional and fuzz testing and testing a network device using the fuzzer |
CN104168288A (zh) * | 2014-08-27 | 2014-11-26 | 中国科学院软件研究所 | 一种基于协议逆向解析的自动化漏洞挖掘系统及方法 |
CN105763392A (zh) * | 2016-02-19 | 2016-07-13 | 中国人民解放军理工大学 | 一种基于协议状态的工控协议模糊测试方法 |
CN107046526A (zh) * | 2016-12-28 | 2017-08-15 | 北京邮电大学 | 基于Fuzzing算法的分布式异构网络漏洞挖掘方法 |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110912776B (zh) * | 2019-11-27 | 2021-09-28 | 中国科学院信息工程研究所 | 一种实体路由器管理协议的自动化模糊测试方法及装置 |
CN110912776A (zh) * | 2019-11-27 | 2020-03-24 | 中国科学院信息工程研究所 | 一种实体路由器管理协议的自动化模糊测试方法及装置 |
CN110912944B (zh) * | 2019-12-31 | 2021-11-23 | 信联科技(南京)有限公司 | 一种can设备安全测试系统及测试方法 |
CN110912944A (zh) * | 2019-12-31 | 2020-03-24 | 信联科技(南京)有限公司 | 一种can设备安全测试系统及测试方法 |
CN112052156A (zh) * | 2020-07-15 | 2020-12-08 | 杭州木链物联网科技有限公司 | 一种模糊测试方法、装置和系统 |
CN112052156B (zh) * | 2020-07-15 | 2022-07-29 | 浙江木链物联网科技有限公司 | 一种模糊测试方法、装置和系统 |
CN111901200A (zh) * | 2020-07-29 | 2020-11-06 | 许继集团有限公司 | 电力控制保护工控协议安全测试方法及系统 |
CN111901200B (zh) * | 2020-07-29 | 2022-05-27 | 许继集团有限公司 | 电力控制保护工控协议安全测试方法及系统 |
CN112104634A (zh) * | 2020-09-08 | 2020-12-18 | 中国电力科学研究院有限公司 | 数据报文处理方法、系统、设备及可读存储介质 |
CN114756474A (zh) * | 2022-04-27 | 2022-07-15 | 苏州睿芯集成电路科技有限公司 | 一种cpu验证中随机向量的生成方法、装置以及电子设备 |
CN115174441A (zh) * | 2022-09-06 | 2022-10-11 | 中国汽车技术研究中心有限公司 | 基于状态机的tcp模糊测试方法、设备和存储介质 |
CN115174441B (zh) * | 2022-09-06 | 2022-12-13 | 中国汽车技术研究中心有限公司 | 基于状态机的tcp模糊测试方法、设备和存储介质 |
CN117171052A (zh) * | 2023-10-30 | 2023-12-05 | 浙江禾川科技股份有限公司 | 一种基于xml语言的脚本测试方法、装置、设备及介质 |
CN117171052B (zh) * | 2023-10-30 | 2024-02-09 | 浙江禾川科技股份有限公司 | 一种基于xml语言的脚本测试方法、装置、设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110232012A (zh) | 一种基于xml的模糊测试语言协议测试脚本和测试引擎 | |
US20090204848A1 (en) | Automatic grammar based fault detection and isolation | |
Khalid et al. | Examining the relationship between findbugs warnings and app ratings | |
CN112181804B (zh) | 一种参数校验方法、设备以及存储介质 | |
CN103209173B (zh) | 一种网络协议漏洞挖掘方法 | |
CN113572726B (zh) | 一种多模态网络控制-数据平面一致性校验方法及装置 | |
US20150319072A1 (en) | Methods, systems, and computer readable media for providing fuzz testing functionality | |
CN109977681A (zh) | 一种面向无人机的模糊测试方法及无人机的模糊测试系统 | |
İnçki et al. | A novel runtime verification solution for IoT systems | |
CN107888446A (zh) | 一种协议健壮性测试方法及装置 | |
US20140068336A1 (en) | Testing development using real-time traffic | |
CN108337266A (zh) | 一种高效的协议客户端漏洞发掘方法与系统 | |
Inçki et al. | Runtime verification of IoT systems using complex event processing | |
US20230267326A1 (en) | Machine Learning Model Management Method and Apparatus, and System | |
WO2021179578A1 (zh) | 业务逻辑调试方法、装置、设备及计算机可读存储介质 | |
CN107172075A (zh) | 基于网络隔离的通信方法、系统及可读存储介质 | |
CN115941363A (zh) | 一种基于http协议的网络通信安全分析方法 | |
Luo et al. | Bleem: Packet sequence oriented fuzzing for protocol implementations | |
CN111935767B (zh) | 一种网络仿真系统 | |
US9329960B2 (en) | Methods, systems, and computer readable media for utilizing abstracted user-defined data to conduct network protocol testing | |
CN111628911B (zh) | Cdn网络回源异常的测试方法、装置和终端设备 | |
CN110532162A (zh) | 一种基于协议状态机的模糊测试脚本及测试引擎 | |
CN107124326A (zh) | 一种自动化测试方法及系统 | |
CN103856373B (zh) | 基于HTTP协议变异的Web系统健壮性测试方法 | |
Chen et al. | Sherlock on Specs: Building {LTE} Conformance Tests through Automated Reasoning |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20190913 |