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 不再报告缺陷,因为使用了更安全的哈希技术。