源代码漏洞检测方法及装置与流程

文档序号:32655060发布日期:2022-12-23 21:16阅读:21来源:国知局
源代码漏洞检测方法及装置与流程

1.本说明书涉及漏洞检测技术领域,特别涉及一种源代码漏洞检测方法及装置。


背景技术:

2.代码安全检测分二进制代码检测和源代码安全检测,基于二进制代码的检测适用度较差,要求苛刻。若直接对源代码进行人工审查,效率低下且测试结果差异巨大,故代码审计系统多采用自动化的源代码检测和人工审计相结合的方法。sast(static analysis security testing,静态源代码安全测试)伴随代码安全审计技术的提出发展至今,已经较为成熟,也成为业内占有率较高的自动化检测方式。
3.sast不需要实际运行程序,而是使用污点分析和数据流分析等程序分析技术对程序的源代码进行快速、全面的分析。由于静态代码检测工具要兼顾扫描效率和漏报率,同时部分影响漏洞是否存在的动态因素无法固定在规则库中,故其规则库具有一定的局限性,进而会出现漏洞误报的情况。工作人员在查看漏洞静态扫描工具生成的扫描报告时,面对报告里大量的误报,审核难度较大,往往会失去耐心,放弃参考静态扫描漏洞报告。因此,为了提升静态漏洞测试工具测试报告的参考意义,需进一步降低静态检测工具扫描结果的误报率。
4.针对上述问题,目前尚未提出有效的解决方案。


技术实现要素:

