【发布时间】: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