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 3Lección 7: “Sandbox de cliente nativo”
Parte 1 /
Parte 2 /
Parte 3Lección 8: "Modelo de seguridad de red"
Parte 1 /
Parte 2 /
Parte 3Lección 9: "Seguridad de aplicaciones web"
Parte 1 /
Parte 2 /
Parte 3Lección 10: “Ejecución simbólica”
Parte 1 /
Parte 2 /
Parte 3Lección 11: "Ur / Lenguaje de programación web"
Parte 1 /
Parte 2 /
Parte 3 Nikolai Zeldovich: ¡ comencemos chicos! Por lo tanto, hoy hablaremos de un enfoque completamente diferente y fundamental para crear aplicaciones web seguras. Se trata de un sistema llamado Ur / Web. Ahora nuestro invitado Adam Chipala, quien es el autor de este sistema, profesor del MIT, le contará sobre el sistema que creó.
Adam Chipala: Quiero llegar a la manifestación lo antes posible. Pero antes de eso, mostraré algunas diapositivas para explicar el contenido de este sistema. Probablemente ya tenga algunas ideas sobre esto de las notas de la conferencia de hoy.
Entonces, ¿qué es Ur / Web? Siempre es útil comenzar con una explicación de lo que significa el título del tema. Ur / Web es principalmente un lenguaje de programación para crear aplicaciones web. Esto es lo que la web tiene en su nombre. Este es un tipo de sistema de pila completo que hace todo lo necesario para crear aplicaciones web. Ur significa el nuevo lenguaje de programación universal que se utiliza para implementar estas funciones web.
El objetivo de Ur / Web es que, en lugar de utilizar un lenguaje de programación de propósito general, una biblioteca y marcos tradicionales para crear aplicaciones web, todo esto ya está integrado en un lenguaje de programación personalizado de Ur / Web. Este es un lenguaje que en tiempo de ejecución implica compilación en lugar de interpretación. Y el compilador, en cierto sentido, comprende lo que debe hacer una aplicación web. Indicará los errores que está cometiendo, a diferencia del compilador de Java normal, que no comprende dónde tiene errores.
Hay tres principios principales que traté de usar al desarrollar este lenguaje: eficiencia de programación, seguridad y rendimiento, especialmente en el lado del servidor, para escalar. En este contexto, el segundo es más relevante.
En la mayoría de los casos, los usuarios de su aplicación no notarán pequeños problemas con el rendimiento en el lado del cliente, pero incluso un pequeño problema en el lado del servidor puede hacer que compre muchos más servidores de los necesarios.

Por el momento, ya hay varios usuarios de Ur / Web, sin embargo, no hay tantos como aquellos que usan otros lenguajes de programación. Pero al menos es la única aplicación web comercial que es un lector de RSS y que admite características exóticas como mostrar comentarios. También hay una URL inventada por un hablante de inglés no nativo que ahora lamenta ese nombre. Se llama BazQux Reader, una combinación de las habilidades tácticas de la comunidad de hackers. Esta aplicación ya tiene varios miles de usuarios pagos. Y parece que es mucho mejor tratarlo que lo que se hace con CSS. Esto es una prueba de que esto se puede hacer usando Ur / Web.
No dude en interrumpirme con preguntas en cualquier momento, aunque probablemente aún no haya descubierto qué podría estar causando las preguntas. Por lo tanto, el principal éxito de las ventas de Ur / Web es que tiene un modelo de programación de muy alto nivel, que es muy diferente de Django, que usted conoce en conferencias anteriores. Y tiene una buena historia de seguridad.
Algunas funciones que le gustaría tener para la seguridad ya están integradas en el sistema, por lo que no tiene que trabajar duro para garantizar que su programa sea seguro. Te contaré más sobre esto en el futuro cercano.
Además, este lenguaje proporciona un alto rendimiento del lado del servidor, incluso en comparación con las herramientas de creación de aplicaciones web más populares, creo que ya lo ha escuchado. La advertencia es que probablemente necesitemos aprender más ideas para lenguajes de programación funcionales, como Haskell, antes de usar Ur / Web.
Miré las preguntas y respuestas para esta lección, y aproximadamente una quinta parte de los estudiantes se quejaron de las partes funcionales de la programación que eran difíciles de completar. Pido disculpas, pero hay tantas buenas ideas en el mundo de la programación funcional que sería difícil no comenzar desde ese momento, agregando gradualmente cosas más complejas. Pero intentaré no exigir un conocimiento estricto del material del que hablaré hoy.
Por lo tanto, este modelo de programación está muy relacionado con la escritura estática. Y esto no es solo una escritura estática, como en el lenguaje Java, que tiene un sistema de tipo torpe relativamente inexpresivo, sino una escritura estática, similar a la utilizada en Haskell o Apache Camel. Esta escritura es una de las formas en que el compilador comprende lo que está haciendo y detecta errores en su programa.