5.本说明书实施例提供了一种源代码漏洞检测方法及装置,以解决现有技术中漏洞检测的误报率高的问题。
6.本说明书实施例提供了一种源代码漏洞检测方法,包括:
7.接收漏洞检测请求;所述漏洞检测请求中携带有待检测程序源代码和扫描分析报告;所述扫描分析报告是利用静态漏洞检测工具对所述待检测程序源代码扫描得到的;所述扫描分析报告中包括报告漏洞集;
8.根据预设切片准则对所述待检测程序源代码进行程序切片,得到多个程序切片;
9.基于所述报告漏洞集,从所述多个程序切片中筛选出对应的漏洞程序切片;
10.将所述漏洞程序切片和所述漏洞程序切片对应的漏洞类型输入至目标误报模型中,输出误报结果报告;基于所述扫描分析报告和所述误报结果报告,生成漏洞检测报告;所述漏洞检测报告中包括误报的漏洞问题数据和正报的漏洞问题数据。
11.在一个实施例中根据预设切片准则对所述待检测程序源代码进行程序切片,得到多个程序切片,包括:
12.对所述待检测程序源代码进行代码分析,构造对应的程序依赖图;
13.对所述程序依赖图进行函数调用分析,生成跨函数的程序依赖图;
14.基于所述程序依赖图、所述跨函数的程序依赖图和所述预设切片准则,对所述待检测程序源代码进行程序切片,得到多个程序切片。
15.在一个实施例中,所述程序依赖图和所述跨函数的程序依赖图包括控制流图和数据依赖图;
16.相应的,基于所述程序依赖图、所述跨函数的程序依赖图和所述预设切片准则,对所述待检测程序源代码进行程序切片,得到多个程序切片,包括:
17.根据所述预设切片准则,确定所述待检测程序源代码对应的待切漏洞点;
18.基于所述控制流图中的控制依赖关系和所述数据依赖图中的数据依赖关系,确定所述待切漏洞点对应的目标可疑漏洞路径;所述目标可疑漏洞路径中包括所述待切漏洞点对应的依赖关系点;
19.结合所述待切漏洞点与所述目标可疑漏洞路径,生成可疑漏洞路径程序切片。
20.在一个实施例中,基于所述控制流图中的控制依赖关系和所述数据依赖图中的数据依赖关系,确定所述待切漏洞点对应的目标可疑漏洞路径,包括:
21.针对所述待切漏洞点按照先数据依赖关系后控制依赖关系的顺序对所述待检测程序源代码进行分析,生成第一可疑漏洞路径;
22.针对所述待切漏洞点按照先控制依赖关系后数据依赖关系的顺序对所述待检测程序源代码进行分析,生成第二可疑漏洞路径;
23.将所述第一可疑漏洞路径与所述第二可疑漏洞路径进行融合,得到目标可疑漏洞路径。
24.在一个实施例中,所述目标误报模型是通过以下步骤得到的:
25.获取批量的程序源代码;
26.对所述批量的程序源代码中各程序源代码进行静态扫描和程序切片,以得到漏洞程序切片集合;
27.基于历史误报数据库,对所述漏洞程序切片集合进行分析,得到正报误报数据集;所述历史误报数据库中包括误报的漏洞问题数据和正报的漏洞问题数据;
28.对所述漏洞程序切片集合进行特征提取,得到特征向量集合;利用所述正报误报数据集确定所述特征向量集合中各特征向量的标签,得到所述特征向量集合对应的标签集合;
29.利用支持向量机算法对所述特征向量集合和所述标签集合进行机器学习,输出目标误报模型。
30.在一个实施例中,对所述漏洞程序切片集合进行特征提取,得到特征向量集合,包括:
31.对所述漏洞程序切片集合中的漏洞程序切片进行抽象语法树的提取,以获取语法特征向量;
32.基于所述正报误报数据集确定所述漏洞程序切片集合中属于误报类型的漏洞程序切片和属于正报类型的漏洞程序切片;对属于误报类型的漏洞程序切片进行跨函数的程序依赖图的提取,得到语义特征向量;对属于正报类型的漏洞程序切片进行程序依赖图的提取,得到语义特征向量;
33.基于语法特征向量语义特征向量,生成所述漏洞程序切片集合对应的特征向量集合。
34.在一个实施例中,基于历史误报数据库,对所述漏洞程序切片集合进行分析,得到
正报误报数据集,包括:
35.利用历史误报数据库,对所述漏洞程序切片集合中的漏洞程序切片进行匹配,得到第一正报误报数据集;
36.对所述漏洞程序切片集合中的漏洞程序切片进行数据流分析,得到第二正报误报数据集;
37.将所述第一正报误报数据集与所述第二正报误报数据集进行融合,生成正报误报数据集。
38.在一个实施例中,所述标签集合中的标签包括:有误报历史记录的误报类型、有误报历史记录的正报类型、无误报历史记录的正报类型;
39.相应的,利用支持向量机算法对所述特征向量集合和所述标签集合进行机器学习,输出目标误报模型,包括:
40.利用支持向量机算法对所述有误报历史记录的误报类型对应的特征向量与所述有误报历史记录的正报类型对应的特征向量进行对比学习;利用支持向量机算法对所述有误报历史记录的误报类型对应的特征向量与所述无误报历史记录的正报类型对应的特征向量进行对比学习。
41.本说明书实施例还提供了一种源代码漏洞检测装置,包括:
42.接收模块,用于接收漏洞检测请求;所述漏洞检测请求中携带有待检测程序源代码和扫描分析报告;所述扫描分析报告是利用静态漏洞检测工具对所述待检测程序源代码扫描得到的;所述扫描分析报告中包括报告漏洞集;
43.切片模块,用于根据预设切片准则对所述待检测程序源代码进行程序切片,得到多个程序切片;
44.筛选模块,用于基于所述报告漏洞集,从所述多个程序切片中筛选出对应的漏洞程序切片;
45.检测模块,用于将所述漏洞程序切片和所述漏洞程序切片对应的漏洞类型输入至目标误报模型中,输出误报结果报告;基于所述扫描分析报告和所述误报结果报告,生成漏洞检测报告;所述漏洞检测报告中包括误报的漏洞问题数据和正报的漏洞问题数据。
46.本说明书实施例还提供一种计算机设备,包括处理器以及用于存储处理器可执行指令的存储器,所述处理器执行所述指令时实现上述任意实施例中所述的源代码漏洞检测方法的步骤。
47.本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机指令,所述指令被执行时实现上述任意实施例中所述的源代码漏洞检测方法的步骤。
48.在本说明书实施例中,提供了一种源代码漏洞检测方法,可以接收漏洞检测请求,所述漏洞检测请求中携带有待检测程序源代码和扫描分析报告,所述扫描分析报告中包括报告漏洞集,可以根据预设切片准则对所述待检测程序源代码进行程序切片,得到多个程序切片,基于所述报告漏洞集,从所述多个程序切片中筛选出对应的漏洞程序切片,将所述漏洞程序切片和所述漏洞程序切片对应的漏洞类型输入至目标误报模型中,输出误报结果报告,之后可以基于所述扫描分析报告和所述误报结果报告,生成漏洞检测报告,所述漏洞检测报告中可以包括误报的漏洞问题数据和正报的漏洞问题数据。上述方案中,在获取到待检测程序源代码以及对应的包括报告漏洞集的扫描分析报告之后,可以对待检测程序源
代码进行程序切片,结合报告漏洞集从程序切片中筛选出漏洞程序切片,并将漏洞程序切片和切片对应的漏洞类型输入至目标误报模型中,输出误报结果报告,误报结果报告中可以包括误报的漏洞程序切片及其对应的漏洞数据,之后,可以将误报结果报告与扫描分析报告结合,得到包含误报的漏洞问题数据和正报的漏洞问题数据的漏洞检测报告。上述方案中,通过训练好的目标误报模型对扫描分析报告中的漏洞集中的漏洞问题数据进行误报分析,确定出误报的漏洞问题数据和正报的漏洞问题数据,可以提高漏洞检测的准确率和效率,进而提高源代码开发的效率。
附图说明
49.此处所说明的附图用来提供对本说明书的进一步理解,构成本说明书的一部分,并不构成对本说明书的限定。在附图中:
50.图1示出了本说明书一实施例中的源代码漏洞检测方法的流程图;
51.图2示出了本说明书一实施例中的源代码漏洞检测方法的整体流程图;
52.图3示出了本说明书一实施例中的源代码漏洞检测方法的目标误报模型的漏洞数据准备的流程图;
53.图4示出了本说明书一实施例中的源代码漏洞检测方法中两个路径融合的流程图;
54.图5示出了本说明书一实施例中的源代码漏洞检测方法中机器学习数据准备的流程图;
55.图6示出了本说明书一实施例中的源代码漏洞检测装置的示意图;
56.图7示出了本说明书一实施例中的计算机设备的示意图。
具体实施方式
57.下面将参考若干示例性实施方式来描述本说明书的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本说明书,而并非以任何方式限制本说明书的范围。相反,提供这些实施方式是为了使本说明书公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
58.本领域的技术人员知道,本说明书的实施方式可以实现为一种系统、装置设备、方法或计算机程序产品。因此,本说明书公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。
59.本说明书实施例提供了一种源代码漏洞检测方法。图1示出了本说明书一实施例中源代码漏洞检测方法的流程图。虽然本说明书提供了如下述实施例或附图所示的方法操作步骤或装置结构,但基于常规或者无需创造性的劳动在所述方法或装置中可以包括更多或者更少的操作步骤或模块单元。在逻辑性上不存在必要因果关系的步骤或结构中,这些步骤的执行顺序或装置的模块结构不限于本说明书实施例描述及附图所示的执行顺序或模块结构。所述的方法或模块结构的在实际中的装置或终端产品应用时,可以按照实施例或者附图所示的方法或模块结构连接进行顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至分布式处理环境)。
60.具体地,如图1所示,本说明书一种实施例提供的源代码漏洞检测方法可以包括以
下步骤:
61.步骤s101,接收漏洞检测请求;所述漏洞检测请求中携带有待检测程序源代码和扫描分析报告;所述扫描分析报告是利用静态漏洞检测工具对所述待检测程序源代码扫描得到的;所述扫描分析报告中包括报告漏洞集。
62.本实施例中的源代码漏洞检测方法可以应用于漏洞检测服务器。漏洞检测服务器可以接收客户端发送的漏洞检测请求。漏洞检测请求中可以携带有待检测程序源代码以及静态漏洞检测工具的扫描分析报告。
63.扫描分析报告可以是利用任一静态检测工具对待检测程序源代码进行静态扫描得到的。这里的静态扫描是指静态源代码安全扫描。可以利用任一静态检测工具与自身的漏洞数据库和规则库结合,对待检测程序源代码开展扫描分析工作,从而生成扫描分析报告。扫描分析报告中可以包括报告漏洞集。报告漏洞集中可以包括程序片段及其对应的漏洞信息。漏洞信息可以包括漏洞名称、爆发行代码等漏洞集信息。
64.其中,上述服务器可以是单一的服务器,也可以是服务器集群,或者是云服务器等都可以,具体的组成形成本技术不作限定。上述客户端可以是台式电脑、笔记本、手机终端、pda等,对于客户端的呈现形成,本技术也不作限定。
65.步骤s102,根据预设切片准则对所述待检测程序源代码进行程序切片,得到多个程序切片。
66.步骤s103,基于所述报告漏洞集,从所述多个程序切片中筛选出对应的漏洞程序切片。
67.漏洞检测服务器可以根据预设切片准则对待检测程序代码进行程序切片。切片准则可以预先设置。在一个实施例中,预设切片准则为库/api函数调用、数组使用、指针使用或表达式定义,在切片过程中有函数声明,分支控制语句时保留代码的语法结构。
68.漏洞检测服务器可以根据预设切片准则对待检测程序源代码进行程序切片,得到多个程序切片,程序切片中展示了代码语义信息和语法结构。因此,程序切片既保留了代码语义信息又展现了代码的语法结构,后面特征提取时会更加准确。
69.之后,可以基于报告漏洞集中的漏洞信息,在多个程序切片中筛选出与漏洞报告集中的漏洞信息关联的全部程序片段作为该漏洞的程序切片。具体地,可以基于所述报告漏洞集中漏洞爆发行代码信息(包括函数以及变量),从所述多个程序切片中筛选出报告漏洞集对应的漏洞程序切片。
70.步骤s104,将所述漏洞程序切片和所述漏洞程序切片对应的漏洞类型输入至目标误报模型中,输出误报结果报告;基于所述扫描分析报告和所述误报结果报告,生成漏洞检测报告;所述漏洞检测报告中包括误报的漏洞问题数据和正报的漏洞问题数据。
71.在得到待检测程序源代码对应的漏洞程序切片之后,可以将漏洞程序切片和对应的漏洞类型输入至目标误报模型中,输出误报结果报告。之后,可以基于静态扫描获得的扫描分析报告和误报结果报告,生成漏洞检测报告。漏洞检测报告中可以包括误报的漏洞问题数据和正报的漏洞问题数据。正报是指静态扫描检测出的漏洞问题确实存在。误报是指静态扫描检测出的漏洞问题实际不存在。
72.上述实施例中,在获取到待检测程序源代码以及对应的包括报告漏洞集的扫描分析报告之后,可以对待检测程序源代码进行程序切片,结合报告漏洞集从程序切片中筛选
出漏洞程序切片,并将漏洞程序切片和切片对应的漏洞类型输入至目标误报模型中,输出误报结果报告,误报结果报告中可以包括误报的漏洞程序切片及其对应的漏洞数据,之后,可以将误报结果报告与扫描分析报告结合,得到包含误报的漏洞问题数据和正报的漏洞问题数据的漏洞检测报告。上述方案中,通过训练好的目标误报模型对扫描分析报告中的漏洞集中的漏洞问题数据进行误报分析,确定出误报的漏洞问题数据和正报的漏洞问题数据,可以提高漏洞检测的准确率和效率,进而提高源代码开发的效率。
73.在本说明书一些实施例中,根据预设切片准则对所述待检测程序源代码进行程序切片,得到多个程序切片,包括:对所述待检测程序源代码进行代码分析,构造对应的程序依赖图;对所述程序依赖图进行函数调用分析,生成跨函数的程序依赖图;基于所述程序依赖图、所述跨函数的程序依赖图和所述预设切片准则,对所述待检测程序源代码进行程序切片,得到多个程序切片。
74.具体地,为了对待检测程序源代码进行程序切片,可以先分析出对应的程序依赖图。首先,构造程序依赖图(program dependence graph,pdg),其次,对其主函数调用其他副函数的信息进行相关补充完善,生成跨函数的pdg,打破切片的函数孤岛。同时对跨函数的pdg的各个点进行数字序号标记,以便后续切片的生成。预设切片准则为库/api函数调用、数组使用、指针使用或表达式定义,在切片过程中有函数声明,分支控制语句时保留代码的语法结构。之后,基于程序依赖图、跨函数程序依赖图和预设切片准则,对待检测程序源代码进行程序切片,得到多个程序切片,程序切片展示了代码的语义信息以及语法结构。通过上述方式,可以得到待检测程序源代码的程序切片。
75.在本说明书一些实施例中,所述程序依赖图和所述跨函数的程序依赖图包括控制流图和数据依赖图;相应的,基于所述程序依赖图、所述跨函数的程序依赖图和所述预设切片准则,对所述待检测程序源代码进行程序切片,得到多个程序切片,包括:根据所述预设切片准则,确定所述待检测程序源代码对应的待切漏洞点;基于所述控制流图中的控制依赖关系和所述数据依赖图中的数据依赖关系,确定所述待切漏洞点对应的目标可疑漏洞路径;所述目标可疑漏洞路径中包括所述待切漏洞点对应的依赖关系点;结合所述待切漏洞点与所述目标可疑漏洞路径,生成可疑漏洞路径程序切片。通过上述方式,可以生成具有可疑漏洞路径特征的程序切片。
76.在本说明书一些实施例中,基于所述控制流图中的控制依赖关系和所述数据依赖图中的数据依赖关系,确定所述待切漏洞点对应的目标可疑漏洞路径,包括:针对所述待切漏洞点按照先数据依赖关系后控制依赖关系的顺序对所述待检测程序源代码进行分析,生成第一可疑漏洞路径;针对所述待切漏洞点按照先控制依赖关系后数据依赖关系的顺序对所述待检测程序源代码进行分析,生成第二可疑漏洞路径;将所述第一可疑漏洞路径与所述第二可疑漏洞路径进行融合,得到目标可疑漏洞路径。
77.具体地,请参考图3,示出了本说明书一实施例中的源代码漏洞检测方法的目标误报模型的漏洞数据准备的流程图。由于pdg包含了控制流图(control flow graph,cfg)和数据依赖图(data dependence graph,ddg),故可结合切片准则获得待切漏洞点及其依赖关系点。控制流图中的控制依赖关系主要针对于三种语句:条件判断、循环和开关。数据依赖图中的数据依赖关系则聚焦于程序中的某个变量是否会被其他点影响,主要分为变量的赋值和读取。由于控制依赖和数据依赖关注的语句不同,从而与待切漏洞点相关的控制依
赖和数据依赖的路径会有较大差异,故采用两种控制和数据依赖不同分析顺序的分析方法来分别获得路径1和2,如图3所示。
78.路径1是先数据依赖分析后控制依赖分析,对待切漏洞点的数据依赖中的变量赋值和读取进行前后向分析,并在结果中加入控制依赖的点。这样的路径分析方法使得待切漏洞点拥有全面化的数据依赖点,而控制依赖点存在部分丢失的可能性。
79.路径2是先控制依赖分析后数据依赖分析,对控制依赖语句中三个语句进行前后向分析,并在结果中加入数据依赖的点。这样的路径分析方法使得待切漏洞点拥有全面化的控制依赖点,而数据依赖点存在部分丢失的可能性。结合待切漏洞点与其最终可疑漏洞路径,可生成可疑漏洞路径程序切片。
80.为了最终的可疑漏洞路径程序切片中待切漏洞点的依赖关系点全面化,仅仅选取控制依赖和数据依赖能够互相印证的点是不充足的,这会造成部分依赖数据的丢失,故本实施例对两条路径分析的方法进行融合校正得到最终可疑漏洞路径。通过上述程序切片方法,能够结合扫描报告漏洞集尽可能涵盖漏洞查验所需的相关源代码,为训练目标误报模型奠定夯实的数据基础。
81.在本说明书一些实施例中,所述目标误报模型是通过以下步骤得到的:获取批量的程序源代码;对所述批量的程序源代码中各程序源代码进行静态扫描和程序切片,以得到漏洞程序切片集合;基于历史误报数据库,对所述漏洞程序切片集合进行分析,得到正报误报数据集;所述历史误报数据库中包括误报的漏洞问题数据和正报的漏洞问题数据;对所述漏洞程序切片集合进行特征提取,得到特征向量集合;利用所述正报误报数据集确定所述特征向量集合中各特征向量的标签,得到所述特征向量集合对应的标签集合;利用支持向量机算法对所述特征向量集合和所述标签集合进行机器学习,输出目标误报模型。
82.具体地,漏洞检测服务器或者模型训练服务器可以预先构建目标误报模型。可以获取批量的程序源代码。对所述批量的程序源代码中各程序源代码进行静态扫描,生成所述各程序源代码对应的扫描分析报告;所述各程序源代码对应的扫描分析报告中包括所述各程序源代码对应的报告漏洞集。根据预设切片准则对所述批量的程序源代码中各程序源代码进行程序切片,得到所述各程序源代码对应的多个程序切片。基于所述各程序源代码对应的报告漏洞集,从所述各程序源代码对应的多个程序切片中筛选出所述各程序源代码对应的漏洞程序切片,得到漏洞程序切片集合。
83.可以获取历史误报数据库。所述历史误报数据库中包括误报的漏洞问题数据和正报的漏洞问题数据。结合历史误报数据库与程序切片数据流分析结果,得到正报误报数据集。正报误报数据集中包括所述漏洞程序切片集中的漏洞程序切片及其在对应漏洞问题下为正报还是误报。正报是指在漏洞程序切片对应的漏洞类型下确实存在该漏洞,误报是指在漏洞程序切片对应的漏洞类型下不存在该漏洞。在得到正报误报数据集之后,可以利用正报误报数据集对漏洞程序切片集合中的漏洞程序切片附标签,得到对应的标签集。之后,可以利用支持向量机算法对所述特征向量集合和所述标签集合进行机器学习,输出目标误报模型。通过上述方式,可以通过机器学习,获得目标误报模型。
84.在本说明书一些实施例中,对所述漏洞程序切片集合进行特征提取,得到特征向量集合,包括:对所述漏洞程序切片集合中的漏洞程序切片进行抽象语法树的提取,以获取语法特征向量;基于所述正报误报数据集确定所述漏洞程序切片集合中属于误报类型的漏
洞程序切片和属于正报类型的漏洞程序切片;对属于误报类型的漏洞程序切片进行跨函数的程序依赖图的提取,得到语义特征向量;对属于正报类型的漏洞程序切片进行程序依赖图的提取,得到语义特征向量;基于语法特征向量语义特征向量,生成所述漏洞程序切片集合对应的特征向量集合。
85.具体地,通过对报告漏洞集及其相关漏洞源代码进行代码分析,以提取抽象语法树和程序依赖图,进而获取语法特征和语义特征。结合误报数据库中误报漏洞问题名称,漏洞问题类型下有误报的漏洞问题进行跨函数程序依赖图的提取。相较于无误报漏洞问题的程序依赖图,有误报漏洞问题的跨函数程序依赖图补充函数中调用其他函数的相关信息,以生成更加精准化的特征向量,挖掘出误报漏洞的某些代码特征,从而提高机器学习识别误报的能力。对抽象语法树和跨函数的程序依赖图分别进行语法和语义特征向量的提取,特征向量的提取可选用相关表征算法,如graph2vec。结合语法语义特征向量作为报告漏洞集中各漏洞问题的特征集合,生成所述漏洞程序切片集合对应的特征向量集合。通过上述方式,可以生成更加精准化的特征向量,挖掘出误报漏洞的某些代码特征,从而提高机器学习识别误报的能力。
86.在本说明书一些实施例中,基于历史误报数据库,对所述漏洞程序切片集合进行分析,得到正报误报数据集,包括:利用历史误报数据库,对所述漏洞程序切片集合中的漏洞程序切片进行匹配,得到第一正报误报数据集;对所述漏洞程序切片集合中的漏洞程序切片进行数据流分析,得到第二正报误报数据集;将所述第一正报误报数据集与所述第二正报误报数据集进行融合,生成正报误报数据集。
87.具体地,可以结合历史误报数据库对报告漏洞集进行分类。误报数据库的来源是历史已人工修改的漏洞报告,漏洞分类是结合误报数据库中误报漏洞问题名称(如sql注入、跨站脚本等),在漏洞问题类型下进行二次分类成在所属漏洞问题类型下有无误报的漏洞问题。结合历史误报数据库对报告漏洞集及其相关源代码进行扫描生成第一正报误报数据集。基于程序依赖图(误报漏洞问题是跨函数的程序依赖图)、报告漏洞集及其相关漏洞源代码进行数据流分析,以生成第二正报误报数据集。具体地,可以分析代码的安全处理手段,包括格式过滤和内容转义,格式过滤包括用户自定义的白名单以及过滤函数,内容转义包括比较成熟的渲染框架的处理,从而生成第二正报误报数据集。将所述第一正报误报数据集与所述第二正报误报数据集进行融合,生成正报误报数据集。第二正报误报数据集可以对正报误报数据集中的误报数据进行扩充。对于一漏洞程序切片,其在第一正报误报数据集和第二正报误报数据集中的至少一个为误报的情况下,该漏洞程序切片在最终的正报误报数据集中的标签即为误报。对于一漏洞程序切片,其在第一正报误报数据及和第二正报误报数据集中均为正报的情况下,该漏洞程序切片在最终的正报误报数据集中的标签即为误报。通过上述方式,采取循环迭代的误报数据库,并结合自身的格式过滤和内容转义两项内容,实现了误报标签的及时扩增更新和误报率的降低,持续提升自动识别误报能力。
88.在本说明书一些实施例中,所述标签集合中的标签包括:有误报历史记录的误报类型、有误报历史记录的正报类型、无误报历史记录的正报类型;相应的,利用支持向量机算法对所述特征向量集合和所述标签集合进行机器学习,输出目标误报模型,包括:利用支持向量机算法对所述有误报历史记录的误报类型对应的特征向量与所述有误报历史记录的正报类型对应的特征向量进行对比学习;利用支持向量机算法对所述有误报历史记录的
误报类型对应的特征向量与所述无误报历史记录的正报类型对应的特征向量进行对比学习。
89.考虑到报告漏洞集及其相关源代码的分类特征提取与后续机器学习的准确度联系密切,本实施例中结合误报数据库中误报漏洞问题进行分类,以得在所属漏洞问题类型下有无误报的漏洞问题,从而在后续机器学习中某个漏洞问题类型下有三类的数据信息(在历史误报记录下的为误报或正报漏洞的两类与未有历史误报记录的正报漏洞问题一类)。因此,本方案将正报的特征向量分为两类:一类是有误报记录的正报特征向量,另一类是没有误报记录的正报特征向量。在机器学习时,将有误报记录的误报特征向量分别与有误报记录的正报特征向量以及无误报记录的正报特征向量进行对比,以获取更多的对比信息,从而提高机器学习的准确度。
90.在本说明书一些实施例中,在基于所述扫描分析报告和所述误报结果报告,生成漏洞检测报告之后,还可以包括:基于所述漏洞检测报告对历史误报数据库进行更新;所述历史误报数据库中包括误报的漏洞问题数据和正报的漏洞问题数据。
91.具体地,在生成漏洞检测报告之后,可以基于所述漏洞检测报告对历史误报数据库进行更新。所述历史误报数据库中包括误报的漏洞问题数据和正报的漏洞问题数据。本实施例中的误报数据库不仅仅依赖于最初的历史数据库,而是采用了循环迭代的数据库,即静动态综合的误报数据来源,从而达到误报数据库的数据实时更新,以提高特征提取的精准度和误报标签的丰富度。
92.本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。具体的可以参照前述相关处理相关实施例的描述,在此不做一一赘述。
93.上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
94.下面结合一个具体实施例对上述方法进行说明,然而,值得注意的是,该具体实施例仅是为了更好地说明本说明书,并不构成对本说明书的不当限定。
95.本说明书实施例公开了一种降低源代码检测误码率的漏洞检测方法,以协助于开发者降低时间成本和提高软件健壮性或提供给代码审计委托方简明、能有效修改的报告。请参考图2,示出了本具体实施例中的漏洞检测方法的整体流程图。具体流程可如图2所示,本实施例中的漏洞检测方法包括以下步骤。
96.步骤一:生成扫描分析报告。
97.通过任一静态源代码漏洞检测工具对程序源代码开展扫描分析工作,从而生成扫描分析报告。
98.步骤二:生成结构化数据集
99.第一步:确定切片准则。本实施例采取的切片准则为四类漏洞语法特征(库/api函数调用、数组使用、指针使用或表达式定义,在切片过程中有函数声明,分支控制语句时保留代码的语法结构。
100.第二步:构造程序依赖图(program dependence graph,pdg)。
101.第三步:对pdg中主函数调用其他副函数的信息进行相关补充完善,生成跨函数的pdg,打破切片的函数孤岛。同时对跨函数的pdg的各个点进行数字序号标记,以便后续切片的生成。
102.第四步:结合切片准则获得待切漏洞点及其依赖关系点。控制依赖主要针对于三种语句:条件判断、循环和开关。数据依赖则聚焦于程序中的某个变量是否会被其他点影响,主要分为变量的赋值和读取。由于控制依赖和数据依赖关注的语句不同,从而与待切漏洞点相关的控制依赖和数据依赖的路径会有较大差异,故采用两种控制和数据依赖不同分析顺序的分析方法来分别获得路径1和2。
103.路径1是先数据依赖分析后控制依赖分析:对待切漏洞点的数据依赖中的变量赋值和读取进行前后向分析,并在结果中加入控制依赖的点。这样的路径分析方法使得待切漏洞点拥有全面化的数据依赖点,而控制依赖点存在部分丢失的可能性。
104.路径2是先控制依赖分析后数据依赖分析:对控制依赖语句中三个语句进行前后向分析,并在结果中加入数据依赖的点。这样的路径分析方法使得待切漏洞点拥有全面化的控制依赖点,而数据依赖点存在部分丢失的可能性。
105.第六步:为了最终的可疑漏洞路径程序切片中待切漏洞点的依赖关系点全面化,仅仅选取控制依赖和数据依赖能够互相印证的点是不充足的,故本实施例对两条路径分析的方法进行融合校正得到最终可疑漏洞路径。
106.第七步:结合待切漏洞点与其最终可疑漏洞路径,可生成可疑漏洞路径程序切片。
107.第八步:结合静态扫描的报告漏洞集,选取漏洞的全部可疑路径切片,组成待测漏洞切片集。
108.本实施例对两条路径进行融合校正生成最终路径,使之待切漏洞点的相关控制依赖和数据依赖点均具有全面化的特点。融合校正是对两条路径中的与待切漏洞点存在依赖关系的点的差异性进行相应的处理,处于相同位置的数据依赖点与控制依赖点直接合并为一个点即可;对于不同位置的数据点与控制依赖点则都存入最终路径中。
109.设路径1中的数据依赖点和控制依赖点分别有a1和a2个,路径2中的数据依赖点和控制依赖点分别有b1和b2个。
110.请参考图4,示出了本说明书一实施例中的源代码漏洞检测方法中两个路径融合的流程图。如图4所示,融合校正可以包括以下步骤。
111.第一步:路径1中的与待切漏洞点存在数据依赖的点d
1i
和控制依赖点c
2m
,i∈a1,m∈a2;路径1中的与待切漏洞点存在控制依赖的点c
1j
和数据依赖点d
2n
,j∈b1,n∈b2。
112.第二步:判断d
1i
与d
2n
位置是否相同,相同转第三步,否则转第四步;判断c
1j
与c
2m
的位置是否相同,相同转第三步,否则转第四步。由于跨函数的pdg的各个点已进行数字序号标记,从而d
1i
与d
2n
,c
1j
与c
2m
均对应着跨函数pdg的点的序号,从而可以根据其进行判断。若在跨函数pdg的点的序号是一致的,则表示位置是相同的。
113.第三步:d
1i
与d
2n
合并为一点并记为sk;c
1j
与c
2m
合并为一点记为so。
114.第四步:未合并的d
1i
标记为s
p
;未合并的c
1j
标记为sq。由于路径1的数据依赖点是全面的,故路径2中的数据依赖点是路径1的一部分,故未合并的数据依赖点是d
1i
。c
1j
同理。
115.第五步:判断sk与so的位置是否相同,相同转第六步,否则转第七步。由于跨函数
pdg是把数据依赖和控制依赖合二为一,故存在某个点拥有两个特性,从而合并的sk与so也需进行位置的判断进行再合并。位置相同与否的判断方式同第二步。
116.第六步:相同位置的sk与so合并一个点记为sr。
117.第七步:未能合并的sk与so记为s
s1
与s
s2

118.第八步:由第四步的s
p
与sq,第六步的sr和第七步s
s1
与s
s2
共同组成待切漏洞点的全部依赖点。
119.第九步:根据待切漏洞点及其全部依赖点构成最终的可疑漏洞路径。
120.步骤三:训练误报识别模型。
121.请参考图5,示出了本说明书一实施例中的源代码漏洞检测方法中机器学习数据准备的流程图,如图5所示,包括以下步骤。
122.第一步:结合历史误报数据库对报告漏洞集进行分类。结合误报数据库中误报漏洞问题名称(如sql注入、跨站脚本等),在漏洞问题类型下进行分类成在所属漏洞问题类型下有无误报的漏洞问题。
123.第二步:对报告漏洞集相关的漏洞源代码进行抽象语法树ast和程序依赖图pdg的提取,以获取语法特征和语义特征。
124.结合误报数据库中误报漏洞问题名称,漏洞问题类型下有误报的漏洞问题进行跨函数程序依赖图pdg的提取。相较于无误报漏洞问题的程序依赖图pdg,有误报漏洞问题的跨函数程序依赖图pdg补充函数中调用其他函数的相关信息,以生成更加精准化的特征向量,挖掘出误报漏洞的某些代码特征,从而提高机器学习识别误报的能力。
125.第三步:对抽象语法树ast和跨函数的程序依赖图pdg分别进行语法和语义特征向量的提取,特征向量的提取可选用相关表征算法,如graph2vec。
126.第四步:结合语法特征向量和语义特征向量作为报告漏洞集中各漏洞问题的特征集合。
127.第五步:结合历史误报数据库对报告漏洞集相关的源代码进行匹配生成第一正报和误报数据集。
128.第六步:结合程序依赖图pdg(误报漏洞问题是跨函数的pdg),对报告漏洞集相关的漏洞源代码进行数据流分析,分析代码的安全处理手段,包括格式过滤和内容转义从而生成第二正报和误报数据集。
129.第七步:结合第五步和第六步,生成正报和误报数据集。
130.第八步:通过误报数据集获得相对应的误报标签。
131.第九步:漏洞误报标签对报告漏洞集中的漏洞问题进行自动识别标记。
132.第十步:将报告漏洞集中已被误报标签标记的漏洞问题特征集合与未标记的漏洞问题特征集合一起输入到机器学习中以进行分类学习。
133.本实施例采用支持向量机svm(support vector machine)算法进行机器学习。相关数学软件的自带学习工具箱中存在svm分类器,如matlab。
134.svm算法分类的基本原理是,首先在输入的特征空间内进行一个超平面的搜索,这个超平面的特点是可根据最大边界条件来对标签数据进行最优划分。若给定一组特征ai,标签值为bi∈{-1,1},则svm则是承担求解一个超平面s的责任,该超平面求解是严格的凸优化问题,如公式(1),通过一个鲁棒性的分类方法来对正则项||s||2加权,当预测标签ait
s-r符号为正时,i为0,当符号为负时,呈线性增长,故拥有一个唯一解的目标能够实现。
[0135][0136]
机器学习完成后即可生成误报模型,但由于机器学习模型的训练是十分消耗时间,故可将此次生成的误报模型存储下来以应用于下次的误报漏洞扫描。
[0137]
本实施例的误报数据库不仅仅依赖于最初的历史数据库,而是采用了循环迭代的数据库,即静动态综合的误报数据来源,从而达到误报数据库的数据实时更新,以提高特征提取的精准度和误报标签的丰富度。
[0138]
步骤四:误报漏洞识别与输出报告
[0139]
将步骤二中获取的待测漏洞切片集输入至步骤三中训练好的误报模型中进行检测,得到误报结果报告,基于扫描分析报告和误报结果报告,生成漏洞检测报告。
[0140]
本实施例的预设切片准则为库/api函数调用、数组使用、指针使用或表达式定义,在切片过程中有函数声明,分支控制语句时保留代码的语法结构。因此,代码切片既保留了代码语义信息又展现了代码的语法结构,故此结构化数据集更加完整、准确。
[0141]
本实施例融合了两种可疑漏洞路径方法来构造代码切片,同时结合扫描报告漏洞集中漏洞信息尽可能筛选出漏洞误报查验所需的全部相关源代码,为漏洞误报识别奠定夯实的数据基础。
[0142]
本实施例采用了新的分类特征提取和误报标签生成方法。标签集为有误报历史记录的误报类型、有误报历史记录的正报类型、无误报历史记录的正报类型,提高了机器学习甄别真假漏洞的准确度。对于误报标签生成,传统生成方法仅依据历史误报数据库,且未结合自身特点,从而误报标签不丰富,本方案采取循环迭代的误报数据库,实现了误报标签的及时扩增更新,持续提升自动识别误报的准确性。
[0143]
本实施例在特征向量提取阶段,对程序切片分别生成抽象语法树和程序依赖图(跨函数的程序依赖图),分别提取代码的语义特征和语法特征向量,从而生成更加精准的特征向量集。
[0144]
本实施例增加了对代码中安全处理的检测,如格式过滤和内容转义的处理,通过检测代码中安全处理方式,筛选出部分误报的漏洞,提高了自动校正识别的准确性。
[0145]
基于同一发明构思,本说明书实施例中还提供了一种源代码漏洞检测装置,如下面的实施例所述。由于源代码漏洞检测装置解决问题的原理与源代码漏洞检测方法相似,因此源代码漏洞检测装置的实施可以参见源代码漏洞检测方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。图6是本说明书实施例的源代码漏洞检测装置的一种结构框图,如图6所示,包括:接收模块601、切片模块602、筛选模块603和检测模块604,下面对该结构进行说明。
[0146]
接收模块601用于接收漏洞检测请求;所述漏洞检测请求中携带有待检测程序源代码和扫描分析报告;所述扫描分析报告是利用静态漏洞检测工具对所述待检测程序源代码扫描得到的;所述扫描分析报告中包括报告漏洞集。
[0147]
切片模块602用于根据预设切片准则对所述待检测程序源代码进行程序切片,得
到多个程序切片。
[0148]
筛选模块603用于基于所述报告漏洞集,从所述多个程序切片中筛选出对应的漏洞程序切片。
[0149]
检测模块604用于将所述漏洞程序切片和所述漏洞程序切片对应的漏洞类型输入至目标误报模型中,输出误报结果报告;基于所述扫描分析报告和所述误报结果报告,生成漏洞检测报告;所述漏洞检测报告中包括误报的漏洞问题数据和正报的漏洞问题数据。
[0150]
在本说明书一些实施例中,切片模块具体用于:对所述待检测程序源代码进行代码分析,构造对应的程序依赖图;对所述程序依赖图进行函数调用分析,生成跨函数的程序依赖图;基于所述程序依赖图、所述跨函数的程序依赖图和所述预设切片准则,对所述待检测程序源代码进行程序切片,得到多个程序切片。
[0151]
在本说明书的一些实施例中,所述程序依赖图和所述跨函数的程序依赖图包括控制流图和数据依赖图;相应的,基于所述程序依赖图、所述跨函数的程序依赖图和所述预设切片准则,对所述待检测程序源代码进行程序切片,得到多个程序切片,包括:根据所述预设切片准则,确定所述待检测程序源代码对应的待切漏洞点;基于所述控制流图中的控制依赖关系和所述数据依赖图中的数据依赖关系,确定所述待切漏洞点对应的目标可疑漏洞路径;所述目标可疑漏洞路径中包括所述待切漏洞点对应的依赖关系点;结合所述待切漏洞点与所述目标可疑漏洞路径,生成可疑漏洞路径程序切片。
[0152]
在本说明书的一些实施例中,基于所述控制流图中的控制依赖关系和所述数据依赖图中的数据依赖关系,确定所述待切漏洞点对应的目标可疑漏洞路径,包括:针对所述待切漏洞点按照先数据依赖关系后控制依赖关系的顺序对所述待检测程序源代码进行分析,生成第一可疑漏洞路径;针对所述待切漏洞点按照先控制依赖关系后数据依赖关系的顺序对所述待检测程序源代码进行分析,生成第二可疑漏洞路径;将所述第一可疑漏洞路径与所述第二可疑漏洞路径进行融合,得到目标可疑漏洞路径。
[0153]
在本说明书的一些实施例中,所述目标误报模型是通过以下步骤得到的:获取批量的程序源代码;对所述批量的程序源代码中各程序源代码进行静态扫描和程序切片,以得到漏洞程序切片集合;基于历史误报数据库,对所述漏洞程序切片集合进行分析,得到正报误报数据集;所述历史误报数据库中包括误报的漏洞问题数据和正报的漏洞问题数据;对所述漏洞程序切片集合进行特征提取,得到特征向量集合;利用所述正报误报数据集确定所述特征向量集合中各特征向量的标签,得到所述特征向量集合对应的标签集合;利用支持向量机算法对所述特征向量集合和所述标签集合进行机器学习,输出目标误报模型。
[0154]
在本说明书的一些实施例中,对所述漏洞程序切片集合进行特征提取,得到特征向量集合,包括:对所述漏洞程序切片集合中的漏洞程序切片进行抽象语法树的提取,以获取语法特征向量;基于所述正报误报数据集确定所述漏洞程序切片集合中属于误报类型的漏洞程序切片和属于正报类型的漏洞程序切片;对属于误报类型的漏洞程序切片进行跨函数的程序依赖图的提取,得到语义特征向量;对属于正报类型的漏洞程序切片进行程序依赖图的提取,得到语义特征向量;基于语法特征向量语义特征向量,生成所述漏洞程序切片集合对应的特征向量集合。
[0155]
在本说明书的一些实施例中,基于历史误报数据库,对所述漏洞程序切片集合进行分析,得到正报误报数据集,包括:利用历史误报数据库,对所述漏洞程序切片集合中的
漏洞程序切片进行匹配,得到第一正报误报数据集;对所述漏洞程序切片集合中的漏洞程序切片进行数据流分析,得到第二正报误报数据集;将所述第一正报误报数据集与所述第二正报误报数据集进行融合,生成正报误报数据集。
[0156]
在本说明书的一些实施例中,所述标签集合中的标签包括:有误报历史记录的误报类型、有误报历史记录的正报类型、无误报历史记录的正报类型;相应的,利用支持向量机算法对所述特征向量集合和所述标签集合进行机器学习,输出目标误报模型,包括:利用支持向量机算法对所述有误报历史记录的误报类型对应的特征向量与所述有误报历史记录的正报类型对应的特征向量进行对比学习;利用支持向量机算法对所述有误报历史记录的误报类型对应的特征向量与所述无误报历史记录的正报类型对应的特征向量进行对比学习。
[0157]
在本说明书一些实施例中,该装置还可以包括:更新模块,用于基于所述漏洞检测报告对历史误报数据库进行更新;所述历史误报数据库中包括误报的漏洞问题数据和正报的漏洞问题数据。
[0158]
从以上的描述中,可以看出,本说明书实施例实现了如下技术效果:在获取到待检测程序源代码以及对应的包括报告漏洞集的扫描分析报告之后,可以对待检测程序源代码进行程序切片,结合报告漏洞集从程序切片中筛选出漏洞程序切片,并将漏洞程序切片和切片对应的漏洞类型输入至目标误报模型中,输出误报结果报告,误报结果报告中可以包括误报的漏洞程序切片及其对应的漏洞数据,之后,可以将误报结果报告与扫描分析报告结合,得到包含误报的漏洞问题数据和正报的漏洞问题数据的漏洞检测报告。上述方案中,通过训练好的目标误报模型对扫描分析报告中的漏洞集中的漏洞问题数据进行误报分析,确定出误报的漏洞问题数据和正报的漏洞问题数据,可以提高漏洞检测的准确率和效率,进而提高源代码开发的效率。
[0159]
本说明书实施方式还提供了一种计算机设备,具体可以参阅图7所示的基于本说明书实施例提供的源代码漏洞检测方法的计算机设备组成结构示意图,所述计算机设备具体可以包括输入设备71、处理器72、存储器73。其中,所述存储器73用于存储处理器可执行指令。所述处理器72执行所述指令时实现上述任意实施例中所述的源代码漏洞检测方法的步骤。
[0160]
在本实施方式中,所述输入设备具体可以是用户和计算机系统之间进行信息交换的主要装置之一。所述输入设备可以包括键盘、鼠标、摄像头、扫描仪、光笔、手写输入板、语音输入装置等;输入设备用于把原始数据和处理这些数的程序输入到计算机中。所述输入设备还可以获取接收其他模块、单元、设备传输过来的数据。所述处理器可以按任何适当的方式实现。例如,处理器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(application specific integrated circuit,asic)、可编程逻辑控制器和嵌入微控制器的形式等等。所述存储器具体可以是现代信息技术中用于保存信息的记忆设备。所述存储器可以包括多个层次,在数字系统中,只要能保存二进制数据的都可以是存储器;在集成电路中,一个没有实物形式的具有存储功能的电路也叫存储器,如ram、fifo等;在系统中,具有实物形式的存储设备也叫存储器,如内存条、tf卡等。
[0161]
在本实施方式中,该计算机设备具体实现的功能和效果,可以与其它实施方式对
照解释,在此不再赘述。
[0162]
本说明书实施方式中还提供了一种基于源代码漏洞检测方法的计算机存储介质,所述计算机存储介质存储有计算机程序指令,在所述计算机程序指令被执行时实现上述任意实施例中所述源代码漏洞检测方法的步骤。
[0163]
在本实施方式中,上述存储介质包括但不限于随机存取存储器(random access memory,ram)、只读存储器(read-only memory,rom)、缓存(cache)、硬盘(hard disk drive,hdd)或者存储卡(memory card)。所述存储器可以用于存储计算机程序指令。网络通信单元可以是依照通信协议规定的标准设置的,用于进行网络连接通信的接口。
[0164]
在本实施方式中,该计算机存储介质存储的程序指令具体实现的功能和效果,可以与其它实施方式对照解释,在此不再赘述。
[0165]
显然,本领域的技术人员应该明白,上述的本说明书实施例的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本说明书实施例不限制于任何特定的硬件和软件结合。
[0166]
应该理解,以上描述是为了进行图示说明而不是为了进行限制。通过阅读上述描述,在所提供的示例之外的许多实施方式和许多应用对本领域技术人员来说都将是显而易见的。因此,本说明书的范围不应该参照上述描述来确定,而是应该参照前述权利要求以及这些权利要求所拥有的等价物的全部范围来确定。
[0167]
以上所述仅为本说明书的优选实施例而已,并不用于限制本说明书,对于本领域的技术人员来说,本说明书实施例可以有各种更改和变化。凡在本说明书的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本说明书的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1