file - 通过添加竞争条件来停止竞争条件?

标签 file permissions c

我正在为类做理论练习。我们得到了这段 UNIX C 代码片段,它容易受到 access() 调用和 open() 调用之间竞争条件的影响。

/*  vulp.c  */

#include <stdio.h>
#include<unistd.h>

#define DELAY 10000

int main()
{
   char * fn = "/tmp/XYZ";
   char buffer[60];
   FILE *fp;
   long int  i;

   /* get user input */
   scanf("%50s", buffer );

   if(!access(fn, W_OK)){
       /* simulating delay */
        for (i=0; i < DELAY; i++){
           int a = i^2; 
        }

        fp = fopen(fn, "a+");
        fwrite("\n", sizeof(char), 1, fp);
        fwrite(buffer, sizeof(char), strlen(buffer), fp);
        fclose(fp);
   }
   else printf("No permission \n");
}

如果攻击者指向不属于他们的文件并赢得竞争条件,他们可以在未经许可的情况下覆盖文件。似乎可以通过添加更多的 access() 和 open() 调用来解决这个问题,这样就会有太多的竞争条件,几乎不可能赢得所有竞争条件。我认为在当前访问和打开调用周围添加一个 for 循环可以做到这一点,但这不就意味着攻击者只需要赢得最后一个竞争条件吗?如果是这样,我如何才能以保留程序功能并使不良竞争条件成为统计上不可能发生的方式重复访问和打开调用?

最佳答案

通常,在实现安全解决方案时,重新发明轮子被认为是危险的。对于密码操作尤其如此,但这是另一个例子。在尝试打败攻击者之前,您真的想了解攻击者方法的所有来龙去脉。

例如,在 OWASP 网站 ( here ) 上,它提到攻击者拥有增加计时窗口大小的技术 - 因此您应该了解这些技术等。

缺乏那种透彻的理解,请使用经过严格审查的解决方案,例如描述的解决方案 here它使用 'wx' 标志来 fopen()

关于file - 通过添加竞争条件来停止竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35470136/

相关文章:

php - 使用 PHP 将多个文件路径保存到 mysql

Android SensorManager 在运行时获取 BODY_SENSORS 权限后不更新 SensorList

laravel - 如何在 Laravel 中为列表或数组定义策略?

c++ - Microsoft Visual C++,无需工程文件即可编译小源代码

c++ - 解包/解密/提取/应用程序 .bin 文件

java - 从 Java 中的文件中读取行

c - 如何通过进程属性限制对 Linux 目录的写访问?

c - 为什么即使我们将正分数放入 double 类型,符号位仍为 1 的原因

c - 初始化错误

c - 轮询系统调用是否知道远程套接字是关闭还是断开?