Unsafe standard function

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

Описание

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

Риск

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

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