CS.HCC
硬编码凭据的使用(密码和用户名)
如果软件包含用于身份验证的硬编码凭据,那么软件非常容易遭受攻击,因为恶意用户可能会从可执行文件提取此信息。
HCC 检查器会检测包括密码和用户名的硬编码凭据作为身份验证函数的参数的使用情况。HCC 检查器还会检测软件将用户凭据与后端应用程序中的内部硬编码值进行比较的情况。硬编码凭据不仅可编码为用于验证函数身份的凭据,还可用作硬编码检查。如果身份验证函数的用户名或密码与硬编码字符串进行比较,这也会是一个漏洞。默认情况下,此检查器考虑常用软件库中的函数,不过也可将其配置为检测自定义身份验证函数。
漏洞与风险
使用硬编码凭据使攻击者能够从可执行文件提取凭据并绕过身份验证。硬编码凭据会产生可能很难检测和修复的重大风险。
缓解与预防
对于出站身份验证:将除代码之外的密码、密钥及其他凭据存储在受到强保护的加密配置文件或数据库中,以阻止所有外部人员访问,包括同一系统中的其他本地用户。对于入站身份验证:不是在首次登录时硬编码默认用户名和密码、密钥或其他身份验证凭据,而是采用要求用户输入唯一强密码或密钥的“首次登录”模式。
漏洞代码示例 1
复制
namespace HCC
{
class Program
{
int VerifyAdminUserPassword(String userPassword)
{
if (userPassword.Equals("username:pwd@123"))
{
Console.WriteLine("Entering Diagnostic Mode...");
return (1);
}
Console.WriteLine("Incorrect user or password");
return (0);
}
}
}
在此示例中,Klocwork 在第 7 行报告了缺陷,这表示“通过对函数“System.String.Equals”的调用使用硬编码凭据”。
修正代码示例 1
复制
namespace Data
{
public class Database
{
public static int VerifyUserPwd(string userPassword)
{
//verify user and pwd at database
return 1;
}
}
}
namespace HCC
{
class Program
{
int VerifyAdminUser(String userPassword)
{
return Data.Database.VerifyUserPwd(userPassword);
}
}
}
在此修正代码示例中,Klocwork 不再报告缺陷。
漏洞代码示例 2
复制
namespace HCC
{
class Program
{
public static bool mySqlConnection()
{
string cs = "server=localhost;user=root;database=sakila;port=3306;password=your_password";
using (MySqlConnection conn = new MySqlConnection(cs))
{
//Do operation
}
return true;
}
}
}
在此示例中,Klocwork 在第 8 行报告了缺陷,这表示“通过对函数“MySql.Data.MySqlClient.MySqlConnection.#constructor”的调用使用硬编码凭据”
修正代码示例 2
复制
namespace HCC
{
class Program
{
private static string getString()
{
//Implementation
throw new NotImplementedException();
}
public static bool mySqlConnection( )
{
string cs = getString();
using (MySqlConnection conn = new MySqlConnection(cs))
{
//perform operation
}
return true;
}
}
}
在此修正示例中,Klocwork 不再报告缺陷。