メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

不整合な暗号操作

途中で再初期化を伴わず、同じ暗号コンテキストを使って連続して暗号化と復号化のステップを実行している

説明

この欠陥は、同じ暗号コンテキストを使用した暗号化ステップと復号化ステップを実行した場合に発生します。それらのステップの間で、コンテキストを再初期化していません。このチェッカーは対称暗号化にのみ適用されます。

たとえば、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);        
}

この例では、EVP_DecryptInit_ex を使用して復号化するために暗号コンテキスト ctx を設定しています。ただし、その直後に、EVP_EncryptUpdate を使用して暗号化する際にもそのコンテキストを使用しています。

修正 — 設定ステップを変更

1 つの修正方法として、設定ステップを変更します。暗号化に暗号コンテキストを使用する場合に、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
影響度: Medium

バージョン履歴

R2017a で導入