Я использую Хранилище учетных данных 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, читая мертвую память.
все еще содержит пароль в памяти
Это больше касается, но текст, который вы цитировали, говорит вам, что с этим делать.