一种漏洞挖掘方法和装置与流程

专利2022-06-29  46


本发明涉及网络安全技术领域,特别涉及一种漏洞挖掘方法和装置。



背景技术:

在进行程序编写的时候,会出现漏洞情况,针对这些漏洞人为发现需要大量的时间与精力。

目前主要通过针对程序段中的每个变量编写测试用例,使用编写的测试用例来测试对应程序段是否存在漏洞;如模糊漏洞挖掘方法通常是根据输入数据进行随机变异的方式构建测试用例。

现有实现的漏洞挖掘方法针对性差,挖掘效率低下。



技术实现要素:

有鉴于此,本申请提供一种漏洞挖掘方法和装置,能够有针对性地进行漏洞挖掘,进而提高漏洞挖掘效率。

为解决上述技术问题,本申请的技术方案是这样实现的:

一种漏洞挖掘方法,该方法包括:

遍历被测程序段中的每一条指令,对所述指令是否存在数据写功能,是否参与了污点变量的传播,以及是否为敏感指令进行判断,确定不安全状态的变量的集合;

针对所述不安全状态的变量的集合中的各变量生成测试用例;

使用生成的测试用例进行漏洞挖掘。

一种漏洞挖掘装置,该装置包括:确定单元、生成单元和测试单元;

所述确定单元,用于遍历被测程序段中的每一条指令,对所述指令是否存在数据写功能,是否参与了污点变量的传播,以及是否为敏感指令进行判断,确定不安全状态的变量的集合;

所述生成单元,用于针对所述确定单元确定的不安全状态的变量的集合中的各变量生成测试用例;

测试单元,用于使用所述生成单元生成的测试用例进行漏洞挖掘。

由上面的技术方案可知,本申请中通过遍历被测程序段中的每一条指令,确定不安全状态的变量的集合,针对所述集合中变量生成测试用例,进而进行漏洞挖掘。该方案能够有针对性地进行漏洞挖掘,进而提高漏洞挖掘效率。

附图说明

图1为本申请实施例中漏洞挖掘流程示意图;

图2为本申请实施例中四个状态之间的转换关系示意图;

图3为本申请实施例中确定不安全状态变量的流程示意图;

图4为本申请实施例中应用于上述技术的装置结构示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,下面结合附图并举实施例,对本发明的技术方案进行详细说明。

本申请实施例中提供一种漏洞挖掘方法,通过遍历被测程序段中的每一条指令,确定不安全状态的变量的集合,针对所述集合中变量生成测试用例,进而进行漏洞挖掘。该方案能够有针对性地进行漏洞挖掘,进而提高漏洞挖掘效率。

下面结合附图,详细说明本申请实施例中漏洞挖掘过程。

本申请实施例中执行主体可以为一个测试设备,用于生成测试用例,以及执行被测程序段的执行,也可以通过多个设备完成,本申请实施例中对此并不进行限制。

参见图1,图1为本申请实施例中漏洞挖掘流程示意图。具体步骤为:

步骤101,遍历被测程序段中的每一条指令,对所述指令是否存在数据写功能,是否参与了污点变量的传播,以及是否为敏感指令进行判断,确定不安全状态的变量的集合。

本步骤的具体实现包括:

被测程序段中的每个变量初始状态为安全状态。

针对遍历到的每一条指令,当该指令存在数据写功能,且目的操作数与污点源有关时,将与目的操作数关联的变量的状态置为被污染状态;

若确定该指令为敏感指令,则将与目的操作数关联的,且状态为被污染状态的变量置位不安全状态;若存在下一条指令,执行下一条指令;

当确定该指令不为敏感指令,且存在下一条指令时,执行下一条指令;

当遍历到的指令不存在数据写功能时,若该指令为跳转指令,且跳转参数与污点源无关,则跳转到对应的目标指令;

当遍历到的指令不存在数据写功能时,若该指令不为跳转指令,或该指令为跳转指令,跳转参数与污点源相关,且存在下一条指令,则执行下一条指令;

当遍历到的指令存在数据写功能,目标操作数与污点源无关,且存在下一条指令时,执行下一条指令;

当执行完最后一条指令时,将状态为不安全状态的所有变量对应的集合作为不安全状态的变量的集合。

下面结合附图,详细给出不安全状态的变量对应的集合的确定过程。

先给出本申请实施例中在具体实现时的一些定义和规则:

一、定义被测程序段为p,定义函数eop(p)={true,false},当eop(p)={true,true}时,表示该程序段已检测完毕,即不存在下一条指令;当eop(p)={true,false}时,表示该程序段尚未检测完毕,即存在下一条指令。

