【问题标题】:Stopping Race Conditions by Adding Race Conditions?通过添加竞态条件来停止竞态条件?
【发布时间】:2016-02-17 21:59:26
【问题描述】:

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

【问题讨论】:

  • 这可能应该在Information Security 上询问,尽管我感觉他们更喜欢Stack Overflow
  • 攻击者无论如何只需要赢得访问/fopen调用之间的最后一个间隙,并且垃圾邮件符号链接/取消链接调用的天真蛮力攻击不会受到某种增加的复杂性的影响for 循环。
  • 我投票结束这个问题,因为它是关于编程和安全的。 Information Security 会更好,虽然 Stack Overflow 也可以。

标签: file permissions c


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 2021-09-30
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多