Seguridad en los Sistemas Operativos
La seguridad con frecuencia, en las computadoras contienen datos valiosos y confidenciales, incluyendo declaraciones fiscales, números de tarjetas de crédito, planes de negocios, secretos comerciales y mucho más.
Por lo general, los propietarios de estas computadoras se preocupan mucho porque sean privadas y nadie pueda alterarlas, motivos por los que se requiere un sistema operativo que proporcione buena seguridad. Una manera de mantener la información secreta es cifrarla y administrar las claves con cuidado.
1. EL ENTORNO DE SEGURIDAD
Vamos a empezar nuestro estudio sobre la seguridad con la definición de cierta terminología. Algunas personas utilizan los términos “seguridad” y “protección” de manera indistinta. Sin embargo, con frecuencia es útil distinguir los problemas generales involucrados en el proceso de evitar que personas no autorizadas lean o modifiquen los archivos, lo que por una parte incluye cuestiones técnicas, administrativas, legales y políticas, y por otra incluye los mecanismos específicos del sistema operativo para brindar seguridad. Para evitar una confusión, utilizaremos el término seguridad para hacer referencia al problema general, y mecanismos de protección para referirnos a los mecanismos específicos del sistema operativo que se utilizan para salvaguardar la información en la computadora. Sin embargo, no hay un límite definido entre estos dos términos. Primero estudiaremos la seguridad para ver cuál es la naturaleza del problema. Más adelante en el capítulo analizaremos los mecanismos de protección y los modelos disponibles para ayudar a obtener seguridad.
La seguridad de los sistemas informáticos y de la red va dirigida a cuatro requisitos básicos:
• Confidencialidad. Requiere que la información de un sistema informático sólo se encuentre accesible para lectura para aquellas partes que estén autorizadas a este tipo de acceso. Este tipo de acceso incluye impresión, mostrado de datos y otras formas de observación, incluyendo la simple revelación de la existencia de un elemento. Por ejemplo, si el propietario de ciertos datos ha decidido que éstos pueden estar disponibles sólo para ciertas personas, el sistema debe garantizar que las personas no autorizadas nunca tengan acceso a esos datos. Como un mínimo absoluto, el propietario debe ser capaz de especificar quién puede ver qué cosa, y el sistema debe cumplir con estas especificaciones, que en teoría se deben aplicar a cada archivo en forma individual.
• Integridad. Requiere que los contenidos de un sistema informático sólo podrán modificarse por las partes que se encuentran autorizadas. Las modificaciones incluyen escritura, cambio, modificación del estado, borrado y creación.
• Disponibilidad. Requiere que los componentes de un sistema informático estén disponibles para todas aquellas partes autorizadas. Por ejemplo, si una computadora es un servidor de Internet y alguien le envía una avalancha de peticiones, puede dejarlo inhabilitado al ocupar todo el tiempo de su CPU con tan sólo tener que examinar y descartar las peticiones entrantes. Si, por ejemplo, requiere 100 μseg para procesar una petición entrante para leer una página Web, entonces cualquiera que se las arregle para enviar 10,000 peticiones/segundo podrá aniquilarlo. Hay disponibles modelos razonables y tecnología
para lidiar con los ataques sobre la confidencialidad y la integridad; es mucho más difícil frustrar estos ataques de negación de servicio.
• Autenticación. Requiere que el sistema informático sea capaz de verificar la identidad de los usuarios.
Componentes de un sistema informático
Los componentes de un sistema informático se pueden clasificar en hardware, software, datos y líneas de comunicaciones y red.
Hardware. El principal peligro del hardware de un sistema informático se encuentra en el área de la disponibilidad. El hardware es el componente más vulnerable a ataques y también es el menos accesible a una manipulación remota. Los principales peligros incluyen daño accidenta] o deliberado a los equipos, así como el robo. La proliferación de ordenadores personales y estaciones de trabajo y el incremento en el uso de redes de área local incrementan las potenciales pérdidas en esta área. Para hacer a frente estos peligros se necesitan medidas de seguridad física y administrativa.
Software. Lo que hace del hardware del sistema informático algo útil para negocios e individuos son el sistema operativo, las utilidades y los programas de aplicación.
La seguridad tiene muchas facetas. Tres de las más importantes son la naturaleza de las amenazas, la naturaleza de los intrusos y la pérdida accidental de datos. Ahora analizaremos cada una de estas facetas en orden.
1.1 Amenazas
Las amenazas relacionadas con los programas de los temas operativos se implementa mediante diversas técnicas, que van desde la utilización de contraseñas para la autenticación a la defensa frente a virus y a la detección de intrusos. Vamos a comenzar explorando la gama de amenazas a la seguridad.
Por tanto, un objetivo común de los piratas informáticos consiste en escribir un programa que cree una brecha de seguridad o que haga que un proceso normal cambie su comportamiento y cree esa brecha de seguridad. De hecho, la mayoría de las brechas de seguridad no relacionadas con programas tienen por objetivo crear una brecha que sí esté basada en un programa. Por ejemplo, aunque resulta útil iniciar una sesión en un sistema sin autorización, normalmente es mucho más útil dejar un demonio de tipo puerta trasera que proporcione información o que permita un fácil acceso incluso aunque se bloquee la brecha de seguridad original. En esta sección, vamos a describir algunos métodos comunes mediante los que los programas pueden provocar brechas de seguridad. Hay que resaltar que existe una considerable variación en lo que respecta a los convenios de denominación de los agujeros de seguridad, y que en este texto utilizamos los términos más comunes o descriptivos.
1.1.1 Malware
En los tiempos antiguos (por ejemplo, antes del 2000), los adolescentes aburridos (pero inteligentes) algunas veces utilizaban sus horas de ocio para escribir software malicioso que después liberaban en el mundo, sólo por hacerlo. A este software (que incluía troyanos, virus y gusanos, y que en conjunto se le conoce como malware) se esparcía rápidamente en todo el mundo. A medida que se publicaba cuántos millones de dólares en daños había provocado el malware y cuántas personas habían perdido sus valiosos datos como resultado, los autores se impresionaban mucho con sus habilidades de programación. Para ellos sólo era una travesura divertida; después de todo, no estaban
obteniendo dinero de eso.
Otra de las aplicaciones comunes del malware es instalar un keylogger en la máquina infectada. Este programa simplemente registra todas las pulsaciones de tecla y las envía en forma periódica a algún máquina o secuencia de máquinas (incluyendo zombies) para que entreguen esta información al criminal. A menudo es difícil hacer que el proveedor de Internet que da servicio a la máquina que hace las entregas coopere en una investigación, ya que muchos de estos proveedores están confabulados con el criminal (o, en algunas ocasiones, es el propietario).
Para protegerse contra estos ataques, las empresas de tarjetas de crédito utilizan software de inteligencia artificial para detectar ciertos patrones peculiares de gastos. Por ejemplo, si una persona que comúnmente utiliza su tarjeta de crédito sólo en las tiendas locales, de manera repentina ordena una docena de computadoras notebook costosas para que las entreguen en una dirección, por ejemplo en Tajikistan, empieza a sonar una alarma en la empresa de tarjetas de crédito y por lo general un empleado llama al tarjeta habiente para preguntarle amablemente sobre la transacción.
Otra forma de delito que se comete mediante cierto malware es permanecer invisible hasta que el usuario inicie sesión de manera correcta en su cuenta bancaria de Internet. Después, ejecuta rápidamente una transacción para ver cuánto dinero hay en la cuenta y lo transfiere de inmediato a la cuenta del criminal, desde donde se transfiere también de inmediato a otra cuenta, luego a otra y a otra (todo esto en distintos países corruptos), de manera que la policía necesite días o semanas para recolecta todas las órdenes de cateo requeridas para seguir el dinero, y que tal vez no se respeten aunque lleguen a obtenerlas. Este tipo de delitos implica un volumen de negocios importante; ya no se trata de adolescentes molestos.
1.1.1.1 Caballos de Troya (troyanos)
A este método se le conoce como ataque de caballo de Troya o troyano en honor al caballo de madera lleno de soldados griegos que se describe en la Odisea de Homero. En el mundo de la seguridad de computadoras, representa a cualquier tipo de malware oculto en el software o en una página Web, que las personas descargan en forma voluntaria.
Cuando se inicia el programa gratuito, llama a una función que escribe el malware en el disco como un programa ejecutable y lo inicia. Después, el malware puede hacer todo el daño para el que fue diseñado, como eliminar, modificar o cifrar archivos. También puede buscar números
de tarjetas de crédito, contraseñas y otros datos útiles, y enviarlos de vuelta a Mal por medio de Internet. Lo más probable es que se adjunte a algún puerto IP y espere ahí las indicaciones, convirtiendo la máquina en un zombie lista para enviar spam o cualquier cosa que su amo remoto desee.
Por lo general, el malware también invoca los comandos necesarios para asegurar que se
reinicie cada vez que se reinicia la máquina. Todos los sistemas operativos tienen una manera de hacer esto. La belleza del ataque del caballo de Troya es que no requiere que su autor irrumpa en la computadora de la víctima. Es la víctima quien hace todo el trabajo.
1.1.1.2 Virus
Es difícil abrir un periódico en estos días sin leer algo acerca de otro virus o gusano de computadora que ataca las computadoras del mundo. Es evidente que son un gran problema de seguridad para individuos y empresas por igual. En esta sección examinaremos los virus; después veremos los gusanos.
¿Qué es un virus? Un virus es un programa que se puede reproducir a sí mismo al adjuntar su código a otro programa, lo cual es similar a la forma en que se reproducen los virus biológicos. El virus también puede hacer otras cosas además de reproducirse a sí mismo. Los gusanos son como los virus, pero se duplican en forma automática. Esa diferencia no nos interesa aquí, por lo que por el momento utilizaremos el término “virus” para tratar con ambos términos.
¿Cómo funcionan los virus?
Ahora veamos qué tipos de virus hay y cómo funcionan. El escritor del virus (llamémoslo Virgilio) probablemente trabaja en ensamblador (o tal vez en C) para obtener un producto pequeño y eficiente. Después de escribir su virus, lo inserta en un programa en su propia máquina, utilizando una herramienta conocida como dropper. Luego, ese programa infectado se distribuye, tal vez publicándolo en una colección de software gratuito en Internet. El programa podría ser un nuevo juego emocionante, una versión pirata de algún software comercial o cualquier otra cosa que se pueda considerar como deseable. Después las personas empiezan a descargar el programa infectado.
1.1.1.2 .1 Virus de compañía
Un virus de compañía en realidad no infecta a un programa, sino que se ejecuta cada vez que lo hace el programa. El concepto es más fácil de explicar con un ejemplo. En MS-DOS, cuando el usuario escribe prog el MS-DOS busca primero un programa llamado prog.com. Si no puede encontrar uno, busca un programa llamado prog.exe. En Windows, cuando el usuario hace clic en Inicio y después en Ejecutar, ocurre lo mismo. Hoy en día la mayoría de los programas son archivos .exe; los archivos .com son muy raros. Suponga que Virgilio sabe que muchas personas ejecutan prog.exe desde un indicador de MSDOS o desde el comando Ejecutar en Windows. Así sólo tiene que liberar un virus llamado prog.com, que se ejecute cada vez que alguien trate de ejecutar prog (a menos que escriba el nombre
completo: prog.exe). Cuando prog.com termina su trabajo, sólo ejecuta prog.exe y el usuario no se da cuenta de ello.
1.1.1.2.2 Virus de programa ejecutable
Los virus que infectan programas ejecutables son más complejos que los de compañía. El tipo más simple de virus de programa ejecutable sólo sobrescribe al programa. A éstos se les conoce como virus de sobrescritura.
El verdadero procedimiento de infección llamado infecta (que no se muestra) simplemente tiene que abrir el archivo cuyo nombre está en su parámetro, copiar el virus guardado en el arreglo sobre el archivo y después cerrar el archivo.
Este virus se podría “mejorar” de varias formas. En primer lugar, se podría insertar una prueba en infectar para generar un número aleatorio y después regresar en la mayoría de los casos sin hacer nada. Por ejemplo, la infección se llevaría a cabo en una de 128 llamadas, con lo cual se reduciría la probabilidad de que alguien detectara el virus antes de que pudiera esparcirse. Los virus biológicos tienen la misma propiedad: los que matan rápido a sus víctimas no se esparcen con tanta rapidez como los que producen una muerte lenta y prolongada, dando a las víctimas muchas oportunidades para esparcir el virus. Un diseño alternativo sería tener una tasa de infección más alta (por ejemplo, de 25%) pero una disminución en el número de archivos infectados a la vez, para reducir la actividad del disco y por ende ser menos conspicuo.
1.1.1.2.3 Virus residentes en memoria
Hasta ahora hemos asumido que cuando se ejecuta un programa infectado se ejecuta el virus, pasa el control al programa real y después termina. Por el contrario, un virus residente en memoria permanece en la memoria (RAM) todo el tiempo, ya sea ocultándose en la parte superior de la memoria, o tal vez escondiéndose en la parte inferior, entre los vectores de interrupción, donde los últimos cientos de bytes casi nunca se utilizan. Un virus muy inteligente puede incluso modificar el mapa de bits de la RAM del sistema operativo, para que el sistema piense que la memoria del virus está ocupada y así evitar que lo sobrescriba.
Un virus residente en memoria típico captura una de las trampas o vectores de interrupción, para lo cual copia el contenido a una variable reutilizable y coloca ahí su propia dirección, con lo cual hace que la interrupción o trampa apunte hacia él. La mejor elección es la interrupción de llamadas al sistema. De esa forma, el virus se ejecuta (en modo de kernel) en cada llamada al sistema. Cuando termina, sólo invoca a la llamada real al sistema, para lo cual salta a la dirección de la trampa guardada.
1.1.1.2.4 Virus del sector de arranque
Cuando la mayoría de las computadoras se encienden, el BIOS lee el registro maestro de arranque de la parte inicial del disco de arranque y lo coloca en la RAM para ejecutarlo.
Normalmente, un virus del sector de arranque [que incluye al virus del MBR (Registro maestro de arranque)] copia primero el verdadero sector de arranque en un lugar seguro en el disco, para que pueda iniciar el sistema operativo cuando termine. El programa de formato de discos de Microsoft fdisk omite la primera pista, por lo que es un buen lugar para ocultarse en las máquinas con Windows. Otra opción es utilizar cualquier sector de disco libre y después actualizar la lista de sectores defectuosos para marcar el sector oculto como defectuoso.
Cuando se inicia la computadora, el virus se copia a sí mismo en la RAM, ya sea en la parte superior o inferior, entre los vectores de interrupciones que no se utilizan. En este punto la máquina está en modo de kernel, con la MMU desactivada, sin sistema operativo ni programa antivirus que se ejecute. Es tiempo de fiesta para los virus.
.
1.1.1.2.5 Virus de driver de dispositivo
El truco es infectar un driver de dispositivos, lo cual produce un virus de driver de dispositivo. En Windows y en algunos sistemas UNIX, los drivers de dispositivos son sólo programas ejecutables que viven en el disco y se cargan en tiempo de arranque. Si se puede infectar uno de estos programas, el virus siempre se cargará oficialmente en tiempo de arranque. Y todavía mejor, los drivers se ejecutan en modo de kernel, y después de que el sistema carga un driver lo llama, con lo cual el virus tiene la oportunidad de capturar el vector de trampas de llamadas al sistema. Este hecho en sí es en realidad un sólido argumento para ejecutar los drivers de dispositivos como programas en modo de usuario; si se infectan no pueden hacer tanto daño como los drivers en modo de kernel.
1.1.1.2.6 Virus de macro
Muchos programas como Word y Excel permiten a los usuarios escribir macros para agrupar varios comandos que se pueden ejecutar después con una sola pulsación de tecla. Las macros también se pueden adjuntar a los elementos de los menús, de manera que cuando se seleccione uno de ellos, se ejecute la macro. En Microsoft Office las macros pueden contener programas completos en Visual Basic, el cual es un lenguaje de programación completo. Las macros se interpretan en vez de compilarlas, pero eso sólo afecta a la velocidad de ejecución, no a lo que pueden hacer. Como las macros pueden ser específicas para cada documento, Office almacena las macros para cada documento, junto con el documento.
Con el crecimiento de los adjuntos de correo electrónico, es un problema inmenso enviar documentos con virus incrustados en las macros. Es mucho más fácil escribir esos virus que ocultar el verdadero sector de arranque en alguna parte de la lista de bloques defectuosos, ocultar el virus entre los vectores de interrupción y capturar el vector de trampas de llamadas al sistema.
.
1.1.1.2.7 Virus de código fuente
Los virus parasíticos y del sector de arranque son muy específicos para cada plataforma; los virus de documentos son un poco menos específicos (Word se ejecuta en Windows y Macintosh, pero no en UNIX). Los virus más portátiles de todos son los virus de código fuente. Imagine el virus de la figura 9-27
¿Cómo se esparcen los virus?
Hay varios escenarios para la distribución. Empecemos con el clásico. Virgilio escribe su virus, lo inserta en un programa que ha escrito (o robado) y empieza a distribuirlo; por ejemplo, lo puede colocar en un sitio Web de shareware. En algún momento dado, alguien descarga el programa y lo ejecuta.
El esparcimiento de la tecnología de los virus está relacionado en parte con el esparcimiento actual de los virus activos. Hay grupos de escritores de virus que se comunican constantemente por Internet y se ayudan a desarrollar nueva tecnología, nuevas herramientas y virus.
Una alternativa a la memoria USB y el CD-ROM es obtener el virus de un sitio FTP remoto. O llevar una notebook y conectarla a un puerto Ethernet que proporcione el café Internet para los turistas que viajan con su notebook y desean leer su correo electrónico todos los días. Una vez conectado a la LAN, Virgilio puede prepararse para infectar a todas las máquinas que estén conectadas.
Hay mucho más que decir sobre los virus. En especial, la forma en que tratan de ocultarse y la manera en que el software antivirus trata de eliminarlos. Más adelante en este capítulo volveremos a tocar estos temas, después de ver las defensas contra el malware.
1.1.1.3 Gusanos
La primera violación a la seguridad computacional en Internet a gran escala empezó en la tarde del 2 de noviembre de 1998, cuando un estudiante graduado de Cornel llamado Robert Tappan Morris liberó un programa tipo gusano en Internet. Esta acción inhabilitó a miles de computadoras en universidades, empresas y laboratorios gubernamentales por todo el mundo antes de que pudieran rastrear y eliminar el gusano.
A continuación analizaremos los puntos importantes de este suceso:
La historia empezó en algún momento en 1998, cuando Morris descubrió dos errores en Berkeley UNIX que permitían obtener acceso no autorizado a las máquinas a través de Internet. Trabajando por su cuenta, escribió un programa llamado gusano que se duplicaba a sí mismo, el cual podía explotar estos errores y duplicarse en segundos en cada máquina a la que podía obtener acceso. Trabajó en el programa durante meses, tiempo en el cual lo optimizó con cuidado e hizo que tratara de ocultar su pista.
No se sabe si la liberación en noviembre 2 de 1998 era una prueba o era algo real. En cualquier caso, hizo que la mayoría de los sistemas Sun y VAX en Internet se doblegaran a unas cuantas horas de la liberación del gusano. La motivación de Morris se desconoce; es posible que considerara todo como una broma de alta tecnología, pero que debido a un error de programación se le haya salido de las manos.
Finger funciona de la siguiente manera. En cada sitio hay un proceso de segundo plano llamado demonio finger, el cual se ejecuta todo el tiempo atendiendo y respondiendo consultas a través de Internet. Lo que hacía el gusano era llamar a finger con una cadena especial de 536 bytes como parámetro. Esta larga cadena desbordaba el búfer del demonio y sobrescribía su pila, de la manera que se muestra en la figura 9-24(c). El error que se explotaba aquí era que el demonio no comprobaba el desbordamiento.
Una corte federal juzgó y condenó a Morris. Fue sentenciado a una multa de 10,000, 3 años de libertad condicional y 400 horas de servicio comunitario. Sus costos legales probablemente excedieron los 150,000. Esta sentencia generó mucha controversia. Muchos en la comunidad computacional sentían que era un brillante estudiante graduado, cuya broma inofensiva se había salido de control. Nada en el gusano sugería que Morris tratara de robar o dañar algo. Otros sentían que era un criminal serio y debería haber ido a la cárcel. Tiempo después, Morris obtuvo su Ph. D. de Harvard
y ahora es profesor en el M.I.T.
1.1.1.4 Spyware
El spyware es un tipo de malware cada vez más común. En general, el spyware es software que se carga de manera clandestina en una PC sin que su propietario se entere, y se ejecuta en segundo plano para hacer cosas a espaldas del propietario. Sin embargo, definirlo es algo complicado. Por ejemplo, Windows Update descarga de manera automática los parches de seguridad en las máquinas Windows sin que los propietarios se enteren. De igual forma, muchos programas antivirus se actualizan
de manera automática en segundo plano. Nada de esto se considera spyware. Si Potter Stewart estuviera vivo, probablemente diría algo como: “No puedo definir el spyware, pero lo reconozco cuando lo veo”.
Otros se han esforzado mucho por definirlo. Barwinski y sus colaboradores (2006) dijeron que tiene cuatro características. En primer lugar se oculta, por lo que la víctima no puede encontrarlo con facilidad. En segundo lugar, recolecta datos sobre el usuario (sitios Web visitados, contraseñas e incluso números de tarjetas de crédito). En tercer lugar, comunica la información recolectada de vuelta a su amo distante. Y en cuarto lugar, trata de sobrevivir a los distintos intentos por eliminarlo.
¿Cómo se esparce el spyware?
La siguiente pregunta obvia es: “¿Cómo se infecta con spyware una computadora?”. Una de las formas es por medio de un caballo de Troya, o troyano, de manera similar al malware.
Hay tres variantes de la tecnología de infección. En primer lugar, la página Web puede redirigir el navegador a un archivo ejecutable (.exe). Cuando el navegador ve el archivo, aparece un cuadro de diálogo preguntando al usuario si desea ejecutar o guardar el programa. Como las descargas legítimas utilizan el mismo mecanismo, la mayoría de los usuarios sólo hacen clic en Ejecutar, con lo cual el navegador descarga y ejecuta el software. En este punto, la máquina está infectada y el spyware tiene la libertad de hacer lo que quiera.
Acciones que realiza el spyware
Ahora veamos lo que el spyware hace con frecuencia. Todos los puntos en la siguiente lista son comunes.
1. Modifica la página de inicio del navegador.
2. Modifica la lista de páginas favoritas (sitios favoritos) del navegador.
3. Agrega nuevas barras de herramientas al navegador.
4. Cambia el reproductor de medios predeterminado del usuario.
5. Cambia el motor de búsqueda predeterminado del usuario.
6. Agrega nuevos iconos al escritorio de Windows.
7. Reemplaza los anuncios de pancarta (banners) en las páginas Web con los que elije el mismo spyware.
8. Coloca anuncios en los cuadros de diálogo estándar de Windows.
9. Genera un flujo continuo e imparable de anuncios emergentes (pop-up).
1.1.1.5 Rootkits
Un rootkit es un programa o conjunto de programas y archivos que intenta ocultar su existencia, incluso frente a los esfuerzos determinados del propietario de la máquina infectada por localizarlo y eliminarlo. Por lo general, el rootkit contiene malware que también se oculta. Los rootkits se pueden instalar mediante cualquiera de los métodos analizados hasta ahora, incluyendo los virus, gusanos y spyware, así como por otros medios, uno de los cuales analizaremos más adelante.
Tipos de rootkits
Ahora vamos a analizar los cinco tipos de rootkits posibles en la actualidad, de abajo hacia arriba.
En todos los casos, la cuestión es: ¿Dónde se oculta el rootkit?
1. Rootkits de firmware. Por lo menos en teoría, para ocultar un rootkit en el BIOS, éste se reprograma y se incluye una copia del rootkit. Dicho rootkit obtendría el control cada vez que se iniciara la máquina, y también cada vez que se hiciera una llamada a una función del BIOS. Si el rootkit se cifrara a sí mismo después de cada uso y se descifrara antes de cada uso, sería muy difícil de detectar. Todavía no se ha observado este tipo de rootkit en la comunidad de computadoras.
2. Rootkits de hipervisor. Un tipo de rootkit muy sigiloso podría ejecutar todo el sistema operativo y las aplicaciones en una máquina virtual bajo su control. La primera prueba del concepto fue blue pill (una referencia a una película llamada The Matrix), que una hacker polaca llamada Joanna Rutkowska demostró en el 2006. Por lo general, este tipo de rootkit modifica la secuencia de arranque, de tal forma que al encender la máquina se ejecute el hipervisor directamente en el hardware, que a su vez inicia el sistema operativo y sus aplicaciones en una máquina virtual. La fortaleza de este método (al igual que el anterior) es que no hay nada oculto en el sistema operativo, en las bibliotecas o en los programas, de manera que los detectores de rootkits que busquen ahí no encontrarán nada.
3. Rootkits de kernel. El tipo más común de rootkit en la actualidad es uno que infecta al sistema operativo y se oculta en él como un driver de dispositivo, o como un módulo de kernel que se puede cargar de manera opcional. El rootkit puede reemplazar con facilidad a un driver extenso, complejo y que cambia con frecuencia, con uno nuevo que contenga el driver anterior junto con el rootkit.
4. Rootkits de biblioteca. Otro lugar en donde se puede ocultar el rootkit es en la biblioteca del sistema; por ejemplo, libc en Linux. En esta ubicación el malware tiene la oportunidad de inspeccionar los argumentos y valores de retorno de las llamadas al sistema, y las modifica según sea necesario para mantenerse oculto.
5. Rootkits de aplicación. Otro lugar para ocultar un rootkit es dentro de un programa de aplicación extenso, en especial uno que cree muchos archivos nuevos mientras se ejecuta (perfiles de usuario, vistas previas de imágenes, etc.). Estos nuevos archivos son buenos lugares para ocultar cosas, y a nadie se le hace extraño que existan.
Detección de rootkits
Es difícil detectar los rootkits cuando no se puede confiar en el hardware, el sistema operativo, las bibliotecas o las aplicaciones. Por ejemplo, una manera obvia de buscar un rootkit es hacer listados de todos los archivos en el disco.
Los rootkits en las bibliotecas y en los programas de aplicación son más difíciles de ocultar, pero si el sistema operativo se cargó desde un medio externo y es confiable, sus hashes también se pueden comparar con los hashes que se sabe son buenos y están almacenados en un CD-ROM. Hasta ahora hemos analizado los rootkits pasivos, que no interfieren con el software de detección.
También hay rootkits activos, que buscan y destruyen el software de detección de rootkits, o que al menos lo modifican para anunciar siempre: “¡NO SE ENCONTRARON ROOTKITS!”. Estos rootkits requieren medidas complicadas, pero por fortuna todavía no han aparecido rootkits activos en la comunidad de computadoras.
Hay dos corrientes de opinión sobre lo que se debe hacer después de descubrir un rootkit. Una de ellas establece que el administrador del sistema se debe comportar como un cirujano que trata un cáncer: debe extirparlo con mucho cuidado. La otra corriente establece que es demasiado peligroso tratar de eliminar el rootkit.
Puede haber piezas todavía ocultas. En este punto de vista, la única solución es regresar al último respaldo completo que esté limpio. Si no hay un respaldo
disponible, se requiere una nueva instalación desde el CD-ROM/DVD original.
Bomba lógica
Considere un programa capaz de iniciar un incidente de seguridad sólo cuando se dan determinadas circunstancias. Sería difícil de detectar porque, en condiciones normales de operación, no existiría ningún agujero de seguridad. Sin embargo, cuando se satisficiera un conjunto predefinido de parámetros, se crearía el agujero de seguridad. Este escenario se conoce con el nombre de bomba lógica. Un programador, por ejemplo, podría escribir código para detectar si todavía continúa contratado por la empresa; en caso de que dicha comprobación fallara, podría crearse un demonio para permitir el acceso remoto, o podría iniciarse un determinado fragmento de código que provocara algún tipo de daño en la instalación.
1.1.2 Amenazas del sistema y de la red
Las amenazas basadas en programas utilizan típicamente un fallo en los mecanismos de protección de un sistema para atacar a los programas. Por contraste, las amenazas del sistema y de la red implican el abuso de los servicios y de las conexiones de red. En ocasiones, se utiliza un ataque del sistema y de la red para lanzar un ataque de programa, y viceversa.
Las amenazas del sistema y de la red crean una situación en la que se utilizan inapropiadamente los recursos del sistema operativo y los archivos del usuario. En esta sección vamos a analizar algunos ejemplos de estas amenazas, incluyendo los gusanos, el escaneo de puertos y los ataques por denegación de servicio.
Es importante destacar que las mascaradas y los ataques por reproducción también resultan comunes en las redes que interconectan los sistemas. De hecho, estos ataques son más efectivos y más difíciles de contrarrestar cuando están implicados múltiples sistemas.
1.2 Intrusos
Los intrusos actúan en dos formas distintas. Los intrusos pasivos sólo quieren leer archivos para los cuales no tienen autorización. Los intrusos activos son más maliciosos; desean realizar modificaciones no autorizadas a los datos. Al diseñar un sistema para que sea seguro contra los intrusos, es importante tener en cuenta el tipo de intruso contra el que tratamos de protegerlo. Algunas categorías comunes son:
1. Usuarios no técnicos que se entrometen en forma casual. Muchas personas tienen computadoras personales en sus escritorios, las cuales están conectadas a un servidor de archivos compartidos y, debido a la naturaleza curiosa de los humanos, algunas de esas personas son capaces de leer el correo electrónico y demás archivos de otras si no hay barreras que las detengan. Por ejemplo, la mayoría de los usuarios de UNIX tienen la opción predeterminada de que todos los archivos recién creados tienen permisos de lectura para todos.
2. Intrusos que husmean. Los estudiantes, programadores de sistemas, operadores y demás personal técnico a menudo consideran como un reto personal la acción de irrumpir en la seguridad de un sistema computacional local. Por lo general son muy habilidosos y están dispuestos a dedicar una cantidad considerable de tiempo a ello.
3. Intentos determinados por obtener dinero. Algunos programadores de los bancos han tratado de robar del banco en el que trabajan. Los esquemas varían, desde cambiar el software para truncar en vez de redondear el interés, quedarse con la fracción de un centavo, desviar las cuentas que no se han utilizado en años, hasta llegar al chantaje (“Si no me pagan, destruiré todos los registros del banco”).
4. Espionaje comercial o militar. El espionaje se refiere a un intento serio y bien fundamentado por parte de un competidor u otro país de robar programas, secretos comerciales, ideas patentables, tecnología, diseños de circuitos, planes de negocios, etcétera. A menudo para hacer esto se intervienen líneas telefónicas o incluso se montan antenas dirigidas hacia la computadora para recoger su radiación electromagnética.
1.3 Pérdida accidental de datos
Además de las amenazas ocasionadas por los intrusos maliciosos, por accidente se pueden perder datos valiosos. Algunas de las causas comunes de pérdida accidental de datos son:
1. Accidentes y desastres naturales: incendios, inundaciones, terremotos, guerras, disturbios o ratas que roen cintas magnéticas.
2. Errores de hardware o software: fallas en la CPU, discos o cintas que no se pueden leer, errores de telecomunicaciones, errores en los programas.
3. Errores humanos: error al introducir los datos, al montar una cinta o un CD-ROM de manera incorrecta; ejecutar el programa incorrecto, perder un disco o una cinta, o cualquier otro error.
La mayoría de estas causas se pueden prevenir mediante la realización de respaldos adecuados que se guardan, de preferencia, lejos de los datos originales. Aunque la acción de proteger los datos contra pérdidas accidentales puede parecer mundana en comparación con la acción de proteger contra intrusos astutos, en la práctica es probable que haya más daños ocasionados por las pérdidas accidentales que por intrusos.
2. FUNDAMENTOS DE LA CRIPTOGRAFÍA (CIFRADO)
La criptografía desempeña un importante papel en la seguridad. Muchas personas están familiarizadas con los criptogramas de los periódicos, que son pequeños rompecabezas en donde cada letra se ha sustituido de manera sistemática por una letra distinta. En realidad no tienen mucho que ver con la criptografía moderna. En esta sección daremos un vistazo a la criptografía en la era de las computadoras, parte de lo cual será útil para comprender el resto de este capítulo. Además, cualquiera que esté preocupado por la seguridad debe conocer por lo menos los fundamentos.
La criptografía moderna se basa en una serie de secretos, denominados claves, que se distribuyen selectivamente a las computadoras de una red y se utilizan para procesar mensajes. La criptografía permite al receptor de un mensaje verificar que el mensaje ha sido creado por alguna computadora que posee una cierta clave: esa clave es el origen del mensaje. De forma similar, un emisor puede codificar su mensaje de modo que sólo una computadora que disponga de una cierta clave pueda decodificar el mensaje, de manera que esa clave se convierte en el destino.
Sin embargo, a diferencia de las direcciones de red, las claves están diseñadas de modo que no sea computacionalmente factible calcularlas a partir de los mensajes que se hayan generado con ellas, ni a partir de ninguna otra información pública. Por tanto, las claves proporcionan un medio mucho más fiable de restringir los emisores y receptores de los mensajes. Observe que la criptografía es un campo de estudio completo por derecho propio, con una gran complejidad; aquí, vamos a explorar únicamente los aspectos más importantes de aquellas partes de la criptografía que se relacionan con los sistemas operativos.
2.1 Criptografía de clave secreta
Para que esto sea más claro, considere un algoritmo en el que cada letra se sustituye por una letra distinta; por ejemplo, todas las As se sustituyen por Qs, todas las Bs se sustituyen por Ws, todas las Cs se sustituyen por Es, y así en lo sucesivo:
Texto simple: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Texto cifrado: Q W E R T Y U I O P A S D F G H J K L Z X C V B N M
A este sistema general se le conoce como sustitución monoalfabética, en donde la clave es la cadena de 26 letras correspondiente al alfabeto completo. La clave de cifrado en este ejemplo es QWERTYUIOPASDFGHJKLZXCVBNM. Utilizando la clave anterior, el texto simple ATTACK se transformaría en el texto cifrado QZZQEA. La clave de descifrado indica cómo obtener de vuelta el texto simple a partir del texto cifrado. En este ejemplo, la clave de descifrado es KXVMCNOPHQRSZYIJADLEGWBUFT, debido a que una A en el texto cifrado es una K en el texto simple, una B en el texto cifrado es una X en el texto simple, y así sucesivamente.
2.2 Criptografía de clave pública
Los sistemas de clave secreta son eficientes debido a que el monto de cálculos requeridos para cifrar o descifrar un mensaje es razonable, pero hay una gran desventaja: el emisor y el receptor deben tener la clave secreta compartida. De hecho, tal vez hasta tengan que reunirse físicamente para que uno le entregue la clave al otro. Para resolver este problema se utiliza la criptografía de clave pública (Diffie y Hellman, 1976). Este sistema tiene la propiedad de que se utilizan distintas claves para el cifrado y el descifrado, y si se elige bien la clave de cifrado es casi imposible descubrir la clave de descifrado correspondiente. Bajo estas circunstancias, la clave de cifrado se puede hacer pública y sólo hay que mantener secreta la clave de descifrado privada.
2.3 Funciones de una vía
Hay varias situaciones, que veremos más adelante, donde es deseable tener cierta función f con la siguiente propiedad: dada f y su parámetro x, es fácil calcular y _ f(x), pero si sólo se tiene f(x) es imposible calcular el valor de x. Comúnmente dicha función manipula los bits en formas complejas.
Podría empezar por inicializar y con x. Después podría ejecutar un ciclo que itere todas las veces que haya bits 1 en x, y en cada iteración se permutarían los bits de y de una manera independiente a la iteración, agregando una constante distinta en cada iteración, y mezclando en general los bits minuciosamente. A dicha función se le conoce como función de hash criptográfica.
2.4 Firmas digitales
Con frecuencia es necesario firmar un documento en forma digital. Las firmas digitales hacen que sea posible firmar correos electrónicos y otros documentos digitales, de tal forma que el emisor no los pueda repudiar después. Una manera común es pasar primero el documento a través de un algoritmo de hashing criptográfico de una vía, que sea muy difícil de invertir. Por lo general, la función de hashing produce un resultado de longitud fija, independiente del tamaño del documento original. Las funciones de hashing más populares son: MD5 (Algoritmo de firma de mensajes 5), el cual produce un resultado de 16 bytes (Rivest, 1992) y SHA-1 (Algoritmo de hash seguro), que produce un resultado de 20 bytes (NIST, 1995). Las versiones más recientes de SHA-1 son SHA-256 y SHA-512, que producen resultados de 32 y 64 bytes, respectivamente, pero se utilizan con menos frecuencia en la actualidad.
2.5 Módulo de plataforma confiable
Toda la criptografía requiere claves. Si se comprometen las claves, también se compromete toda la seguridad que se basa en ellas. Por lo tanto, es esencial almacenar las claves de una forma segura.
¿Cómo almacenamos claves en forma segura en un sistema que no es seguro?
La industria ha propuesto utilizar un chip llamado TPM (Trusted Platform Modules, Módulos de plataforma confiables), un criptoprocesador que contiene almacenamiento no volátil para guardar las claves. El TPM puede realizar operaciones criptográficas como cifrar bloques de texto simple o descifrar bloques de texto cifrado en la memoria principal. También puede verificar firmas digitales. Al realizar estas operaciones en un hardware especializado, se pueden realizar con más velocidad y es probable que se utilicen con más frecuencia. Algunas computadoras ya tienen chips TPM y es muy probable que muchas computadoras más los vayan a incluir en el futuro.
El TPM es muy controversial, ya que hay distintas partes que tienen ideas diferentes acerca de quién va a controlar el TPM y de quién se va a proteger. Microsoft es un gran defensor de ese concepto y ha desarrollado una serie de tecnologías para utilizarlo, incluyendo Palladium, NGSCB y BitLocker. En su punto de vista, el sistema operativo controla el TPM para evitar que se ejecute el software no autorizado. El “software no autorizado” podría ser software pirata (es decir, copias ilegales) o sólo software que el sistema operativo no autorice. Si el TPM está involucrado en el proceso de arranque, podría iniciar sólo los sistemas operativos firmados por el fabricante mediante una
clave secreta colocada dentro del TPM, que se divulgue sólo a ciertos distribuidores de sistemas operativos (como Microsoft). Por lo tanto, el TPM se podría utilizar para limitar las opciones de los usuarios en cuanto al software, para que sólo puedan seleccionar el software aprobado por el fabricante de computadoras.
3. MECANISMOS DE PROTECCIÓN
Es más fácil obtener seguridad si hay un modelo claro de lo que se debe proteger y de a quién se le permite hacer qué cosa. En este campo se ha realizado una cantidad considerable de trabajo, por lo que sólo podemos arañar la superficie. Nos concentraremos en unos cuantos modelos generales y en los mecanismos para llevarlos a cabo.
3.1 Dominios de protección
Un sistema computacional contiene muchos “objetos” que necesitan protección. Estos objetos pueden ser de hardware (por ejemplo, CPUs, segmentos de memoria, unidades de disco o impresoras) o de software (por ejemplo, procesos, archivos, bases de datos o semáforos).
Cada objeto tiene un nombre único que se utiliza como referencia, y hay un conjunto finito de operaciones que los procesos pueden llevar a cabo con los objetos. Las operaciones read y write son apropiadas para un archivo; up y down se utilizan en un semáforo.
Es obvio que se necesita una manera de prohibir que los procesos utilicen objetos sin autorización. Además, mediante este mecanismo se debe poder restringir a los procesos para que sólo puedan utilizar un conjunto de las operaciones legales cuando sea necesario. Por ejemplo, el proceso A tal vez tenga permiso de leer, pero no de escribir en el archivo F.
Para poder analizar distintos mecanismos de protección, es conveniente introducir el concepto de un dominio. Un dominio es un conjunto de pares (objeto, permisos). Cada par especifica un objeto y cierto subconjunto de las operaciones que se pueden realizar en él. Un permiso en este contexto indica el permiso para realizar una de las operaciones. A menudo, un dominio corresponde a un solo usuario y le indica lo que puede hacer y lo que no, pero un dominio también puede ser más general que sólo un usuario. Por ejemplo, los miembros de un equipo de programación que trabajan en cierto proyecto podrían pertenecer al mismo dominio, de manera que todos tengan acceso a los archivos del proyecto.
3.2 Sistemas confiables
En realidad, hay varias organizaciones que piensan que es más importante una buena seguridad que características nuevas e ingeniosas, y los militares son el ejemplo principal. Para construir un sistema seguro, hay que tener un modelo de seguridad en el núcleo del sistema operativo que sea lo bastante simple como para que los diseñadores puedan comprenderlo de verdad, y que resistan toda la presión de desviarse de este modelo para agregar nuevas características.
3.3 Base de cómputo confiable
En el mundo de la seguridad, todos hablan con frecuencia sobre los sistemas confiables en vez de sistemas seguros. Éstos son sistemas que han declarado formalmente requerimientos de seguridad y cumplen con ellos. En el centro de todo sistema confiable hay una TCB (Trusted Computing Base, Base de cómputo confiable) mínima que consiste en el hardware y software necesarios para cumplir con todas las reglas de seguridad. Si la base de cómputo confiable funciona según las especificaciones, no se puede comprometer la seguridad el sistema, sin importar qué otra cosa esté mal.
Proceso de usuario
Todas las llamadas al sistema pasan por el monitor de referencia para comprobar la seguridad:
Algunos de estos procesos, como el sistema de archivos y el administrador de procesos, forman parte de la base de cómputo confiable debido a que pueden comprometer con facilidad la seguridad del sistema. Pero otras partes como el driver de impresora y el driver de audio no forman parte de la base de cómputo confiable, y no importa cuál sea su problema (incluso si un virus se apodera de ellos), no hay nada que se pueda hacer para comprometer la seguridad del sistema.
3.4 Modelos formales de los sistemas seguros
Cambian con frecuencia a medida que se crean objetos, los objetos antiguos se destruyen y los propietarios deciden aumentar o restringir el conjunto de usuarios para sus objetos. Se ha puesto mucha atención en el modelado de los sistemas de protección, en los cuales la matriz de protección cambia de manera constante. Ahora daremos un vistazo a una parte de este trabajo.
3.5 Seguridad multinivel
El modelo Bell-La Padula
El modelo de seguridad multinivel más utilizado en el mundo es el modelo Bell-La Padula, por lo que empezaremos con él (Bell y La Padula, 1973). Este modelo se diseñó para manejar la seguridad militar, pero también se puede aplicar a otras organizaciones.
El modelo Bell-La Padula hace referencia a la estructura organizacional, pero en última instancia el sistema operativo es quien tiene que implementarlo. Una manera de hacerlo es asignar a cada usuario un nivel de seguridad, que se debe almacenar junto con otros datos específicos del usuario, como el UID y el GID. Al momento de iniciar sesión, el shell del usuario adquiere su nivel de seguridad, y todos sus hijos lo heredan. Si un proceso que se ejecuta en el nivel de seguridad trata de abrir un archivo u otro objeto cuyo nivel de seguridad sea mayor que k, el sistema operativo debe rechazar el intento de apertura. Todos los intentos similares de abrir cualquier objeto de un nivel de seguridad menor que k para escribir en él deben fallar.
El problema con el modelo Bell-La Padula es que se ideó para guardar secretos, no para garantizar la integridad de los datos. Para esto último necesitamos precisamente las propiedades inversas.
El modelo Biba
(Biba, 1977):
1. El principio de integridad simple Un proceso que se ejecuta en el nivel de seguridad k sólo puede escribir objetos en su nivel o en uno inferior (no hay escrituras hacia arriba).
2. La propiedad * de integridad Un proceso que se ejecute en el nivel de seguridad k puede leer sólo los objetos en su nivel o en uno superior (no hay lecturas hacia abajo).
En conjunto, estas propiedades aseguran que el programador pueda actualizar los archivos del conserje con la información adquirida del presidente, pero no viceversa. Desde luego que ciertas organizaciones desean tanto las propiedades de Bell-La Padula como las de Biba, pero como están en conflicto directo, es difícil de obtener las propiedades de ambos modelos a la vez.
3.6 Canales encubiertos
El modelo de Lampson se formuló originalmente en términos de un solo sistema de tiempo compartido, pero se pueden adaptar las mismas ideas a las LANs y otros entornos multiusuario. En su forma más pura, implica tres procesos en cierta máquina protegida. El primer proceso (el cliente) desea que el segundo (el servidor) realice cierto trabajo. El cliente y el servidor no confían completamente uno en el otro. Por ejemplo, el trabajo del servidor es ayudar a que los clientes llenen sus formularios fiscales. A los clientes les preocupa que el servidor registre en secreto sus datos financieros; por ejemplo, para mantener una lista secreta de cuánto gana cada quién, y después vender la lista. Al servidor le preocupa que los clientes traten de robar el valioso programa fiscal.
El tercer proceso es el colaborador, que está conspirando con el servidor para robar los datos confidenciales de los clientes. Por lo general, el colaborador y el servidor son propiedad de la misma persona.El objeto de este ejercicio es diseñar un sistema en el que sea imposible que el proceso servidor filtre al proceso colaborador la información que ha recibido de manera legítima del proceso cliente. A este problema, Lampson lo llamó problema del confinamiento.
3.7 Esteganografía
Se puede utilizar un tipo ligeramente distinto de canal encubierto para pasar información secreta entre procesos, incluso cuando un humano o un censor automatizado pueda inspeccionar todos los mensajes entre los procesos y vetar los que sean sospechosos. Por ejemplo, considere una empresa que comprueba en forma manual todo el correo electrónico saliente que envían sus empleados, para asegurar que no estén filtrando secretos a sus cómplices o competidores fuera de la empresa.
4. AUTENTICACIÓN
Todo sistema computacional seguro debe requerir que todos los usuarios se autentiquen al momento de iniciar sesión. Después de todo, si el sistema operativo no puede estar seguro de quién es el usuario, tampoco puede saber a qué archivos y otros recursos puede acceder. Aunque la autenticación puede parecer un tema trivial, es un poco más complicado de lo que se podría esperar. Las primeras mainframes como ENIAC no tenían un sistema operativo, mucho menos un procedimiento de inicio de sesión. Los posteriores sistemas mainframe de procesamiento por lotes y tiempo compartido tenían por lo general un procedimiento de inicio de sesión para autenticar los trabajos y los usuarios.
Habiendo determinado que la autenticación es a menudo importante, el siguiente paso es encontrar una buena manera de hacer que funcione. La mayoría de los métodos para autenticar usuarios cuando tratan de iniciar sesión se basan en uno de tres principios generales, que a saber identifican:
1. Algo que el usuario conoce.
2. Algo que el usuario tiene.
3. Algo que el usuario es.
Las personas que desean ocasionar problemas en un sistema en particular primero tienen que iniciar sesión en ese sistema, para lo cual tienen que pasar por el procedimiento de autenticación que se utilice. En la prensa popular, a estas personas se les conoce como hackers. Sin embargo, en el mundo de las computadoras la palabra “hacker” es un término honorario que se reserva para los grandes programadores. Para diferenciar a los verdaderos hackers, utilizaremos el término en el sentido original y a las personas que tratan de irrumpir en los sistemas computacionales a los que no pertenecen les llamaremos crackers. Algunas personas hablan sobre los hackers de sombrero blanco para referirse a los tipos buenos, y sobre los hackers de sombrero negro para referirse a los tipos malos, pero con base en nuestra experiencia la mayoría de los hackers permanecen en el interior todo el tiempo y no utilizan sombreros, así que no se les puede diferenciar por ello.
4.1 Autenticación mediante el uso de contraseñas
La forma más utilizada de autenticación es requerir que el usuario escriba un nombre de inicio de sesión y una contraseña. La protección mediante contraseñas es fácil de comprender y de implementar.
La implementación más simple sólo mantiene una lista central de pares (nombre-iniciosesión, contraseña). El nombre de inicio de sesión que se introduce se busca en la lista y la contraseña introducida se compara con la contraseña almacenada. Si coinciden, se permite al usuario que inicie sesión; en caso contrario, se rechaza.
¿Cómo entran a la fuerza los crackers?
Para entrar a la fuerza, la mayoría de los crackers se conectan a la computadora destino (por ejemplo, a través de Internet) y prueban muchas combinaciones (nombre de usuario, contraseña) hasta que encuentran una que funciona. Muchas personas utilizan su nombre en una forma u otra como su nombre de inicio de sesión. Para Ellen Ann Smith, algunos candidatos razonables podrían ser ellen, smith, ellen_smith, ellen-smith, ellen.smith, emith, easmith y eas. Con uno de esos libros ti tulado 4096 nombres para su nuevo bebé más una agenda telefónica llena de apellidos, un cracker puede compilar con facilidad una lista computarizada de nombres de inicio potenciales apropiados para el país que va a atacar (ellen_smith podría funcionar bien en los Estados Unidos o en Inglaterra, pero tal vez no en Japón).
Desde luego que no basta con adivinar el nombre de inicio de sesión. También hay que adivinar la contraseña. ¿Qué tan difícil es eso? Más fácil de lo que podría creer. Morris y Thompson (1979) realizaron un trabajo clásico sobre la seguridad de las contraseñas en sistemas UNIX. Compilaron una lista de contraseñas probables: nombres y apellidos, nombres de calles, nombres de ciudades, palabras de un diccionario de tamaño moderado (también palabras deletreadas a la inversa), números de placas de automóviles y cadenas cortas de caracteres aleatorios. Después compararon su lista con el archivo de contraseñas del sistema para ver si había coincidencias. Cerca de 86% de las contraseñas aparecieron en su lista. Klein (1990) obtuvo un resultado similar.
Seguridad de contraseñas de UNIX
Algunos sistemas operativos (antiguos) mantienen el archivo de contraseñas en el disco en un formato no cifrado, pero protegido mediante los mecanismos usuales de protección del sistema. Es muy peligroso tener todas las contraseñas en un archivo en el disco y en un formato no cifrado, ya que muchas personas tienen acceso a este archivo, y con mucha frecuencia. Entre estas personas puede haber administradores del sistema, operadores de las máquinas, personal de mantenimiento, programadores, la gerencia y tal vez hasta algunas secretarias.
Contraseñas de un solo uso
La mayoría de los superusuarios exhortan a sus usuarios mortales para que cambien sus contraseñas una vez al mes. La mayoría de los usuarios hacen caso omiso. Lo más extremoso es cambiar la contraseña en cada inicio de sesión; a estas contraseñas se les conoce como contraseñas de un solo uso. Cuando se utilizan contraseñas de una sola vez, el usuario recibe un libro que contiene una lista de contraseñas. En cada inicio de sesión se utiliza la siguiente contraseña en la lista. Si un intruso llega a descubrir una contraseña no le servirá de nada, ya que la próxima vez se debe utilizar una contraseña distinta. Se le sugiere al usuario que trate de no perder el libro de contraseñas.
Autenticación de reto-respuesta
Una variación en la idea de las contraseñas es hacer que cada nuevo usuario proporcione una larga lista de preguntas y respuestas que posteriormente se almacenan en el servidor en forma segura.
4.2 Autenticación mediante el uso de un objeto físico
El segundo método para autenticar a los usuarios es comprobar algún objeto físico que tengan, en vez de algo que sepan. Para este fin se han utilizado las llaves de puertas metálicas durante siglos.
Hoy en día, el objeto físico que se utiliza con frecuencia es una tarjeta de plástico que se inserta en un lector asociado con la computadora. Por lo general, el usuario no sólo debe insertar la tarjeta, sino que también debe escribir una contraseña para evitar que alguien utilice una tarjeta perdida o robada.
Visto de esta forma, el uso de un ATM (Cajero automático) bancario empieza cuando el
usuario inicia sesión en la computadora del banco a través de una terminal remota (la máquina ATM) mediante el uso de una tarjeta de plástico y una contraseña (en la actualidad es un código NIP de 4 dígitos en la mayoría de los países, pero esto sólo es para evitar el costo de tener que colocar un teclado completo en la máquina ATM).
Las tarjetas de plástico que contienen información vienen en dos variedades: tarjetas de tira magnética y tarjetas de chip. Las tarjetas de tira magnética contienen aproximadamente 140 bytes de información escrita en una pieza de cinta magnética pegada en la parte posterior de la tarjeta.
Una terminal puede leer esta información y enviarla a la computadora central. A menudo la información contiene la contraseña del usuario (por ejemplo, el código NIP) para que la terminal pueda realizar una comprobación de identidad, incluso aunque el enlace con la computadora principal esté desconectado. Por lo general, la contraseña se cifra mediante una clave que sólo el banco conoce.
Las tarjetas de chip contienen un pequeño circuito integrado (chip). Estas tarjetas se pueden subdividir en dos categorías: tarjetas de valor almacenado y tarjetas inteligentes. Las tarjetas de valor almacenado contienen una pequeña cantidad de memoria (por lo general menos de 1 KB), en la que se utiliza la tecnología ROM para permitir que el valor se recuerde cuando se quite la tarjeta del lector y, por ende, se desconecte la energía. No hay CPU en la tarjeta, por lo que el valor almacenado se debe modificar mediante una CPU externa (en el lector).
4.3 Autenticación mediante biométrica
El tercer método de autenticación mide las características físicas del usuario que son difíciles de falsificar. A estas características se les conoce como biométricas (Pankanti y colaboradores, 2000). Por ejemplo, un lector de huellas digitales o de voz conectado a la computadora podría verificar la identidad del usuario.
Un sistema biométrico común consta de dos partes: inscripción e identificación.
Durante la inscripción se miden las características del usuario y se digitalizan los resultados. Las características importantes se extraen y almacenan en un registro asociado con el usuario. El registro se puede guardar en una base de datos central (por ejemplo, para iniciar sesión en una computadora remota) o se puede almacenar en una tarjeta inteligente que el usuario lleva consigo, y que inserta en un lector remoto (por ejemplo, una máquina ATM).
La otra parte es la identificación. El usuario aparece y proporciona un nombre de inicio de sesión. Después el sistema realiza de nuevo la medición. Si los nuevos valores coinciden con los que se muestrearon al momento de la inscripción, se acepta el inicio de sesión; en caso contrario se rechaza.
5. ATAQUES DESDE EL INTERIOR
Hemos visto con cierto detalle la forma en que funciona la autenticación de usuarios. Por desgracia, evitar que los visitantes indeseables inicien sesión es sólo uno de los muchos problemas de seguridad existentes. Los “trabajos internos” podrían ser una categoría completamente distinta de problemas de seguridad. Los programadores y otros empleados de la empresa que operan la computadora que se debe proteger, o que crean software crítico, son los que ejecutan estos tipos de trabajos. Estos ataques son distintos de los externos, debido a que los usuarios internos tienen conocimiento y acceso especializados que los externos no tienen.
5.1 Bombas lógicas
En estos tiempos de externalización masiva, los programadores se preocupan comúnmente por sus trabajos. Algunas veces hasta realizan ciertos pasos para que su potencial partida (involuntaria) sea menos dolorosa. Para aquellos que se inclinan a favor del chantaje, una estrategia es crear una bomba lógica. Este dispositivo es una pieza de código escrita por uno de los programadores de
una empresa (que en ese momento son empleados), y se inserta de manera secreta en el sistema de producción. Mientras que el programador le proporcione su contraseña diaria, no hará nada.
No obstante, si el programador es despedido de manera repentina y se le desaloja físicamente de las instalaciones sin advertirle, el siguiente día (o la siguiente semana) la bomba lógica no recibirá su contraseña diaria, por lo que se activará. También son posibles muchas variantes sobre este tema. En un caso famoso, la bomba lógica comprobaba la nómina; si el número personal del programador no aparecía en ella durante dos periodos de nómina consecutivos, se activaba (Spafford y colaboradores, 1989).
Al activarse la bomba tal vez se empiece a borrar el contenido del disco, eliminando archivos al azar, realizando cuidadosamente cambios difíciles de detectar en los programas clave o cifrando archivos esenciales. En este último caso, la empresa tiene que tomar una difícil decisión entre llamar a la policía (que podría o no resultar en una condena muchos meses después, pero sin duda no restaurará los archivos faltantes) o ceder al chantaje y volver a contratar al programador como “consultor” por una suma astronómica para que corrija el problema (y esperar que no plante nuevas bombas lógicas mientras lo hace).
Se han registrado casos en los que un virus plantó una bomba lógica en las computadoras que infectó. En general, estas bombas se programaron para activarse al mismo tiempo en cierta fecha y hora en el futuro. Sin embargo, como el programador no sabe de antemano qué computadoras sufrirán los ataques, las bombas lógicas no se pueden utilizar para proteger el trabajo o el chantaje. A menudo se configuran para activarse en una fecha que tenga cierto significado político. A estas
bombas se les conoce algunas veces como bombas de tiempo.
5.2 Trampas
Otro hoyo de seguridad que producen los usuarios internos es la trampa. Este problema se crea mediante el código que inserta un programador de sistemas para evitar cierto chequeo de rutina. Por ejemplo, un programador podría agregar código al programa de inicio de sesión para permitir que cualquiera pueda iniciar sesión con el nombre “zzzzz”, sin importar qué haya en el archivo de contraseñas. El código normal en el programa de inicio de sesión podría ser como el de la figura
9-22(a). La trampa sería el cambio en la figura 9-22(b). Lo que hace la llamada a strcmp es comprobar si el nombre de inicio de sesión es “zzzzz”. De ser así el inicio de sesión tiene éxito, sin importar qué contraseña se utilice. Si este código de trampa lo insertara un programador que trabaje para un fabricante de computadoras, y después lo enviara con sus computadoras, el programador
podría iniciar sesión en cualquier computadora fabricada por su empresa, sin importar quién sea el dueño ni la información que contenga el archivo de contraseñas. Lo mismo se aplica para un programador que trabaja para un distribuidor de sistemas operativos. La puerta simplemente pasa por
alto todo el proceso de autenticación.
5.3 Suplantación de identidad en el inicio de sesión
En este ataque interno, el perpetrador es un usuario legítimo que trata de recolectar las contraseñas de otras personas por medio de una técnica conocida como suplantación de identidad en el inicio de sesión. Por lo general se emplea en empresas con muchas computadoras públicas en una LAN utilizada por muchos usuarios. Por ejemplo, muchas universidades tienen salones llenos de computadoras donde los estudiantes pueden iniciar sesión en cualquiera de ellas. Esto funciona así. Normalmente,
cuando no hay nadie conectado a una computadora UNIX, aparece una pantalla similar
a la de la figura 9-23(a). Cuando un usuario se sienta y escribe un nombre de inicio de sesión, el sistema le pide una contraseña. Si es correcta, el usuario comienza su sesión y se inicia un shell (y posiblemente también una GUI).
6. CÓMO EXPLOTAR LOS ERRORES (BUGS) EN EL CÓDIGO
Ahora que hemos visto algunas formas en que los usuarios internos pueden poner en peligro la seguridad, es tiempo de iniciar nuestro estudio sobre cómo pueden atacar los usuarios externos y trastornar el sistema operativo desde el exterior, por lo general a través de Internet. Casi todos los mecanismos de ataque aprovechan los errores en el sistema operativo, o en algún programa de aplicación popular como Internet Explorer o Microsoft Office. El escenario típico es que alguien descubre un error en el sistema operativo y después encuentra la manera de explotarlo para comprometer
a las computadoras que ejecutan el código defectuoso.
Aunque toda explotación implica tener un error específico en un programa específico, hay varias categorías generales de errores que ocurren una y otra vez, y vale la pena estudiarlos para ver cómo funcionan los ataques. En las siguientes secciones examinaremos varios de estos métodos.
6.1 Ataques de desbordamiento del búfer
Una de las fuentes más extensas de ataques se debe al hecho de que casi todos los sistemas operativos y la mayoría de los programas de sistemas están escritos en el lenguaje de programación C (esto es porque a los programadores les gusta y se puede compilar con una eficiencia extrema). Por desgracia, ningún compilador de C realiza la comprobación de los límites en los arreglos. En consecuencia, tampoco se revisa la siguiente secuencia de código, que no es válida:
int i;
char c[1024];
i = 12000;
c[i] = 0;
6.2 Ataques de retorno a libc
Tanto el ataque de desbordamiento del búfer como aquél mediante cadenas de formato requieren que se proporcionen datos a la pila, para después hacer que la función actual vuelva a estos datos en vez de regresar al método que hizo la llamada. Una forma de combatir estos ataques es marcar las páginas de la pila como de lectura/escritura, pero no de ejecución. Las CPUs Pentium modernas pueden hacer esto, aunque la mayoría de los sistemas operativos no aprovechan esta posibilidad.
Pero hay otro ataque que funciona aún si los programas en la pila no se pueden ejecutar. A esto se le conoce como ataque de retorno a libc.
6.3 Ataques por desbordamiento de enteros
Las computadoras realizan aritmética de enteros en números de longitud fija, por lo general de 8, 16, 32 o 64 bits. Si la suma de dos números que se van a sumar o multiplicar excede al máximo entero que se puede representar, se produce un desbordamiento. Los programas de C no atrapan este error; sólo almacenan y utilizan el valor incorrecto. En especial si las variables son enteros con signo, entonces el resultado de sumar o multiplicar dos enteros positivos se puede almacenar como un entero negativo. Si las variables no tienen signo, los resultados serán positivos pero tal vez haya acarreo cíclico. Por ejemplo, considere dos enteros de 16 bits sin signo, cada uno de los cuales contiene el valor 40,000. Si se multiplican en conjunto y el resultado se almacena en otro entero de 16 bits sin signo, el producto aparente es 4096.
6.4 Ataques por inyección de código
Este tipo de explotación implica hacer que el programa ejecute código sin darse cuenta de ello. Considere un programa que en cierto punto necesita duplicar un archivo suministrado por el usuario bajo un nombre distinto (tal vez como respaldo). Si el programador es demasiado perezoso como para escribir el código, podría utilizar la función system, que crea una bifurcación del shell y ejecuta su argumento como un comando del shell. Por ejemplo, el código de C system(“ls >lista-archivos”) crea una bifurcación de un shell que ejecuta el comando ls >lista-archivos el cual lista todos los archivos en el directorio actual y los escribe en un archivo llamado lista-archivos.
6.5 Ataques por escalada de privilegios
En el ataque por escalada de privilegios el atacante engaña al sistema para que le proporcione más permisos de acceso de los que tiene. Por lo general lo engaña para que haga algo que sólo el superusuario puede hacer. Un famoso ejemplo es de un programa que utilizó el demonio cron, el cual permite a los usuarios programar el trabajo que se va a realizar cada hora, cada día o cada semana, o con cualquier otra frecuencia. Comúnmente este demonio se ejecuta como root (o como algo casi igual de poderoso), por lo que puede acceder a los archivos desde cualquier cuenta de usuario. Tiene un directorio en el que almacena los comandos que están programados para ejecutarse.
Por supuesto que los usuarios no pueden escribir en este directorio, ya que les daría la habilidad de hacer casi cualquier cosa.
El ataque funcionaba de la siguiente manera. El programa del atacante establecía su directorio de trabajo en el directorio del demonio cron. Es obvio que no podría escribir ahí, pero eso no importó.
7. DEFENSAS
Con problemas merodeando por todos lados, ¿hay alguna esperanza de que los sistemas puedan ser seguros? En realidad sí la hay, y en las siguientes secciones analizaremos algunas de las formas en que se pueden diseñar e implementar sistemas para incrementar su seguridad. Uno de los conceptos más importantes es la defensa en profundidad. La idea básica aquí es que debemos tener varios niveles de seguridad, de manera que si se viola uno de ellos, aún quedan otros niveles de defensa. Piense en una casa con una barda de hierro cerrada, alta y con picos a su alrededor, detectores de movimiento en el jardín, dos candados industriales en la puerta frontal y un sistema de alarma contra robos computarizado en su interior. Aunque cada técnica es valiosa por sí sola, para robar la casa el ladrón tendría que vencerlas todas. Los sistemas computacionales con una seguridad apropiada son como esta casa, con varios niveles de seguridad. Ahora veremos algunos de ellos.
7.1 Firewalls
La habilidad de conectar cualquier computadora en cualquier parte con cualquier otra computadora en cualquier parte es una ventaja con claroscuros. Aunque hay mucho material valioso en Web, una computadora conectada a Internet está expuesta a dos tipos de peligros: entrantes y salientes.
Los peligros entrantes incluyen crackers que tratan de entrar a la computadora, así como
virus, spyware y demás malware. Los peligros salientes incluyen información confidencial como los números de tarjetas de crédito, contraseñas, devoluciones de impuestos y todo tipo de información corporativa.
En consecuencia, se requieren mecanismos para mantener los bits “buenos” adentro y los bits “malos” afuera. Uno de estos métodos es el uso de un firewall, que es tan sólo una adaptación moderna de ese antiguo recurso de seguridad medieval: cavar un foso profundo alrededor del castillo.
Hay dos variedades básicas de firewall: de hardware y de software.
7.2 Los antivirus y las técnicas anti-antivirus
Los firewalls tratan de mantener a los intrusos fuera de la computadora, pero pueden fallar de diversas formas, como veremos a continuación. En ese caso, la siguiente línea de defensa está compuesta por los programas antimalware, que se conocen comúnmente como programas antivirus, aunque muchos de ellos también combaten los gusanos y el spyware. Los virus tratan de ocultarse y los usuarios tratan de encontrarlos, algo parecido al juego del gato y el ratón. En este sentido los virus son como los rootkits, excepto que la mayoría de los escritores de virus se enfocan en el rápido esparcimiento del virus, en vez de jugar a las escondidas como los rootkits.
Ahora analizaremos algunas de las técnicas utilizadas por el software .
La solución ideal para la amenaza de los virus es la prevención: no permitiendo que un virus entre en el sistema, en primer lugar. Este objetivo es, en general imposible de conseguir, sin embargo la prevención puede reducir el número de ataques de virus que tengan éxito. La siguiente opción es conseguir realizar lo siguiente:
• Detección.
• Identificación.
• Eliminación.
Si la detección tiene éxito pero no es posible ni la identificación ni la eliminación, entonces la alternativa consiste en deshacemos del programa infectado y volver a cargar una versión limpia desde
Los avances en las tecnologías de los virus y los antivirus van mano a mano. Los primeros virus eran fragmentos de código relativamente simples y podrían identificarse y eliminase con paquetes de software de antivirus también relativamente simples. A medida que la carrera armamentista de los virus ha evolucionado, los virus y, necesariamente, el software de antivirus han crecido hasta convertirse en algo mucho más complejo y sofisticado. En la actualidad van apareciendo estrategias y paquetes de antivirus cada vez más sofisticados.
¿Cómo evitar los virus?
Toda buena historia necesita una moraleja; la de esta historia es “Mejor seguro que arrepentido”.
Es mucho más fácil evitar los virus que tratar de rastrearlos después de que han infectado una computadora.
A continuación veremos unos cuantos lineamientos para los usuarios individuales, pero también algunas cosas que la industria en general puede llevar a cabo para reducir los problemas de una forma considerable.
¿Qué pueden hacer los usuarios para evitar una infección de un virus?
En primer lugar, elegir un sistema operativo que ofrezca un alto nivel de seguridad, con un límite sólido entre el modo de kernel y el modo de usuario, y contraseñas separadas para cada usuario, además del administrador del sistema. Bajo estas condiciones, un virus que se escabulla de alguna forma no podrá infectar los archivos binarios del sistema.
En segundo lugar, pueden instalar sólo software legal que se compre de algún fabricante confiable. Aunque, esto no garantiza nada, sí ayuda mucho, ya que han ocurrido casos en que los empleados descontentos introducen virus en un producto de software comercial. Es riesgoso descargar software de sitios Web y tableros de anuncios electrónicos.
En tercer lugar, pueden comprar un buen paquete de software antivirus y usarlo según las indicaciones. Hay que asegurarse de obtener actualizaciones periódicas del sitio Web del fabricante.
En cuarto lugar, no deben hacer clic en los adjuntos de correo electrónico y deben pedir a los demás que no les envíen adjuntos. El correo electrónico que se envía como texto ASCII simple siempre es seguro, pero los adjuntos pueden contener virus que se activan al abrirlos.
En quinto lugar, pueden realizar copias frecuentes de los archivos clave en un medio externo, como disco flexible, CD grabable o cinta. Es conveniente mantener varias generaciones de cada archivo en una serie de medios de respaldo. De esta forma, si el usuario descubre un virus, puede tener la oportunidad de restaurar los archivos al estado que tenían antes de ser infectados. No es de mucha ayuda restaurar el archivo infectado de ayer, pero la versión de la semana pasada tal vez si sea de ayuda.
En sexto y último lugar, deben resistir la tentación de descargar y ejecutar el nuevo software ostentoso y gratuito de una fuente desconocida. Tal vez haya una razón por la cual sea gratuito: que el fabricante desea que nuestra computadora se una a su ejército de zombies. Aunque si usted tiene software de máquina virtual, es seguro ejecutar software desconocido dentro de ella.
La industria también debería tomar en serio la amenaza de los virus y modificar algunas prácticas peligrosas. En primer lugar, los sistemas operativos deben ser simples. Entre más características espectaculares tengan, habrá más hoyos de seguridad. Esto es un hecho de la vida.
En segundo lugar, hay que olvidarse del contenido activo. Desde el punto de vista de la seguridad, es un desastre. Para ver un documento que alguien nos envió, no tiene que ser obligatorio ejecutar su programa. Por ejemplo, los archivos JPEG no contienen programas y, por ende, no pueden contener virus. Todos los documentos deberían ser así.
En tercer lugar, debe haber una forma de proteger contra escritura ciertos cilindros del disco, para evitar que los virus infecten los programas que contienen. Esta protección se podría implementar mediante un mapa de bits dentro del controlador que liste los cilindros protegidos contra escritura.
En cuarto lugar, la memoria flash es una buena idea pero sólo debería modificarse al activar un interruptor externo, algo que sólo ocurrirá cuando el usuario instale de manera consciente una actualización del BIOS. Desde luego que nada de esto se tomará con seriedad sino hasta que llegue un virus realmente grande. Por ejemplo, uno que ataque el mundo financiero y restablezca todas las cuentas bancarias a 0. Claro que para entonces será demasiado tarde.
7.3 Firma de código
Un método completamente distinto de impedir que el malware entre en la computadora (recuerde: defensa en profundidad) es ejecutar sólo el software de distribuidores confiables que no tenga modificaciones.
La firma de código se basa en la criptografía de clave pública. Un distribuidor de software genera un par (clave pública, clave privada), y pone la primera clave a disposición del público pero guarda la segunda clave con recelo. Para firmar una pieza de software, el distribuidor primero calcula una función de hash del código para obtener un número de 128, 160 o 256 bits, dependiendo de si se utiliza MD5, SHA-1 o SHA-256. Después, para firmar el valor de hash lo cifra con su clave privada (en realidad, la descifra utilizando la notación de la figura 9-3). Esta firma acompaña al software a cualquier lado que vaya.
7.4 Encarcelamiento
Hay un viejo dicho ruso que dice: “Confiar pero verificar”. Sin duda, se tenía al software en mente cuando se acuñó este viejo dicho ruso. Aunque una pieza de software esté firmada, es conveniente verificar que su comportamiento sea correcto.
El programa recién adquirido se ejecuta como un proceso que en la figura se denomina “prisionero”. El “carcelero” es un proceso confiable (sistema) que monitorea el comportamiento del prisionero.
Cuando un proceso encarcelado realiza una llamada al sistema, en vez de que se ejecute esta llamada el control se transfiere al carcelero (por medio de una trampa en el kernel), y se le envía el número de la llamada al sistema junto con sus parámetros. Después el carcelero decide si se debe permitir o no la llamada al sistema. Por ejemplo, si el proceso encarcelado trata de abrir una conexión de red con un host remoto desconocido para el carcelero, éste puede rechazar la llamada y eliminar al prisionero.
Si la llamada al sistema es aceptable, el carcelero informa al kernel y éste lleva a cabo la llamada.
7.5 Detección de intrusos basada en modelos
Otro método para defender una máquina es instalar un IDS Intrusion Detection System (Sistema de detección de intrusos). Hay dos tipos básicos de IDS: uno se concentra en inspeccionar los paquetes de red entrantes y el otro se enfoca en buscar anomalías en la CPU.
I. CONCLUSIÓN
La evolución de la computación y de las comunicaciones en las últimas décadas: Ha ocasionado que sean más accesibles a los sistemas informático , por lo tanto incrementado los riesgos vinculados a la seguridad.
El nivel de criticidad y de confidencialidad de los datos administrados por los sistemas informáticos es cada vez mayor: Pudiendo ser esta información técnica (por ejemplo, el diseño de un nuevo chip o nuevo software), comercial (por ejemplo, estudios de la competencia o planes de marketing), financiera (por ejemplo, planes para una oferta de acciones), legal (por ejemplo, documentos sobre la posible fusión o absorción de una empresa), y de muchos otros tipos. Con frecuencia, para proteger esta información se pone un guardia uniformado a la entrada del edificio, que asegura la adecuada identificación de todo el que entre. Asimismo, los archiveros y las oficinas se cierran con llave para asegurar que sólo las personas autorizadas tengan acceso a la información.
La tendencia es que los sistemas sean más asequibles y fáciles de usar, pero la favorabilidad hacia el usuario puede implicar un aumento de la vulnerabilidad.
Desafortunadamente, no es posible conseguir una seguridad total; Ya que , existe la posibilidad de acceso mediante equipos remotos conectados , y por eso debemos prever de mecanismos para tratar de que eliminar los fallos de seguridad .
II. BIBLIOGRAFÍA
Sistemas Operativos Modernos (Andrew S. Tanenbaum)
Fundamentos de los Sistemas Operativos 7ma Edición (Abraham Silberschatz, Peter Baer Galvin & Greg Gagne)
Sistemas Operativos - William Stallings
0 comentarios:
Publicar un comentario