二、定义被检测程序段的输入变量集合为l,定义污点源集合为i,则有

三、定义被检测程序段中的指令集合为c,定义敏感指令集合为h,则有敏感指令主要包含以下几类:

1、字符串处理函数,如字符串拷贝函数等。

2、命令执行函数,如文件操作函数、用户权限提升函数等。

3、身份认证鉴权操作,如用户登录操作等。

4、重要资源操作,如数据库和配置内容操作等。

四、集合m代表被检测程序段位于内存中的变量集合,r代表被检测程序段位于寄存器中的变量集合;

五、定义集合v为所有变量的集合,v为m和r的并集,即v={v|v∈m∪r}。

六、mt代表被污染的内存区域地址集合,rt代表被污染的寄存器地址集合。则有

七、定义集合vt为被污染变量集合,vt为mt和rt的并集,即也就是说,对于如果变量v被写入了i中的记录或被写入了mt和rt中的数据,那么则称v被污染。

八、定义函数s(v)返回污染变量v的污点源集合,则有

九、定义函数d(v)返回操作变量v的敏感指令集合,则有当操作变量v的指令中不存在敏感指令时,有

十、被测程序段中的每一变量的状态定义如下:

正常状态,此时变量未被污染;

污染状态,此时变量已被污染;

安全状态,此时变量不会经由接口函数泄露敏感信息或由于变量取非正常值而使程序出现运行异常;

不安全状态,此时变量可能会经由接口函数泄露敏感信息或由于变量取非正常值而导致程序出现运行异常。

参见图2,图2为本申请实施例中四个状态之间的转换关系示意图。图2中qn为正常状态,qt为污染状态,qs为安全状态;qi为不安全状态;各状态对应的值表示安全状态的值大于正常状态对应的值;正常状态的值大于污染状态对应的值,污染状态对应的值大于不安全状态对应的值。

状态转换集合为{t1、t2、t3、t4、t5、t6、t7},时,表示返回污染变量v的污点源集合为空时,表示操作变量v的指令中不存在敏感指令时,返回操作变量v的敏感指令集合为空。

∑为事件输入集合,∑={e|e∈s(v)×d(v)×eop(p)},且在任意确定的时刻,状态机m只能接收一个确定的输入;σ为映射函数,σ=q×∑→t。q0为初始状态,q0=qn;

其中,m=(q,∑,t,σ,q0)。

十一、定义函数f(v)为变量经过模拟执行过程后最终确定的状态,则有f(v)∈{qs,qt}。为了方便阐述,定义fi(v)为变量v在指令i执行后返回的状态。

十二、当f(v)=qs时,有

十三、对于变量v=x y,定义运算f(v)=min{f(x),f(y)},即当某2个变量组合,成为组合变量,其函数返回值为2个变量分别返回的函数值的下界。该定义表示若某个变量由污染变量和未被污染变量组成,那么,整个变量在执行后应该是被污染状态。原因在于,对于污点分析的研究实际上是污点的传播过程,状态的变化只能从未被污染态进入污染态,而不能反方向,否则,对于漏洞挖掘的过程将失去意义。需要注意的是,初始状态不参与运算。

基于上述定义,本申请实施例中给出设备确定不安全状态变量的集合,以及各处于不安全状态的变量对应的污点源敏感权重的过程。

参见图3,图3为本申请实施例中确定不安全状态变量的流程示意图。具体步骤为:

步骤301,设置被测程序段中的所有变量的状态为安全状态;针对被测程序段中的第一条指令。

步骤302,确定该指令是否存在数据写功能,如果是,执行步骤303;否则,执行步骤308。

步骤303,确定对应目的操作数是否与污点源相关,如果是,执行步骤304;否则,执行步骤311。

根据定义的污点源集合确定目的操作数是否与污点源相关。

步骤304,将目的操作数关联的变量置为被污染状态。

步骤305,确定当前指令是否为敏感指令,如果是,执行步骤306;否则,执行步骤311。

根据定义的敏感指令集合确定当前指令是否为敏感指令。

步骤306,将目的操作数相关的变量置为不安全状态。

步骤307,获取当前置为不安全状态的变量的污点源,并将污点源的敏感权重增加预设值;执行步骤311。

这里的预设值可以根据实际需要设置,如1。

步骤308,确定该指令是否为跳转指令,如果是,执行步骤309;否则,执行步骤311。

