当前位置: 首页 > 专利查询>四川大学专利>正文

一种基于上下文边关系的改进源码切片方法技术

技术编号:39665701 阅读:9 留言:0更新日期:2023-12-11 18:29
本发明专利技术公开了一种基于上下文边关系的改进源码切片方法,可以识别更多的切点,针对同一个切点,改进的切片方法也能提取更多漏洞相关的代码行,提升样本数据集的数量

【技术实现步骤摘要】
一种基于上下文边关系的改进源码切片方法


[0001]本专利技术涉及源代码漏洞检测技术等领域,具体的说,是一种基于上下文边关系的改进源码切片方法


技术介绍

[0002]伴随着计算机技术的发展,众多应用程序在生活的各个领域得到广泛的部署和应用

但大多软件均是在已有的框架

模块上二次开发,开发过程中存在着开发流程不规范,开发周期短等问题,导致相似的漏洞广泛存在于不同的软件中

近年来,公开的漏洞呈逐年激增的趋势,大量软件安全事故的发生给用户和系统带来了无法弥补的损失

[0003]针对漏洞泛滥的问题,有研究者提出使用深度学习建立漏洞源代码漏洞检测模型,在开发周期中部署检测模型,在代码开发中着重考虑安全问题,实现“安全左移”,减小后续修复漏洞的成本

[0004]目前在源代码漏洞检测的研究领域中,常将源码转换成图表示,使得源码的某些特征显式地展现在图中

最常用的图表示是程序依赖图
(Program Dependency Graph, PDG)。
[0005]在具体实现中,生成
PDG
的主流方式是从
Joern
工具生成的代码属性图
(Code Property Graph)
中提取
REACHES(
数据依赖
)

CONTROLS(
控制依赖
)
两种边构建
PDG
,显式地展现源码间不同代码行的数据依赖和控制依赖关系

[0006]为了从测试代码中生成训练样本,需要从源码中识别容易造成漏洞的代码行作为切点

在得到切点后,几乎所有的研究都使用前向与后向切片技术
(Forward and Backward Slicing)
缩小源码规模,只选择与切点高度相关的代码行构成不同的切片

每个切片就是一个样本,在向量化后送入模型进行训练

但是这样方法生成的切片存在数据量有限,数据集不平衡,切片质量不高等问题

此外,由于前向切片与后向切片往往会对图进行深度优先遍历选择相应的代码行,这会导致下游图卷积网络的卷积层数往往较大,使得整个模型的计算量偏大,模型的训练时间较长,功耗较大

数据集的质量严重限制了模型的检测性能


技术实现思路

[0007]本专利技术的目的在于提供一种基于上下文边关系的改进源码切片方法,可以识别更多的切点,针对同一个切点,改进的切片方法也能提取更多漏洞相关的代码行,提升样本数据集的数量

质量,平衡正负样本数量,提高下游源代码漏洞检测任务的模型性能

特别地,如果下游任务使用图卷积网络,在达到相近模型性能的前提下,本方法还能够极大地减少模型训练所需计算量和所花费的时间

[0008]本专利技术通过下述技术方案实现:一种基于上下文边关系的改进源码切片方法,包括下述步骤:1)源码的初步解析:使用
joern
工具的
joern

parse
模块初步解析源码文件,得到对应的
CPG

2
)生成
PDG
:从
CPG
中提取所有代码行的结点,再提取包含这些结点且类型为“REACHES”与“CONTROLS”的边,构成
PDG
;3)提取切点:根据切点类型,从
PDG
中选择对应切点类型的代码行作为切点;4)切片:对于每个切点,提取与漏洞高度相关的代码行,形成最终切片;5)追加变量声明语句:追加相关的变量声明语句到最终切片中;6)匿名化用户变量:以一般的形式替换源码中用户定义的变量和函数名;这个操作可以消除类似功能但名称不同的变量与函数对模型学习造成的干扰

[0009]7)打标签:根据每个切片是否含有漏洞行,将每个切片标记为1(含有漏洞的切片)或者为0(不含漏洞的切片);8)持久化保存:以
json
形式保存到本地,作为模型训练的数据集