Resulta que el idioma principal de Ur en el que se construye Ur / Web tiene un sistema muy expresivo de tipeo estático. Mucho de lo que hace Ur / Web es realmente proporcionado por bibliotecas sin soporte especial del compilador. Por ejemplo, le enseñamos al compilador cómo verificar el tipo de consultas SQL sin crear reglas para ingresar SQL en el compilador. Se pueden codificar como bibliotecas y usar un tipo estándar de validación para asegurarse de que sus consultas SQL sigan las reglas SQL.
Lo más relevante en este contexto es garantizar un alto nivel de seguridad: la mayoría de las vulnerabilidades de seguridad más comunes son imposibles cuando se programa en Ur / Web. Siempre puede despedirse de los ataques de inyección de código malicioso y los ataques de secuencias de comandos entre sitios. Puede permitir que los nombres de banderas de aspecto aterrador hagan las cosas más terribles que se pueden hacer en una aplicación web, incluso si realmente causa algún tipo de "magia negra" usando las funciones de la interfaz de otra persona.
Hay varias otras propiedades específicas de seguridad que discutiré más adelante. El rendimiento también es muy bueno. El compilador está optimizado principalmente para crear código fuente para dominios y mucho más productivo que el código escrito a mano en C.
Por lo tanto, comprende lo que está haciendo la aplicación web y puede optimizar algunas cosas que un compilador de tipo general tradicional no "captaría". Por lo tanto, el código fuente que produce este compilador que se ejecuta en el servidor compite con éxito con el código C. Si comparamos los costos de garantizar el rendimiento con los costos laborales de la programación en otros lenguajes, vemos que Ur / Web simplifica enormemente la vida del programador.
La siguiente diapositiva muestra un punto de referencia rápido para el rendimiento de este marco de infraestructura web de terceros.
Esta es una captura de pantalla de los resultados de la última prueba, en la que varias tareas de programación web fueron realizadas por diferentes marcos.

Puede ver que Ur / Web ocupó el cuarto lugar de los 60 marcos que participaron en las pruebas de rendimiento. Después de tomar esta captura de pantalla, se realizaron algunas mejoras más en el compilador. Por lo tanto, espero que en la próxima ronda, de acuerdo con sus resultados, avance un poco. Básicamente, este es un ejemplo simple del uso de SQL para generar páginas HTML. Recibe alrededor de 100,000 solicitudes por segundo del servidor Ur / Web, y esto es más que suficiente para la mayoría de las aplicaciones. Es importante que esta diapositiva indique que puede usar un modelo de alto nivel que brinde una mayor seguridad al perder ligeramente el rendimiento en los marcos más comunes.
Entonces, permítanme comenzar con imágenes que reflejan mi impresión de lo que los programadores de hoy piensan acerca de escribir aplicaciones web utilizando los marcos más comunes. Luego, le mostraré otro punto de vista proporcionado por Ur / Web y según el cual, muchas cosas que pueden salir mal no tienen errores en este marco.
La imagen principal es un servidor web del que depende todo el proceso de su aplicación. Y hay toda una flota de navegadores que van a interactuar con este servidor. El servidor permanecerá en un cierto estado, lo que garantiza la interacción con todos estos navegadores.
La imagen habitual es que el navegador comienza a interactuar con el servidor web enviándole una solicitud HTTP, que incluye las URL integradas. Después de eso, el servidor web envía la página HTTP y HTML al navegador. Sin embargo, hay algunas URL integradas que se pueden usar para determinar qué solicitud debe hacer el servidor web en el futuro.

Este servidor web también puede comunicarse con una base de datos que proporciona almacenamiento persistente común a todos los usuarios de la aplicación. En este caso, se utiliza un protocolo SQL popular para las conversaciones entre la red del servidor y la base de datos. Esto es exactamente de lo que hablaré cuando discuta las posibilidades de Ur / Web.

Las aplicaciones web modernas no son solo una página instantánea. Siempre que algo cambie en la página, realiza una nueva solicitud al servidor, después de lo cual se reemplaza toda la página del módulo. Existe un estilo AJAX según el cual el navegador a veces envía solicitudes HTTP adicionales al servidor web durante una vista de página y recibe respuestas procesadas por el programa de usuario. En este caso, generalmente se utilizan representaciones de datos como XML y JSON, así como otros formatos simples para intercambiar datos entre el cliente y el servidor.