步骤309,确定对应的跳转指令参数是否与污点源有关,如果是,执行步骤311;否则,执行步骤310。

步骤310,跳转至目标指令,执行步骤302。

步骤311,确定是否为被测程序段中的最后一条指令,如果是,结束本流程;否则,执行步骤312。

步骤312,遍历到下一条指令,执行步骤302。

至此,结束图3所示流程。

在具体实现时,由于输入参数不同,导致不能遍历所有指令时,需要遍历一次后,再使用不同输入参数进行指令的遍历,直到被测程序段中的所有指令均被遍历完毕。

步骤102,针对所述不安全状态的变量的集合中的各变量生成测试用例。

本申请实施例中仅针对处于不安全状态的变量生成测试用例,这样大大节省了生成的测试用例的数量。

针对任一条指令中,目标操作数关联的变量为不安全状态的变量时,确定该变量的污点源,将该变量的污点源敏感权重增加预设值。

针对所述集合中的不安全状态的变量的测试用例的数量与该变量的污点源敏感权重成正比。即敏感权重越大,生成的测试用例越多。

在对被检测程序段使用上述方法算法得到处于不安全状态的变量集合后,需要针对这些变量构建测试用例。根据漏洞挖掘的工作实践,敏感权重越大,意味着变量更有可能通过接口函数泄露敏感信息或由于变量取非正常值而使程序出现运行异常,也就是说发现漏洞的概率更高。而更高的概率则意味着需要更多的测试用例进行触发,因此在申请中,针对某一变量的测试用例的数量与其敏感权重成正比。

令处于不安全状态的变量集合为u={vi1,vi2,...,vin},其对应的敏感权重集合为w={w1,w2,...,wn},测试用例总量为n,则对于其测试用例数量为

步骤103,使用生成的测试用例进行漏洞挖掘。

由于本申请实施例中生成的测试用例仅相当于所有变量对应的测试用例中的一部分,也就是说大大减少了测试用例的个数,这样也就大大加快了漏洞挖掘的效率。

基于同样的发明构思,本申请实施例中还提供一种漏洞挖掘装置。参见图4,图4为本申请实施例中应用于上述技术的装置结构示意图。该装置包括:确定单元401、生成单元402和测试单元403;

确定单元401,用于遍历被测程序段中的每一条指令,对所述指令是否存在数据写功能,是否参与了污点变量的传播,以及是否为敏感指令进行判断,确定不安全状态的变量的集合;

生成单元402,用于针对确定单元401确定的不安全状态的变量的集合中的各变量生成测试用例;

测试单元,用于使用生成单元402生成的测试用例进行漏洞挖掘。

较佳地,

确定单元401,具体用于遍历被测程序段中的每一条指令,对所述指令是否参与了污点变量的传播,以及是否为敏感指令进行判断,确定不安全状态的变量的集合时,包括:针对遍历到的每一条指令,当该指令存在数据写功能,且目的操作数与污点源有关时,将与目的操作数关联的变量的状态置为被污染状态;若确定该指令为敏感指令,则将与目的操作数关联的,且状态为被污染状态的变量置位不安全状态;若存在下一条指令,执行下一条指令;当执行完最后一条指令时,将状态为不安全状态的所有变量对应的集合作为不安全状态的变量的集合。

较佳地,

确定单元401,进一步用于将与目的操作数关联的变量的状态置为被污染状态之后,当确定该指令不为敏感指令,且存在下一条指令时,执行下一条指令;当遍历到的指令不存在数据写功能时,若该指令为跳转指令,且跳转参数与污点源无关,则跳转到对应的目标指令;当遍历到的指令不存在数据写功能时,若该指令不为跳转指令,或该指令为跳转指令,跳转参数与污点源相关,且存在下一条指令,则执行下一条指令;当遍历到的指令存在数据写功能,目标操作数与污点源无关,且存在下一条指令时,执行下一条指令。

较佳地,

确定单元401,进一步用于针对任一条指令中,目标操作数关联的变量为不安全状态的变量时,确定该变量的污点源,将该变量的污点源敏感权重增加预设值。

较佳地,

测试单元403,具体用于针对所述集合中的不安全状态的变量的测试用例的数量与该变量的污点源敏感权重成正比。

较佳地,

针对被测程序段中的每个变量,初始状态设置为安全状态。

上述实施例的单元可以集成于一体,也可以分离部署;可以合并为一个单元,也可以进一步拆分成多个子单元。

