Нужно ли обнулять PCREDENTIAL.CredentialBlob вручную? - PullRequest
0 голосов
/ 31 декабря 2018

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

Ответы [ 2 ]

0 голосов
/ 01 января 2019

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

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

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

SecureZeroMemory (cred->CredentialBlob, cred->CredentialBlobSize);
0 голосов
/ 31 декабря 2018

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

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

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

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

...