EN JP CN

SV.WEAK_CRYPTO.WEAK_HASH

SV.WEAK_CRYPTO.WEAK_HASH

弱いパスワード脆弱性

ブルートフォースパスワードクラッキングは、パスワードセキュリティにとって最も危険な脅威の 1 つです。ソフトウェアの暗号化方式が、必要な保護レベルに対して十分に強力でない場合、ブルートフォース攻撃が現在の攻撃方法とリソースの使用に成功することができます。SV.WEAK_CRYPTO.WEAK_HASH チェッカーは、DES 暗号化を使用する encrypt、crypt*、および setkey 暗号化シーケンスにフラグを立てます。 DES 暗号化では、ブルートフォースパスワード攻撃に対して十分な保護は得られません。

脆弱性とリスク

機密データの保護が不十分の場合、データの機密性または整合性が失われる可能性があります。DES 暗号化は、ブルートフォース攻撃で破られる可能性があります。MD5 ベースのアルゴリズムの方が少しセキュアなので、DES ベースのアルゴリズムより好まれていますが、さらに新しい SHA-1 ベースのアルゴリズムでも既に破られています。SHA-256 や SHA-512 などのハッシュアルゴリズムは、連邦情報処理規格 (FIPS) から承認されており、よりセキュアであると考えられています。セキュリティ分野の専門家が最善と考える暗号アルゴリズムを使用することが重要です。

軽減と防止

弱暗号化問題を回避するには:

  • 実証済みでセキュアな暗号ライブラリから最強の暗号化アルゴリズムを選択して使用します。
  • お使いのコードが既存の権限サービスにアクセスしている場合、そのサービスに認証を任せます。
  • 機密データをハードコードしたり、暗号化キーを保存したりしないでください。
  • MD5 ベースの暗号化を使用する場合、salt パラメーター ( $1$ で始まる文字列) を埋め込んで、暗号化アルゴリズムに変化を付けます。

脆弱コード例

1   #include <stdio.h>
2   #include <time.h>
3   #include <unistd.h>
4   #include <crypt.h>
5    
6   int
7   main(void)
8   {
9     unsigned long seed[2];
10    char salt[] = "$1$........";
11    const char *const seedchars =
12      "./0123456789ABCDEFGHIJKLMNOPQRST"
13      "UVWXYZabcdefghijklmnopqrstuvwxyz";
14    char *password;
15    int i;
16   
17    /* Generate a (not very) random seed.
18       You can do it better than this... */
19    seed[0] = time(NULL);
20    seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);
21   
22    /* Turn it into printable characters from ‘seedchars’. */
23    for (i = 0; i < 8; i++)
24      salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f];
25  
26    /* Read in the user’s password and encrypt it. */
27    password = crypt(getpass("Password:"), salt); // SV.WEAK_CRYPTO.WEAK_HASH is reported here
28  
29    /* Print the results. */
30    puts(password);
31    return 0;
32  }