硬编码包含凭据的连接字符串¶
ID: cs/hardcoded-connection-string-credentials
Kind: path-problem
Security severity: 9.8
Severity: error
Precision: medium
Tags:
- security
- external/cwe/cwe-259
- external/cwe/cwe-321
- external/cwe/cwe-798
Query suites:
- csharp-security-extended.qls
- csharp-security-and-quality.qls
在源代码或配置文件中包含未加密的硬编码入站或出站身份验证凭据十分危险,因为凭据很容易被发现。
包含硬编码凭据的源代码或配置文件可能会被攻击者看到。 例如,源代码可能是开源的,或者可能被泄露或意外公开。 对于作为二进制文件提供的应用程序,可以在编译后的程序集中访问凭据。
对于入站身份验证,硬编码凭据可能会导致未经授权的系统访问。 如果凭据在源代码中被硬编码,则问题尤其严重,因为它无法轻易禁用。 对于出站身份验证,硬编码凭据可能会向攻击者提供特权信息或对某些其他系统的未经授权的访问。
建议¶
从源代码中删除硬编码凭据(例如用户名、密码和证书),如果需要,请将其放置在配置文件或其他数据存储中。 如有可能,请将包含凭据数据的配置文件与源代码分开存储在访问受限的安全位置。
对于出站身份验证详细信息,请考虑加密凭据或封闭的数据存储或配置文件,并使用权限来限制访问。
对于入站身份验证详细信息,请考虑尽可能使用标准库函数对密码进行哈希处理。 例如,Microsoft 提供了 Microsoft.AspNet.Identity.PasswordHasher
类。
示例¶
以下示例显示了不同类型的入站和出站身份验证。
在第一种情况下,我们接受来自远程用户的密码,并将其与纯文本字符串文字进行比较。 如果攻击者获取了源代码或程序集,则他们可以观察到密码,并且可以登录到系统。 此外,如果发现了此类入侵,则需要重新编译应用程序才能更改密码。
在第二种情况下,使用 Microsoft 提供的 PasswordHasher.VerifyHashedPassword
,将密码与存储在配置文件中的哈希和加盐密码进行比较。 在这种情况下,访问源代码或程序集不会向攻击者泄露密码。 即使访问包含密码哈希和盐的配置文件,对攻击者来说也几乎没有价值,因为通常很难从哈希和盐中反向推导出密码。
在最后一种情况下,密码更改为新的硬编码值。 如果攻击者可以访问源代码,则他们将能够观察到新密码。
using Microsoft.AspNet.Identity;
using System;
using System.Web;
using System.Web.Security;
public class HardCodedCredentialHandler : IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
string password = ctx.Request.QueryString["password"];
// BAD: Inbound authentication made by comparison to string literal
if (password == "myPa55word")
{
ctx.Response.Redirect("login");
}
string hashedPassword = loadPasswordFromSecretConfig();
// GOOD: Inbound authentication made by comparing to a hash password from a config
if (PasswordHasher.VerifyHashedPassword(hashedPassword, password))
{
ctx.Response.Redirect(VALID_REDIRECT);
}
// BAD: Set the password to a hardcoded string literal
MembershipUser user = loadMembershipUser();
user.ChangePassword(password, "myNewPa55word");
}
}
参考¶
OWASP:XSS 使用硬编码密码。
Microsoft 文档:防止开放重定向攻击 (C#)。
常见弱点枚举:CWE-259。
常见弱点枚举:CWE-321。
常见弱点枚举:CWE-798。