包括的字段有:
keyLine
:一个数字,对应本切片的切点的代码行;
nodes

lineNo
:一个列表,其中包含了本切片选择所有的代码行;
edges

No
:一个列表,以结点对的形式存储本切片所选择的代码行之间存在的边;
nodes

line
:一个列表,包含每个代码行的文本内容;
nodes

line

sym
:一个列表,包含每个代码行匿名化后的文本内容;
function_name
:字符串,表名本切点所属的函数名;
criterionType
:字符串,表名本切片的切点类型;
target
:数字,表名此切片是否包含漏洞行;0为不包含,1为包含;
testcaseID:
数字,可以唯一表示本切片

[0010]进一步为更好地实现本专利技术所述的一种基于上下文边关系的改进源码切片方法,特别采用下述设置方式:所述步骤1)具体为:对于每一个源码文件,都会生成对应的
CPG

joern
工具使用
csv
文件格式表示
CPG
的图结构,每个
CPG
分别用
nodes.csv
表示图结构中存在的结点和
edges.csv
描述不同结点之间存在的关系;
nodes.csv

key

code

type

location
等字段

其中,
key
是每个结点唯一的标识,
code
是对应代码行的代码文本形式,
type
是此结点的类型,如果这个结点是在代码行粒度上的结点,此结点
location
字段会标明其所属的代码行
。edges.csv
只有三个字段,分别为
start, end, type

var。start

end
分别用
nodes.csv

key
字段分别指明本条边的开始和终止结点
。Type
字段表名连接这两个结点的边的类型

如果边的类型是是数据依赖,
var
字段会指明对应此数据依赖对应变量的标识符,其他类型的边
var
本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.
一种基于上下文边关系的改进源码切片方法,其特征在于:包括下述步骤:1)源码的初步解析:使用
joern
工具的
joern

parse
模块初步解析源码文件,得到对应的
CPG
;2)生成
PDG
:从
CPG
中提取所有代码行的结点,再提取包含这些结点且类型为“REACHES”与“CONTROLS”的边,构成
PDG
;3)提取切点:根据切点类型,从
PDG
中选择对应切点类型的代码行作为切点;4)切片:对于每个切点,提取与漏洞高度相关的代码行,形成最终切片;5)追加变量声明语句:追加相关的变量声明语句到最终切片中;6)匿名化用户变量:以一般的形式替换源码中用户定义的变量和函数名;7)打标签:根据每个切片是否含有漏洞行,将每个切片标记为1或者为0;8)持久化保存:以
json
形式保存到本地,作为模型训练的数据集
。2.
根据权利要求1所述的一种基于上下文边关系的改进源码切片方法,其特征在于:所述步骤1)具体为:对于每一个源码文件,都会生成对应的
CPG

joern
工具使用
csv
文件格式表示
CPG
的图结构,每个
CPG
分别用
nodes.csv
表示图结构中存在的结点和
edges.csv
描述不同结点之间存在的关系
。3.
根据权利要求2所述的一种基于上下文边关系的改进源码切片方法,其特征在于:所述步骤2)具体为:
2.1
)对于每组
nodes.csv

edges.csv
,提取
nodes.csv
中表示代码行的结点;
2.2
)记提取出的表示代码行的结点的集合为
nodes_list
;其中,所述表示代码行的结点的
location
字段会有内容指明所属代码行,而非表示代码行的结点的
location
字段为空;
2.3
)再从
edges.csv
选择
start

key
中均出现在
nodes_list
中,且
type

REACHES

CONTROLS
的边,记提取出的边的集合为
edges_list

2.4
)而后由
nodes_list

edges_list
共同构成
PDG
;其中,结点是源码中的每一行代码,而边是不同代码行之间的数据依赖和控制依赖关系
。4.
根据权利要求2所述的一种基于上下文边关系的改进源码切片方法,其特征在于:所述切点类型包括
SensiCall
类型,
operator
类型,
...

【专利技术属性】
技术研发人员:胡勇张毓林
申请(专利权)人:四川大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1