Seguridad de Aplicaciones Veamos una clase de técnicas dirigidas a los protocolos de aplicación que corren encima de TCP/IP: Ataques de sondeo: • Finger: Puede revelar información “interesante” sobre un usuario (nombre real, teléfono, oficina, etc.). Esto es útil para montar un ataque a su contraseña. Además, una cuenta que no ha sido usada en mucho tiempo, es un buen blanco – puede tener una contraseña “fácil” (ej. la cuenta guest), y si se usa probablemente nadie se va a enterar. • TCP fingerprinting: Existen programas (ej. queso) que pueden identificar el sistema de operación de una máquina remota con bastante precisión. Esto le ayuda a Manuel en evaluar qué tipo de ataque puede tener éxito, el tamaño esperado de los buffers remotos, etc. • Banners: El texto introductorio que aparece cuando uno se conecta por un puerto FTP, Telnet, SMTP etc. puede revelar bastante información, incluyendo la versión del software y sistema de operación, quizás el verdadero nombre de la máquina, su arquitectura, etc. • Comandos como “showmount -e” dan información, por ejemplo sobre volumenes exportados por NFS. Los que estan exportados para lectura y escritura son los más interesantes . . . March 8, 2000 Seguridad de Aplicaciones-1 Ataques Locales Suponemos que Manuel puede interactuar con una máquina remota, por ejemplo: • Puede hacer login como usuario. Si no tiene cuenta, quizás puede robarse una (escuchando contraseñas en la red). • Se presenta como cliente de un servidor público (de FTP, Web, correo, etc.) El programa con el cuale él interactua en el servidor tı́picamente ejecuta con permisos especiales. Por ejemplo, en Unix muchos “demonios” tienen la propiedad de ser setuid, es decir que ejecutan con los privilegios de su dueño y no de los del usuario que los llama. Los “bugs” en tales programas son especialmente peligrosos, por que pueden dejar que Manuel los manipule. March 8, 2000 Seguridad de Aplicaciones-2 Desbordaje de Buffers El ataque favorito es aprovechar la falta de cuidado en el chequeo de parámetros, por ejemplo: { char buffer[16]; printf ("Nombre: "); gets (buffer); /* Leer nombre */ ... Nombre: unstringextremadamentelargo El programa no chequea el tamaño de su entrada. Como esta es más grande que el espacio reservado, se desborda el arreglo buffer y se sobreescribe la pila. Con suficiente cuidado, Manuel puede insertar instrucciones de máquina para que el programa ejecute una llamada al sistema similar a: system ("/bin/sh"); Ahora tiene un Shell corriendo en el servidor, con los privilegios del dueño del programa. Si éste es root, mejor todavı́a . . . March 8, 2000 Seguridad de Aplicaciones-3 Hay varias técnicas de defensa contra este tipo de problema: • Algunos sistemas (ej. Linux) tienen una opción en el kernel para que el segmento de pila no sea ejecutable. En ciertos casos (no comunes) esto puede romper algunos programas, y en todo caso no es una solución 100% efectivo. • Un producto llamado Stackguard (www.immunix.org) envuelve las llamadas a funciones en código especial que permite detectar cuando la dirección de retorno en la pila ha sido alterada. Tampoco es 100% efectivo. • Exhortar a los programadores a tener más cuidado cuando crean programas setuid. Además, realizar auditorias para que otros puedan revisar el código (por ejemplo el grupo Open BSD se dedica a esto). En este contrxto el acceso al código fuente es crı́tico. March 8, 2000 Seguridad de Aplicaciones-4 Ataques de Diccionario En el caso en que Manuel puede hacer login en la máquina remota, puede leer el archivo /etc/passwd y montar un ataque de búsqueda exhaustiva. Defensas: • No guardar el hash de las contraseñas directamente en /etc/passwd sino en otro archivo, /etc/shadow. Este último puede ser protegido contra lectura por procesos no-privilegiados. Todo sistema Unix moderno soporta esto (pero el administrador tiene que habilitarlo). A veces Manuel puede montar un contraataque: causa que el programa privilegiado aborte, dejando una imagen de su memoria en un archivo core que él puede leer (esto requiere algo de preparación previa). • Usar un algoritmo de “hashing” más fuerte que el normal. En Linux, se puede usar MD5, con contraseñas más largas que los tradicionales 8 caracteres. Nuevamente, el administrador tiene que habilitar esto explı́citamente. Nótese que a veces Manuel puede obtener una copia de /etc/passwd sin necesidad de hacer login. Algunos sistemas viejos de correo electrónico son tan ingénuos que Manuel les puede convencer a que le envien cualquier archivo en el sistema . . . March 8, 2000 Seguridad de Aplicaciones-5 Problemas con X-Windows X11 define un protocolo cliente-servidor, donde el servidor maneja la pantalla del usuario y los clientes son programas de aplicación. Puede funcionar sobre un protocolo de transporte de red, tı́picamente TCP, para el acceso desde sistemas remotos. Si no hay cuidado con el control de permisos, hay varios problemas potenciales: • Los eventos (“refrescar pantalla”, “movimiento del mouse”, “tecla presionada”, etc.) pueden ser monitoreados remotamente. • En el peor caso, Manuel puede colocar una ventana transparente que cubra toda la pantalla de su victima. Todos los eventos le serán enviados. Puede también introducir eventos (por ejemplo, ejecutar comandos en ventanas xterm). • Existen programas (ej. xwd) para hacer un “screen dump” – tomar una foto de una ventana. Con ellos Manuel puede captar el contenido de un documento, por ejemplo. Todo se facilita por que muchos usuarios no configuran bien sus sesiones de X11. Es muy fácil usar “xhost +” para quitar protecciones cuando las mismas molestan. Hay un sistema de autenticación llamado X cookies que ayuda en la defensa, pero a veces es fastidioso configurar. De todas maneras, no encripta las sesiones (aunque con el programa ssh esto también se puede hacer). March 8, 2000 Seguridad de Aplicaciones-6 Condiciones de Carrera Otro tipo de ataque explota pequeñas ventanas de tiempo en que un sistema es vulnerable. Por ejemplo, es muy común en las aplicaciones crear un archivo temporal en el directorio /tmp, y luego borrarlo unos segundos después. Esto requiere que se genere un nombre para dicho archivo, que no coincida con otro ya existente: for (;;) { generar nombre aleatorio en /tmp si /tmp/nombre-nuevo no existe { crear /tmp/nombre-nuevo /* X */ break } } Si Manuel es suficientemente astuto, puede predecir el valor de nombre-nuevo y justamente en el punto “X” crear un enlace simbólico con ese nombre, apuntando a un archivo de su elección, por ejemplo /etc/passwd . . . Defensa: crear nombres temporales atómicamente es “truculento” pero hay rutinas de librerı́a que lo pueden hacer. Uselas. March 8, 2000 Seguridad de Aplicaciones-7 Rootkits Si Manuel logra obtener privilegios de root, procede a encubrir sus acciones: • Instala nuevos binarios de comandos importantes, por ejemplo con una “puerta trasera” para que le sea más fácil entrar la próxima vez. • En los sistemas que permiten cargar módulos dinámicos del sistema de operación, puede colocar un módulo suyo para tomar control total sobre el sistema atacado. • Cambia el comportamiento de los utilitarios que hacen “logging” en el sistema para que no le rastrean. • Altera los logs existentes (/var/log/wtmp etc.) para quitar la evidencia de su penetración, y cambia las fechas de modificación de archivos claves (/etc/passwd etc.) para que no se note que han cambiado. Para facilitar estas acciones (que requieren de bastante sofisticación) puede utilizar un “rootkit” o paquete preparado por un experto. Disponible en los mejores sitios del Internet. Defensa: el sistema Tripwire mantiene una base de datos con un hash criptográficamente fuerte de todo archivo importante, y puede detectar cualquier cambio. La base de datos debe ser guardado en otro sitio que no sea vulnerable. Nótese que el programa tripwire en sı́ es un punto vulnerable a ataques. March 8, 2000 Seguridad de Aplicaciones-8 Debilidades de Aplicaciones Veamos algunas vulnerabilidades conocidas en sistemas Unix. Todos pueden ser tapadas, pero el administrador tiene que saber qué está haciendo. Los Comandos ’r’ La mayorı́a de las versiones de Unix tienen este “feature” (bug), el cual es derivado de BSD. Es decir soportan comandos como rsh, rexec, rlogin, etc. que consultan a los archivos /etc/hosts.equiv y $HOME/.rhosts para ver si “confian” en un anfitrión o usuario remoto. Si Manuel puede alterar dichos archivos, efectivamente abre las puertas. Más aún, tienen el efecto que la seguridad de nuestro sistema puede ser comprometida por la inseguridad de otros en loc cuales nuestros suarios “confian”. La mejor defensa es prohibir a los usuarios el uso de estos archivos, pero puede ser polı́ticamente dificil. TFTP El protocolo TFTP (usado para booting de estaciones de trabajo) es muy poco cuidadoso, y puede ser convencido a transferir cualquier archivo si no está bien configurado: $ tftp cretino.inocente.bobo.com tftp> get /etc/passwd /tmp/passwd Received 1205 bytes in 0.5 seconds tftp> quit $ crack < /tmp/passwd March 8, 2000 Seguridad de Aplicaciones-9 FTP FTP usa un sistema sencillo de contraseñas, las cuales pueden ser escuchadas. Además, el FTP Anónimo deja entrar cualquier usuario, por lo tanto las detalles de configuración del mismo son sumamente importantes. (Ej. tiene que correr como root porque usa puertos privilegiados . . . ). Algunos servidores hacen una consulta inversa a DNS para chequear el nombre del anfitrión cliente, pero esto es vulnerable (ver despues). Algunas reglas para servidores FTP: • El demonio debe hacer un chroot() para limitar su acceso al sistema de archivos del anfitrión. Esto implica usar un directorio /bin propio para el demonio, incluyendo copias de las librerı́as compartidas, y también un directorio particular de “dispositivos” (/dev). • Proteger todo archivo y directorio en el área FTP contra escritura. Ninguno de estos debe pertenecer al “login” FTP – el proceso demonio corre con esta identidad. • No dejar un archivo /etc/passwd real en el área (tiene que existir uno falso porque se usa). • Pensar tres veces antes de crear un directorio público (incoming). Es un blanco favorito para software pirateado. March 8, 2000 Seguridad de Aplicaciones-10 DNS Tı́picamente DNS maneja mapas directos e inversos, pero no necesariamente hay coherencia entre ellos. Si Manuel controla parte del árbol inverso, algunos anfitriones se van a engañar cuando usan una consulta inversa para autentificar una máquina (ej. un cliente FTP). Cierta protección se puede lograr si el resultado de la consulta inversa se aplica a una consulta directa para chequear. Si Manuel tiene acceso al cache de consultas del victima, puede contaminarlo de tal manera que el chequeo anterior parece confirmar la autenticidad. Una variante es inundar el servidor DNS del victima con respuestas falsas. Versiones recientes (de bind por ejemplo) pueden resistir esto. En todo caso, no se debe confiar en autentificación basada en los nombres de máquinas. Utilizar las direcciones IP es mejor, aunque sea débil. Algunos resolvers hacen esto: un usuario en el dominio ldc.usb.ve trata de contactar a cd.pir.com. El resolver intenta con cd.pir.com.ldc.usb.ve, cd.pir.usb.com.ve, y cd.pir.com.ve, antes de cd.pir.com. Manuel puede crear un dominio en pir.com.ve . . . March 8, 2000 Seguridad de Aplicaciones-11 Correo POP (Post Office Protocol) es simplista, aunque sı́ pide una contraseña del usuario. Hay propuestas para usar one-time passwords, ej. con el sistema S/KEY. El protocolo SMTP es aún más simplista por que ni siquiera intenta autentificar el usuario (para sorpresa de muchos usuarios). Por ejemplo, es trivial falsificar un mensaje (usando MAIL FROM en una sesión Telnet al puerto 25). Además, el programa sendmail es uno de los más complejos y problemáticos en el universo Unix, y frecuentemente corre como root. Mejoras alternativas incluyen postfix, qmail y exim, pero ninguno es 100% compatible con sendmail y usarlos puede implicar un cambio no transparente para los usuarios. De todas maneras, tampoco hacen autentificación (algunos pueden soportar un modo “SMTP después de POP” para tratar de reducir la vulnerabilidad, pero esto no es estandarizado). Otros RPC, Portmapper, NIS, NFS, IMAP, SNMP, NNTP . . . March 8, 2000 Seguridad de Aplicaciones-12