1

我对为什么 checkmarx 将以下公共属性Password标记为 Heap Inspection 类型的中等漏洞有点困惑。

知道为什么 checkmarx 将此行标记为漏洞吗?下面的代码有什么建议/改进想法吗?

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);
    }
}
4

2 回答 2

6

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

于 2018-03-15T14:20:31.503 回答
3

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

为了防止这种情况,您需要重新设计您的应用程序,以便永远不需要纯文本密码 - 它应该始终被立即散列(或者更确切地说是 bcrypt/scrypt/PBKDF2'd)。
在需要明文密码的极少数情况下,将其存储在字节数组中,然后在完成后将数组归零 - 这并不能完全解决问题,但它确实允许您最小化暴露窗口,并控制密码在堆中传递太多。

于 2018-02-04T16:19:15.777 回答