Небезопасная стандартная функция

Функция, небезопасная в связанных с безопасностью целях

Описание

Небезопасная стандартная функция ищет функции, которые небезопасны и не должны использоваться для связанного с безопасностью программирования. Функции могут быть небезопасными по многим причинам. Некоторые функции небезопасны, потому что они неповторно используемы. Другие функции изменяются в зависимости от цели или платформы, делая некоторые реализации небезопасными.

Риск

Некоторые небезопасные функции не повторно используемы, означая, что содержимое функции не заблокировано во время вызова. Так, атакующий может изменить середину реки значений.

getlogin в частности может быть небезопасным в зависимости от реализации. Некоторые реализации getlogin возвращают только первые восемь символов имени для входа в систему. Атакующий может использовать различный вход в систему с теми же первыми восемью символами, чтобы получить запись и управлять программой.

Фиксация

Избегайте небезопасных функций в связанных с безопасностью целях. Если вы не можете избежать небезопасных функций, используйте более безопасную версию функции вместо этого. Для getlogin используйте getlogin_r.

Примеры

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

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <string.h>
#include <stdlib.h>


volatile int rd = 1;

int login_name_check(char *user)
{
    int r = -2;
    char *name = getlogin();
    if (name != NULL)
    {
        if (strcmp(name, user) == 0)
        {
            r = 0;
        }
        else
            r = -1;
    }

    return r;
}

Этот пример использует getlogin, чтобы сравнить имя пользователя текущего пользователя к данному имени пользователя. Однако getlogin может возвратить что-то другое, чем текущее имя пользователя, потому что параллельный процесс может поменять струну.

Исправление — использует getlogin_r

Одно возможное исправление должно использовать getlogin_r вместо getlogin. getlogin_r повторно используем, таким образом, можно доверять результату.

#define _POSIX_C_SOURCE 199506L // use of getlogin_r
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <string.h>
#include <stdlib.h>


volatile int rd = 1;

enum {  NAME_MAX_SIZE=64  };

int login_name_check(char *user)
{
    int r;
    char name[NAME_MAX_SIZE];
    
    if (getlogin_r(name, sizeof(name)) == 0) 
    {
        if ((strlen(user) < sizeof(name)) && 
                     (strncmp(name, user, strlen(user)) == 0))
        {
            r = 0;
        }
        else
            r = -1;
    }
    else
        r = -2;
    return r;
}

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

Группа: безопасность
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: UNSAFE_STD_FUNC
Влияние: носитель
ID CWE: 558, 663

Введенный в R2015b