查找给定代码中的安全问题

时间:2010-08-07 05:08:30

标签: c++ c windows security unix

有人可以告诉我一种在给定代码中查找安全漏洞的方法。例如:在给定的套接字程序中。欢迎任何好的例子或好书推荐。

谢谢&的问候,

mouseY的

6 个答案:

答案 0 :(得分:4)

此类别中最低级的成果是简单地在源头搜索通常被滥用或难以安全使用的功能,例如:

  • strcpy的
  • strcat的
  • 的sprintf

然后开始查看那些不是非常糟糕但可能被误用的东西。特别是写入缓冲区的任何内容如果被误用都可能会有危险。

  • 的memcpy
  • 的memmove
  • 的recv /读
  • 发送/写
  • 整个printf系列应始终具有格式字符串
  • 常量

注意:所有这些(gets除外)都可以正确使用,所以不要因为使用该函数而认为它是一个缺陷,而是看看它是如何使用的。另请注意,gets 总是是一个缺陷。

注2:此列表详尽无遗,对常用的误用函数以及如何避免这些函数进行一些研究。

就工具而言,我推荐valgrindsplint

等内容

答案 1 :(得分:4)

Evan的答案中没有涉及的一个主要话题是整数溢出。以下是一些例子:

wchar_t *towcs(const char *s)
{
    size_t l = strlen(s)+1;
    mbstate_t mbs = {0};
    wchar_t *w = malloc(l*sizeof *w), *w2;
    if (!w || (l=mbsrtowcs(w, (char **)&s, l, &st))==-1) {
        free(w);
        return 0;
    }
    return (w2=realloc(w, l*sizeof *w)) ? w2 : w;
}

这里,一个巨大的字符串(32位> 1gig)将乘以大小(我假设为4)溢出,导致一个微小的分配和随后的写操作结束。

另一个更常见的例子:

uint32_t cnt;
fread(&cnt, 1, 4, f);
cnt=ntohl(cnt);
struct record *buf = malloc(cnt * sizeof *buf);

这种代码在读取文件/网络数据时非常多,并且会受到同样的溢出。

基本上,需要检查对从不可信源获得的值执行的任何算术,该算法最终将用作分配大小/数组偏移量。您可以以便宜的方式执行此操作(对读取的值施加任意限制,使其显着超出可能溢出的范围,或者您可以在每个步骤测试溢出:而不是:

foo = malloc((x+1)*sizeof *foo);

你需要这样做:

if (x<=SIZE_MAX-1 && x+1<=SIZE_MAX/sizeof *foo) foo = malloc((x+1)*sizeof *foo);
else goto error;

在其参数中使用算术运算符的malloc / realloc的简单grep将发现许多这样的错误(但不是溢出已经发生在上面的几行等等)。

答案 2 :(得分:2)

以下是图书推荐: Writing Secure Code 。不仅演示如何编写安全代码,还展示暴露安全漏洞的常见陷阱和实践。它有点过时了(我的副本说它是在2002年出版的),但它教的安全概念在8年后仍然非常适用。

答案 3 :(得分:1)

您可以留意的一些源代码构造是:

  • 不进行边界检查的函数。埃文很好地说了一遍。
  • 输入验证&amp;消毒,或缺乏消毒。
  • NULL指针解除引用
  • fork()s,execve()s,pipe()s,system()使用非静态参数调用(或者更糟糕的是,使用用户输入)。
  • 具有不适当存储持续时间的线程之间共享的对象(指向自动变量的指针,甚至是线程本地存储中的“死”对象)。
  • 处理文件操作时,请确保将正确的变量类型用于函数的返回结果。确保检查错误。不要对实现做出任何假设 - 创建文件的权限,文件名的唯一性等等。
  • 应避免使用不良的随机源(加密,通信等)。
  • 无论如何,应该修复简单或明显的错误(也许是出于疏忽)。你永远不知道什么是可利用的,除非它是。

此外,受数据保护?好吧,如果你不在乎,那很好。 : - )

您可以考虑的一些工具是:

  • valgrind:暴露内存缺陷,在大型应用程序中通常很关键。
  • 夹板:静态检查器
  • fuzzing框架
  • RATS:一个免费的开源工具。它的作者公司被Fortify收购。

答案 4 :(得分:0)

我选择了一个安全类,我们使用了一个名为Fortify 360的商业产品,它对C ++代码进行了静态分析。我们针对一个旧版本的OpenSSL运行它,它发现了很多东西,并提供了纠正缺陷的指导(顺便说一下,最新版本的OpenSSL已经解决了)。

无论如何,它是一种有用的商业工具。

答案 5 :(得分:0)

一些OpenBSD人最近刚刚发布了presentation on their coding practices