Instituto de Tecnología de Massachusetts. Conferencia Curso # 6.858. "Seguridad de los sistemas informáticos". Nikolai Zeldovich, James Mickens. Año 2014
Computer Systems Security es un curso sobre el desarrollo e implementación de sistemas informáticos seguros. Las conferencias cubren modelos de amenazas, ataques que comprometen la seguridad y técnicas de seguridad basadas en trabajos científicos recientes. Los temas incluyen seguridad del sistema operativo (SO), características, gestión del flujo de información, seguridad del idioma, protocolos de red, seguridad de hardware y seguridad de aplicaciones web.
Lección 1: "Introducción: modelos de amenaza"
Parte 1 /
Parte 2 /
Parte 3Lección 2: "Control de ataques de hackers"
Parte 1 /
Parte 2 /
Parte 3Lección 3: “Desbordamientos del búfer: exploits y protección”
Parte 1 /
Parte 2 /
Parte 3Lección 4: “Separación de privilegios”
Parte 1 /
Parte 2 /
Parte 3Lección 5: “¿De dónde vienen los sistemas de seguridad?”
Parte 1 /
Parte 2Lección 6: “Oportunidades”
Parte 1 /
Parte 2 /
Parte 3 Audiencia: ¿podemos concluir que cada oportunidad tiene un proceso?
Profesor: lo dudo. Puede tener tantos procesos como desee, por una posibilidad pueden existir varios procesos. En pocas palabras, no necesariamente necesita un proceso separado para cada oportunidad. Porque hay un proceso
fort1 que puede abrir muchos archivos y pasar muchas capacidades al componente privilegiado de
fort .

