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 не является входным и использует небезопасный алгоритм Data Encryption Standard.

Коррекция - Использование 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
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 327, 522, 663
Введенный в R2015b