exponenta event banner

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
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 558, 663
Введенный в R2015b