No data added into context

Выполнение операции хеша на пустом контексте может вызвать ошибки времени выполнения

Описание

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

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

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

void bar(unsigned char* src, int len, EVP_MD_CTX *ctx) {
    //ctx passed as argument of bar()
    EVP_DigestFinal(ctx, out_buf, &out_len); //no defect
}
EVP_MD_CTX glob_ctx;
void foo(unsigned char* src, int len) {
    //glob_ctx declared outside scope of foo()
    EVP_DigestFinal(&glob_ctx, out_buf, &out_len); //no defect
}

Риск

Выполнение шага обновления на контексте с пустыми данными может привести к ошибке времени выполнения.

Выполнение последнего шага на контексте без данных может привести к неожиданному поведению.

Фиксация

Выполните по крайней мере одну операцию обновления с непустыми данными по контексту дайджеста сообщения, прежде чем вы подпишете, проверите или получите данные в контексте.

Примеры

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

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

unsigned char out_buf[EVP_MAX_MD_SIZE];
unsigned int out_len;

void func(unsigned char* src, int len)
{
    EVP_MD_CTX ctx;
    EVP_MD_CTX_init(&ctx);


    EVP_DigestInit(&ctx, EVP_sha256());
    EVP_DigestUpdate(&ctx, src, len);
    EVP_MD_CTX_init(&ctx);
    EVP_DigestFinal(&ctx, out_buf, &out_len);
}

В этом примере, контекст дайджеста сообщения ctx инициализируется и операция обновления выполняется, чтобы добавить данные src в контекст. Контекст затем повторно инициализируется, но никакие данные не добавляются к ctx перед EVP_DigestFinal попытки получить данные от ctx, который приводит к ошибке.

Коррекция — выполняет последний шаг прежде, чем повторно инициализировать контекст

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

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

unsigned char out_buf[EVP_MAX_MD_SIZE];
unsigned int out_len;

void func(unsigned char* src, int len)
{
    EVP_MD_CTX ctx;
    EVP_MD_CTX_init(&ctx);


    EVP_DigestInit(&ctx, EVP_sha256());
    EVP_DigestUpdate(&ctx, src, len);
    EVP_DigestFinal(&ctx, out_buf, &out_len);
    EVP_MD_CTX_init(&ctx);
} 
#include <openssl/evp.h>
#include <stdio.h>

unsigned char out_buf[EVP_MAX_MD_SIZE];
unsigned int out_len;

void func(unsigned char* src, int len)
{
    EVP_MD_CTX ctx;
    EVP_MD_CTX_init(&ctx);
    size_t cnt = 0;

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

В этом примере нулевые байты данных хешируются в контекст дайджеста сообщения во время операции обновления. Получение данных от контекста в последнем шаге приводит к неожиданному поведению.

Коррекция — Добавляет непустые Данные В Контекст

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

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

unsigned char out_buf[EVP_MAX_MD_SIZE];
unsigned int out_len;

void func(unsigned char* src, int len)
{
    EVP_MD_CTX ctx;
    EVP_MD_CTX_init(&ctx);

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

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

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