Вопрос

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

Это было полезно?

Решение

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

  1. Если вы вызываете машинный код через JNI
  2. В самой JVM (обычно написанной на C ++)
  3. Интерпретатор или JIT-компилятор работает некорректно (проверка границ, предписанных байт-кодом Java).

Другие советы

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

По сути, нет.

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

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

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

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

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

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

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

http://secunia.com/advisories/25295

Или посмотрите эти старые рекомендации по нескольким предыдущим уязвимостям JDK и JRE:

  • Уязвимости с целочисленностью и переполнением буфера в утилите распаковки JAR Java Runtime Environment (JRE) "unpack200" могут привести к повышению привилегий https://download.oracle.com/sunalerts/1020225.1.html

    Уязвимости с целочисленностью и переполнением буфера в среде выполнения Java Среда (JRE) с распаковкой апплетов и Java Web Start приложения, использующие утилиту распаковки JAR "unpack200", могут позволить ненадежному апплету или приложению повысить привилегии.Например, ненадежный апплет может предоставить самому себе разрешения на чтение и запись локальные файлы или выполнение локальных приложений, которые доступны для пользователя, запускающего ненадежный апплет.

    Sun выражает благодарность "регенрехту", работающему с iDefense VCP (http://labs.idefense.com/vcp/) и Крису Эвансу из Google за привлечение нашего внимания к этим проблемам.

  • В Sun Java Development Kit (JDK) и Java Runtime Environment (JRE) было выявлено множество уязвимостей. https://security.gentoo.org/glsa/200705-23

    Группа безопасности Fujitsu сообщила о неуказанной уязвимости, связанной с "неправильным использованием системных классов".Дополнительно, Крис Эванс из службы безопасности Google сообщил о переполнении целых чисел что привело к переполнению буфера в анализаторе ICC, используемом с JPG или BMP файлы и неправильный вызов open() в /dev/tty при обработке некоторые BMP-файлы.

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

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

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

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

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

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

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

Одной из ключевых особенностей JAVA является Безопасность.Программы, написанные на интерпретируемых языках, не подвержены эксплойту переполнения буфера, но вы всегда можете вызвать переполнение буфера в самом интерпретаторе.Хотя это будет непросто.Аналогично, Python также является интерпретируемым языком и защищен от переполнения буфера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top