exponenta event banner

Umask используется с аргументами в стиле chmod

Аргумент для umask разрешает внешнему пользователю слишком много управления

Описание

Этот дефект возникает, когда umask команды имеют аргументы, указанные в стиле аргументов для chmod.

Для новых файлов, umask значение указывает, какие разрешения не устанавливать, другими словами, какие разрешения удалять. Аргумент umask битово отрицается и затем применяется к новым разрешениям на доступ к файлам. В отличие от этого, chmod устанавливает разрешения по мере их указания.

Риск

Если вы используете chmod-style arguments, вы указываете противоположные разрешения желаемого. Эта ошибка может предоставить внешним пользователям непреднамеренный доступ для чтения/записи к новым файлам и папкам.

Зафиксировать

Установите umask таким образом, чтобы пользователь (u) имеет меньше отключенных разрешений, чем группа (g). Установите umask так, чтобы у группы было меньше отключенных разрешений, чем у других пользователей (o), или u <= g <= o.

Вы можете увидеть значение umask, позвонив,

umask
или символьное значение путем вызова,
umask -S

Примеры

развернуть все

#include <stdio.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>

typedef mode_t (*umask_func)(mode_t);

const mode_t default_mode = (
    S_IRUSR    /* 00400 */ 
    | S_IWUSR  /* 00200 */ 
    | S_IRGRP  /* 00040 */ 
    | S_IWGRP  /* 00020 */
    | S_IROTH  /* 00004 */
    | S_IWOTH  /* 00002 */
    );         /* 00666 (i.e. -rw-rw-rw-) */

static void my_umask(mode_t mode)
{
    umask(mode);
}

int umask_use(mode_t m)
{
    my_umask(default_mode);
    return 0;
}

В этом примере используется функция с именем my_umask для установки режима маски по умолчанию. Тем не менее, default_mode переменная дает разрешения 666 или -rw-rw-rw. umask отменяет это значение. Однако это отрицание означает, что режим маски по умолчанию отключает разрешения на чтение/запись для пользователя, пользователей группы и других внешних пользователей.

Исправление - аннулирование привилегированных разрешений

Одной из возможных корректировок является отрицание default_mode аргумент для my_umask. Эта коррекция сводит на нет отрицание umask для новых файлов.

#include <stdio.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>

typedef mode_t (*umask_func)(mode_t);

const mode_t default_mode = (
    S_IRUSR    /* 00400 */ 
    | S_IWUSR  /* 00200 */ 
    | S_IRGRP  /* 00040 */ 
    | S_IWGRP  /* 00020 */
    | S_IROTH  /* 00004 */
    | S_IWOTH  /* 00002 */
    );         /* 00666 (i.e. -rw-rw-rw-) */

static void my_umask(mode_t mode)
{
    umask(mode);
}

int umask_use(mode_t m)
{
    my_umask(~default_mode);
    return 0;
}

Информация о результатах

Группа: Безопасность
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: BAD_UMASK
Воздействие: Низкий
CWE ID: 560, 922
Представлен в R2015b