Luego, cuando el navegador devuelve esta respuesta, hay un código JavaScript que implementa una lógica arbitraria para controlar la interfaz de usuario, que se muestra al usuario.

Este código JavaScript puede leer las respuestas que el servidor da a varias llamadas AJAX. Luego puede modificar la página, que se muestra principalmente al cambiar la variable global DOM que se establece para la página. Cualquier parte del programa puede afectar arbitrariamente esta variable global, que es una página. A menudo, las partes de una página se ven mediante una ID de cadena anotada por los nodos de un árbol que describe un documento.
Y finalmente, otra complicación es que a veces queremos que el servidor web se comunique con el navegador sin una solicitud. Supongamos que aparece un nuevo mensaje de correo electrónico y el servidor web desea informar al navegador sobre este nuevo mensaje.

Y hay muchas maneras de hacer esto, por ejemplo, Comet, un modelo de operación de aplicación web en el que una conexión HTTP constante permite al servidor web enviar datos al navegador sin ninguna solicitud adicional del navegador, o el protocolo de comunicación dúplex WebSockets, que se comunica entre el navegador y el servidor en tiempo real En principio, estas son las mismas cosas, pero en una dirección conceptualmente diferente.
Entonces, quiero volver a la pantalla todos estos protocolos e idiomas, habiendo seleccionado previamente algunas partes en amarillo. Después de leer las notas de la conferencia, ¿alguien adivinó lo que es común entre todas estas partes resaltadas en términos de seguridad?
Estudiante: son todas las líneas en las que puedes colocar cualquier cosa.
Profesor: correctamente, en el enfoque generalmente aceptado para programar aplicaciones web, todas estas cosas son cadenas. Y el lenguaje de programación no comprende cómo los usa, por lo que no puede ayudarlo a evitar errores. Entonces, por ejemplo, presentando estas cosas como cadenas, obtienes ataques de inyección de código. Por lo que puedo decir, los ataques de inyección de código son principalmente el resultado de incluir como primitivo en su lenguaje de programación o su marco alguna función que lanza programas en forma de texto en un lenguaje bastante expresivo.
Ur / Web no tiene un intérprete incorporado para ejecutar cadenas como programas. Y esto hace estructuralmente imposible muchos de los errores de aplicación web más comunes. Por lo tanto, todos estos objetos seleccionados serán invisibles o representados por tipos especiales, lo que deja en claro con qué código está tratando. Sin embargo, no tiene ninguna conversión automática a cadenas en ninguno de estos tipos especiales.
Ahora la diapositiva muestra un modelo alternativo que proporciona Ur / Web y que se compila en un modelo tradicional. Por lo tanto, funciona en todos los navegadores generalizados. Pero el programador puede pensarlo en un nivel superior y evitar posibles errores que fueron posibles en la imagen anterior.

Entonces todavía tenemos un servidor web que responde a las solicitudes. Y todavía tenemos esta flota de navegadores que están tratando de usar un servidor web. Pero la primera diferencia importante es que cuando un navegador quiere comenzar a usar una aplicación web, no solo envía una cadena de solicitudes HTTP con una URL.
Ejecuta la función de primera clase en el servidor sin involucrar al cliente. Y luego el servidor responde no solo con una cadena de texto de protocolo HTTP, sino con un árbol de documentos estrictamente escrito. Por lo tanto, en lugar de una cadena HTML, tenemos un árbol, en un lenguaje de programación, un objeto de la primera clase. Y el programa manipula este árbol en particular, no la cadena.
Cada uno de estos árboles contiene enlaces, que en sí mismos son solo notas al pie de página para otras funciones que se pueden invocar en el servidor. Cuando el usuario hace clic en estos enlaces, el navegador selecciona la función y conceptualmente la llama en el servidor, como la función original que llamamos para llegar a este punto.
También tenemos una interfaz de base de datos a la que accede un servidor web que envía solicitudes a la base de datos. En el modelo Ur / Web, esto no es solo texto, sino árboles de sintaxis SQL fuertemente tipados. Y luego la base de datos responderá no con texto, sino con una lista de registros de valores propios en el lenguaje de programación Ur con el que trabajamos.

