2016-12-27 105 views
0

我有一段C代碼,我需要知道TOCTTOU漏洞的位置以及原因。有人知道它在哪裏,我該如何糾正它?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

lstat()的使用提供了TOCTOU漏洞,因爲該文件可能在lstat()之後和open()之前被刪除。使用open()來代替並測試返回值是一個簡單的解決方案。

+0

你能給我一個代碼示例嗎?謝謝! :) – user7346822

+0

當然你是在開玩笑,先生。 user7346822 ;-) –

+0

nope,如果我看到你的意思,我會更好地理解它。謝謝 – user7346822