Есть ли у Java переполнение буфера?

Есть ли у Java переполнение буфера? Если да, вы можете дать мне сценарии?

Ответ 1

Так как строки Java основаны на массивах char, и Java автоматически проверяет границы массивов, переполнение буфера возможно только в необычных сценариях:

  • Если вы вызываете собственный код через JNI
  • В самом JVM (обычно написанном на С++)
  • Интерпретатор или JIT-компилятор работает некорректно (проверка байт-кода по байт-коду Java)

Ответ 2

Управляемые языки, такие как Java и С#, не имеют этих проблем, но конкретные виртуальные машины (JVM/CLR/etc), которые фактически запускают код, могут.

Ответ 3

Для всех целей и задач нет.

В Java есть массив проверка границ, которая будет проверять, что данные не могут быть доступны из области вне выделенного массива. Когда вы пытаетесь получить доступ к области, размер которой превышает размер массива, будет выбрано исключение ArrayOutOfBounds.

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

Ответ 4

Да и нет. Нет, в этом вы не можете действительно ошибочно открыть себя до уязвимости переполнения буфера, потому что это модель управляемой памяти. Однако в JVM и JDK могут быть уязвимости переполнения буфера. См. Консультацию Secunia:

http://secunia.com/advisories/25295

Ответ 5

Переполнение буфера в строгом смысле перезаписи стека или самой кучи потребует либо:

  • Ошибка в структуре (они существовали в прошлом и могут снова появиться)
  • Использование JNI (по существу, больше не используется управляемый код)

Переполнение буфера в том смысле, что у вас есть код с использованием буфера, а ваш код отвечает за его правильное разборку, но это невозможно. Например, вы можете написать синтаксический анализатор XML, и кто-то может предоставить вам неправильный (или законный, но необычный) запрос, который благодаря дизайну вашего синтаксического анализа перезаписывает ранее проверенные данные с некоторой полезной нагрузкой, которая может привести к плохому действию вашего приложения.

Эта последняя форма менее вероятна, но плохо написанная функция очистки строк sql, широко распространенная, у которой была такая проблема, как это было бы привлекательной целью.

Ответ 6

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

Ответ 7

Как уже указывалось, Java в качестве языка ограничивает проверку всего доступа к памяти, и если здесь имеется ошибка, JVM виноват, а не программа. Однако, что следует отметить, что является аналогичным аргументом в отношении утечек памяти в Java; в то время как невозможно разбить стек, исключение ArrayOutOfBoundsEx в неправильном месте, которое не обрабатывается правильно, все равно может привести к зависанию вашей системы.

Ответ 8

Возможно, вы могли вызвать переполнение буфера в программе Java, если вы использовали средство Java Native Interace (JNI) для вызова внешнего кода, а внешний код имел проблему с возможностью использования. Это довольно редко, так как большинство приложений избегают использования JNI, где это возможно.

Ответ 9

Возможно, чтобы метод записывал в допустимые записи массива, который он не намеревался, как правило, через переполнение целых чисел.

Например, для проверки границ недостаточно:

/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */

IIRC, StringBuffer некогда была ошибка, но ничего интересного вам не удалось сделать.