Seguridad en Java 

Qué es Java 

Prohibido 

Agujeros 

Líneas futuras 

Cómo firmar applets 

Consejos 

Recursos 

Barreras de seguridad en Java

Modelo de las 4 capas
Lenguaje
Verificador
Cargador
Gestor

Características del lenguaje/compilador

Java fue diseñado con las siguientes ideas en mente:

  • Evitar errores de memoria
  • Imposibilitar acceso al SO
  • Evitar que caiga la máquina sobre la que corre

Con el fin de llevar a la práctica estos objetivos, se implementaron las siguientes características:

Ausencia de punteros
Protege frente a imitación de objetos, violación de encapsulación, acceso a áreas protegidas de memoria, ya que el programador no podrá referenciar posiciones de memoria específicas no reservadas, a diferencia de lo que se puede hacer en C y C++.
Gestión de memoria
Ya no se puede gestionar la memoria de forma tan directa como en C, (no hay malloc). En cambio, se instancian objetos, no se reserva memoria directamente (new siempre devuelve un handler), minimizando así la interacción del programador con la memoria y con el SO.
Recogida de basura
El programador ya no libera la memoria manualmente mediante free (fuente muy común de errores en C y C++, que posía llegar a producir el agotamiento de la memoria del sistema). El recogedor de basura de Java se encarga de reclamar la memoria usada por un objeto una vez que éste ya no es accesible o desaparece. Así, al ceder parte de la gestión de memoria a Java en vez de al programador, se evitan las grietas de memoria (no reclamar espacio que ya no es usado más) y los punteros huérfanos (liberar espacio válido antes de tiempo).
Arrays con comprobación de límites
En Java los arrays son objetos, lo cual les confiere ciertas funciones muy útiles, como la comprobación de límites. Para cada subíndice, Java comprueba si se encuentra en el rango definido según el número de elementos del array, previniendo así que se referencien elementos fuera de límite
Referencias a objetos fuertemente tipadas
Impide conversiones de tipo y castings para evitar accesos fuera de límites de memoria (resolución en compilación)
Casting seguro
Sólo se permite casting entre ciertas primitivas de lenguaje (ints, longs) y entre objetos de la misma rama del árbol de herencia (uno desciende del otro y no al revés), en tiempo de ejecución
Control de métodos y variables de clases
Las variables y los métodos declarados privados sólo son accesibles por la clase o subclases herederas de ella y los declarados como protegidos, sólo por la clase
Métodos y clases final
Las clases y los métodos (e incluso los datos miembro) declarados como final no pueden ser modificados o sobrescritos. Una clase declarada final no puede ser ni siquiera extendida.

Pero, ¿qué ocurriría si modifico un compilador de C para producir códigos de byte de Java, pasando por alto todas las protecciones suministradas por el lenguaje y el compilador de Java que acabamos de describir?

Con el fin de evitar esa forma de ataque, se construyó la segunda línea de defensa, el verificador de código de bytes.

 

Copyright © 1997-1998 Gonzalo Álvarez Marañón, CSIC. Todos los derechos reservados.

Criptonomicón es un servicio ofrecido libremente desde el Instituto de Física Aplicada del CSIC. Para información sobre privacidad, por favor consulte la declaración de política sobre privacidad. Para sugerencias, comentarios o quejas, acuda al libro de visitas. Para contribuir al Criptonomicón, lea la página de contribuciones.