我正在为一堂课做理论练习。我们得到了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循环,并且打开调用会这样做,但这并不意味着攻击者只需要赢得最后一次竞争条件?如果是这样,我怎样才能以保留程序功能的方式重复访问和打开调用,并使不良竞争条件成为统计上的不可能性?
答案 0 :(得分:0)
通常,在实施安全解决方案时,重新发明轮子被认为是危险的。对于加密操作尤其如此,但这是另一个例子。在你试图击败它们之前,你真的想要了解攻击者方法的所有细节。
例如,在OWASP网站(here)上,它提到攻击者有技术来增加时间窗口的大小 - 所以你应该了解这些技术。
如果没有这种透彻的理解,请使用经过严格审查的解决方案,例如使用&#39; wx&#39;标记为fopen()