vulnerability tutorial seguridad overflows ejemplo java buffer-overflow buffer-overrun

tutorial - ¿Tiene Java desbordamientos de búfer?



perl buffer overflow (10)

Como Java Strings se basa en matrices char y Java comprueba automáticamente límites de matriz, los desbordamientos de búfer solo son posibles en escenarios inusuales:

  1. Si llama código nativo a través de JNI
  2. En la propia JVM (generalmente escrita en C ++)
  3. El intérprete o el compilador JIT no funciona correctamente (verificaciones de límites obligatorios por código de bytes Java)

¿Tiene Java desbordamientos de búfer? Si es así, ¿puedes darme escenarios?


Como ya se ha señalado, Java tiene, como lenguaje, la comprobación de límites en todo el acceso a la memoria, y si hay un error aquí, la JVM tiene la culpa y no el programa. Sin embargo, lo que debe tenerse en cuenta, que es un argumento similar a las pérdidas de memoria en Java; si bien no es posible destruir la pila, una excepción ArrayOutOfBoundsException en el lugar incorrecto, que no se maneja correctamente, puede terminar arruinando su sistema.


Es posible que un método escriba en entradas válidas de una matriz que no tenía la intención de hacerlo, normalmente a través de un desbordamiento de enteros.

Por ejemplo, lo siguiente no es suficiente para verificar los límites:

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

IIRC, StringBuffer una vez tuvo un error como ese, pero no había nada interesante que pudieras hacer con él.


Las máquinas virtuales Java (y .Net) detectan código que intenta escribir fuera de la memoria reservada. Las aplicaciones que no manejan esto correctamente todavía pueden causar problemas de seguridad. Si los usuarios malintencionados pueden desencadenar excepciones ingresando entradas no válidas, pueden hacer ataques de denegación de servicio, por ejemplo.


Los lenguajes administrados como Java y C # no tienen estos problemas, pero las máquinas virtuales específicas (JVM / CLR / etc) que realmente ejecutan el código pueden.


Para todos los efectos, no.

Java tiene una comprobación de límites de matriz que verificará que no se pueda acceder a los datos desde el área fuera de la matriz asignada. Cuando se intenta acceder al área que está más allá del tamaño de la matriz, se ArrayOutOfBounds una excepción ArrayOutOfBounds .

Si hay un desbordamiento del búfer, probablemente se deba a un error en la Máquina Virtual Java y, a mi conocimiento, no es el comportamiento previsto que está escrito en las Especificaciones del lenguaje Java ni en las Especificaciones de la Máquina virtual Java.


Posiblemente podría causar un desbordamiento del búfer en un programa Java si estaba utilizando el recurso Java Native Interace (JNI) para invocar código externo, y el código externo tenía un problema explotable. Esto es bastante poco frecuente, ya que la mayoría de las aplicaciones evitan el uso de JNI siempre que sea posible.


Si y no. No, en realidad no se puede crear una apertura errónea de una vulnerabilidad de desbordamiento de búfer porque es un modelo de memoria administrada. Sin embargo, puede haber vulnerabilidades de desbordamiento de búfer en la JVM y JDK. Ver este aviso de Secunia:

http://secunia.com/advisories/25295


Un desbordamiento de búfer en el sentido estricto de sobrescribir la pila o el propio montón requeriría:

  1. Un error en el marco (estos han existido en el pasado y pueden serlo nuevamente)
  2. El uso de JNI (esencialmente ya no usa código administrado)

Un desbordamiento de búfer en el sentido de que tiene código utilizando un búfer y su código es responsable de analizarlo correctamente pero no hacerlo es posible. Por ejemplo, puede escribir un analizador XML y alguien podría proporcionarle una solicitud mal formada (o legítima pero poco común) que, debido al diseño de su analizador, sobrescribe datos previamente validados con alguna carga útil que podría causar un mal funcionamiento de su aplicación.

Esta última forma es menos probable, pero una función de limpieza de cadenas sql mal escrita ampliamente distribuida que tenía un problema como este sería un objetivo atractivo.


Una de las características clave de JAVA es Seguridad. Los programas escritos en idiomas interpretados no son propensos a la explotación de desbordamiento de búfer, pero siempre puede causar un desbordamiento de búfer en Intérprete mismo. Aunque será difícil. Del mismo modo, Python también es un lenguaje interpretado y está a salvo del desbordamiento del búfer.

Gracias..