Instituto de Tecnologia de Massachusetts. Curso de Aula nº 6.858. "Segurança de sistemas de computador". Nikolai Zeldovich, James Mickens. 2014 ano
Computer Systems Security é um curso sobre o desenvolvimento e implementação de sistemas de computador seguros. As palestras abrangem modelos de ameaças, ataques que comprometem a segurança e técnicas de segurança baseadas em trabalhos científicos recentes. Os tópicos incluem segurança do sistema operacional (SO), recursos, gerenciamento de fluxo de informações, segurança de idiomas, protocolos de rede, segurança de hardware e segurança de aplicativos da web.
Palestra 1: “Introdução: modelos de ameaças”
Parte 1 /
Parte 2 /
Parte 3Palestra 2: “Controle de ataques de hackers”
Parte 1 /
Parte 2 /
Parte 3Aula 3: “Estouros de Buffer: Explorações e Proteção”
Parte 1 /
Parte 2 /
Parte 3Palestra 4: “Separação de Privilégios”
Parte 1 /
Parte 2 /
Parte 3Palestra 5: “De onde vêm os sistemas de segurança?”
Parte 1 /
Parte 2Palestra 6: “Oportunidades”
Parte 1 /
Parte 2 /
Parte 3Palestra 7: “Sandbox do Cliente Nativo”
Parte 1 /
Parte 2 /
Parte 3Aula 8: “Modelo de Segurança de Rede”
Parte 1 /
Parte 2 /
Parte 3Aula 9: “Segurança de aplicativos da Web”
Parte 1 /
Parte 2 /
Parte 3Palestra 10: “Execução Simbólica”
Parte 1 /
Parte 2 /
Parte 3Aula 11: “Linguagem de Programação Ur / Web”
Parte 1 /
Parte 2 /
Parte 3 Nikolai Zeldovich: vamos começar pessoal! Hoje, falaremos sobre uma abordagem completamente diferente e fundamental para criar aplicativos da Web seguros. É sobre um sistema chamado Ur / Web. Agora, nosso convidado Adam Chipala, que é o autor deste sistema, professor do MIT, falará sobre o sistema que ele criou.
Adam Chipala: Eu quero chegar à manifestação o mais rápido possível. Mas antes disso, mostrarei alguns slides para explicar o conteúdo deste sistema. Você provavelmente já teve algumas idéias sobre isso nas notas de aula de hoje.
Então, o que é Ur / Web? É sempre útil começar com uma explicação do significado do título do tópico. Ur / Web é principalmente uma linguagem de programação para a criação de aplicativos da web. É isso que a Web tem em seu nome. Esse é um tipo de sistema de pilha completo que faz tudo o que você precisa para criar aplicativos da web. Ur significa a nova linguagem de programação universal usada para implementar essas funções da web.
O ponto principal de Ur / Web é que, em vez de usar uma linguagem de programação de uso geral, biblioteca e estruturas tradicionais para criar aplicativos da Web, tudo isso já está integrado a uma linguagem de programação Ur / Web personalizada. Essa é uma linguagem que em tempo de execução envolve compilação e não interpretação. E o compilador, de certa forma, entende o que um aplicativo Web deve fazer. Ele indicará os erros que você está cometendo, ao contrário do compilador Java comum, que não entende onde você tem erros.
Existem três princípios principais que tentei usar ao desenvolver essa linguagem: eficiência, segurança e desempenho de programação, especialmente no lado do servidor, para dimensionamento. Nesse contexto, o segundo é mais relevante.
Na maioria dos casos, os usuários do seu aplicativo não perceberão pequenos problemas com o desempenho no lado do cliente, mas mesmo um pequeno problema no lado do servidor pode fazer com que você compre muito mais servidores do que o necessário.

