c - 解决 “Writing Secure Code” 中的安全漏洞 '

标签 c security

我正在研究代码安全性,我正在尝试对以下 2 个摘自“编写安全代码”,第 2 版的片段进行安全性分析:

http://www.di.uniba.it/~ndm/corsi/sa/materiale/lab/StackOverrun.c

http://www.di.uniba.it/~ndm/corsi/sa/materiale/lab/FormatString.c

在第一个中,我认为唯一不安全的声明是 strcpy(buf, 输入); 应该是 strncpy(buf, 输入, sizeof(buf-1)); 所有其他 printf 都是安全的:即使他们使用的参数比他们应该使用的少,但他们是故意这样做的。

在第二个中,printf 是安全的,但 fprintf(stdout, buf); 不是,应该替换为以下代码:fprintf (标准输出, "%s", 缓冲器);

我的问题是 pFile = fopen(argv[1], "r"); 由于可能的竞争条件也被分析程序认为是不安全的,但我看不出这是不可能的在此代码中被利用。如果文件以只读方式打开,攻击者可以用它做一些令人讨厌的事情吗?我认为没有。

那么问题来了:你认为这个分析正确吗?你能找到其他缺陷还是我的推理有问题?

谢谢!

最佳答案

我的第一个想法是,将未经净化的程序输入传递给 libc 调用是不好的。 libc 溢出的情况太多了,开发人员不应传递超出 libc 预期的参数(例如在这种情况下字符串应为 < PATH_MAX)。

但是既然你提到了竞争条件,我认为虽然在这个特定的例子中没有特别的问题,但通常不赞成使用 fopen(),因为它容易出现竞争条件。如果您正在寻址一个文件,任何文件,使用接受文件名而不是文件句柄的函数。如果通过一个或另一个操作通过文件的路径名引用文件,文件的状态可能会改变,并且程序对该状态的假设可能不再正确。下面的文章对此有更好的解释。

http://www.sans.edu/research/security-laboratory/article/race-cndtns

http://www.unixprogramming.info/s_isregfile-race-conditions

关于c - 解决 “Writing Secure Code” 中的安全漏洞 ',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6398366/

相关文章:

java - 我使用 AES 算法加密 32 字节长度的数据,结果(密文)是 64 字节长度,这有效吗?

c - 4个变量函数的平均值打印 "4.00000"(除以4)而不是实际的平均值

c - 如何根据行内容的标准从文件中读取行?

c - 这对额外的括号有什么作用?

c - 在windows下安装gtk并使用gcc编译?

security - Couchbase 存储桶的密码更改程序

c - 为什么父进程首先从 LINUX 中的管道读取

javascript - 如何添加 X-XSS-Protection : 1; mode=block HTML

css - CSS 病毒可能存在吗? (或任何安全漏洞)

web-services - 保护胖客户端应用程序中的 API key