SV.AUTH.BYPASS.MIGHT

不正确的身份验证

此检查器会验证用户身份验证方法是否足够并且未被绕过。项目身份验证可以依赖于 loggedIn Cookie 值。SV.AUTH.BYPASS.MIGHT 检查器会识别 loggedIn Cookie 可能被用于绕过身份验证的情况。

如果“userName”在主体中与 .getParameter() 或 .get() 一起使用,则此检查器会报告缺陷。

漏洞与风险

当参与者要求具有指定的身份,而软件未证明或未充分证明该要求正确时,此弱点可导致资源或功能暴露给意外的参与者。此弱点可能会向攻击者提供敏感信息,甚至使攻击者能够执行任意代码。

漏洞代码示例 1

复制
  import jakarta.servlet.http.*;
   public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       Map<String, String> result = new HashMap<>();
 
       // result contains cookie values from request
       ...
       if ("true".equals(result.get("loggedIn"))
       {
           if (! AuthenticateUser(request.getParameter("username"), ...)) { // user authentication
               System.out.error("Error: you need to log in first");
          }
          else {
              Cookie loggedIn = new Cookie("loggedIn", "true");
              ...
          }
      }
  }

Klocwork 在第 7 行报告 SV.AUTH.BYPASS.MIGHT 缺陷,指出“使用 Cookie loggedIn 可导致身份验证绕过”。在此示例中,用户可以在浏览器中设置 loggedIn Cookie 并绕过身份验证。

修正代码示例 1

复制
   import javax.servlet.http.*;
   public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       Map<String, String> result = new HashMap<>();
     
       if (! AuthenticateUser(request.getParameter("username"), ...)) { // user authentication
           System.out.error("Error: you need to log in first");
       }
       else {
           Cookie loggedIn = new Cookie("loggedIn", "true");
           ...
      }
  }

在此修正代码示例中,Klocwork 不再报告缺陷,因为没有任何 Cookie 被用于绕过身份验证。

相关检查器

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。

扩展

可调整此检查器,以查找项目中用于标识用户 logged-in 状态的特定 Cookie。可以通过在 .jkb 文件中使用 @CheckerParam 选项来完成此操作。如果调整此检查器以添加任何自定义值,则不再使用默认值。如果还要将默认值包括在内,可以将其与自定义值一起重新添加至 .jkb 文件。有关详情,请参阅调整 Java 分析。