Отмечает ли галочкой свойства с именем «Пароль» как среднюю уязвимость независимо от реализации подчеркивания?

Меня немного смущает, почему галочка помечает нижеприведенное общедоступное свойство Password как среднюю уязвимость типа Heap Inspection.

Есть идеи, почему галочка помечает эту строку как уязвимость? Любые рекомендации/идеи по улучшению кода ниже?

SecureString password;

public String Password
{
    get { return SecureStringToString(password); }
    set
    {
        if (value != null)
        {
            password = new SecureString();
            foreach (char c in value) password.AppendChar(c);
        }
    }
}

String SecureStringToString(SecureString value)
{
    IntPtr valuePtr = IntPtr.Zero;
    try
    {
        valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
        return Marshal.PtrToStringUni(valuePtr);
    }
    finally
    {
        Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
    }
}

person Ebeid ElSayed    schedule 01.02.2018    source источник
comment
В тот момент, когда SecureString превращается в String, это совершенно, совершенно бесполезно. Узнайте, как работает SecureString, если хотите узнать подробности   -  person Camilo Terevinto    schedule 02.02.2018
comment
@CamiloTerevinto Буду признателен за конструктивный комментарий по самому вопросу.   -  person Ebeid ElSayed    schedule 02.02.2018
comment
Это конструктивный комментарий: вам нужно узнать, как работает SecureString. CheckMarx совершенно прав, говоря вам, что вы делаете неправильно.   -  person Camilo Terevinto    schedule 02.02.2018
comment
@EbeidSolimanElSayed Как вы думаете, чем занимается Marshal.PtrToStringUni? Как вы думаете, что происходит с (раньше) безопасным текстом пароля, когда вы вызываете эту функцию?   -  person NetMage    schedule 02.02.2018


Ответы (2)


Соответствующий запрос Checkmarx действительно заботится о базовой реализации, он точно ищет поля/переменные пароля типа String. Поскольку вы разрешаете возвращать свою SecureString как обычную строку, как только это происходит, она снова подвергается воздействию и становится уязвимой для «проверки кучи» (т. Е. Пароль в виде открытого текста хранится в неизменяемой строковой переменной в памяти).

Чтобы предотвратить это, вам нужно будет перепроектировать свое приложение, чтобы пароль в виде обычного текста никогда не требовался — его всегда следует сразу же хэшировать (или, скорее, с помощью bcrypt/scrypt/PBKDF2).
В редких случаях, когда требуется незашифрованный пароль, сохраните его в массиве байтов, а затем обнулите массив, когда закончите с ним - это не решает проблему полностью, но позволяет минимизировать окно раскрытия и контролировать пароль из слишком много передается по куче.

person AviD    schedule 04.02.2018

Потому что он назвал пароль. CheckMarx — это часть кака, которая реагирует на слова пароль, индекс, выполнение и так далее. Избегайте их, и ваш код будет в безопасности. (по мнению авторов ChechMarx).

person yurin    schedule 15.03.2018