发明名称 基于报文变异的协议鲁棒性测试生成方法
摘要 基于报文变异的协议鲁棒性测试生成方法属于网络协议测试技术领域,其特征在于所述方法依次含有以下步骤:把协议规范描述为一个不确定性参数化扩展有限状态机,建立鲁棒性要求并构造正常验证序列,利用多种变异策略生成单域异常报文,如果单域异常报文注入后导致确定性变迁,则生成单域变异复合异常测试例-1,如果单域异常报文注入后导致非确定性变迁,则生成单域变异复合异常测试例-2,然后使用“pairwise(两两组合)”方法对多域异常进行两两组合,如果多域异常报文注入后导致确定性变迁,则生成多域复合异常测试例-1,如果多域异常报文注入后导致非确定性变迁,则生成多域变异复合异常测试例-2。本发明适用于各种不同的网络协议,具有很好的通用性。
申请公布号 CN101388807B 申请公布日期 2011.03.30
申请号 CN200810112273.X 申请日期 2008.05.22
申请人 清华大学 发明人 尹霞;景传明;王之梁;施新刚
分类号 H04L12/26(2006.01)I;H04L12/56(2006.01)I 主分类号 H04L12/26(2006.01)I
代理机构 北京众合诚成知识产权代理有限公司 11246 代理人 朱琨
主权项 1.基于报文变异的协议鲁棒性测试生成方法,其特征在于,所述方法是在网络操作环境中对于一个被测试的网络设备依次按以下步骤实现的:步骤(1):用一个不确定性参数化扩展有限状态机NPEFSM描述一个被测协议实现:所述NPEFSM表示为&lt;S, s<sub>0</sub>,I,O,<img file="FSB00000258274600011.GIF" wi="53" he="51" />T&gt;,其中:●S:有限状态集合,S=S<sub>spec</sub>,S<sub>spec</sub>包含协议规范中定义的状态,定义S<sub></sub>={s<sub>k</sub>|k=1,2,...},任意一个s<sub>k</sub>都是不确定状态,表示在异常报文注入下不确定变迁的末状态,根据协议规范中关于该变迁不确定或模糊的规定推断出s<sub>k</sub>处在S的哪个子集中,所以,S=S<sub>spec</sub>=(S<sub>spec</sub>∪S<sub></sub>);●s<sub>0</sub>:初始状态;●<img file="FSB00000258274600012.GIF" wi="742" he="101" />包含p个输入;每个输入<img file="FSB00000258274600013.GIF" wi="110" he="69" />携带一个参数向量值<img file="FSB00000258274600014.GIF" wi="67" he="65" />1≤k≤p;所述p个输入中既包含协议规范中定义的输入,记为I<sub>spec</sub>,由有效的报文和部分无效报文组成,也包含了协议规范中没有明确定义的大量输入,记为I<sub>unspec</sub>,全部是无效报文;●<img file="FSB00000258274600015.GIF" wi="848" he="74" />包含q个输出;每个输出<img file="FSB00000258274600016.GIF" wi="133" he="65" />携带一个参数向量值<img file="FSB00000258274600017.GIF" wi="75" he="66" />1≤k≤q;●<img file="FSB00000258274600018.GIF" wi="35" he="43" />是为描述变迁定义的变量,用向量表示,这些变量和输入、输出携带的参数不同;●T:变迁集合,T=T<sub>spec</sub>∪T<sub>nondeter</sub>,其中:T<sub>spec</sub>表示在协议规范中给出明确规定的变迁,T<sub>nondeter</sub>包含下面两种变迁并都导致末状态s<sup>*</sup>∈S<sub></sub>,一种是:对于任意状态s<sub>i</sub>,收到输入i<sub>j</sub>∈I<sub>unspec</sub>,对应的变迁在协议规范里都没有明确规定;另外存在一种变迁,尽管i<sub>j</sub>∈I<sub>spec</sub>,对应的变迁在协议规范里没有定义,或者仅给出模糊或不确定的说明,详细定义如下:对于t∈T<sub>spec</sub>,<img file="FSB00000258274600019.GIF" wi="991" he="92" />其中s<sub>j</sub>∈S<sub>spec</sub>,s<sub>k</sub>∈S<sub>spec</sub>;<img file="FSB000002582746000110.GIF" wi="222" he="69" /><img file="FSB000002582746000111.GIF" wi="197" he="69" />或者<img file="FSB000002582746000112.GIF" wi="113" he="69" />为空,其中s和s<sup>*</sup>分别是该变迁的初始状态和末状态;<img file="FSB000002582746000113.GIF" wi="231" he="62" />是携带参数的输入和输出;<img file="FSB000002582746000114.GIF" wi="199" he="62" />是基于变量集合和输入的断言;动作<img file="FSB000002582746000115.GIF" wi="315" he="64" />是基于当前变量值、输入的操作,并作用于变量值和输出;对于t∈T<sub>nondeter</sub>,<img file="FSB00000258274600021.GIF" wi="525" he="90" />其中s<sub>j</sub>∈S<sub>spec</sub>,s<sub>k</sub>∈S<sub></sub>;<img file="FSB00000258274600022.GIF" wi="162" he="70" />输出和动作未知或者不确定,用“-”表示;断言始终为真true;步骤(2):依次按以下步骤进行建立鲁棒性要求以及建立正常验证序列,所述鲁棒性要求是指在无效报文注入后,状态及行为仍然保持正常并符合协议规范的一致性要求:步骤(2.1)建立正常验证序列_1:假设<img file="FSB00000258274600023.GIF" wi="90" he="71" />是一个无效报文并且<img file="FSB00000258274600024.GIF" wi="260" he="71" />如果<img file="FSB00000258274600025.GIF" wi="1126" he="97" />s<sub>j</sub> ∈S<sub>spec</sub>;<img file="FSB00000258274600026.GIF" wi="195" he="71" />或者<img file="FSB00000258274600027.GIF" wi="113" he="71" />为空,根据s<sub>j</sub>的状态验证序列构造正常验证序列,步骤(2.2)建立正常验证序列_2:假设<img file="FSB00000258274600028.GIF" wi="91" he="71" />是一个无效报文并且<img file="FSB00000258274600029.GIF" wi="184" he="71" />如果<img file="FSB000002582746000210.GIF" wi="489" he="91" />s<sub>i</sub>∈S<sub>spec</sub>,s<sub>k</sub>∈S<sub></sub>且<img file="FSB000002582746000211.GIF" wi="323" he="60" />根据s<sub>k</sub>的状态识别序列构造正常验证序列,步骤(2.3)建立正常验证序列_2-1近似替代正常验证序列_2:由于状态识别序列的构造复杂,故需要建立正常验证序列_2-1代替正常验证序列_2,首先定义强制变迁:假设<img file="FSB000002582746000212.GIF" wi="186" he="63" />并且s<sub>j</sub>∈S<sub>spec</sub>,<img file="FSB000002582746000213.GIF" wi="377" he="66" />是强制变迁,当且仅当,存在<img file="FSB000002582746000214.GIF" wi="193" he="70" />使得<img file="FSB000002582746000215.GIF" wi="187" he="45" /><img file="FSB000002582746000216.GIF" wi="460" he="96" />利用强制变迁可以建立正常验证序列_2-1:无效报文注入后,末状态为s<sub>k</sub>∈S<sub></sub>并且<img file="FSB000002582746000217.GIF" wi="581" he="53" />如果存在强制变迁:(s<sub>k</sub>∈S<sub>k</sub>)→s<sub>j</sub>,通过报文注入触发这种变迁并根据s<sub>j</sub>的状态验证序列构造正常验证序列;步骤(3):首先仅针对输入的报文一个域进行变异,其它域值都是合法的,对应的测试例为单域变异复合异常测试例,如果异常注入后的变迁是确定变迁T<sub>spec</sub>,称为单域变异复合 异常测试例-1,其生成步骤如下:步骤(3.1)初始化:定义一个关于有效报文pdu的测试组TestGroup<sub>pdu</sub>并初始为空,步骤(3.2)输入一个有效的报文pdu={f<sub>1</sub>,f<sub>2</sub>,....,f<sub><i>l</i></sub> ,....,f<sub>N</sub>},共包含N个域,其中pdu.f<sub><i>l</i></sub>对应的异常域值为M个,用<img file="FSB00000258274600031.GIF" wi="365" he="62" />表示,假设 f <sub>l</sub>的取值范围为:f<sub>i</sub>∈[最小值,最大值],则这些异常域值包括{最小值,最小值+1,最小值+2*(最大值-最小值)/n,最小值+3*(最大值-最小值)/n,...,最大值-1,最大值},其中n是划分参数,由设定者制定;另外还要定义其它异常报文:报文的每个域依次移除后生成的多个异常报文,并且每个异常报文仅有一个域被移除,其它域保持不变;每个域被双倍字节的域代替生成的多个异常报文,并且每个异常报文仅有一个域被代替,其它域保持不变;步骤(3.3)定义一个关于pdu.f<sub><i>l</i></sub>的测试例<img file="FSB00000258274600032.GIF" wi="208" he="61" />并初始为空,保存域pdu. f <sub>l</sub>的有效域值;步骤(3.4)将“从s<sub>0</sub>到s<sub>i</sub>的状态引导序列”添加到<img file="FSB00000258274600033.GIF" wi="209" he="61" />中;步骤(3.5)对于每一个<img file="FSB00000258274600034.GIF" wi="180" he="59" />执行如下步骤:把e<sub>k</sub>赋值给pdu.f<sub><i>l</i></sub>,把“无效报文注入”作为一个测试序列添加到<img file="FSB00000258274600035.GIF" wi="207" he="61" />中,然后把“从s<sub>j</sub>到s<sub>i</sub>的状态引导序列”也添加到<img file="FSB00000258274600036.GIF" wi="209" he="61" />中;步骤(3.6)将状态s<sub>i</sub>验证序列添加到<img file="FSB00000258274600037.GIF" wi="208" he="60" />中;步骤(3.7)把<img file="FSB00000258274600038.GIF" wi="210" he="60" />添加到TestGroup<sub>pdu</sub>中;步骤(3.8)把步骤(3.3)保存的有效域值重新赋值给被变异域pdu. f<sub><i>l</i></sub>;步骤(3.9)对于每个域 f<sub><i>l</i></sub>∈pdu,都分别执行从步骤(3.3)到步骤(3.8)的所有步骤;步骤(4):对于单域变异复合异常测试例,如果异常注入后的变迁是不确定变迁T<sub>nondeter</sub>,称为单域变异复合异常测试例-2,其生成步骤如下:步骤(4.1)初始化:定义一个关于有效报文pdu的测试组TestGroup<sub>pdu</sub>并初始为空,步骤(4.2)输入一个有效的报文pdu={f<sub>1</sub>,f<sub>2</sub>...., f<sub><i>l</i></sub>....,f<sub>N</sub>},共包含N个域,其中pdu.f<sub><i>l</i></sub>对应的异常域值为M个,用<img file="FSB00000258274600039.GIF" wi="366" he="60" />表示,假设f<sub>l</sub>的取值范围为:f<sub>i</sub>∈[最小值,最大值],则这些异常域值包括{最小值,最小值+1,最小值+2*(最大值-最小值)/n,最小值+3*(最大值-最小值)/n,...,最大值-1,最大值},其中n是划分参数,由设定者制 定;另外还要定义其它异常报文:报文的每个域依次移除后生成的多个异常报文,并且每个异常报文仅有一个域被移除,其它域保持不变;每个域被双倍字节的域代替生成的多个异常报文,并且每个异常报文仅有一个域被代替,其它域保持不变;步骤(4.3)定义一个关于pdu.f <sub>l</sub>的测试例<img file="FSB00000258274600041.GIF" wi="207" he="60" />并初始为空,保存域pdu. f<sub><i>l</i></sub>的有效域值;步骤(4.4)将“从s<sub>0</sub>到s<sub>i</sub>的状态引导序列”添加到<img file="FSB00000258274600042.GIF" wi="209" he="60" />中;步骤(4.5)对于每一个<img file="FSB00000258274600043.GIF" wi="180" he="58" />执行如下步骤:把e<sub>k</sub>赋值给pdu.f<sub><i>l</i></sub>,把“无效报文注入”作为一个测试序列添加到<img file="FSB00000258274600044.GIF" wi="207" he="60" />中,把“利用强制变迁s<sub>k</sub>→s<sub>j</sub>建立的从s<sub>k</sub>到s<sub>j</sub>的状态引导序列”添加到<img file="FSB00000258274600045.GIF" wi="208" he="60" />中,然后把“从s<sub>j</sub>到s<sub>i</sub>的状态引导序列”也添加到<img file="FSB00000258274600046.GIF" wi="209" he="61" />中;步骤(4.6)将“状态s<sub>i</sub>验证序列”添加到<img file="FSB00000258274600047.GIF" wi="208" he="60" />中;步骤(4.7)把<img file="FSB00000258274600048.GIF" wi="210" he="60" />添加到TestGroup<sub>pdu</sub>中;步骤(4.8)把步骤(4.3)保存的有效域值重新赋值给被变异域pdu.f <sub>l</sub>;步骤(4.9)对于每个域f <sub>l</sub>∈pdu,都分别执行从步骤(4.3)到步骤(4.8)的所有步骤;步骤(5):将输入的异常报文的多个域同时变异,对应的测试例为多域变异复合异常测试例,如果异常注入后的变迁是确定变迁T<sub>spec</sub>,称为多域变异复合异常测试例-1,其生成步骤如下:步骤(5.1)初始化:定义一个关于有效报文pdu的测试组TestGroup<sub>pdu</sub>并初始为空;步骤(5.2)输入一个有效的报文pdu={f<sub>1</sub>,f<sub>2</sub>...., f<sub><i>l</i></sub>....,f<sub>N</sub>},共包含N个域,每个域的异常域值集合已经在步骤(3.2)或者步骤(4.2)中生成;F={F<sub>1</sub>,F<sub>2</sub>,...F<sub>M</sub>},对于任意<i>l</i>,1≤<i>l</i>≤M,<img file="FSB00000258274600049.GIF" wi="201" he="51" />F<sub><i>l</i></sub>是几个域的组合,组合方式由测试者制定,进而M值可确定;步骤(5.3)定义一个关于的测试例<img file="FSB000002582746000410.GIF" wi="208" he="60" />并初始为空;保存pdu.F<sub><i>l</i></sub>中各域的有效域值;步骤(5.4)将“从s<sub>0</sub>到s<sub>i</sub>的状态引导序列”添加到<img file="FSB000002582746000411.GIF" wi="212" he="59" />中;步骤(5.5)利用已有的pairwise算法来组合 F <sub>l</sub>中各域的域值生成异常值集合<img file="FSB000002582746000412.GIF" wi="86" he="58" />对于每 一个<img file="FSB00000258274600051.GIF" wi="185" he="61" />执行如下步骤:把E<sub>k</sub>赋值给pdu.F<sub><i>l</i></sub>,把“无效报文注入”序列添加到<img file="FSB00000258274600052.GIF" wi="211" he="60" />中,然后把“从s<sub>j</sub>到s<sub>i</sub>的状态引导序列”添加到<img file="FSB00000258274600053.GIF" wi="207" he="60" />中;步骤(5.6)将“状态s<sub>i</sub>验证序列”添加到<img file="FSB00000258274600054.GIF" wi="209" he="60" />中;步骤(5.7)把<img file="FSB00000258274600055.GIF" wi="212" he="59" />添加到TestGroup<sub>pdu</sub>中;步骤(5.8)把步骤(5.3)保存的有效域值重新赋值给被变异域组合pdu.F<sub><i>l</i></sub>;步骤(5.9)对于每个域组合F <sub>l</sub>∈F,分别执行从步骤(5.3)到步骤(5.8)的所有步骤,步骤(6):对于多域变异复合异常测试例,如果异常注入后的变迁是不确定变迁T<sub>nondeter</sub>,称为多域变异复合异常测试例-2,其生成步骤如下:步骤(6.1)初始化:定义一个关于有效报文pdu的测试组TestGroup<sub>pdu</sub>并初始为空;步骤(6.2)输入一个有效的报文pdu={f<sub>1</sub>,f<sub>2</sub>...., f<sub><i>l</i></sub>....,f<sub>N</sub>},共包含N个域,每个域的异常域值集合已经在步骤(3.2)或者步骤(4.2)中生成;F={F<sub>1</sub>,F<sub>2</sub>,...F<sub>M</sub>},对于任意<i>l</i>,<img file="FSB00000258274600056.GIF" wi="355" he="45" />F<sub><i>l</i></sub>是几个域的组合,组合方式由测试者制定,进而M值可确定;步骤(6.3)定义一个关于F <sub>l</sub>的测试例<img file="FSB00000258274600057.GIF" wi="209" he="60" />并初始为空;保存pdu.F<sub><i>l</i></sub>中各域的有效域值;步骤(6.4)将“从s<sub>0</sub>到s<sub>i</sub>的状态引导序列”添加到<img file="FSB00000258274600058.GIF" wi="211" he="60" />中;步骤(6.5)利用已有的pairwise算法组合F<sub>l</sub>中各域的域值生成异常值集合<img file="FSB00000258274600059.GIF" wi="86" he="60" />对于每一个<img file="FSB000002582746000510.GIF" wi="185" he="59" />执行如下步骤:把E<sub>k</sub>赋值给pdu.F<sub><i>l</i></sub>,把“无效报文注入”序列添加到<img file="FSB000002582746000511.GIF" wi="212" he="60" />中,把“利用强制变迁s<sub>k</sub>→s<sub>j</sub>建立的从s<sub>k</sub>到s<sub>j</sub>的状态引导序列”添加到<img file="FSB000002582746000512.GIF" wi="210" he="60" />中,然后把“从s<sub>j</sub>到s<sub>i</sub>的状态引导序列”添加到<img file="FSB000002582746000513.GIF" wi="210" he="60" />中;步骤(6.6)将“状态s<sub>i</sub>验证序列”添加到<img file="FSB000002582746000514.GIF" wi="210" he="60" />中;步骤(6.7)把<img file="FSB000002582746000515.GIF" wi="211" he="61" />添加到TestGroup<sub>pdu</sub>中;步骤(6.8)把步骤(6.3)保存的有效域值重新赋值给被变异域组合pdu. F<sub><i>l</i></sub>;步骤(6.9)对于每个域组合 F<sub><i>l</i></sub>∈F,分别执行从步骤(6.3)到步骤(6.8)的所有步骤。 
地址 100084 北京市100084-82信箱