我在C中有一段代码,我需要知道我在哪里有TOCTTOU漏洞以及原因。有人知道它在哪里以及如何纠正它吗?
int process(char *filename)
{
struct stat aux;
char buffer[1024];
printf("Input to be appended: ");
fgets(buffer, sizeof(buffer), stdin);
if((lstat(filename, &aux) == 0) && !S_ISLNK(aux.st_mode))
{
printf("[+] Opening\n", filename);
int fd = open(filename, O_RDWR | O_APPEND), nb;
nb = write(fd, buffer, strlen(buffer));
printf("[+] Done!\n");
return 0;
}else
printf("[-] ERROR\n", filename);
return 1;
}
int main(int argc, char * argv[])
{
if(argc != 2){
fprintf(stderr, "usage: %s filename\n", argv[0]);
exit(1);
}
return process(argv[1]);
}
谢谢!
答案 0 :(得分:0)
使用lstat()提供了TOCTOU漏洞,因为该文件可能在lstat()之后和open()之前被删除。使用open()代替并测试返回值是一个简单的解决方案。