# vulcnn **Repository Path**: QISANSAN/vulcnn ## Basic Information - **Project Name**: vulcnn - **Description**: VulCNN: An Image-inspired Scalable Vulnerability Detection System - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2022-07-29 - **Last Updated**: 2025-01-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## VulCNN VulCNN: An Image-inspired Scalable Vulnerability Detection System [中文](./readme-cn.md) | [English](./readme-en.md) #### Step 1: 代码规范化 使用normalization.py对漏洞代码进行规范化处理。 ``` # 以下参数是必要的: # -i, --input 待标准化输入数据的文件夹路径,包含一组.c文件 # -o, --output 标准化后数据的输出文件夹路径,包含一组经过标准化的.c文件 python ./normalization.py -i ./data/sard -o ./data/sard-nomalized ``` #### Step 2: joern生成pdg 使用joern生成漏洞代码对应的pdg(需配置好joern环境,请参考[joern](https://github.com/joernio/joern)) ``` # 先生成bins, 输出为.bin文件 python joern_graph_gen.py -i ./data/sard-nomalized -o ./data/sard-bins -t parse # 然后生成pdgs, 输出为.dot文件 python joern_graph_gen.py -i ./data/sard-bins -o ./data/sard-pdgs -t export -r pdg ``` #### Step 3 训练sent2vec模型 参考[sent2vec](https://github.com/epfml/sent2vec#train-a-new-sent2vec-model) ``` # 将待训练的文本整合为一个data.txt文件,输出data_model.bin模型文件,本项目中维度设置为128 ./fasttext sent2vec -input ./data/data.txt -output ./data/data_model -minCount 8 -dim 128 -epoch 9 -lr 0.2 -wordNgrams 2 -loss ns -neg 10 -thread 20 -t 0.000005 -dropoutK 4 -minCountLabel 20 -bucket 4000000 -maxVocabSize 750000 -numCheckPoints 10 ``` (p.s. 我用sard数据集训练的sard_model.bin文件在[这里获取|百度网盘](https://pan.baidu.com/s/1i4TQP8gSk5_0WlD34yDHwg?pwd=6666)或者 [这里获取|google云盘](https://drive.google.com/file/d/1p4X4PH9tqFbKByTHGnUiIwtjvmYL8VsL/view?usp=share_link)) #### Step 4: pdg提取中心性等特征生成图数据 使用ImageGeneration.py生成漏洞代码对应的图(rgb三通道), 输出为pkl文件 ``` # 以下参数是必要的: # -i, --input 待输入pdg数据的文件夹路径,包含一组.dot文件 # -o, --output 图数据的输出文件夹路径,包含一组经过.pkl文件 # -m, --model 第三步中训练生成的模型的路径 python ImageGeneration.py -i ./data/sard-pdgs -o ./data/sard-outputs -m ./data/data_model.bin ``` #### Step 5: 图数据整合并划分训练集和测试集 使用generate_train_test_data.py整合图数据, 输出为整合后的train.pkl和test.pkl文件 ``` # 直接使用代码需要在sard-outputs文件夹下设置,分别包含漏洞和非漏洞的.pkl文件,如果采用其他方式则修改相应代码即可 # 以下参数是必要的: # -i, --input 待输入pkl数据的文件夹路径,包含Vul和No-Vul两个文件夹,文件夹下分别包含一组有漏洞/无漏洞的.pkl文件 # -o, --output 整合和划分训练集和测试集后的输出文件夹路径,包含一个总数据集all_data.pkl, 一个训练数据集train.pkl和一个测试数据集test.pkl文件 # -n, --num n表示kfold的数量,即n=10则按照9:1划分训练集和测试集,进行10组, n=5则按照4:1划分训练集和测试集,进行5组 python generate_train_test_data.py -i ./data/sard-outputs -o ./data/sard-pkl -n 5 ``` #### Step 5: 使用CNN进行训练 使用CNN模型进行训练 ``` # 以下参数是必要的: # -i, --input 待输入数据集的文件夹路径,需包含train.pkl和test.pkl两个文件夹 # -o, --output 输出结果文件夹路径 # -n, --num kfold的数量与步骤4中保持一致 # 以下参数是可选的: # -e, --epoch 训练轮数,默认100 # -d, --dim 向量维度,与步骤3中保持一致,默认128 python VulCNN.py -i ./data/sard-pkl -o ./data/sard-result -n 5 -e 100 -d 128 ```