exponenta event banner

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

Функция не входит в систему или использует алгоритм шифрования с риском

Описание

Этот дефект возникает, когда стандартная функция шифрования использует нарушенный или слабый криптографический алгоритм. Например, crypt не является входящим и основан на рискованном стандарте шифрования данных (DES).

Риск

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

Если слабая функция не входит, то при использовании функции в параллельных программах возникает дополнительный риск расового состояния.

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

Избегайте функций, использующих эти алгоритмы шифрования. Вместо этого используйте функцию повторного ввода, использующую более сильный алгоритм шифрования.

Примечание

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

Примеры

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

#define _GNU_SOURCE
#include <pwd.h>
#include <string.h>
#include <crypt.h>

volatile int rd = 1;

const char *salt = NULL;
struct crypt_data input, output;

int verif_pwd(const char *pwd, const char *cipher_pwd, int safe)
{
    int r = 0;
    char *decrypted_pwd = NULL;
    
    switch(safe)
    {
      case 1: 
        decrypted_pwd = crypt_r(pwd, cipher_pwd, &output);
        break;
        
      case 2: 
        decrypted_pwd = crypt_r(pwd, cipher_pwd, &output);
        break;
        
      default:
        decrypted_pwd = crypt(pwd, cipher_pwd); 
        break;
    }
    
    r = (strcmp(cipher_pwd, decrypted_pwd) == 0); 
    
    return r;
}

В этом примере: crypt_r и crypt расшифровать пароль. Однако crypt не входит и использует небезопасный алгоритм шифрования данных.

Коррекция - использование crypt_r

Одной из возможных корректировок является замена crypt с crypt_r.

#define _GNU_SOURCE
#include <pwd.h>
#include <string.h>
#include <crypt.h>

volatile int rd = 1;

const char *salt = NULL;
struct crypt_data input, output;

int verif_pwd(const char *pwd, const char *cipher_pwd, int safe)
{
    int r = 0;
    char *decrypted_pwd = NULL;
    
    switch(safe)
    {
      case 1: 
        decrypted_pwd = crypt_r(pwd, cipher_pwd, &output);
        break;
        
      case 2: 
        decrypted_pwd = crypt_r(pwd, cipher_pwd, &output);
        break;
        
      default:
        decrypted_pwd = crypt_r(pwd, cipher_pwd, &output);  
        break;
    }
    
    r = (strcmp(cipher_pwd, decrypted_pwd) == 0);
    
    return r;
}

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

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