目录
1、准备阶段
2、生成实验数据的CFG图
3、生成实验数据的PDG图
4、生成实验数据的调用图
5、获取四种类型的SyVCs
6、提取SeVCs
7、获取漏洞的代码行号
8、给切片打标签
9、将标签写入切片
1、准备阶段
实验数据我只用这些:
(1)NVD
(2)NVD_diff
将实验数据放在/home/test/source2slice目录下
删除.joernIndex文件
将实验数据导入joern
开启neo4j数据库
2、生成实验数据的CFG图
mkdir cfg_db
python2 get_cfg_relation.py
运行文件的结果:
(1)会针对NVD中的每个实验数据,都会生成相应的文件夹;
(2)每一个文件夹下,有三个pkl文件,分别为cfg.pkl、dict_cfgnode2if.pkl、dict_if2cfgnode.pkl
cfg.pkl中保存的是函数CFG图的边,另外两个文件目前不清楚作用。
3、生成实验数据的PDG图
mkdir pdg_db
python2 complete_PDG.py
运行结果:
(1)会生成每个实验数据对应的pkl文件
(2)以第一个pkl文件为例,可以看到文件中包含的是pdg图相应的边信息。
另外,以10这个节点为例,其实pkl文件中的边是经过选择了的,也就是说neo4j数据库中保存着程序的PDG图,但是有一些冗余的信息需要处理。
4、生成实验数据的调用图
mkdir dict_call2cfgNodeID_funcID
python2 access_db_operate.py
运行结果:
(1)生成一个dict.pkl文件
(2)打开该pkl文件
这里打开文件,里面没东西,可能是文件数太少,没有调用关系,这里还有待深究。
5、获取四种类型的SyVCs
python2 points_get.py
运行结果:
(1)在source2slice目录下生成四种SyVCs相对应得pkl文件:
- sensifunc_slice_points.pkl
- pointuse_slice_points.pkl
- arrayuse_slice_points.pkl
- integeroverflow_slice_points_new.pkl
(2)查看文件里是啥
1)sensifunc_slice_points.pkl
以sensifunc_slice_points.pkl文件为例,里面保存的是符号函数调用漏洞的一些危险函数,以及其在图数据库中的信息。
以(['100'],'86','strcpy')为例,100是strcmp所在语句节点的编号,86是strcmp所在的函数的编号。
其余三个文件中得内容,也差不多。
2)pointuse_slice_points.pkl
3)arrayuse_slice_points.pkl
4)integeroverflow_slice_points_new.pkl
6、提取SeVCs
mkdir -pv C/test_data/4
python2 extract_df.py
运行结果:
(1)生成四种漏洞类型对应的SeVCs
(2)以api_alices.txt为例,打开该文件:
以strcpy为例,可以看到,生成了strcpy的切片,并且每一句后面都表明了该行代码在文件中的行数。
7、获取漏洞的代码行号
首先,dealfile.py文件需要做以下修改:
python2 dealfile.py
运行结果:
(1)在source2slice文件下,会生成一个vul_context_func.pkl文件;
(2)这个文件里保存:通过对比diff文件,以论文中提到的漏洞认定标准,找到有漏洞的文件中危险语句的行数。
以CVE_2004_1151_PATCHED_sys32_ni_syscall.c文件为例:
对应的diff文件,保存了CVE_2004_1151_PATCHED_sys32_ni_syscall.c的危险语句,即第4、5、6、7、8行语句。
生成的vul_context_func.pkl中,保存的就是这些危险语句在原文件中的位置。
8、给切片打标签
对源文件做以下更改:
(1)修改路径:切片文件、标签文件以及vul_context_func.pkl文件
(2)获取key的时候,如下图一样更改。
python2 make_label_nvd.py
运行结果:
(1)在./C/label_data/目录下,生成四种SyVCs对应的标签文件
(2)以api_slices_label.pkl文件为例,可以看到文件中对每一个切片文件都做了标签,0代表该切片没有漏洞;1代表该切片有漏洞。
9、将标签写入切片
对原文件做以下修改:
python2 data_preprocess.py
运行结果:
(1)在./slice_label文件下,产生了四种SyVCs对应的txt文件,其实这四个文件就是李珍老师github上给的四个txt文件。
(2)查看标签是否与李珍老师给的一样,这里仅以一个被标记为0的api切片和一个被标记为1的api切片为例:
1)标记为0的api切片
2)标记为1的api切片
综上,生成了四种SyVCs切片文件,且都打了标签。下一步将进行切片的向量化。