我需要手动将PCREDENTIAL.CredentialBlob归零吗?

时间:2018-12-31 15:32:28

标签: c++ winapi credentials credential-manager

我正在这样使用Windows credentials store

PCREDENTIAL cred = nullptr;
if (CredRead(entryName, 1, 0, &cred) != TRUE || !cred)
    return -1;

// ... code which handles cred.UserName and cred.CredentialBlob

CredFree(cred);

如您所见,我将缓冲区释放为required。但是,我看到LPBYTE指针CredentialBlob仍然有效,并且仍然在内存中包含密码。我是否必须手动SecureZeroMemory?谁拥有缓冲区?我没有找到其他能做到这一点的源代码...

我什么都没找到,https://msdn.microsoft.com/library/aa919793.aspx仅包含以下通用语句:

  

使用后从内存中清除凭据数据

     

使用后不要将凭据保留在内存中。使用后,通过调用SecureZeroMemory清除临时存储区中的所有凭证数据。

2 个答案:

答案 0 :(得分:2)

  

但是,我看到LPBYTE指针CredentialBlob仍然有效

您如何确定?您最有可能通过读取无效内存来提交UB。

  

一个仍然在内存中包含密码

这更令人担忧,但是您引用的文字告诉您如何处理。

答案 1 :(得分:2)

您拥有缓冲区。 documentation指出:

  

缓冲区中包含的任何指针都是指向此单个已分配块中位置的指针。

在理想情况下,CredFree会在释放整个块之前将整个块归零,为此可能值得向Microsoft提出建议,但就目前情况而言,最好的选择是执行以下操作在致电CredFree之前:

SecureZeroMemory (cred->CredentialBlob, cred->CredentialBlobSize);