Por lo tanto, no debemos preocuparnos por convertir incorrectamente las cadenas en representaciones "nativas" o por convertir las representaciones "nativas" en cualquier otro formato que la base de datos tradicionalmente nos pueda proporcionar.
Este es un elemento clave en cómo la semántica de Ur / Web hace que sea más fácil para los programadores trabajar con una gran cantidad de scripts que pueden ocurrir mientras la aplicación se está ejecutando.
Existe una idea de transacción estándar en el mundo de las bases de datos relacionales, donde puede realizar una serie de operaciones sin interrumpirlas con otros hilos paralelos. Y Ur / Web adapta este modelo y lo integra en la semántica del lenguaje. Por lo tanto, cuando se realiza una función en el servidor en nombre del cliente, todos sus accesos a la base de datos ocurren en forma de un bloque atómico sin ninguna interrupción causada por todas las demás solicitudes simultáneas al mismo servidor. No puede evitar este comportamiento, incluso si lo desea, porque estas transacciones están integradas en el lenguaje de programación.
Y realmente facilitan la ejecución de consultas concurrentes y, potencialmente, ayudan a evitar los problemas de seguridad que surgen cuando hay una cierta alternancia de ciertas combinaciones de consultas.
Quiero obtener una respuesta a una de las preguntas presentadas en el resumen de esta conferencia y que me intrigó. Entonces, Ur / Web detecta cuando una transacción falla debido a un problema de ejecución paralela, como un callejón sin salida, y reinicia automáticamente la transacción. Alguien, respondiendo preguntas, escribió que esto puede facilitar el lanzamiento de ataques de seguridad, que dependen de una falla en la transacción debido a problemas de concurrencia. Solo quería preguntarle a la clase, ¿alguien puede dar un ejemplo de tal ataque, como lo imagina? Si tiene un sistema que reinicia automáticamente las transacciones en puntos muertos, ¿cómo puede esto causar problemas de seguridad? No tengo respuesta a esta pregunta, por eso pregunto. Esta pregunta puede tener una respuesta tan obvia que claramente vale la pena discutirla.
Estudiante: ¿ tal vez esto pueda causar algún tipo de falla del servicio DoS? Si va a reiniciar la transacción que está enviando, y sabe que no tendrá éxito, simplemente puede continuar reiniciando este proceso e intentar nuevamente ...
Profesor: ok, sigue ...
Estudiante: si obliga al sistema a hacer lo que sabe, nunca tendrá éxito, puede intentarlo una y otra vez y, al final, provocar que el servicio falle.
Profesor: cierto, pero para hacer esto, necesita al menos dos hilos trabajando al mismo tiempo. Aunque esto podría funcionar, es posible que pueda lanzar un ataque de denegación de servicio. En este caso, puede aprovechar el hecho de que los manejadores de solicitudes se reinician una y otra vez y deliberadamente causan un conflicto, y usar esto como una forma de aumentar el poder de los ataques DoS además de lo que puede obtener con la ayuda de un modelo tradicional de ataque de este tipo. Bueno, puedo creerlo.
Estudiante: ¿ es esta la única forma de causar una falla en la transacción?
Profesor: sí, esta es la única forma de provocar un bloqueo y reinicio automático.
Estudiante: quizás haya un tercero que fallaría condicionalmente. Entonces podría usar esto para monitorear el comportamiento de otros usuarios.
Profesor: También necesitará una forma de observar que alguien ha fallado, pero solo podrá hacerlo después de un tiempo. Sin embargo, esto también puede ser un problema. , , , . , . , , , . .
: , , , . , ?
: , , , .
: , , , ? , .
: , , . , .
: , , , , , ?
: , , , , , ? , – , . . , , .
: , , ?
: , , . , , , . , – .
, -. AJAX, .

, . , . , - .

, . , .
, Ur/Web , . — , . , , . — , , .
— , , , . , , , .
. Ur/Web- Ur/Web-. JavaScript, . , . .
, , . , . , , , . , , , .

. , , , , , . . , , JavaScript.
JavaScript , , , JavaScript .
, , Ur/Web- — . , , , . JSON. .

, , . , . . - .
, , , , . : «, », . «» .

, . , ?
: , ?
: RPC , . , .
— , . , , .
: ?
: HTTP-. , - , , , HTTP .
, , . . , Ur/Web. , .

, . , , URL- URL-. . , URL.
URL . - , URL. , HTML . HTML. , XML-, , .
- , . HTML- , .

, , . , , UTF-8. , .
, UTF-8, . - , Tangled Web ( ), Ur/Web, , .
Por cierto, en cualquier momento durante esta demostración, sugiera experimentos que se le ocurran para que podamos probar en mi sistema qué tipo de errores puede detectar.Creo que esta es la forma más productiva de demostrar las capacidades de Ur / Web.27:45 minCurso MIT "Seguridad de sistemas informáticos". Lección 11: Ur / Lenguaje de programación web, Parte 2La 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).
VPS (KVM) E5-2650 v4 (6 núcleos) 10GB DDR4 240GB SSD 1Gbps hasta diciembre de forma gratuita al pagar por un período de seis meses, puede ordenar
aquí .
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?