SV.AUTH.BYPASS.MUST
不正确的身份验证
在某些用例中可能会检查 loggedIn Cookie 以验证用户是否已经登录。如果未登录,代码会通过用户提供的用户名和密码进行身份验证。如果成功,它会设置 loggedIn 和用户 Cookies 以“记住”用户已经登录。SV.AUTH.BYPASS.MUST 检查器会验证用户身份验证方法是否足够并且未被绕过。
如果“userName”和“password”在主体中与 .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("password"), ...)) { // user authentication
System.out.error("Error: you need to log in first");
}
else {
Cookie loggedIn = new Cookie("loggedIn", "true");
...
}
}
}
Klocwork 在第 7 行报告 SV.AUTH.BYPASS.MUST 缺陷,指出“使用 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("password"), ...)) { // user authentication
System.out.error("Error: you need to log in first");
}
else {
Cookie loggedIn = new Cookie("loggedIn", "true");
...
}
}
在修正代码示例中,Klocwork 不再报告缺陷,因为未使用可用来绕过身份验证的 Cookie。