Seguridad Informática Seguridad software II Ramón Hermoso y Matteo Vasirani Grado en Ingenierı́a Informática Principios básicos de seguridad software Diseño Programación 1 Principios básicos de seguridad software 2 Diseño 3 Programación 4 Modelo de seguridad Java Modelo de seguridad Java Principios básicos de seguridad software Diseño Programación 1 Principios básicos de seguridad software 2 Diseño 3 Programación 4 Modelo de seguridad Java Modelo de seguridad Java Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Principios básicos de seguridad software Dos perspectivas: Diseño Definir la arquitectura de seguridad de un sistema Principios generales para proteger los recursos importantes1 Programación Programar las funcionalidades con garantı́as de seguridad Dependiente del lenguaje de programación 1 Saltzer & Schroeder, “The Protection of Information in Computer Systems” Principios básicos de seguridad software Diseño Programación 1 Principios básicos de seguridad software 2 Diseño 3 Programación 4 Modelo de seguridad Java Modelo de seguridad Java Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Diseño 1 Economı́a del mecanismo Mantener el diseño lo más simple posible Muy importante en seguridad ya que los errores de diseño son difı́ciles de detectar cuando se usa el sistema normalmente Ejemplo El protocolo finger permite preguntar información sobre los usuarios de un sistema Una implementación del cliente asume que la respuesta del servidor está siempre bien formada Un servidor atacante puede enviar una secuencia infinita de caracteres El cliente imprime los caracteres, llenando el disco → denegación de servicio Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Diseño 2 Exclusión por defecto Tomar las decisiones de acceso sobre la base de los permisos y no de denegación de acceso Para todo evento que no está previsto, se denega el acceso Ejemplo Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Diseño 2 Exclusión por defecto Tomar las decisiones de acceso sobre la base de los permisos y no de denegación de acceso Para todo evento que no está previsto, se denega el acceso Ejemplo int ret = IsAccessAllowed(...); if (ret == ERROR ACCESS DENIED) { // Security check failed. } else { // Security check OK. } Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Diseño 2 Exclusión por defecto Tomar las decisiones de acceso sobre la base de los permisos y no de denegación de acceso Para todo evento que no está previsto, se denega el acceso Ejemplo int ret = IsAccessAllowed(...); if (ret == ERROR ACCESS DENIED) { // Security check failed. } else { // Security check OK. } ¿Qué pasa si el método IsAccessAllowed(...) falla? Principios básicos de seguridad software Diseño Programación Diseño 2 Exclusión por defecto (continua) Una mejor implementación serı́a int ret = IsAccessAllowed(...); if (ret == NO ERROR) { // Security check OK. } else { // Security check failed. } Modelo de seguridad Java Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Diseño 3 Mediación completa Todo acceso a cualquier objeto tiene que ser autorizado Es fundamental la autenticación Comprobar los permisos sólo una vez aumenta las prestaciones pero pone en peligro la seguridad Ejemplo Un DNS almacena una tabla que asocia un nombre simbólico a una dirección IP Un atacante consigue cambiar esta tabla asociando otra IP a un nombre simbólico El DNS confı́a en la primera comprobación nombre-IP y enruta todo el tráfico a la máquina con la IP del atacante Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Diseño 4 Diseño abierto El diseño del sistema no tiene que ser secreto Asumir que un atacante tiene información sobre cómo funciona el mecanismo de protección Desacoplar el mecanismo de protección de las llaves Obscuridad 6= seguridad Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Diseño 5 Separación de privilegios El sistema deberı́a dar acceso sólo si se cumplen multiples condiciones Una puerta que necesita dos llaves es más robusta que una que sólo necesita una Separar el software en varios componentes cuyo acceso se pueda controlar Ejemplo En Unix BSD un usuario puede cambiar al usuario root (su root) sólo si 1) sabe la contraseña y 2) pertenece al grupo wheel, cuyo GID es 0 Ambas condiciones son necesarias Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Diseño 6 Menor privilegio posible Un usuario o un proceso tiene que tener los privilegios mı́nimos para poder operar Revocar los privilegios cuanto antes Ejemplo La regla need to know del ejército US Las personas tienen acceso sólo a los documentos relevantes a sus tareas Ejemplo: El programa sendmail necesita los privilegios de root para abrir el puerto 25 Una vez que se ha establecido en escucha en el puerto 25, no necesita los privilegios de root Sin embargo, el programa no se auto-revoca los privilegios → buffer overflow → escalada de privilegios Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Diseño 7 Aceptabilidad psicológica Los mecanismos de seguridad no deben inhibir la accesibilidad a los recursos Si un mecanismo de seguridad complica demasiado el acceso a un recurso, el usuario tendrá la tentación de desactivar el mecanismo A ser posible, los mecanismos de seguridad deberı́an ser transparentes y user-friendly Ejemplo El programa ssh permite crear la pareja de claves pública-privada para poder acceder remotamente a un ordenador sin contraseña Ejemplo Poner una contraseña para leer un fichero Documento Word del examen: OK Fichero de configuración: KO Principios básicos de seguridad software Diseño Programación 1 Principios básicos de seguridad software 2 Diseño 3 Programación 4 Modelo de seguridad Java Modelo de seguridad Java Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 1 Proteger datos y métodos internos Usar los mecanismos de control de acceso proporcionados por el lenguaje de programación Tipos de datos abstractos (abstract), modificadores de privacidad (private) Ejemplo Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 1 Proteger datos y métodos internos Usar los mecanismos de control de acceso proporcionados por el lenguaje de programación Tipos de datos abstractos (abstract), modificadores de privacidad (private) Ejemplo public abstract class Animal { private boolean isHuman = false; ... } public class Dog extends Animal { public void evolve(){ isHuman = true; // Cannot do that } } Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 2 Manejar eventos “imposibles” No asumir que determinados errores no puedan suceder Introducir excepciones (java.lang.Exception) de manera explicita Ejemplo Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 2 Manejar eventos “imposibles” No asumir que determinados errores no puedan suceder Introducir excepciones (java.lang.Exception) de manera explicita Ejemplo switch(suit) { case Suit.CLUBS: // ♣ ... break; case Suit.DIAMONDS: // ♦ ... break; case Suit.HEARTS: // ♥ ... break; case Suit.SPADES: // ♠ ... break; default: throw new RuntimeException() Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 3 Usar la criptografı́a con cuidado Evitar claves predecibles o espacios de claves reducidos (generador de números aleatorios + semilla) Gestión de claves, almacenamiento seguro, vaciar la memoria Ejemplo Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 3 Usar la criptografı́a con cuidado Evitar claves predecibles o espacios de claves reducidos (generador de números aleatorios + semilla) Gestión de claves, almacenamiento seguro, vaciar la memoria Ejemplo char[] pw = readPassword() ... // use password java.util.Arrays.fill(pw, ’\0’); Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 4 Programar de manera defensiva Desconfiar de los datos proporcionados por el usuario Esperar lo peor (ley de Murphy): atacantes o idiotas Evitar variables globales (public static final) Ejemplo Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 4 Programar de manera defensiva Desconfiar de los datos proporcionados por el usuario Esperar lo peor (ley de Murphy): atacantes o idiotas Evitar variables globales (public static final) Ejemplo public void setTheMap(Object key, Object value){ map.put(key, value); // Java allows null keys } Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 4 Programar de manera defensiva Desconfiar de los datos proporcionados por el usuario Esperar lo peor (ley de Murphy): atacantes o idiotas Evitar variables globales (public static final) Ejemplo public void setTheMap(Object key, Object value){ map.put(key, value); // Java allows null keys } public void setTheMap(Object key, Object value){ if(key == null){ throw new RuntimeException(); } else { map.put(key, value); } } Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 5 Evitar los objetos mutables Es peligroso que un método devuelva un objeto mutable Ejemplo Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 5 Evitar los objetos mutables Es peligroso que un método devuelva un objeto mutable Ejemplo public List getTheList(){ return myPreciousList; } Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 5 Evitar los objetos mutables Es peligroso que un método devuelva un objeto mutable Ejemplo public List getTheList(){ return myPreciousList; } La clase que invoca el método getTheList() puede cambiar el contenido de myPreciousList Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 5 Evitar los objetos mutables Es peligroso que un método devuelva un objeto mutable Ejemplo public List getTheList(){ return myPreciousList; } La clase que invoca el método getTheList() puede cambiar el contenido de myPreciousList import java.util.Collections; ... public List getTheList(){ return Collections.unmodifiableList(myPreciousList); } Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 6 Serialización Una vez serializados, los objetos están fuera del sistema de seguridad de la JVM Poner los datos que no se quieren serializar como transient Cifrar los datos sensibles que se quieren serializar Ejemplo Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Programación 6 Serialización Una vez serializados, los objetos están fuera del sistema de seguridad de la JVM Poner los datos que no se quieren serializar como transient Cifrar los datos sensibles que se quieren serializar Ejemplo public class UserData{ private transient String password; private String username; ... } Principios básicos de seguridad software Diseño Programación 1 Principios básicos de seguridad software 2 Diseño 3 Programación 4 Modelo de seguridad Java Modelo de seguridad Java Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Seguridad Java Muchos problemas de seguridad están relacionados con el acceso a la memoria El lenguaje Java se diseñó eliminando algunas caracterı́sticas presentes en otros lenguajes de programación como C++ Eliminación de la aritmética con punteros Comprobación de rangos en el acceso a vectores Definición del comportamiento de las variables sin inicializar Eliminación de la liberación de memoria controlada directamente por el programador Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Seguridad Java Aplicaciones y applets son sujetas a una polı́tica de seguridad que delimita la ejecución en un dominio que especifica un conjunto de permisos para acceder a los recursos Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Seguridad Java Applet Los navegadores instalan automáticamente un SecurityManager que vigila la ejecución de las applet El programa se ejecuta en una sandbox que limita el acceso a los recursos del sistema Aplicaciones Una aplicación puede invocar el SecurityManager cuando arranca con la opción -Djava.security.manager Cuando el class loader carga un programa, éste es asociado a un conjunto de permisos por defecto (objetos java.security.Permission) Es posible implementar una polı́tica de control de acceso para conceder/revocar permisos Principios básicos de seguridad software Diseño Programación Modelo de seguridad Java Extensiones Java proporciona extensiones para programar funcionalidades de seguridad Java Cryptography Extension (JCE) Cifrado, claves públicas-privadas, números aleatorios, firmas digitales, certificados Basado en una arquitectura de plugin, que permite a diferentes provedores ofrecer diferentes implementaciones de los mismos servicios Java Secure Socket Extension (JSSE) Creación de socket seguras para comunicación TCP/IP (SSL) Java Authentication and Authorization Service (JAAS) Autenticación de usuarios Autorización para ejecutar determinadas acciones