Есть ли в Java переполнение буфера? - PullRequest
89 голосов
/ 26 января 2009

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

Ответы [ 10 ]

101 голосов
/ 26 января 2009

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

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

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

13 голосов
/ 26 января 2009

Для всех намерений и целей, нет.

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

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

9 голосов
/ 26 января 2009

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

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

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

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

9 голосов
/ 26 января 2009

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

http://secunia.com/advisories/25295

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

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

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

    Sun с благодарностью отмечает, что «regenrecht» работает с 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.

4 голосов
/ 26 января 2009

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

3 голосов
/ 26 января 2009

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

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

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

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

3 голосов
/ 26 января 2009

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

2 голосов
/ 26 января 2009

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

1 голос
/ 04 июня 2018

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

...