exponenta event banner

Отсутствуют зашифрованные данные для обработки

Заключительный этап шифрования или дешифрования выполняется без предыдущих шагов обновления

Описание

Этот дефект возникает при неправильном выполнении последнего шага блочного шифрования или дешифрования.

Например, можно выполнить одно из следующих действий:

  • Перед выполнением последнего шага действия по обновлению для шифрования или дешифрования данных не выполняются.

    /* Initialization of cipher context */
    ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    ...
    /* Missing update step */
    ...
    /* Final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
  • Последовательные заключительные шаги выполняются без промежуточной инициализации и обновления.

    /* Initialization of cipher context */
    ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    ...
    /* Update step(s) */
    ret = EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
    ...
    /* Final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
    ...
    /* Missing initialization and update */
    ...
    /* Second final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
  • Выполняется очистка контекста шифра, а затем выполняется заключительный шаг.

    /* Initialization of cipher context */
    ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    ...
    /* Update step(s) */
    ret = EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
    ...
    /* Cleanup of cipher context */
    EVP_CIPHER_CTX_cleanup(ctx);
    ...
    /* Second final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);

Риск

Блочные шифры разбивают данные на блоки фиксированного размера. Во время шифрования или дешифрования операция обновления шифрует или дешифрует данные в блоках. Любые оставшиеся данные шифруются или дешифруются на заключительном этапе. Последний шаг добавляет заполнение к оставшимся данным, так что он занимает один блок, а затем шифрует или дешифрует дополненные данные.

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

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

Выполните шифрование или дешифрование в следующей последовательности:

  • Инициализация контекста шифра

  • Шаги обновления

  • Заключительный шаг

  • Очистка контекста

Примеры

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


#include <openssl/evp.h>
#include <stdlib.h>
#define SIZE16 16

unsigned char *out_buf;
int out_len;
unsigned char key[SIZE16];
unsigned char iv[SIZE16];

void func(void) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);

    /* Initialization of cipher context */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    
    /* Missing update steps for encryption */
    
    /* Final encryption step */
    EVP_EncryptFinal_ex(ctx, out_buf, &out_len);           
}

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

Исправление - Выполните шаги обновления для шифрования перед заключительным шагом

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


#include <openssl/evp.h>
#include <stdlib.h>
#define SIZE16 16

unsigned char *out_buf;
int out_len;
unsigned char key[SIZE16];
unsigned char iv[SIZE16];

void func(unsigned char *src, int len) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);

    /* Initialization of cipher context */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    
    /* Update steps for encryption */
    EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);   
    
    /* Final encryption step */
    EVP_EncryptFinal_ex(ctx, out_buf, &out_len);           
}

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

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