Опасно ли использовать java.lang.String для хранения конфиденциальных данных?

Поскольку строковые объекты Java являются неизменяемыми, а сборщик мусора асинхронным, хранение информации об аутентификации в строках предотвращает один вид безопасности в пользу безопасности потоков.

Безопасная обработка такой информации требует изменчивости, то есть обнуления памяти, ранее использовавшейся для хранения конфиденциальной информации.

Предположим, вы используете версию openssl с уязвимостью HeartBleed.

Разве наивная реализация аутентификации не может привести к тому, что память JVM будет захламлена именами пользователей и паролями?

Следует ли вообще избегать java.lang.string, если вы не можете заранее знать, что информация не является конфиденциальной?

И в качестве побочного вопроса, что JVM может сделать, чтобы снизить риск? Я не знаю о переключателе а-ля «нетерпеливое заполнение освобожденной памяти как можно скорее».


person reechard    schedule 07.06.2014    source источник
comment
Что такое StringObject?   -  person Oliver Charlesworth    schedule 07.06.2014
comment
Что такое StringObject? Я не думаю, что это стандартный класс Java. Вы говорите об экземплярах java.lang.String?   -  person Fabian    schedule 07.06.2014
comment
Вот почему многие API принимают пароли как char[], а не String.   -  person Oliver Charlesworth    schedule 07.06.2014
comment
Оптимизация чего-либо на основе априорных знаний считается вредной.   -  person Kevin Krumwiede    schedule 07.06.2014
comment
Да, ребята, я имел в виду примитивный буфер символов, используемый для хранения строковой памяти.   -  person reechard    schedule 07.06.2014
comment
Если вы обеспокоены атакой по побочному каналу из-за уязвимости Heartbleed, вам следует вместо этого сосредоточить свои усилия на обновлении вашей библиотеки OpenSSL.   -  person Makoto    schedule 07.06.2014
comment
@Makoto Heartbleed является примером. Не рекомендуется оставлять конфиденциальную информацию в ожидании сборщика мусора. Это все равно, что выбросить бумажную выписку по кредитной карте в мусор.   -  person reechard    schedule 07.06.2014
comment
Данные есть данные, независимо от того, в удобочитаемом ли они формате или нет. Если он находится на вашем сервере, в памяти, и вы не защищаете его должным образом, тогда важно как он хранится. Я бы не стал делать общее заявление о том, что хранение экземпляров String до тех пор, пока они не будут удалены сборщиком мусора, является плохой практикой, поскольку вы можете хранить их как любой объект и быть столь же уязвимыми.   -  person Makoto    schedule 07.06.2014
comment
Итак, мне не следует беспокоиться об уничтожении выписок по кредитным картам, потому что я, возможно, скопировал их и разместил в Интернете?   -  person reechard    schedule 07.06.2014


Ответы (1)


Я не большой крипто-эксперт, но я думаю, что это зависит от вашей оценки модели угроз.

Если вы можете предположить, что злоумышленник может считывать случайные части памяти, я, честно говоря, не знаю, как можно спроектировать криптографически безопасную систему. В конце концов, злоумышленник может извлечь ваш секретный ключ, как только вы извлечете его из памяти. Если вы предполагаете, что злоумышленники могут это сделать, установка дополнительных средств защиты для максимально быстрой очистки памяти не изменит того факта, что ваша система по-прежнему уязвима. Злоумышленник, заранее знающий временные параметры системы, может проникнуть в нее.

Если вы не предполагаете, что злоумышленник может это сделать, то вопросы безопасности, связанные с сохранением старых строк в памяти, менее важны. Функции безопасности на уровне языка Java должны гарантировать, что злоумышленник, который может скомпрометировать JVM, не сможет увидеть строковые объекты с истекшим сроком действия. Если вы не доверяете реализации Java, чтобы защитить это, то я не думаю, что ошибка больше связана с JVM, чем со строковыми объектами.

В более общем плане, я думаю, что первый вопрос, который нужно задать, это то, что, по вашему предположению, может сделать злоумышленник. Если вы считаете, что ваша система может быть уязвима для сканирования содержимого оперативной памяти, то я думаю, что у вас гораздо более серьезная проблема, чем сборщики мусора, которые работают недостаточно быстро. Если вы думаете, что кто-то может запустить произвольный код Java, то я не думаю, что это проблема. Если вы думаете, что кто-то может заморозить компьютер и отнести его в лабораторию для проверки оперативной памяти, я думаю, у вас есть более серьезные проблемы, о которых нужно беспокоиться.

Надеюсь это поможет!

person templatetypedef    schedule 07.06.2014
comment
Правильный. Если String действительно является мусором, тогда к ней нельзя обратиться с помощью кода Java. Только некоторая атака на уровне машинного языка может получить доступ к данным, и такая атака может получить доступ к ЛЮБЫМ данным. - person Hot Licks; 08.06.2014
comment
По-прежнему полезно стирать данные, так как это сокращает окна атаки. Как вы заметили, это не эффективная защита сама по себе, но есть такая концепция, называемая глубокоэшелонированной защитой. Это не обязательно останавливает любую атаку, но делает ее еще более сложной, что может спасти вашу задницу в (надеюсь) редком случае, когда другие линии защиты рухнут. - person ; 08.06.2014
comment
Да, @delnan, добавил дополнительный вопрос - person reechard; 08.06.2014