La razón por la que cree que necesita un proceso separado para cada oportunidad que estamos tratando se refiere a esta extraña interacción entre capacidades y privilegios externos.
Porque
fort1 tiene un privilegio externo. Y lo que estamos haciendo es básicamente transformar este privilegio externo en
Capacidad en este proceso
fort1 . Entonces, si tiene varios tipos diferentes de privilegios externos o varios privilegios diferentes que desea usar con precaución, entonces probablemente desee un proceso separado que tenga este privilegio. Y cada vez que desee utilizar un conjunto específico de privilegios, solicitará el proceso apropiado para realizar la separación, y si esto tiene éxito, le pedirá al proceso que le devuelva la
Capacidad .
De hecho, existía un diseño del sistema operativo que se basaba completamente en las capacidades y no tenía privilegios externos. Y esto es genial, pero no muy práctico para usar en un sistema real. Resulta que en realidad no desea tanto privilegios externos como oportunidades para nombrar un objeto y contarle a alguien sobre este objeto sin transferir los derechos a este objeto sin falta.
Tal vez no sé qué privilegios puede tener con respecto a algún documento general, pero quiero informarle que tenemos este documento general. Si puedes leerlo, léelo. Si lo escribes en él, bien, escribe. Pero no quiero transferirle ningún derecho. Solo quiero decirte: "¡Oye, esta cosa, ve y pruébalo!" Esto es un inconveniente en el mundo de las oportunidades, porque realmente te obliga a nunca hablar de objetos sin transferir derechos a este objeto.
Por lo tanto, es importante saber acerca de esto y utilizar esta función en algunas partes del sistema, pero no confiar en que sea la solución para la seguridad del sistema.
Público: suponga que el proceso tiene las capacidades que le da otro proceso, pero resulta que ya tiene grandes capacidades con respecto a algún objeto. ¿Puede un proceso compararlos para asegurarse de que estén tocando el mismo objeto? ¿O usará las grandes oportunidades?
Profesor: el hecho es que el proceso no utiliza capacidades de manera implícita, por lo que esta es una propiedad muy útil de las capacidades. Definitivamente debe indicar cuál de las opciones está utilizando. Así que piénselo en términos de un descriptor de archivo. Supongamos que le doy un descriptor de archivo abierto para algún archivo, y es de solo lectura. Luego, alguien más le brinda otra oportunidad para otros archivos, que pueden incluir este archivo. Y una nueva característica le permite leer y escribir en archivos.
En este caso, si intenta escribir en el primer archivo, sin duda tendrá éxito, ya que se abrirá un descriptor de archivo adicional, que permite no solo leer sino también escribir. Entonces, esto es algo genial cuando no necesita privilegios externos adicionales. Simplemente tiene todas estas posibilidades, porque las personas realmente construyeron tales bibliotecas y, en principio, administran sus capacidades por usted. Como que los recogen. Y cuando intentan realizar una operación, buscan oportunidades y encuentran las que hacen que funcione.
Esto lo devuelve al control externo de la
autoridad ambiental que intentaba evitar. Una característica positiva de las posibilidades es que es un diseño de software que simplifica su vida. Esto es poco común en soluciones de seguridad. Esta propiedad facilita la escritura de código que apunta a los privilegios que desea utilizar desde un punto de vista de seguridad. Y esto es bastante fácil de escribir código.
Sin embargo, la
capacidad puede resolver otros problemas. Por lo tanto, los problemas de administración de privilegios a menudo surgen cuando necesita ejecutar algún código no confiable. Porque realmente desea controlar los privilegios que otorga, porque de lo contrario existe el riesgo de mal uso de cualquier privilegio que brinde. Y este es un punto de vista ligeramente diferente desde el cual los autores del artículo sobre
Capsicum abordan las oportunidades. Ellos, por supuesto, son conscientes del problema de la autoridad externa, pero este es un problema ligeramente diferente que puede o no puede resolver. Pero básicamente les importa que tengan una aplicación privilegiada realmente grande, y les preocupa que haya errores en diferentes partes del código fuente de esta aplicación. Por lo tanto, les gustaría reducir los privilegios de los diversos componentes de esta aplicación.
En este sentido, la historia es muy similar a
OKWS . Entonces, tiene una aplicación grande, la divide en componentes y restringe los privilegios para cada componente. Esto ciertamente tiene sentido en
OKWS . ¿Hay otras situaciones en las que podría estar preocupado por compartir privilegios? Creo que en su artículo describen ejemplos que debería intentar ejecutar, por ejemplo,
tcpdump y otras aplicaciones que analizan datos de red. ¿Por qué están tan preocupados por las aplicaciones que analizan las entradas de red? ¿Qué pasa en
tcpdump ? ¿Cuál es la razón de su paranoia?
Audiencia: un atacante puede controlar lo que se envía y lo que se llama para ejecutar, por ejemplo, paquetes.
Profesor: sí, ¿realmente les importan los ataques de este tipo y si el atacante realmente puede controlar los datos de entrada? Porque es bastante problemático si escribes código
C que debería manejar estructuras de datos. Obviamente, estará manipulando mucho los punteros copiando bytes a las matrices que asignan memoria. Al mismo tiempo, es fácil cometer un error con la gestión de la memoria, lo que tendrá consecuencias bastante desastrosas.
Así que esta es la razón por la que decidieron hacer el trabajo de su protocolo de red y otras cosas en el sandbox.