综上所述,本申请通过遍历被测程序段中的每一条指令,确定不安全状态的变量的集合,针对所述集合中变量生成测试用例,进而进行漏洞挖掘。该方案能够有针对性地进行漏洞挖掘,进而提高漏洞挖掘效率。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。


技术特征:

1.一种漏洞挖掘方法,其特征在于,该方法包括:

遍历被测程序段中的每一条指令,对所述指令是否存在数据写功能,是否参与了污点变量的传播,以及是否为敏感指令进行判断,确定不安全状态的变量的集合;

针对所述不安全状态的变量的集合中的各变量生成测试用例;

使用生成的测试用例进行漏洞挖掘。

2.根据权利要求1所述的方法,其特征在于,所述遍历被测程序段中的每一条指令,对所述指令是否参与了污点变量的传播,以及是否为敏感指令进行判断,确定不安全状态的变量的集合,包括:

针对遍历到的每一条指令,当该指令存在数据写功能,且目的操作数与污点源有关时,将与目的操作数关联的变量的状态置为被污染状态;

若确定该指令为敏感指令,则将与目的操作数关联的,且状态为被污染状态的变量置位不安全状态;若存在下一条指令,执行下一条指令;

当执行完最后一条指令时,将状态为不安全状态的所有变量对应的集合作为不安全状态的变量的集合。

3.根据权利要求2所述的方法,其特征在于,所述将与目的操作数关联的变量的状态置为被污染状态之后,所述方法进一步包括:

当确定该指令不为敏感指令,且存在下一条指令时,执行下一条指令。

4.根据权利要求2所述的方法,其特征在于,所述方法进一步包括:

当遍历到的指令不存在数据写功能时,若该指令为跳转指令,且跳转参数与污点源无关,则跳转到对应的目标指令;

当遍历到的指令不存在数据写功能时,若该指令不为跳转指令,或该指令为跳转指令,跳转参数与污点源相关,且存在下一条指令,则执行下一条指令。

5.根据权利要求2所述的方法,其特征在于,所述方法进一步包括:

当遍历到的指令存在数据写功能,目标操作数与污点源无关,且存在下一条指令时,执行下一条指令。

6.根据权利要求1所述的方法,其特征在于,所述方法进一步包括:

针对任一条指令中,目标操作数关联的变量为不安全状态的变量时,确定该变量的污点源,将该变量的污点源敏感权重增加预设值。

7.根据权利要求6所述的方法,其特征在于,针对所述集合中的不安全状态的变量的测试用例的数量与该变量的污点源敏感权重成正比。

8.根据权利要求1-7任一项所述的方法,其特征在于,

针对被测程序段中的每个变量,初始状态设置为安全状态。

9.一种漏洞挖掘装置,其特征在于,该装置包括:确定单元、生成单元和测试单元;

所述确定单元,用于遍历被测程序段中的每一条指令,对所述指令是否存在数据写功能,是否参与了污点变量的传播,以及是否为敏感指令进行判断,确定不安全状态的变量的集合;

所述生成单元,用于针对所述确定单元确定的不安全状态的变量的集合中的各变量生成测试用例;

测试单元,用于使用所述生成单元生成的测试用例进行漏洞挖掘。

10.根据权利要求9所述的装置,其特征在于,

所述确定单元,具体用于遍历被测程序段中的每一条指令,对所述指令是否参与了污点变量的传播,以及是否为敏感指令进行判断,确定不安全状态的变量的集合时,包括:针对遍历到的每一条指令,当该指令存在数据写功能,且目的操作数与污点源有关时,将与目的操作数关联的变量的状态置为被污染状态;若确定该指令为敏感指令,则将与目的操作数关联的,且状态为被污染状态的变量置位不安全状态;若存在下一条指令,执行下一条指令;当执行完最后一条指令时,将状态为不安全状态的所有变量对应的集合作为不安全状态的变量的集合。

技术总结
本申请提供了一种漏洞挖掘方法和装置,该方法包括:遍历被测程序段中的每一条指令,对所述指令是否存在数据写功能,是否参与了污点变量的传播,以及是否为敏感指令进行判断,确定不安全状态的变量的集合;针对所述不安全状态的变量的集合中的各变量生成测试用例;使用生成的测试用例进行漏洞挖掘。该方法能够有针对性地进行漏洞挖掘,进而提高漏洞挖掘效率。

技术研发人员:田慧蓉;李艺;罗成
受保护的技术使用者:中国信息通信研究院
技术研发日:2018.12.03
技术公布日:2020.06.09

转载请注明原文地址: https://bbs.8miu.com/read-22010.html

最新回复(0)