メインコンテンツ

安全でない標準暗号化関数

関数が再呼び出し可能でないか、リスクの大きい暗号化アルゴリズムを使用している

説明

この欠陥は、標準暗号化関数で、破損したまたは脆弱な暗号アルゴリズムが使用された場合に発生します。たとえば、crypt は再呼び出し可能でなく、リスクの大きいデータ暗号化標準 (DES) に基づいています。

リスク

壊れているか脆弱、または非標準などのアルゴリズムを使用する場合、機密情報が攻撃者の脅威にさらされる可能性があります。確信犯的なハッカーはさまざまな技術を利用して、保護されたデータにアクセスする可能性があります。

脆弱な関数が再呼び出し不可能であり、同時実行される複数のプログラムでその関数が使用されると、競合状態のリスクがさらに高まります。

修正方法

上述のような暗号化アルゴリズムを使用する関数の使用を回避します。代わりに、より強固な暗号化アルゴリズムを使用する、再呼び出し可能な関数を使用します。

メモ

crypt の実装によっては、追加の、よりセキュリティで保護された暗号化アルゴリズムをサポートしています。

すべて展開する

#define _GNU_SOURCE
#include <pwd.h>
#include <string.h>
#include <crypt.h>

volatile int rd = 1;

const char *salt = NULL;
struct crypt_data input, output;

int verif_pwd(const char *pwd, const char *cipher_pwd, int safe)
{
    int r = 0;
    char *decrypted_pwd = NULL;
    
    switch(safe)
    {
      case 1: 
        decrypted_pwd = crypt_r(pwd, cipher_pwd, &output);
        break;
        
      case 2: 
        decrypted_pwd = crypt_r(pwd, cipher_pwd, &output);
        break;
        
      default:
        decrypted_pwd = crypt(pwd, cipher_pwd); 
        break;
    }
    
    r = (strcmp(cipher_pwd, decrypted_pwd) == 0); 
    
    return r;
}

この例では、crypt_rcrypt によってパスワードを復号化しています。しかし、crypt は再呼び出し不可能であり、安全でないデータ暗号化標準アルゴリズムを使用しています。

修正 — crypt_r を使用

1 つの修正方法として、cryptcrypt_r に置き換えます。

#define _GNU_SOURCE
#include <pwd.h>
#include <string.h>
#include <crypt.h>

volatile int rd = 1;

const char *salt = NULL;
struct crypt_data input, output;

int verif_pwd(const char *pwd, const char *cipher_pwd, int safe)
{
    int r = 0;
    char *decrypted_pwd = NULL;
    
    switch(safe)
    {
      case 1: 
        decrypted_pwd = crypt_r(pwd, cipher_pwd, &output);
        break;
        
      case 2: 
        decrypted_pwd = crypt_r(pwd, cipher_pwd, &output);
        break;
        
      default:
        decrypted_pwd = crypt_r(pwd, cipher_pwd, &output);  
        break;
    }
    
    r = (strcmp(cipher_pwd, decrypted_pwd) == 0);
    
    return r;
}

結果情報

グループ: セキュリティ
言語: C | C++
既定値: オフ
コマンド ライン構文: UNSAFE_STD_CRYPT
影響度: Medium

バージョン履歴

R2015b で導入