Control de Acceso

Anuncio
Control de Acceso
El tema de Control de Acceso es el eje tradicional del estudio
de seguridad informática, porque trata de mecanismos que
operan en cada máquina en forma aislada, usualmente por una
combinación del diseño del sistema de operación (SOP) y la
arquitectura del hardware.
La función del SOP es mediar las interacciones entre los
principales previamente autenticados (usuarios, procesos – a
veces llamados sujetos) y los objetos (archivos, dispositivos
. . . ) que tratan de manipular.
12 de junio de 2002
Control de Acceso-1
Protección en el SOP
El modelo más general se llama la Matriz de Control de
Acceso, ej.:
SOP
Sam r w x
Alicia - - x
Bob r - x
MIDAS
rwx
--x
r--
Datos
rwrwr--
Pista
r---r--
MIDAS es un programa de contabilidad, Pista es un archivo
con la pista de auditoría. Sam es el administrador del sistema,
Alicia la gerente de finanzas, y Bob el auditor.
Las entradas expresan los derechos de acceso del sujeto (fila)
sobre el objeto (columna) en términos de leer (r), escribir (w),
y ejecutar (x).
Entonces, Sam puede cambiar todo menos la Pista, Bob sólo
puede leer más no cambiar, etc.
12 de junio de 2002
Control de Acceso-2
La matriz del ejemplo no refleja lo que queremos, porque
Alicia puede modificar los Datos directamente. Mejor sería:
SOP
Sam
rwx
Alicia r - x
MIDAS r - x
Bob
r-x
MIDAS
rwx
--x
r-r--
Datos
r---rwr--
Pista
r----wr--
Nota: ahora MIDAS es un objeto y un sujeto.
Esto todavía no es perfecto porque Sam podría sobreescribir a
MIDAS con su propio programa . . .
12 de junio de 2002
Control de Acceso-3
Grupos y Roles
Aunque el modelo de la matriz es teóricamente completo para
expresar los controles de acceso, es impráctico para sistemas
con muchos sujetos y/o objetos.
En sistemas reales, los principales se pueden clasificar en
categorías para reducir la complejidad. Hay varias formas de
enfocar esto:
Grupo: Un conjunto de principales, ej. “empleados del departamento
de contabilidad”.
Rol: Un conjunto de derechos de acceso que puede ser asumido por
uno o más principales en forma no-permanente, ej. “el oficial
de guardia”.
Los enfoques no son contradictorios, pero en la práctica el
enfoque de Grupos tiene mucha tradición, mientras el de Roles
es más experimental, e implementado más en la semántica de
aplicaciones que en el SOP.
12 de junio de 2002
Control de Acceso-4
Listas de Control de Acceso
Dado que la matriz es casi vacia (la mayoría de los sujetos no
tienen derechos sobre la mayoría de los objetos) podemos
ganar en eficiencia guardando las entradas no-vacias de cada
columna junto con el objeto correspondiente. Esto se llama
una lista de control de acceso o ACL.
Los ACLs permiten bastante flexibilidad, pero tienen un costo:
es dificil saber a cuales objetos un determinado sujeto tiene
acceso. En particular, es costoso revocar todos los derechos de
un sujeto (por ejemplo cuando se le cancela la cuenta).
No obstante, variantes de los ACLs existen en Unix y en
Windows NT. La implementación en NT es más compleja y
flexible, pero menos probado en el mundo real. Veamos la
versión implementada en Unix.
12 de junio de 2002
Control de Acceso-5
Capabilities
La alternativa a los ACLs es guardar las entradas no-vacias de
cada fila junto con el sujeto correspondiente. En este caso las
filas se llaman listas de capabilities (un capability es la tupla
[{derechos}, objeto]).
El uso de capabilities ofrece ventajas de eficiencia al tiempo
de ejecución porque el SOP puede chequear inmediatamente si
existe un derecho de acceso a un objeto, sin verificar quien es
el sujeto.
Además, facilita la delegación: Alicia le puede entregar a Bob
el derecho de accesar a su archivo Datos, por ejemplo a
determinada hora. Esto es dificil lograr con ACLs.
Problema: ahora es dificil saber quien tiene acceso al objeto.
Según las detalles de implementación, Bob podría haberlo
regalado a Manuel, sin preguntarle a Alicia. Esto complica la
revocación de todos los derechos sobre un objeto.
Los capabilities son menos usados que los ACLs, pero un
ejemplo real es el sistema AS/400 de IBM. También se puede
considerar que los certificados criptográficos son realmente
capabilities, con muchas de las mismas ventajas y problemas.
12 de junio de 2002
Control de Acceso-6
La meta de muchos administradores de redes locales o
intranets es lograr single sign-on, o sea que el usuario se
identifique una sola vez para obtener un abaníco de servicios,
por ejemplo leer correo, ver las notas de un estudiante,
consultar información personal de la Nómina, reservar un
salón de clase, etc., todos los cuales son implementados en
servidores distintos en unidades administrativamente
independientes.
A una escala más grande, se está empezando a trabajar en
servicios de autentificación globales para el Internet, ej.
Passport (Microsoft) o Liberty Alliance. Sin embargo, esto
acarrea sus propios problemas:
Requiere mucho cuidado en el diseño. Ej. el sistema Passport
tiene vulnerabilidades conocidas.
Implica depositar mucha confianza en el administrador central
del servicio de autenticación.
Puede permitir a un adversario (que puede ser el gobierno)
correlacionar distintas actividades de un usuario.
12 de junio de 2002
Control de Acceso-7
Protección en Hardware
El SOP sólo puede ser efectivo si siempre puede mediar los
accesos a los objetos. Tiene que ser posible garantizar que un
programa no pueda tomar control de la máquina y bloquear la
intervención del SOP, o lo altere indebidamente. Esto requiere
necesariamente cierto soporte de hardware, incluyendo como
mínimo:
Una arquitectura de procesador que soporte al menos dos
modos de ejecución, uno de los cuales tiene menos privilegios
que el otro. Cada modo debe tener su propio PC (contador de
programa) y registros internos.
En el modo no-privilegiado, debe ser posible:
• Restringir las direcciones de memoria accesibles.
• Limitar el acceso directo a los dispositivos.
• Evitar cambios de modo no-controlados.
Un reloj que interrumpe la ejecución periódicamente y pasa
control al modo privilegiado (para evitar denials of service).
Sin estos elementos, no es posible implementar controles de
acceso en una manera confiable.
12 de junio de 2002
Control de Acceso-8
Ataques a los Controles de Acceso
El ataque favorito es aprovechar la falta de cuidado en el
chequeo de parámetros a un programa que corre con
privilegios de root, 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. Esto se llama
stack-smashing.
12 de junio de 2002
Control de Acceso-9
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 contexto el acceso al
código fuente es crítico.
12 de junio de 2002
Control de Acceso-10
Condiciones de Carrera
Otro tipo de ataque explota pequeñas ventanas de tiempo en
que un sistema es vulnerable. Por ejemplo, a veces una
aplicación crea un archivo temporal en el directorio /tmp, y
luego lo borrar 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.
12 de junio de 2002
Control de Acceso-11
Otros Ataques
Algunos ataques son legendarios:
El sistema TENEX chequeaba passwords en un lazo
secuencial, caracter por caracter, y devolvía un error tan
pronto lo detectaba. Manuel podía colocar su candidato para el
password al final de la memoria virtual:
legal ilegal
c andidato
Si el sistema retorna el error, el primer caracter es incorrecto y
Manuel intenta con otro. Si da una excepción por acceso ilegal
a memoria, el primer caracter es correcto. Manuel corre el
candidato una posición y repite:
legal ilegal
ca ndidato
Esta técnica permite atacar un espacio de AN posibles
passwords con un costo proporcional a A × N , por un alfabeto
de tamaño A y passwords de longitud máxima N .
Alternativamente, Manuel puede medir cuanto tiempo le tarda
al sistema en rechazar su candidato, para saber cuantas
iteraciones del lazo fueron ejecutados. En este caso se llama
un timing attack.
12 de junio de 2002
Control de Acceso-12
Ataques de denial of service (DOS):
Manuel ejecuta tantos procesos que llena una tabla interna de
tamaño fijo. Ni siquiera root puede ejecutar un comando de
Shell para matar su programa.
Manuel envia tantos paquetes SYN en la red (para abrir
conexiones TCP) que se llenan los buffers. Esto es un SYN
Flood.
Ataques de interfaz al usuario:
Manuel fabrica un programa (ej. un juego) y lo ofrece al
administrador, quien lo ejecuta con sus privilegios. El juego
funciona, pero también hace otras cosas . . .
Esto es el famoso Caballo de Troya. Funciona por una
violación del Principio de Mínimo Privilegio.
Un variante es que Manuel crea su caballo de Troya con el
nombre ls y lo deja en algún directorio donde tiene permisos.
Algún día el administrador entra en el directorio y ejecuta ls
para listar sus contenidos . . .
El administrador debe cuidarse de no incluir el directorio
actual “.” en su “camino de búsqueda” ($PATH en Unix).
12 de junio de 2002
Control de Acceso-13
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.
12 de junio de 2002
Control de Acceso-14
Descargar