Нужно ли обнулять PCREDENTIAL.CredentialBlob вручную?

Я использую Хранилище учетных данных 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.

1

Решение

Вы владеете буфером. документация состояния:

Любые указатели, содержащиеся в буфере, являются указателями на местоположения в этом выделенном блоке.

В идеальном мире CredFree обнулит весь блок, прежде чем освободить его, и, возможно, стоило бы подать предложение Microsoft на этот счет, но в сложившейся ситуации лучше всего сделать следующее, прежде чем звонить CredFree:

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

Другие решения

Тем не менее, я вижу, что указатель LPBYTE CredentialBlob по-прежнему действует

Как вы это определяете? Скорее всего, вы делаете UB, читая мертвую память.

все еще содержит пароль в памяти

Это больше касается, но текст, который вы цитировали, говорит вам, что с этим делать.

2

По вопросам рекламы [email protected]