No momento, já existem vários usuários do Ur / Web, no entanto, não existem tantos como aqueles que usam outras linguagens de programação. Mas pelo menos é o único aplicativo da web comercial que é um leitor de RSS e suporta recursos exóticos, como a exibição de comentários. Há também um URL inventado por um falante de inglês não nativo que agora lamenta esse nome. Chama-se BazQux Reader, uma combinação das habilidades táticas da comunidade hacker. Este aplicativo já possui vários milhares de usuários pagos. E parece que é muito melhor lidar com isso do que o que é feito com CSS. Isso prova que isso pode ser feito usando o Ur / Web.
Sinta-se à vontade para me interromper com as perguntas a qualquer momento, embora eu provavelmente ainda não tenha descoberto o que pode estar causando essas perguntas. Portanto, o principal sucesso das vendas de Ur / Web é que ele possui um modelo de programação de alto nível muito diferente do Django, que você conhece nas palestras anteriores. E ele tem uma boa história de segurança.
Algumas funções que você gostaria de ter para segurança já estão integradas ao sistema, portanto você não precisa trabalhar duro para garantir que seu programa esteja seguro. Vou contar mais sobre isso em um futuro próximo.
Além disso, esse idioma fornece alto desempenho no servidor, mesmo quando comparado às ferramentas de criação de aplicativos Web mais populares, acho que você já ouviu falar sobre isso. A ressalva é que provavelmente precisaremos aprender mais idéias de linguagens de programação funcionais, como Haskell, antes de usar o Ur / Web.
Analisei as perguntas e respostas desta lição e cerca de um quinto dos alunos se queixou das partes funcionais da programação que eram difíceis de concluir. Peço desculpas, mas há tantas boas idéias no mundo da programação funcional que seria difícil não começar a partir desse momento, adicionando gradualmente coisas mais complexas. Mas tentarei não exigir um conhecimento estrito do material sobre o qual falarei hoje.
Portanto, esse modelo de programação está realmente intimamente relacionado à tipagem estática. E isso não é apenas digitação estática, como na linguagem Java, que possui um sistema de tipo desajeitado relativamente inexpressivo, mas digitação estática, semelhante à usada no Haskell ou no Apache Camel. Essa digitação é uma maneira de o compilador entender o que você está fazendo e detectar erros em seu programa.

Acontece que o idioma principal do Ur no qual o Ur / Web é construído possui um sistema muito expressivo de digitação estática. Muito do que o Ur / Web faz é realmente fornecido por bibliotecas sem suporte especial ao compilador. Por exemplo, ensinamos ao compilador como verificar o tipo de consultas SQL sem criar regras para inserir SQL no compilador. Eles podem ser codificados como bibliotecas e usam um tipo padrão de validação para garantir que suas consultas SQL sigam as regras SQL.
O mais relevante nesse contexto é garantir um alto nível de segurança - a maioria das vulnerabilidades de segurança mais comuns é impossível ao programar no Ur / Web. Você pode sempre dizer adeus a ataques maliciosos de injeção de código e ataques de script entre sites. Você pode permitir que nomes de bandeira com aparência assustadora façam as coisas mais terríveis que podem ser feitas em um aplicativo Web, mesmo se você realmente causar algum tipo de "magia negra" usando as funções da interface de outra pessoa.
Existem várias outras propriedades específicas de segurança que discutirei mais adiante. O desempenho também é muito bom. O compilador é principalmente otimizado para criar código-fonte para domínios e muito mais produtivo que o código escrito à mão em C.
Portanto, ele entende o que o aplicativo da Web está fazendo e pode otimizar algumas coisas que um compilador de tipo geral tradicional não “capturaria”. Portanto, o código-fonte que esse compilador executa no servidor concorre com êxito com o código C. Se compararmos os custos de garantir o desempenho com os custos de mão-de-obra da programação em outros idiomas, veremos que o Ur / Web simplifica bastante a vida do programador.
O slide a seguir mostra uma referência rápida para o desempenho dessa estrutura de infraestrutura da web de terceiros.
Esta é uma captura de tela dos resultados do último teste, na qual várias tarefas de programação da web foram executadas por diferentes estruturas.

Você pode ver que o Ur / Web ficou em quarto lugar em 60 estruturas que participaram de testes de desempenho. Após a captura da captura de tela, foram feitas mais algumas melhorias no compilador. Portanto, espero que na próxima rodada, de acordo com seus resultados, ele avance um pouco. Basicamente, este é um exemplo simples de uso do SQL para gerar páginas HTML. Você recebe cerca de 100.000 solicitações por segundo do servidor Ur / Web, e isso é mais do que suficiente para a maioria dos aplicativos. É importante que este slide indique que você pode usar um modelo de alto nível que forneça maior segurança, perdendo levemente o desempenho das estruturas mais comuns.
Então, deixe-me começar com imagens que refletem minha impressão do que os programadores pensam hoje em escrever aplicativos da Web usando as estruturas mais comuns. Em seguida, mostrarei outro ponto de vista fornecido pelo Ur / Web e, segundo o qual, muitas coisas que podem dar errado acontecem sem erros nessa estrutura.
A imagem principal é um servidor da Web do qual depende todo o processo do seu aplicativo. E há toda uma frota de navegadores que vão interagir com este servidor. O servidor permanecerá em um determinado estado, o que garante a interação com todos esses navegadores.
A imagem usual é que o navegador começa a interagir com o servidor da Web enviando uma solicitação HTTP, que inclui os URLs incorporados a ele. Depois disso, o servidor da Web envia a página HTTP e HTML de volta ao navegador. No entanto, existem alguns URLs internos que podem ser usados para determinar qual solicitação o servidor da Web deve fazer no futuro.