Otro ejemplo del mundo real donde se necesita compartir privilegios es su navegador. Probablemente desee aislar su complemento Flash, o su extensión de
Java , o algo más. Porque representan un amplio campo para los ataques que se usan de forma bastante agresiva.
Entonces esto parece un plan inteligente. Por ejemplo, si escribe alguna pieza de software, desea verificar el comportamiento de sus componentes en el sandbox. En términos más generales, esto se refiere a lo que descargó de Internet y tiene la intención de ejecutar con menos privilegios. ¿Se
adapta esto al estilo de aislamiento que ofrece
Capsicum ? Podría descargar un salvapantallas aleatorio o algún juego de Internet. Y quiero ejecutarlos en mi computadora, pero primero me aseguro de que no arruinen todo lo que tengo. ¿
Usarías Capsicum para esto?
Público: puede escribir un programa sandbox en el que utilizará
Capsicum .
Profesor: cierto. ¿Cómo lo usarías? Bueno, simplemente entrarías en modo sandbox con el
comando cap_enter y luego ejecutarías el programa. ¿Esperas que esto funcione? Creo que habrá un problema. Se conectará con el hecho de que si el programa no espera que
Capsicum lo aísle , puede intentar abrir la biblioteca compartida, pero no podrá hacerlo, porque no podrá abrir algo como
/ lib / ... , porque no lo hace. permitido en modo de
capacidad .
Por lo tanto, estos métodos de sandbox deben usarse para aquellas cosas para las cuales el desarrollador ha previsto que pueden ejecutarse en este modo. Probablemente hay otros métodos de sandbox que se pueden usar para código no modificado, pero los requisitos pueden cambiar ligeramente. Por lo tanto, los creadores de
Capsicum no
están muy preocupados por la compatibilidad con versiones anteriores. Si tenemos que abrir archivos de manera diferente, los abriremos de manera diferente. Pero si desea dejar el código existente, necesita algo más, por ejemplo, una máquina virtual completa para que pueda ejecutar el código en ella. Esto plantea la pregunta: ¿deberíamos usar máquinas virtuales para el entorno limitado de
Capsicum ?
Público: en este caso, es posible el desbordamiento de memoria.
Profesor: sí, lo es. Pero, ¿y si no nos importa la memoria? Por lo tanto, las máquinas virtuales son probablemente muy buenas y no utilizan mucha memoria. Entonces, ¿por qué otra razón no deberíamos usar
VM en
Capsicum ?
Público: es difícil controlar la actividad de la red.
Profesor: Eso es correcto! Es difícil controlar lo que está sucediendo en la red porque no le está dando acceso a la máquina virtual a la red, o se está conectando a la red a través del modo
NAT , o está usando
Vista previa o
VMWare . Pero entonces su sandbox puede acceder a Internet completo. Por lo tanto, tendrá que administrar la red con más detalle, quizás estableciendo reglas de firewall para la máquina virtual, y así sucesivamente. Esto no es muy bueno.
¿Pero qué pasa si no te importa la red? Suponga que solo tiene algún tipo de video. ¿Qué sucede si procesa algún video simple o analiza
tcpdump ? En este caso, simplemente inicia la máquina virtual, comienza a analizar sus paquetes
tcpdump y lo devuelve después de la presentación que
tcpdump desea escribir al usuario, porque no hay E / S de red real. Entonces, ¿hay alguna otra razón?
Audiencia: porque la sobrecarga de inicialización sigue siendo alta.
Profesor: sí, esta puede ser la sobrecarga inicial de iniciar una máquina virtual, lo que reduce el rendimiento. Entonces es verdad.
Público: Bueno, es posible que aún desee tener derechos sobre una base de datos y similares.
Profesor: si. Pero, en general, esto significa que tiene datos reales con los que está trabajando, y es realmente difícil separarlos. Por lo tanto, las máquinas virtuales son, de hecho, un mecanismo para compartir mucho más grande, por lo que no se pueden compartir cosas fácilmente. Por lo tanto, esto es bueno para situaciones en las que tiene un programa completamente aislado que desea ejecutar y, al mismo tiempo, no desea compartir ningún archivo, directorio, proceso y simplemente dejar que funcione por separado.
Entonces esto es genial. Esto es probablemente, de alguna manera, un aislamiento más fuerte que el que ofrece
Capsicum , porque hay menos opciones para que las cosas salgan mal. Sin embargo, este aislamiento no es aplicable en muchas situaciones cuando desea usar
Capsicum . Porque en
Capsicum puedes intercambiar archivos con gran precisión, usando las capacidades del sandbox.
Entonces, tomemos
tcpdump y veamos por qué es difícil aislarlo usando el mecanismo
Unix . Si recuerda, en
Capsicum la forma en que funciona
tcpdump es que abre algunos sockets especiales y luego ejecuta la lógica de análisis en los paquetes de red, después de lo cual se imprime en los terminales de usuario. Entonces, ¿qué se necesita para un sandbox
tcpdump basado en
Unix ? ¿Son sus privilegios limitados? El problema con
Unix es que la única forma de cambiar realmente los privilegios es cambiar la entrada en la función de decisión, que decide si realmente puede acceder a algún objeto o no. Y lo único que realmente puede cambiar son los privilegios del proceso. Esto significará que el proceso podrá enviar el
UID a otra persona.
O puede cambiar los permisos para varios objetos que están en su sistema. De hecho, puede usar ambas soluciones.
Si desea aislar
tcpdump en el sandbox, probablemente tenga que seleccionar un ID de usuario adicional y cambiarlo mientras trabaja. Pero este no es un plan ideal, ya que no va a ejecutar varias instancias de
tcpdump con la misma
ID de usuario. Por lo tanto, si comprometo una instancia de
tcpdump , esto no significará que quiero permitir que el atacante use este factor para controlar otras instancias de
tcpdump que se ejecutan en mi máquina. Entonces, esta es potencialmente una mala decisión para usar
uid en este caso.
Otro problema es que en
Unix, debe tener privilegios de root para cambiar la identificación de usuario, privilegios, procesos u otra cosa, o cambiarlos a otra cosa. Esto también es malo.
Y otro problema es que, sin importar cuál sea su
ID , pueden existir archivos de acceso abierto. Por lo tanto, su sistema puede tener un grupo completo de archivos legibles o grabables, por ejemplo, un archivo de contraseña. De hecho, no importa qué
ID tenga, el proceso aún podrá leer esta contraseña. Entonces esto tampoco es muy bueno.
Por lo tanto, para organizar un entorno limitado en
Unix , probablemente debería hacer ambas cosas: cambiar el
UID y revisar cuidadosamente los permisos de todos los objetos para asegurarse de que no tiene archivos abiertos no aislados que sean sensibles a que un hacker los sobrescriba o los pueda leer. Creo que al hacerlo obtienes otro mecanismo que puedes usar. Si lo envía hasta el final, puede ver dificultades para compartir archivos o compartir directorios.
Ahora veamos cómo
Capsicum está tratando de resolver este problema. Aquí, tan pronto como ingresemos al modo "sandbox", todo estará disponible solo a través de oportunidades. Por lo tanto, si no tiene la
capacidad , simplemente no puede acceder a ningún objeto.
Estos chicos en el artículo hacen una gran apuesta en el espacio de nombres global. Entonces, ¿qué es este espacio de nombres global y por qué están tan preocupados?
Su sistema de archivos en sí es una especie de brillante ejemplo de un espacio de nombres global. Puede escribir una barra y enumerar cualquier archivo que desee detrás de él. Por ejemplo, vaya a alguien en el directorio de inicio, por ejemplo,
/ home / nickolai / ... ¿Por qué es malo? ¿Por qué están en contra del espacio de nombres global en
Capsicum ? Que piensas
Público: si tiene los permisos incorrectos, cuando usa la autoridad puede meterse en problemas.
Profesor: si. El problema es que todavía es
Unix . Por lo tanto, todavía hay permisos de archivo regulares. Por lo tanto, quizás, si realmente desea aislar algún proceso en el entorno limitado, no podrá leer ni escribir nada en el sistema. Pero si logra encontrar un archivo grabable en el directorio de inicio de algún usuario estúpido, esto será bastante desagradable para el cliente sandbox.
En términos más generales, su idea era enumerar con precisión todos los objetos que tiene el proceso. Porque simplemente puede enumerar todas las funciones en una tabla de descriptores de archivos o en cualquier otro lugar donde las funciones estén almacenadas para usted. Y esto es lo único que el proceso puede tocar.
Pero si tiene acceso al espacio de nombres global, entonces esto es potencialmente imposible. Porque incluso si tiene un conjunto limitado de características, aún podría comenzar la línea con una barra inclinada y escribir algún archivo nuevo, y nunca sabrá el conjunto de operaciones u objetos a los que puede acceder este proceso.
Es por eso que están tan preocupados por el espacio de nombres global, porque contradice su objetivo de controlar con precisión todo a lo que el proceso de sandbox debería tener acceso. De esta manera, trataron de eliminar espacios de nombres globales con muchos cambios en el núcleo en
FreeBSD . En su caso, el núcleo tenía que asegurarse de que todas las operaciones pasaran por algunas capacidades, a saber, a través del descriptor de archivo.
Vamos a ver si realmente necesitamos cambios en el kernel. ¿Qué pasa si lo hacemos en la biblioteca? Después de todo, estamos implementando
Capsicum , que ya tiene una biblioteca. Y todo lo que hacemos es cambiar todas estas funciones, como "abrir, leer, escribir", para utilizar exclusivamente las funciones de
capacidad . Luego, todas las operaciones pasarán por algunas características, búsquelas en la tabla de archivos, y así sucesivamente. ¿Funcionará esto?
Público: siempre puede realizar la
llamada al sistema
syscall .
Profesor: si. El problema es que hubo un conjunto de llamadas al sistema que el núcleo acepta, e incluso si implementa una buena biblioteca, esto no evitará la posibilidad de que un proceso defectuoso o comprometido haga una llamada al sistema directamente. Por lo tanto, de alguna manera debes fortalecer el núcleo.
En el compilador, el modelo de amenaza no está en el proceso del compilador comprometido y no en código arbitrario, sino en la negligencia del programador. Entonces, si el desarrollador del programa no se equivoca y hace lo correcto, entonces la biblioteca probablemente será suficiente.
, , , . - , .
? — ,
cap_enter . ,
cap_enter ? , ?
, , . , , , .
cap_enter ,
open () ,
openat .
Unix- , ,
open ,
openat , , , — :
openat (dirfd,“name) .
openat «name» , .

