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 作者的意见)。
我有点困惑为什么 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 作者的意见)。