Esse servidor da web também pode se comunicar com um banco de dados que fornece armazenamento persistente comum a todos os usuários do aplicativo. Nesse caso, um protocolo SQL popular é usado para conversas entre a rede do servidor e o banco de dados. É exatamente sobre isso que falarei ao discutir as possibilidades de Ur / Web.

Os aplicativos da web modernos não são apenas uma página instantânea. Sempre que algo deve mudar na página, você faz uma nova solicitação ao servidor, após a qual a página inteira do módulo é substituída. Há um estilo AJAX, segundo o qual o navegador às vezes envia solicitações HTTP adicionais ao servidor da web durante uma visualização de página e recebe respostas que são processadas pelo programa do usuário. Nesse caso, geralmente são usadas representações de dados como XML e JSON, além de outros formatos simples para a troca de dados entre o cliente e o servidor.

Então, quando o navegador retorna essa resposta, há algum código JavaScript que implementa lógica arbitrária para controlar a interface do usuário, que é mostrada ao usuário.

Este código JavaScript pode ler as respostas que o servidor fornece a várias chamadas AJAX. Ele pode modificar a página, que é exibida principalmente alterando a variável DOM global definida para a página. Qualquer parte do programa pode afetar arbitrariamente essa variável global, que é uma página. Muitas vezes, partes de uma página são visualizadas por um ID de string anotado pelos nós de uma árvore que descreve um documento.
E, finalmente, outra complicação é que às vezes queremos que o servidor da Web se comunique com o navegador sem uma solicitação. Suponha que uma nova mensagem de email apareça e o servidor da Web deseje informar o navegador sobre essa nova mensagem.

E há muitas maneiras de fazer isso, por exemplo, Comet - um modelo de operação de aplicativo da Web no qual uma conexão HTTP constante permite que o servidor da Web envie dados ao navegador sem qualquer solicitação adicional do navegador, ou protocolo de comunicação duplex WebSockets, que se comunica entre o navegador e o servidor. em tempo real. Em princípio, são as mesmas coisas, mas em uma direção conceitualmente diferente.
Então, quero retornar à tela todos esses protocolos e idiomas, tendo selecionado previamente algumas partes em amarelo. Depois de ler as notas da aula, alguém adivinhou o que é comum entre todas essas partes destacadas em termos de segurança?
Aluno: são todas as linhas em que você pode colocar qualquer coisa.
Professor: corretamente, na abordagem geralmente aceita para a programação de aplicativos da Web, todas essas coisas são string. E a linguagem de programação não entende como você as usa, portanto, não pode ajudá-lo a evitar erros. Então, por exemplo, apresentando essas coisas como strings, você recebe ataques de injeção de código. Até onde eu sei, os ataques de injeção de código são principalmente o resultado de incluir como primitivo em sua linguagem de programação ou em sua estrutura alguma função que inicia programas na forma de texto em uma linguagem bastante expressiva.
O Ur / Web não possui um intérprete interno para executar seqüências de caracteres como programas. E isso torna estruturalmente impossível muitos dos erros mais comuns de aplicativos da web. Portanto, todos esses objetos selecionados serão invisíveis ou representados por tipos especiais, o que deixa claro com qual código você está lidando. No entanto, você não possui transmissões automáticas para cadeias de caracteres em nenhum desses tipos especiais.
Agora, o slide mostra um modelo alternativo que o Ur / Web fornece e que é compilado em um modelo tradicional. Por isso, funciona em todos os navegadores comuns. Mas o programador pode pensar sobre isso em um nível mais alto e evitar possíveis erros possíveis na imagem anterior.

Portanto, ainda temos um servidor web que responde às solicitações. E ainda temos essa frota de navegadores que estão tentando usar um servidor da web. Mas a primeira diferença importante é que, quando um navegador deseja começar a usar um aplicativo Web, ele não envia apenas uma sequência de solicitações HTTP com um URL.
Ele executa a função de primeira classe no servidor sem envolver o cliente. E então o servidor responde não apenas com uma sequência de texto do protocolo HTTP, mas com uma árvore de documentos estritamente digitada. Assim, em vez de uma string HTML, temos uma árvore, em uma linguagem de programação, um objeto da primeira classe. E o programa manipula essa árvore em particular, não a string.
Cada uma dessas árvores contém links, que são apenas notas de rodapé para outras funções que podem ser chamadas no servidor. Quando o usuário clica nesses links, o navegador seleciona a função e chama-a conceitualmente no servidor, como a função original que chamamos para chegar a esse ponto.
Também temos uma interface de banco de dados que é acessada por um servidor da Web que envia solicitações ao banco de dados. No modelo Ur / Web, isso não é apenas texto, mas árvores de sintaxe SQL de tipo forte. E o banco de dados responderá não com texto, mas com uma lista de registros de autovalores na linguagem de programação Ur com a qual trabalhamos.

