Является ли стандартная Java невосприимчивой к недостаткам безопасности memcpy, таким как недавний недостаток open ssl heartbeat?

Недавно была обнаружена серьезная ошибка библиотеки openssl, которая позволяет злоумышленникам читать до 64 КБ памяти.

http://blog.existentialize.com/diagnosis-of-the-openssl-heartbleed-bug.html

Причина, по-видимому, связана с использованием memcpy, а не с перекрестной проверкой размера ввода, предоставленного злоумышленником.

Если мы предположим, что стандартные библиотеки (без вызова C), неуязвима ли Java к этим типам уязвимостей?

Если говорить более конкретно о типе уязвимости безопасности, я имею в виду не доверие к пользовательскому вводу, а конкретно ограниченный доступ к памяти.

1 ответ

Решение

Java безопаснее, потому что она не использует арифметику указателей, выполняет проверку границ и (обычно) не позволяет получить доступ к произвольным частям памяти (см. Sun.misc.Unsafe!).

Однако подобные проблемы могут возникнуть в принципе, если считывать и записывать байты из массива, ByteBuffer и т. Д. В соответствии со смещениями, предоставленными ненадежным клиентом. Проблема значительно уменьшается, потому что можно атаковать только данные в пределах этого массива (или аналогичного контейнера), а не данные в произвольных смежных объектах.

Даже с Unsafe обычно это может быть Safe, потому что обычно он используется для выделения и доступа к очень специфическому набору критичных к производительности объектов, а не ко всему приложению (включая ключи шифрования, пароли и т. д.).

Фундаментальная проблема заключается в доверии пользовательскому вводу, и это может произойти на любом языке и в самых разных контекстах, например, SQL-инъекция.

Другие вопросы по тегам