我是否需要手动将 PCREDENTIAL 归零.凭据blob

Do I need to manually zero out PCREDENTIAL.CredentialBlob?

本文关键字:PCREDENTIAL 归零 凭据 blob 是否      更新时间:2023-10-16

我正在使用Windows凭据存储,如下所示:

PCREDENTIAL cred = nullptr;
if (CredRead(entryName, 1, 0, &cred) != TRUE || !cred)
    return -1;
// ... code which handles cred.UserName and cred.CredentialBlob
CredFree(cred);

如您所见,我根据需要释放缓冲区。但是,我看到LPBYTE指针CredentialBlob仍然有效,并且仍然包含内存中的密码。我是否必须手动SecureZeroMemory它以及谁拥有缓冲区?我没有发现其他源代码可以做到这一点...

我没有找到任何东西,https://msdn.microsoft.com/library/aa919793.aspx 只包含以下通用语句:

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

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

您拥有缓冲区。 文档指出:

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

在理想的世界中,CredFree在释放块之前将整个块归零,并且可能值得提交一个建议来Microsoft这种效果,但就目前情况而言,您最好的选择可能是在调用CredFree之前执行以下操作:

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

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

你如何确定这一点?最有可能的是,您是通过读取死内存来提交UB。

A 仍然包含内存中的密码

这更令人担忧,但你引用的文本告诉你该怎么做。