通过添加竞争条件来阻止竞争条件?

时间:2016-02-17 21:59:26

标签: file permissions c

我正在为一堂课做理论练习。我们得到了UNIX C代码的snippit,它容易受到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循环,并且打开调用会这样做,但这并不意味着攻击者只需要赢得最后一次竞争条件?如果是这样,我怎样才能以保留程序功能的方式重复访问和打开调用,并使不良竞争条件成为统计上的不可能性?

1 个答案:

答案 0 :(得分:0)

通常,在实施安全解决方案时,重新发明轮子被认为是危险的。对于加密操作尤其如此,但这是另一个例子。在你试图击败它们之前,你真的想要了解攻击者方法的所有细节。

例如,在OWASP网站(here)上,它提到攻击者有技术来增加时间窗口的大小 - 所以你应该了解这些技术。

如果没有这种透彻的理解,请使用经过严格审查的解决方案,例如使用&#39; wx&#39;标记为fopen()