checkmarx 是否将名为 Password 的属性标记为中等漏洞,而不考虑下划线实现?

Is checkmarx mark properties named Password as Medium vulnerability regardless to the underlining implementation?

我有点困惑为什么 checkmarx 将下面的 public 属性 Password 标记为堆检查类型的中等漏洞。

知道为什么 checkmarx 将这一行标记为漏洞吗? 对以下代码有 recommendations/improvement 个想法吗?

SecureString password;

public String Password
{
    get { return SecureStringToString(password); }
    set
    {
        if (value != null)
        {
            password = new SecureString();
            foreach (char c in value) password.AppendChar(c);
        }
    }
}

String SecureStringToString(SecureString value)
{
    IntPtr valuePtr = IntPtr.Zero;
    try
    {
        valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
        return Marshal.PtrToStringUni(valuePtr);
    }
    finally
    {
        Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
    }
}

相关的 Checkmarx 查询确实关心底层实现,它精确地查找字符串类型的密码 fields/variables。由于您允许将 SecureString 作为常规字符串返回,一旦发生这种情况,它就会再次暴露并容易受到 "heap inspection" 的攻击(即明文密码存储在内存中的不可变字符串变量中)。

为了防止这种情况发生,您需要重新设计您的应用程序,以便永远不需要纯文本密码 - 它应该始终立即进行哈希处理(或者更确切地说 bcrypt/scrypt/PBKDF2'd)。
在需要明文密码的极少数情况下,将其存储在字节数组中,然后在完成后将数组归零 - 这并不能完全解决问题,但它确实可以让你最大限度地减少暴露 window,并控制密码在堆中传递过多。

因为它命名为password。 CheckMarx 是一块卡卡,它对密码、索引、执行等词做出反应。避免它们,您的代码将是安全的。 (根据 ChechMarx 作者的意见)。