SV.AUTH.HASH.MIGHT

使用弱加密算法

每当 MD5 哈希技术与从 servlet 的请求中提取的用户名/密码一起使用时,SV.AUTH.HASH 检查器都会检测到。如果使用用户名,则 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 行报告了 SV.AUTH.HASH.MIGHT 缺陷,这表示“将有风险的 MD5 哈希与用户名一起使用可导致身份验证绕过”。

修正代码示例 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 提供。