一、程序模型与漏洞模型模块

  该模块主要是建立相应的漏洞数据库,建立该库需要全面的安全漏洞信息,步骤:

  (1)将“所有”可能发生安全漏洞的函数列进来,并指定它们的等级。

  (2)再将这些函数的等级进行动态升级与降级分类,因为某些函数在某些情况或者某些操作下是安全的。即进行类型划分。

  (3)将漏洞的详情信息描述出来(包括函数名称,漏洞类型,安全等级,出现行号,修改建议等信息)

  以下简单的划分了几个常见的函数,在具体的应用中可以根据自己的规则来定义更多函数的危险等级和类型划分。

  例如:下表是部分危险函数的等级划分

 

安全等级 危险函数
1 strncpy、recv、lstrncat、strncat、
2 fprintf、vsprintf、wscanf、lstrncpy
3 printf、sprintf、scanf、getchar、fget
4 strcat、strcpy、strlen

  然后对这些函数进行类型划分,如下表:

 

 

类型 buffer strncat printf sprintf scanf normal strncpy
函数 strcat、strcpy strncat、lstrncat printf、fprintf sprintf、vsprintf scanf、wscanf strlen、recv、getchar、fget strncpy、lstrncpy

 

  对以上几类函数的具体处理:

  (1)对于buffer类函数的处理:

  这类函数都是极其危险的,但是在活性参数为单个字符或者固定字符串的时候产生危险的可能性会大大降低。(活性参数是指可以作为一个token,用于下一步的分析)

  示例一:strcpy(dest,”abc”);  //活性参数为abc常量,安全

  (2)对于strncat类函数的处理:

  这类函数包括五个,他们的危险性都不大(等级1),通常考虑在调用strncat(dest,src,len)时,len表示整个目的地址的长度,这是不正确的,他必须是该地址要容纳的字符串的长度,所以考虑大多数情况,当它的形式是”sizeof(dest)”时,发出高危险警告。实际上,如果dest的后一个字符始终是的话,sizeof(dest)的危险性是不大的。这样做可能漏掉一些危险,但是能判断出大部分的情况。

  示例一:strncat(dest,src,sizeof(dest)-1);//危险降低

  (3)对于printf类的处理

  这类函数是以printf为代表的各类输出函数,通常他们的危险都很高,当其活性参数为固定字符串时,危险程度会降低,在这种情况下vsnprintf产生的错误定义为输出端口错误。

  (4)对于scanf类的处理

  以scanf(format,addr)为例,format格式直接决定缓冲区得到的数据类型,如果format规定的格式是s%,由于没有规定字符串的长度,则很可能造成缓冲区溢出,故判断为高危险。相反,如果format规定的格式为5s%之类的,由于规定的字符串的长度,产生危险的概率会大大降低,将其判断为低危险或者无危险。

  示例:scanf(“%s”,str);//危险,没有规定字符串的长度

  scanf(“%5s”,str);//str长度不大于5,危险降低