La seguridad del lenguaje se puede interpretar más ampliamente que afectando simplemente a la seguridad. Pero como este es un sitio de seguridad, solo debemos restringirnos a la seguridad.
Es evidente que la selección de idioma tiene una importancia significativa sobre si obtendrá ciertos tipos de vulnerabilidad. Escriba un programa no trivial en C y estará lleno de errores de corrupción de memoria (desbordamiento del búfer, uso después de que se libere, etc.).
Hay un par de definiciones útiles:
Memoria segura : esto significa que un programa dentro del idioma no puede acceder a la memoria fuera de las asignaciones. No se ejecuta más allá de un búfer ni se utiliza una asignación después de que se haya liberado. Eso es difícil de probar automáticamente para un lenguaje como C. La seguridad de la memoria generalmente se logra a través de la recolección de basura y el uso de la seguridad de tipo más restrictiva.
Tipo de seguridad : no confunda esto con solo no desordenar sus tipos en idiomas inseguros. Esta es una garantía que va más allá de la seguridad de la memoria en el sentido de que no puede usar un tipo de manera inapropiada para el tipo real del objeto. No puede tratar un puntero como un entero, por ejemplo.
Curiosamente, desde 1.5 Java no es seguro para el tipo de vainilla. Es de tipo seguro con respecto a los tipos sin procesar, según lo utilizado por la JVM y el lenguaje de Java 1.4 y anteriores. No es seguro con respecto al sistema completo de tipo de idioma, incluidos los genéricos. Esto no parece importar en absoluto, en gran parte porque para acceder a un objeto, el bytecode debe realizar una verificación de tipo en bruto.
Para las vulnerabilidades de corrupción sin memoria, las bibliotecas se vuelven más importantes. Por ejemplo, la inyección es una clase de vulnerabilidad increíblemente popular, pero realmente no hay ninguna excusa para tener alguna.
El código móvil (que es un código móvil y no confiable) es algo completamente diferente. La seguridad se puede lograr a través de una caja de arena (como NaCl de Google), un Modelo de Capacidad de Objetos (jerga que significa esencialmente POO en un entorno seguro) o alguna combinación de los otros dos.
En cuanto a Java SE 1.7 vs 1.2. No ha habido mucho cambio. 1.2 es muy diferente a 1.1, y 1.0 fue un poco diferente de nuevo (aunque en realidad antes prestaba atención a este tipo de cosas).
Problemas específicos en el lenguaje de Java que causan vulnerabilidades:
-
static
(para campos, cuando no es inmutable) es una forma de una sola palabra clave para introducir vulnerabilidades y destruir la calidad del código.
- Soporte increíblemente pobre para tipos de valor (inmutables).
- Los métodos en Objeto y Java Serialización (estoy incluido como parte del lenguaje debido a la palabra clave
transient
y una implementación que ni siquiera es posible en el código de bytes) son dudosos.
- Permitir que los campos se vean sin inicializar (aunque sea un zerod) a los que se les puede dar una interpretación insegura.
- Desbordamiento de todos los tipos de enteros. Aunque como Java es seguro para la memoria, esto rara vez importa. No importa para validar argumentos a código nativo / intrínseco o administración de recursos.