exponenta event banner

Несогласованные операции шифрования

Шаги шифрования и дешифрования выполняются последовательно с одним и тем же контекстом шифра без повторной инициализации между

Описание

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

Например, можно настроить контекст шифра для дешифрования с помощью EVP_DecryptInit_ex.

EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
Однако контекст используется для шифрования с помощью EVP_EncryptUpdate.
EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len); 

Риск

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

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

После настройки контекста шифра для определенного семейства операций используйте контекст только для этого семейства операций.

Например, если настроить контекст шифра для дешифрования с помощью EVP_DecryptInit_ex, затем используйте контекст только для расшифровки.

Примеры

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



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

/* Using the cryptographic routines */

unsigned char *out_buf;
int out_len;
unsigned char g_key[16];
unsigned char g_iv[16];
void func(unsigned char* src, int len) {
    
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);
    
    /* Cipher context set up for decryption*/
    EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, g_key, g_iv);

    /* Update step for encryption */
    EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);        
}

В этом примере контекст шифра ctx настроен для дешифрования с использованием EVP_DecryptInit_ex. Однако сразу же после этого контекст используется для шифрования с использованием EVP_EncryptUpdate.

Исправление - изменение шага настройки

Одной из возможных корректировок является изменение шага настройки. Если вы хотите использовать контекст шифра для шифрования, настройте его с помощью EVP_EncryptInit_ex.


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

unsigned char *out_buf;
int out_len;
unsigned char g_key[16];
unsigned char g_iv[16];

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

    /* Cipher context set up for encryption*/
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, g_key, g_iv);

    /* Update step for encryption */
    EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);        
}

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

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