SV.AUTH.HASH.MUST

脆弱な暗号化アルゴリズムの使用

SV.AUTH.HASH チェッカーは、サーブレットの要求からフェッチされるユーザー名/パスワードに MD5 ハッシュ手法が使用されているケースをすべて検出します。ユーザー名が使用されていると、Klocwork は SV.AUTH.HASH.MIGHT 欠陥を報告します。MD5 の生成にパスワードが使用されていると、Klocwork は SV.AUTH.HASH.MUST 欠陥を報告します。

リリース 2023.2 の時点で、このチェッカーは Jakarta EE をサポートしています。

脆弱性とリスク

脆弱な暗号化アルゴリズムを使用すると、意図しないアクターへのリソースまたは機能の露出につながりかねず、攻撃者に機密情報が漏れたり、任意のコードを実行するチャンスすら与えたりする可能性があります。

脆弱コード例 1

コピー
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String password = request.getParameter("password"); //Source
       String md5 = getMd5(password);
       ...
  }
  public static String getMd5(String str)
  {
   try {
       MessageDigest md = MessageDigest.getInstance("MD5"); //SV.WEAK.CRYPT
      byte[] messageDigest = md.digest(str.getBytes()); //SV.AUTH.HASH.MUST - Sink
      //...
  }

この例では、Klocwork は 10 行目で「リスクのある MD5 ハッシュをパスワードに使用すると認証のバイパスを引き起こす可能性がある」という SV.AUTH.HASH.MUST 欠陥を報告します。

修正コード例 1

コピー
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String password = request.getParameter("password"); //Source
       String md5 = getMd5(password);
       ...
  }
  public static String getMd5(String str)
  {
   try {
       MessageDigest md = MessageDigest.getInstance("SHA3-256");
      byte[] messageDigest = md.digest(str.getBytes());
      //...
  }

修正されたこの例では、より安全なハッシュ手法が使用されているため、Klocwork はもはや欠陥を報告しません。

関連チェッカー

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。