Entendiendo el día cero de JVM en relación con otros tiempos de ejecución

4

Soy un desarrollador de .net y php, y como Java ha estado en las noticias recientemente gracias a la cadena de cero días, decidí actualizar la seguridad.

En lo que respecta a los días cero de Java, esta pregunta ha sido muy útil: Seguridad de JVM para el servidor . Tengo entendido que las vulnerabilidades existen en los applets de java que se ejecutan en el navegador y no para las aplicaciones web alojadas en un servidor.

Si esto es correcto, entonces las aplicaciones web del lado del servidor que se ejecutan en plataformas como .net, springmvc, lamp son bastante seguras, además de los vectores de ataque introducidos por el desarrollador, como la entrada sin saneamiento y similares (consulte owasp ).

Mi pregunta es la siguiente: ¿Se han realizado estudios para ver si alguna de las plataformas web populares (puedo pensar en lamp, spring, .net) es inherentemente más vulnerable que otras?

    
pregunta ton.yeung 25.05.2013 - 21:38
fuente

3 respuestas

3

Usted tiene razón en su evaluación de "Java 0-day" para el código del servidor. Estos ataques tienen que ver con la ruptura de código hostil del sandbox de applet , que es el modelo de seguridad utilizado por los applets: un applet es un código que podría ser malicioso y, por lo tanto, se ejecutará bajo fuertes restricciones (por ejemplo, sin acceso a archivos locales, sin carga de código nativo, sin conexiones de red, excepto al servidor que envió el applet El primer lugar, no hay introspección completa en otros paquetes ...). En un servidor, el código es, por definición, no hostil y no se ejecuta en un entorno limitado.

Java en un servidor todavía se ejecuta en la Java Virtual Machine , que no es lo mismo que el sandbox. En términos generales, la JVM impone reglas de tipo (sin acceso a campos o llamadas de método en objetos que no tienen el campo o método designado) y límites de matriz (no se escribe en bytes adyacentes después de desbordamientos de búfer), y ejecuta el recolector de basura; La zona de pruebas agrega muchos controles adicionales sobre qué métodos estándar pueden llamarse o no, con un elaborado sistema de permisos. El código del lado del servidor no está en un espacio aislado, pero la JVM seguirá conteniendo el daño en caso de que haya agujeros explotables:

  • En el caso de un desbordamiento del búfer, el subproceso ofensivo se termina (bueno, recibe una excepción que puede interceptar, pero en la práctica la terminación es el resultado final normal) y ningún objeto en la memoria ha sido realmente dañado. Los desbordamientos de búfer siguen siendo errores, pero, al menos, las consecuencias son limitadas.

  • El recolector de basura , por definición, evitará cualquier tipo de acceso después de libre.

  • El sistema de tipo estricto evitará el acceso a cualquier byte de datos con una interpretación distinta de la que se utilizó para almacenar ese byte en primer lugar.

  • Las variables locales no inicializadas no se pueden leer (el análisis de flujo cuando se carga el código lo impide). Los campos se ven obligados sistemáticamente a establecer valores predeterminados sanos (0, false , 0.0, null ).

Todo esto, sin embargo, se aplica igualmente a .NET, PHP y Perl y casi a todos, excepto a los lenguajes de programación de muy bajo nivel.

Intentar establecer niveles de vulnerabilidades inherentes es un negocio arriesgado. Las características de Java, que expliqué anteriormente, pueden convertirse en un argumento sobre cómo es Java ". inherentemente seguro ". Sin embargo, lo mismo se aplicaría a la mayoría de los otros marcos de programación, incluido PHP. En última instancia, la mayoría de las vulnerabilidades son errores de programación, no en el marco, sino errores cometidos por el desarrollador que utilizó el marco. Contar las vulnerabilidades publicadas le informará solo sobre los agujeros de seguridad en el marco bibliotecas , pero no sobre los agujeros en el código desarrollado para el marco, y ahí es donde estarán la mayoría de los agujeros.

