SV.AUTH.HASH.MIGHT

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

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 userName = request.getParameter("userName"); //Source
     String md5 = getMd5(userName);
     ...
  }
  public static String getMd5(String str)
     {
         try {
             MessageDigest md = MessageDigest.getInstance("MD5"); //SV.WEAK.CRYPT
             byte[] messageDigest = md.digest(str.getBytes());   //SV.AUTH.HASH.MIGHT - Sink
             //...
     }

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

修正コード例 1

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

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

関連チェッカー

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

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