Очистка памяти в разных языках для безопасности

Изучая Java, я узнал, что строки небезопасны для хранения паролей, так как вы не можете вручную очистить память, связанную с ними (вы не можете быть уверены, что они в конечном итоге будут собраны, интернированные строки могут никогда не быть, и даже после gc вы не можете быть уверены, что содержимое физической памяти действительно было стерто). Вместо этого я должен был использовать массивы символов, поэтому я могу обнулить их после использования. Я пытался найти подобные практики на других языках и платформах, но пока не смог найти соответствующей информации (обычно все, что я вижу, это примеры кода паролей, хранящихся в строках, без упоминания каких-либо проблем с безопасностью).

Особенно меня интересует ситуация с браузерами. Я часто использую jQuery, и мой обычный подход — просто установить значение поля пароля в пустую строку и забыть об этом:

$(myPasswordField).val("");

Но я не на 100% уверен, что этого достаточно. Я также понятия не имею, безопасны ли строки, используемые для промежуточного доступа (например, когда я использую $.ajaxдля отправки пароля на сервер). Что касается других языков, обычно я не вижу упоминаний об этой проблеме (еще один интересующий меня язык — Python).

Я знаю, что вопросы, связанные с попытками создания списков, противоречивы, но, поскольку это связано с общей проблемой безопасности, которая в значительной степени игнорируется, ИМХО оно того стоит. Если я ошибаюсь, я был бы рад узнать об этом только из JavaScript (в браузерах) и Python. Я также не знал, спросить здесь, в security.SEили в программистов.SE, но поскольку для безопасного выполнения задачи используется фактический код (не концептуальный вопрос), я считаю, что этот сайт является лучшим вариантом.

Примечание:в низкоуровневых языках или языках, однозначно поддерживающих символы как примитивные типы, ответ должен быть очевиден( Редактировать:не совсем очевидно, так как @ Гейб показал в своем ответе ниже).Я прошу те языки высокого уровня, в которых «все является объектом» или что-то в этом роде, а также те, которые выполняют автоматическое интернирование строк за кулисами (так что вы можете создать дыру в безопасности, не осознавая этого, даже если вы достаточно осторожным).

Обновление: согласно ответуна связанный вопрос, даже использование char[]в Java не гарантирует пуленепробиваемость (или .NET SecureString , если уж на то пошло), так как сборщик мусора может перемещать массив так, что его содержимое может остаться в памяти даже после очистки (SecureString, по крайней мере, остается в том же адресе ОЗУ, гарантируя очистку, но его потребители/производители могут по-прежнему оставлять следы).

Наверное, @NiklasB. прав, несмотря на то, что уязвимость существует, вероятность эксплойта низка, а сложность его предотвращения высока, это может быть причиной того, что эта проблема в основном игнорируется. Я хотел бы найти хотя бы какую-нибудь ссылку на эту проблему, касающуюся браузеров, но пока поиск в гугле не дал результатов (есть ли у этого сценария хотя бы имя?).

6
задан Cœur 10 December 2017 в 07:38
поделиться