Unsafe standard encryption function

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

Описание

Этот дефект происходит, когда стандартная функция шифрования использует поврежденный или слабый криптографический алгоритм. Например, 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++
Значение по умолчанию: Off
Синтаксис командной строки: UNSAFE_STD_CRYPT
Удар: Средняя
ID CWE: 327, 522, 663
Введенный в R2015b