SV.AUTH.HASH.MUST

使用弱加密算法

每当 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 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 行报告了 SV.AUTH.HASH.MUST 缺陷,这表示“将有风险的 MD5 与密码一起使用可导致身份验证绕过”。

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