exponenta event banner

Отсутствует вектор инициализации блочного шифра

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

Описание

Этот дефект возникает при шифровании или расшифровке данных с использованием нулевого вектора инициализации (IV).

Примечание

Контекст шифра можно инициализировать с помощью вектора инициализации NULL (IV). Однако, если для алгоритма требуется IV, перед этапом шифрования или дешифрования необходимо связать контекст шифра с ненулевым IV.

Риск

Многие режимы блочного шифрования используют вектор инициализации (IV) для предотвращения атак словарей. При использовании NULL IV зашифрованные данные уязвимы для таких атак.

Блочные шифры разбивают данные на блоки фиксированного размера. Блочные режимы шифрования, такие как CBC (Cipher Block Chaining), защищают от словарных атак с помощью XOR-ing каждого блока с зашифрованным выходом из предыдущего блока. Для защиты первого блока эти режимы используют случайный вектор инициализации (IV). При использовании NULL IV при шифровании того же открытого текста получается тот же шифротекст. Ваши данные становятся уязвимыми для словарных атак.

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

Перед выполнением операций шифрования или дешифрования

 ret = EVP_EncryptUpdate(&ctx, out_buf, &out_len, src, len)
связать контекст шифра ctx с вектором инициализации, отличным от NULL.
ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)

Примеры

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


#include <openssl/evp.h>
#include <stdlib.h>
#define fatal_error() abort()

unsigned char *out_buf;
int out_len;

int func(EVP_CIPHER_CTX *ctx, unsigned char *key, unsigned char *src, int len){
    if (key == NULL)
        fatal_error();
    
    /* Last argument is initialization vector */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, NULL); 
    
    /* Update step with NULL initialization vector */
    return EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

В этом примере вектор инициализации, связанный с контекстом шифра ctx имеет значение NULL. Если этот контекст используется для шифрования данных, данные уязвимы для словарных атак.

Коррекция - использовать вектор случайной инициализации

Используйте генератор сильных случайных чисел для создания вектора инициализации. Исправленный код здесь использует функцию RAND_bytes объявлен в openssl/rand.h.


#include <openssl/evp.h>
#include <openssl/rand.h>
#include <stdlib.h>
#define fatal_error() abort()
#define SIZE16 16

unsigned char *out_buf;
int out_len;

int func(EVP_CIPHER_CTX *ctx, unsigned char *key, unsigned char *src, int len){
    if (key == NULL)
        fatal_error();
    unsigned char iv[SIZE16];
    RAND_bytes(iv, 16);
    
    /* Last argument is initialization vector */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); 
    
    /* Update step with non-NULL initialization vector */
    return EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

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

Группа: Криптография
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_CIPHER_NO_IV
Воздействие: среднее
CWE ID: 310, 326, 329
Представлен в R2017a