exponenta event banner

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

Функция небезопасна для целей безопасности

Описание

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

Риск

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

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++
По умолчанию: Откл.
Синтаксис командной строки: UNSAFE_STD_FUNC
Воздействие: среднее
CWE ID: 558, 663
Представлен в R2015b