TOCTTOU代码漏洞

时间:2016-12-27 17:42:41

标签: security

我在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]);
}

谢谢!

1 个答案:

答案 0 :(得分:0)

使用lstat()提供了TOCTOU漏洞,因为该文件可能在lstat()之后和open()之前被删除。使用open()代替并测试返回值是一个简单的解决方案。