夹板如何进行污点分析

时间:2012-09-29 04:17:59

标签: c analysis static-code-analysis splint taint

如何使用Splint执行污点分析?

我在我的Ubuntu 12.04上安装了Splint。创建了一个小测试用例如下:

#include<stdio.h>
#include<string.h>
int main(int argc, char *argv[]) {
    char a[10];
    strncpy(a,argv[1],10);
    printf(a);
    return 0;
}

还创建了splint.xh文件,其中包含以下内容:

int printf  (/*@untainted@*/ char *fmt, ...);
char *fgets (char *s, int n, FILE *stream) /*@ensures tainted s@*/ ;
char *strcat (/*@returned@*/ char *s1,  char *s2) /*@ensures s1:taintedness = s1:taintedness | s2:taintedness @*/ ;
void strncpy (/*@returned@*/ char *s1,  char *s2, size_t num)    /*@ensures s1:taintedness = s1:taintedness | s2:taintedness @*/ ;

还创建了splint.mts文件,其中包含以下内容:

    attribute taintedness
       context reference char *
       oneof untainted, tainted
       annotations
         tainted reference ==> tainted
         untainted reference ==> untainted
                       transfers
         tainted as untainted ==> error "Possibly tainted storage used where untainted required."
       merge
          tainted + untainted ==> tainted
       defaults
          reference ==> tainted
          literal ==> untainted
          null ==> untainted
    end

然后最后使用以下命令运行了splint工具:

    splint -mts splint prg001.c

其中prg001.c是样本输入,“splint”指的是splint.mts和splint.xh文件。所有文件都在当前目录中。

我收到的输出是:

Splint 3.1.2 --- 2012年8月21日

prg001.c :(在函数main中) prg001.c:6:1:printf的格式字符串参数不是编译时常量:                  一个   格式参数在编译时是未知的。这可以带来安全性   漏洞,因为参数无法进行类型检查。 (使用   -formatconst禁止警告) prg001.c:3:14:参数argc未使用   函数体中不使用函数参数。如果是论点   类型兼容性或未来计划需要,使用/ @unused @ /   论证声明。 (使用-paramuse来禁止警告)

完成检查--- 2个代码警告

输出中没有任何污点分析的提示。有人可以帮助我如何使用Splint完成污点分析。

由于

1 个答案:

答案 0 :(得分:1)

问题在于splint.xh文件。

我将printf更改为printfxxx并且工作正常。

这意味着标准定义会覆盖我的.xh文件。这解决了我的问题,现在夹板输出污染变量和污染流。