我正在为类做理论练习。我们得到了这段 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/