Automated Vulnerability Detection in Source Code Using Deep Representation Learning
ICMLA18
https://blog.csdn.net/weixin_40400177/article/details/103540916 (相关的机器学习与源代码建模)
本文主要是利用CNN网络直接对函数源代码进行特征提取,然后根据这些来对漏洞函数进行识别。
数据清理部分:
-
去除函数中所有的注释
-
将函数中的所有标识符进行归一化处理。
2.1 对于常量的处理。单个字符,字符串,浮点数分别用相应的类型进行替换。对于整数型的常量,进行逐位次的切分。(对于整数型的怎么逐位次的切分而且这样切分的意义)
2.2 对于标识符的处理。即函数中的变量和其它的函数名。对于这些函数名和变量都有自己相应的类型,将这些标识符与相应的类型进行替换(单个字符,字符串,浮点数)。
2.3 为了减少语料库的大小,对于类型相同但是表示的方式不同的不同token,进行归一化处理,比如说:uint32_t,u32,uinit32,DWORD 这几种类型(这种归一化有必要吗)
implement of data cleaning
-
去除函数中的注释,在C/C++ 中的这些注释可以分为以下两种形式:
单行注释: 以
//
开头的后面都是注释的内容;单行中以/*
开头以*/
结尾的中间的内容多行注释 : 以
/*
开头以*/
结尾的中间的内容用正则表达式来匹配这两种注释,然后删除
对于多行注释的匹配,可以在后面加个
re.S
参数。这个表示将搜索的内容作为一个整体,不然就是将这些逐行进行匹配,当一行匹配不成功时,就切换下一行。即将.
包括换行符在内的匹配。不加参数.
这个只匹配除了换行符之外的所有字符。result = re.findall(r'\/\*(.*?)\*\/', text1, re.S)
-
识别出函数中各变量和函数
2.1 对于函数中的各种变量的识别以及其类型的识别。
在C/C++ 中变量可能出现的位置。变量申明,变量赋值,函数的参数,操作符的操作数
Var = re.compile(r'\b([_A-Za-z]\w*)\b(?:(?=\s*\w+\()|(?!\s*\w+))(?!\s*\()') # variable name
变量的类型。首先将所有的变量名匹配出来,然后逐个查找。因为变量首次出现的地方一定是变量申明或者在函数参数中。然后将匹配出的变量名在函数中进行匹配找到第一个匹配到的地方,就能知道变量的类型。
对于变量的申明只有下面这几种情况
int a = 0, float b = 1; int a, float b; int a = 0, float b; int a,b; int a, float b = 1;
Var_type = re.compile(r'([_A-Za-z0-9]*)(?:\s|\s[_A-Za-z0-9]*\s*,\s*)(?=%s)'%Var_name)
又一个问题出现了。用怎样的类型标记符来表示一个变量的类型?
对于同种类型变量都用同一个标记符那显然没有意义,那就根据变量和数量来进行标记,
char1 int2
2.2 对于函数中的函数名以及其类型的识别。
函数名特征明显,被调用的时候出现,其类型??
函数名在函数被调用时出现,而其特征比较明显,一般在后面有括号跟着。
-
Func = re.compile(r’\b([_A-Za-z]\w*)\b(?=\s*()’) # function name
```
但是对于函数类型我们可以通过函数被调用的几个情形进行分析。函数被调用无外非这几个场景
```c
a += Fun1();
b = FUNC2() + Func1();
Func1();
```
所以在识别出有函数调用的情况下,然后分三种情况识别出前面变量的类型。
其实可以分为两种情况,即当Func单独出现和Func没有单独出现。当Func没有单独出现时,可以将等号这类赋值符号前的变量类型作为函数的类型;而当Func单独出现时,可以认为此函数返回值为空(void)
```python
Func_type = related_var_type
Func_type = "void"
```
-
数据集
数据集是h5py格式的,共有6个分组,
[‘CWE-119’, ‘CWE-120’, ‘CWE-469’, ‘CWE-476’, ‘CWE-other’, ‘functionSource’]
在functionSource里有函数的源码,其余的标识与源码对应的序号之间的标签(True or False)
validate_data:
CWE-469 CWE-119 CWE-120 CWE-476 CWE-other True 252 2419 4750 1208 3579 False 127224 125057 122726 126268 123897