,
Capability open , , , . . - ? -, ? , – . , ?
: , .
: . , , . , , . , . , , . -, .
, , , , , . , , .. , , , . ?
. ? ,
Unix PID . ,
kill (25) PID = 25 . , .
Capsicum ? ?
: .
: . -, . ,
Unix , . ,
PID , ,
fork ,
pdfork , « ». , - .
. , . , - : « «» , , , , ». . , , - .
, , , . , . , , .

. , «-» . ,
openat , «-». , «-», .
? , «-» ?
: , , . ,
Capability .
: , .
: , , - …
: .
: - .
: , . «-» ? ,
openat -
b/c/../.. ?
, , ? - , . , , ,
openat (d, “b/c/../..) «c» , - .

. , , , . «-», . , , . , , . ,
UID - ?
: , .
: , . , , «»
UID ? :
cap_enter UID . , . ? ?
: ,
UID , , , , , - .
: , . «»
UID . , ,
UID. Resulta que tengo cientos de procesos en ejecución en mi computadora, y no tengo idea de lo que es. Por lo tanto, destruir el UID no es un buen plan para fines de gestión.54:14 minContinuación:Curso MIT "Seguridad de sistemas informáticos". Lección 6: "Oportunidades", parte 3La versión completa del curso está disponible aquí .Gracias por quedarte con nosotros. ¿Te gustan nuestros artículos? ¿Quieres ver más materiales interesantes?
Apóyenos haciendo un pedido o recomendándolo a sus amigos, un
descuento del 30% para los usuarios de Habr en un análogo único de servidores de nivel de entrada que inventamos para usted: toda la verdad sobre VPS (KVM) E5-2650 v4 (6 núcleos) 10GB DDR4 240GB SSD 1Gbps de $ 20 o cómo dividir el servidor? (las opciones están disponibles con RAID1 y RAID10, hasta 24 núcleos y hasta 40GB DDR4).
Dell R730xd 2 veces más barato? ¡Solo tenemos
2 x Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TV desde $ 249 en los Países Bajos y los Estados Unidos! Lea sobre
Cómo construir un edificio de infraestructura. clase utilizando servidores Dell R730xd E5-2650 v4 que cuestan 9,000 euros por un centavo?