Missing salt for hashing operation

Хешированные данные уязвимы для табличного нападения радуги

Описание

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

  • EVP_DigestFinal

  • EVP_DigestSignUpdate

  • EVP_DigestVerifyUpdate

  • SHA*_Final семейство функций

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

EVP_MD_CTX ctx_global;

void foo(EVP_MD_CTX* ctx) {
//ctx passed as argument of func()
    EVP_DigestFinal(ctx, out_buf, &out_len); //no defect
}

void bar() {
// ctx_global declared outside of bar() 
    EVP_DigestFinal(&ctx_glob, out_buf, &out_len); //no defect
}

Риск

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

Фиксация

Обеспечьте соль, когда вы хешируете данные.

Примеры

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

#include <openssl/evp.h>
#include <cstring>

unsigned char* out_buf;
unsigned int out_len;

void func()
{
    const char* src = "toto";
    EVP_MD_CTX ctx;

    EVP_DigestInit(&ctx, EVP_sha256());
    EVP_DigestUpdate(&ctx, src, strlen(src));
    EVP_DigestFinal(&ctx, out_buf, &out_len);
    EVP_cleanup();
}

В этом примере, контекст ctx инициализируется безопасным алгоритмом хеширования SHA-256, затем EVP_DigestUpdate хеши src в ctx. Поскольку EVP_DigestUpdate называется только однажды, никакая соль не может быть обеспечена, чтобы улучшить безопасность операции хеширования. Значение обзора, что EVP_DigestFinal получает затем уязвимо для предварительно вычисленных нападений радуги.

Коррекция — соль хеша в контекст после хеша исходных данных

Одна возможная коррекция должна хешировать соль в контекст ctx после первой операции хеширования. Получившееся значение обзора, что EVP_DigestFinal получает более безопасно.

#include <openssl/evp.h>
#include <openssl/rand.h>
#include <cstring>

#define BUFF_SIZE_32 32

unsigned char* out_buf;
unsigned int out_len;

void func()
{
    const char* src = "toto";
    const char* salt;

    RAND_bytes((unsigned char*)salt, BUFF_SIZE_32);
    EVP_MD_CTX ctx;

    EVP_DigestInit(&ctx, EVP_sha256());
    EVP_DigestUpdate(&ctx, src, strlen(src));
    EVP_DigestUpdate(&ctx, salt, BUFF_SIZE_32);
    EVP_DigestFinal(&ctx, out_buf, &out_len);
    EVP_cleanup();
}

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

Группа: криптография
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: CRYPTO_MD_NO_SALT
Удар: Средняя
ID CWE: 759
Введенный в R2019b