代码之家  ›  专栏  ›  技术社区  ›  MrTux

是否需要手动清空pcredential.credentialBlob?

  •  1
  • MrTux  · 技术社区  · 7 年前

    我正在使用 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 回复  |  直到 7 年前
        1
  •  2
  •   catnip    7 年前

    你拥有缓冲区。这个 documentation 国家:

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

    在一个理想的世界里, CredFree 在释放前将整个块归零,这可能值得向Microsoft提交一个这样的建议,但事实上,最好的办法是在调用之前执行以下操作 无学分的 :

    SecureZeroMemory (cred->CredentialBlob, cred->CredentialBlobSize);
    
        2
  •  2
  •   Lightness Races in Orbit    7 年前

    但是,我看到lpbyte指针credentialblob仍然有效

    你如何确定这个?很可能你是通过阅读死记忆来提交UB。

    存储器中仍有密码

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