Есть ли у 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:
Ответ 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
некогда была ошибка, но ничего интересного вам не удалось сделать.