Portanto, não precisamos nos preocupar com a conversão incorreta de cadeias de caracteres em representações "nativas" ou com a conversão de representações "nativas" em qualquer outro formato que o banco de dados possa nos fornecer tradicionalmente.
Esse é um elemento-chave em como a semântica de Ur / Web facilita para os programadores trabalharem com muitos scripts que podem realmente acontecer enquanto o aplicativo está em execução.
Existe uma idéia de transação padrão no mundo dos bancos de dados relacionais, onde você pode executar uma série de operações sem interrompê-las com outros encadeamentos paralelos. E Ur / Web adapta esse modelo e o incorpora na semântica da linguagem. Portanto, quando uma função é executada no servidor em nome do cliente, todos os seus acessos ao banco de dados ocorrem na forma de um bloco atômico, sem nenhuma interrupção causada por todas as outras solicitações simultâneas ao mesmo servidor. Você não pode evitar esse comportamento, mesmo que deseje, porque essas transações são incorporadas à linguagem de programação.
E eles realmente facilitam a execução de consultas simultâneas e potencialmente ajudam a evitar os problemas de segurança que surgem quando há alguma alternância de determinadas combinações de consultas.
Quero obter uma resposta para uma das perguntas apresentadas no resumo desta palestra e que me intrigou. Portanto, o Ur / Web detecta quando uma transação falha devido a um problema de execução paralela, como um beco sem saída, e reinicia automaticamente a transação. Alguém, respondendo a perguntas, escreveu que isso pode facilitar o lançamento de ataques de segurança, que dependem de uma falha de transação devido a problemas de simultaneidade. Eu só queria perguntar à classe, alguém pode dar um exemplo de um ataque como você imagina? Se você possui um sistema que reinicia automaticamente transações em deadlocks, como isso pode causar problemas de segurança? Não tenho resposta para essa pergunta, e é por isso que pergunto. Essa pergunta pode ter uma resposta tão óbvia que vale a pena discuti-la.
Aluno: talvez isso possa causar algum tipo de falha no serviço de DoS? Se ele vai reiniciar a transação que você está enviando e você sabe que ela não será bem-sucedida, basta continuar reiniciando esse processo e tentar novamente ...
Professor: ok, continue ...
Aluno: se você forçar o sistema a fazer o que você sabe que nunca será bem-sucedido, tente várias vezes e, no final, faça com que o serviço falhe.
Professor: certo, mas para fazer isso, você precisa de pelo menos dois threads trabalhando ao mesmo tempo. Embora isso possa funcionar, você poderá iniciar um ataque de negação de serviço. Nesse caso, você pode tirar vantagem do fato de que os manipuladores de solicitação são reiniciados repetidamente e causar deliberadamente um conflito, e usar isso como uma maneira de aumentar o poder dos ataques DoS, além do que você pode obter com a ajuda de um modelo tradicional de ataque desse tipo. Bem, eu posso acreditar.
Aluno: essa é a única maneira de causar uma falha na transação?
Professor: sim, esta é a única maneira de causar uma falha e reiniciar automaticamente.
Aluno: talvez exista uma terceira pessoa que falharia condicionalmente. Então você pode usar isso para monitorar o comportamento de outros usuários.
Professor: Você também precisará de uma maneira de observar que alguém falhou, mas só poderá fazer isso depois de algum tempo. No entanto, isso também pode ser um 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, , .
, , , , , , .
, Ur/Web.
27:45
Curso MIT "Segurança de sistemas de computadores". 11: « Ur/Web», 2A versão completa do curso está disponível
aqui .
Obrigado por ficar conosco. Você gosta dos nossos artigos? Deseja ver materiais mais interessantes? Ajude-nos fazendo um pedido ou recomendando a seus amigos, um
desconto de 30% para os usuários da Habr em um análogo exclusivo de servidores básicos que inventamos para você: Toda a verdade sobre o VPS (KVM) E5-2650 v4 (6 núcleos) 10GB DDR4 240GB SSD 1Gbps da US $ 20 ou como dividir o servidor? (as opções estão disponíveis com RAID1 e RAID10, até 24 núcleos e até 40GB DDR4).
VPS (KVM) E5-2650 v4 (6 núcleos) 10GB DDR4 240GB SSD de 1Gbps até dezembro de graça quando pagar por um período de seis meses, você pode fazer o pedido
aqui .
Dell R730xd 2 vezes mais barato? Somente nós temos
2 TVs Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 a partir de US $ 249 na Holanda e nos EUA! Leia sobre
Como criar um prédio de infraestrutura. classe usando servidores Dell R730xd E5-2650 v4 custando 9.000 euros por um centavo?