CodeQL 文档

硬编码凭据

ID: cs/hardcoded-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

点击查看 CodeQL 代码库中的查询

在源代码或配置文件中包含未加密的硬编码入站或出站身份验证凭据是危险的,因为这些凭据可能很容易被发现。

包含硬编码凭据的源代码或配置文件可能会被攻击者看到。例如,源代码可能是开源的,或者可能被泄露或意外泄露。对于作为二进制文件发布的应用程序,可以在编译后的程序集中访问凭据。

对于入站身份验证,硬编码凭据可能会导致未经授权的用户访问系统。如果凭据是在源代码中硬编码的,则这个问题尤其严重,因为很难禁用该凭据。对于出站身份验证,硬编码凭据可能会向攻击者提供特权信息或对其他系统的未经授权的访问权限。

建议

从源代码中删除硬编码凭据(如用户名、密码和证书),并在必要时将其放在配置文件或其他数据存储中。如果可能,请将包含凭据数据的配置文件与源代码分开存储在访问受限的安全位置。

对于出站身份验证详细信息,请考虑加密凭据或包含这些凭据的数据存储或配置文件,并使用权限来限制访问。

对于入站身份验证详细信息,请尽可能使用标准库函数对密码进行哈希处理。例如,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");
    }
}

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私