2015-12-02 2 views
1

Мне интересно, может ли кто-нибудь помочь мне с этим, я пытаюсь выяснить, как обрабатывать время проверки, время использования проблемы и отказаться от привилегий, когда они не нужны , в случае, например, это символическая ссылка на файл, который можно изменить, чтобы сказать теневой файл. Предполагая, что приведенная ниже функция вызывается, когда вызывающий процесс работает с повышенными привилегиями.Обновите файл на безопасном уровне с символическими ссылками - C

int 
updatefile(char *file) 
{ 
    int fd; 

    if (access(file, R_OK|W_OK)) { 
    perror("access()"); 
    return (-1); 
    } 

    fd = open(file, O_RDWR); 

    /* 
    * file is written to here. 
    */ 

    printf("Updated %s on...\n", file); 
    system("date"); 

    /* 
    * elevated privileges are required here... 
    */ 

    return (0); 
} 

ответ

3

Предполагая, что ваша access функции проверяет тип файла и определяет, является ли пользователь имеет соответствующие привилегии для манипуляций файла, вы обеспокоены потенциальной ошибкой TOCTTOU между вызовом access и призывом к open.

Типичный способ избежать этого было бы:

int updatefile(char *file) 
{ 
    int fd = -1; 

    if(-1 != (fd = open(file, R_OK | W_OK))) 
    { 
     struct stat buf; 

     if(0 == fstat(fd, &buf)) 
     { 
      /* perform any necessary check on the here */ 
      /* do what ever else you need to do */ 

      /* write to the file here */ 

      /* gain elevated permissions here */ 
      /* do privileged task */ 
      /* drop back to normal permissions here */ 

      close(fd); 
     } 
     else 
     { 
      /* handle error stating the file */ 
     } 
    } 
    else 
    { 
     /* handle error for not opening file */ 
    } 
} 

Причина, по которой это работает, то, что мы откладываем делать какие-либо проверки на файл до после того, как мы получим «обрабатывать» в файл. Мы можем определить, не имеет ли у пользователя разрешения на открытие файла по значению errno во внешнем блоке else;

Если мы сможем получить «дескриптор» файла, мы тогда можем делать все, что мы хотим проверить. Потому что мы сохраняем «дескриптор» с момента открытия файла, когда выполняем наши проверки и, наконец, когда мы используем файл; злоумышленник не сможет изменить файловую систему между проверкой и использованием.

Надежда это помогает T.

+0

Реверса схема сравнения безвкусная и устаревшая. – chqrlie

+0

@chqrlie это схема, которую я всегда видел как способ избежать TOCTTOU. заботиться о том, чтобы поделиться более элегантной и современной схемой? – thurizas

+0

Включить дополнительные предупреждения компилятора. 'gcc -Wall -W -Werror' или' clang -Weverything -Werror' предотвращает это и многие другие глупые ошибки и опечатки. Обратное сравнение позволяет уменьшить читаемость ИМХО. – chqrlie

Смежные вопросы