Por lo tanto, las vulnerabilidades se relacionan con lo fácil que es usar el marco y con lo buenas (o malas) que las características del marco ayudan al programador a no hacer errores. Esto es relativo al desarrollador . Un desarrollador PHP capacitado que no sepa nada sobre Java no será bueno para crear un servidor seguro basado en Java: tendrá que aprender algo de Java y usarlo de inmediato, será un proceso doloroso y el desarrollador no tendrá Mucho tiempo para pruebas. Esto no implica en absoluto que PHP sea inherentemente más seguro que Java; la situación se revertiría con un desarrollador que conoce Java pero no PHP.

En el mejor de los casos, podemos señalar que los lenguajes de programación de "bajo nivel" como C, Forth, Assembly, C ++ ... son objetivamente más difíciles de usar que los de "alto nivel" (como C #, Java, PHP, Node.js ...). El punto donde esto es más evidente es el manejo de las cadenas de caracteres. Los servidores típicos hacen eso mucho. En C, el manejo de las cadenas de caracteres es muy manual, con todas las asignaciones y copias, y cuidando las longitudes del búfer. Los idiomas con gestión de memoria automática (por ejemplo, todos los que tienen un GC) hacen que estos trabajos sean mucho más fáciles, es decir, es mucho más difícil equivocarse .

Eso es sobre el final del ejercicio. Para plataformas basadas en lenguajes de alto nivel (ya sea LAMP, Spring, .NET ...), el "más seguro" será el que el desarrollador conozca mejor . Este "factor de conocimiento" triunfa sobre todos los demás.

(Podría convertir eso en: "el marco web más seguro será aquel para el que es más fácil encontrar un desarrollador competente".)

    
respondido por el Tom Leek 07.08.2013 - 19:13
fuente
1

Uno puede usar una base de datos de vulnerabilidades como NVD para tener una idea de cuántas vulnerabilidades han sido encontrado para un marco web particular. Por ejemplo, una búsqueda de rails devuelve 64 resultados, mientras que una búsqueda de asp.net devuelve 57 resultados. Uno puede filtrar las vulnerabilidades encontradas en los últimos tres meses para una visión más actual de las cosas. En este escenario, una búsqueda de rails devuelve 9 resultados, mientras que asp.net devuelve 0.

Sin embargo, esto por lo general no presenta ninguna vista de utilidad intrínseca sobre la situación general. Las vulnerabilidades se encuentran todo el tiempo, las vulnerabilidades se corrigen todo el tiempo. La seguridad subyacente de un marco elegido generalmente no será el enlace más débil en su aplicación web si siempre usa una versión reciente de dicho marco.

    
respondido por el Ayrx 26.05.2013 - 08:18
fuente
1
  

¿Se han realizado estudios para ver si alguna de las plataformas web populares (puedo pensar en lamp, spring, .net) es inherentemente más vulnerable que otras?

Bueno, tal estudio en general no sería exacto. A medida que aumenta la popularidad y el uso de una plataforma, también lo hace la superficie de impacto, y así, a su vez, la investigación que va a explotarla. Viceversa también es cierto.

Permítame explicarlo dando un poco de un ejemplo no relacionado.

Tomemos OS X y Windows. Encontrará una gran cantidad de vulnerabilidades en Windows y bastantes en OS X. Esto no significa que, de manera inherente, OS X sea seguro y que Windows sea un desastre. Esto se debe al hecho de que la superficie de impacto de una vulnerabilidad en Windows es enorme en comparación con la de OS X, por lo que se investiga mucho sobre el ataque a Windows, y menos en Linux, y aún menos en OS X, aunque en el pasado Hace un par de años hemos visto un aumento en las vulnerabilidades de OS X.

    
respondido por el oldnoob 07.08.2013 - 16:56
fuente

Lea otras preguntas en las etiquetas