有人可以告诉我一种在给定代码中查找安全漏洞的方法。例如:在给定的套接字程序中。欢迎任何好的例子或好书推荐。
谢谢&的问候,
mouseY的
答案 0 :(得分:4)
此类别中最低级的成果是简单地在源头搜索通常被滥用或难以安全使用的功能,例如:
然后开始查看那些不是非常糟糕但可能被误用的东西。特别是写入缓冲区的任何内容如果被误用都可能会有危险。
注意:所有这些(gets
除外)都可以正确使用,所以不要因为使用该函数而认为它是一个缺陷,而是看看它是如何使用的。另请注意,gets
总是是一个缺陷。
注2:此列表不详尽无遗,对常用的误用函数以及如何避免这些函数进行一些研究。
等内容答案 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)
您可以留意的一些源代码构造是:
此外,受数据保护?好吧,如果你不在乎,那很好。 : - )
您可以考虑的一些工具是:
答案 4 :(得分:0)
我选择了一个安全类,我们使用了一个名为Fortify 360的商业产品,它对C ++代码进行了静态分析。我们针对一个旧版本的OpenSSL运行它,它发现了很多东西,并提供了纠正缺陷的指导(顺便说一下,最新版本的OpenSSL已经解决了)。
无论如何,它是一种有用的商业工具。
答案 5 :(得分:0)
一些OpenBSD人最近刚刚发布了presentation on their coding practices。