draper_cnn

Automated Vulnerability Detection in Source Code Using Deep Representation Learning

ICMLA18

https://blog.csdn.net/weixin_40400177/article/details/103540916 (相关的机器学习与源代码建模)

本文主要是利用CNN网络直接对函数源代码进行特征提取,然后根据这些来对漏洞函数进行识别。

数据清理部分:

  1. 去除函数中所有的注释

  2. 将函数中的所有标识符进行归一化处理。

    2.1 对于常量的处理。单个字符,字符串,浮点数分别用相应的类型进行替换。对于整数型的常量,进行逐位次的切分。(对于整数型的怎么逐位次的切分而且这样切分的意义)

    2.2 对于标识符的处理。即函数中的变量和其它的函数名。对于这些函数名和变量都有自己相应的类型,将这些标识符与相应的类型进行替换(单个字符,字符串,浮点数)。

    2.3 为了减少语料库的大小,对于类型相同但是表示的方式不同的不同token,进行归一化处理,比如说:uint32_t,u32,uinit32,DWORD 这几种类型(这种归一化有必要吗)

    implement of data cleaning

    1. 去除函数中的注释,在C/C++ 中的这些注释可以分为以下两种形式:

      单行注释: 以//开头的后面都是注释的内容;单行中以 /* 开头以 */结尾的中间的内容

      多行注释 : 以 /* 开头以 */结尾的中间的内容

      用正则表达式来匹配这两种注释,然后删除

      对于多行注释的匹配,可以在后面加个 re.S 参数。这个表示将搜索的内容作为一个整体,不然就是将这些逐行进行匹配,当一行匹配不成功时,就切换下一行。即将 . 包括换行符在内的匹配。不加参数.这个只匹配除了换行符之外的所有字符。

      result = re.findall(r'\/\*(.*?)\*\/', text1, re.S)
      
    2. 识别出函数中各变量和函数

      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"
  ```
  1. 数据集

    数据集是h5py格式的,共有6个分组,

    [‘CWE-119’, ‘CWE-120’, ‘CWE-469’, ‘CWE-476’, ‘CWE-other’, ‘functionSource’]

    在functionSource里有函数的源码,其余的标识与源码对应的序号之间的标签(True or False)

    validate_data:

    CWE-469CWE-119CWE-120CWE-476CWE-other
    True2522419475012083579
    False127224125057122726126268123897
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值