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 3Aula 12: Segurança de rede
Parte 1 /
Parte 2 /
Parte 3Aula 13: âProtocolos de Redeâ
Parte 1 /
Parte 2 /
Parte 3Palestra 14: âSSL e HTTPSâ
Parte 1 /
Parte 2 /
Parte 3Palestra 15: âSoftware MĂ©dicoâ
Parte 1 /
Parte 2 /
Parte 3Palestra 16: âAtaques de Canal Lateralâ
Parte 1 /
Parte 2 /
Parte 3Palestra 17: âAutenticação de UsuĂĄrioâ
Parte 1 /
Parte 2 /
Parte 3Palestra 18: âNavegação Privada na Internetâ
Parte 1 /
Parte 2 /
Parte 3Palestra 19: âRedes AnĂŽnimasâ
Parte 1 /
Parte 2 /
Parte 3Palestra 20: âSegurança do telefone mĂłvelâ
Parte 1 /
Parte 2 /
Parte 3 Hoje falaremos sobre segurança do Android. VocĂȘ pode pensar nisso como um exemplo interessante de um sistema que foi projetado principalmente com a segurança em mente. Ă possĂvel que, ao contrĂĄrio de muitos dos sistemas que examinamos atĂ© agora, como Unix ou navegadores da Web, onde a segurança tenha sido "danificada" na maioria dos casos apĂłs a criação do sistema e seu design nĂŁo tenha focado nessas questĂ”es, os desenvolvedores do Android inicialmente eram muito preocupado com classes de ataque especĂficas e construçÔes de aplicativos.

Eles criaram uma maneira melhor de estruturar aplicativos Android que nos permitirĂĄ aplicar melhor as polĂticas de segurança. O mais interessante Ă© que este Ă© um sistema bastante utilizado, ao contrĂĄrio de alguns trabalhos de pesquisa que oferecem apenas uma nova arquitetura, esse sistema Ă© realmente usado na prĂĄtica e hĂĄ cada vez mais dispositivos usando o sistema operacional Android.
Hoje falaremos sobre como algumas coisas deram certo ou falharam. Consideraremos quais partes do projeto elas consideraram importantes e o que perderam e qual Ă© o resultado na prĂĄtica. Isso Ă© bem interessante. Em certo sentido, os desenvolvedores usaram os sistemas existentes sobre os quais falamos, para que o Android seja construĂdo no UNIX, na verdade, Ă© apenas o kernel do Linux que roda no telefone como um todo.
Portanto, de vĂĄrias maneiras, eles usam alguns dos mecanismos familiares que vocĂȘ lembra do Lab 2, onde vocĂȘ usava IDs de usuĂĄrio e grupos Unix e outras coisas para separar aplicativos um do outro. Mas no caso do Android, eles tĂȘm uma maneira completamente diferente de definir IDs de usuĂĄrio e permissĂ”es de arquivo do que em um sistema Linux tĂpico.
Vamos começar discutindo qual Ă© o nĂvel de ameaça aqui? O que incomoda esses caras no telefone? O que estĂĄ acontecendo aqui? Do que eles estĂŁo tentando se proteger? O que Ă© um modelo de ameaça em um dispositivo mĂłvel?
Aluno: aplicaçÔes que podem ser prejudiciais?
Professor: sim, eles estĂŁo preocupados que os aplicativos que podem ser instalados no telefone possam ser maliciosos. Eu acho que existem aplicativos francamente maliciosos projetados para ganhar controle sobre vocĂȘ ou roubar seus dados pessoais. Portanto, vocĂȘ deve se preocupar com seus dados e com coisas que custam dinheiro - mensagens SMS, telefonemas, conexĂŁo Ă Internet e assim por diante.
Assim, Ă direita estĂŁo as coisas que vocĂȘ deseja proteger no telefone e, Ă esquerda, as coisas que podem fazĂȘ-las funcionar de maneira diferente. Como existem aplicativos maliciosos, os caras do Android nĂŁo querem que os usuĂĄrios possam instalar aplicativos criados por desenvolvedores dos quais o Google nunca ouviu falar. AlĂ©m disso, esses aplicativos podem ser prejudiciais, nĂŁo porque o desenvolvedor o desejasse, mas porque simplesmente se esqueceu de fazer algo. E seria bom ajudar esses caras a criar aplicativos seguros, pois muitas vezes o desenvolvedor de aplicativos nĂŁo Ă© especialista no campo de vulnerabilidades que podem ser usadas por um invasor em seu aplicativo.

Como o Android Ă© generalizado, podemos visualizar relatĂłrios de vulnerabilidade. HĂĄ um banco de dados do CVE que cataloga muitas vulnerabilidades nos sistemas operacionais, e isso Ă© realmente interessante. Obviamente, existem mensagens de erro do Android, muitas das quais vocĂȘ se deparou em palestras. O excesso de buffer ainda Ă© possĂvel em algumas partes do Android, existe uma mĂĄ escolha do sistema de criptografia padrĂŁo, as pessoas esquecem de inicializar o gerador de nĂșmeros aleatĂłrios e criar chaves previsĂveis. Tudo isso ainda estĂĄ acontecendo, porque o software nĂŁo estĂĄ seguro de nenhum dos problemas conhecidos.
O interessante Ă© que parece que esses problemas sĂŁo isolados e surgem de tempos em tempos. Em geral, eles podem ser eliminados e o sistema permanece bastante seguro apĂłs a correção desses erros. Portanto, de vĂĄrias maneiras, o design do Android funciona muito bem. Portanto, mais tarde examinaremos mais detalhadamente quais partes do design funcionam melhor e quais sĂŁo piores. Mas, em geral, essa Ă© uma solução de software bastante bem pensada, ou pelo menos mais pensada do que os aplicativos Unix de desktop que vocĂȘ jĂĄ viu atĂ© agora.
Portanto, uma das maneiras de descobrir como proteger dados e vĂĄrios serviços que podem custar dinheiro a partir de aplicativos maliciosos Ă© primeiro entender como Ă© o aplicativo para o sistema Android. Depois, falaremos sobre como vĂĄrias permissĂ”es ou privilĂ©gios sĂŁo configurados e aplicados neste aplicativo. Os aplicativos Android sĂŁo muito diferentes do que vocĂȘ viu atĂ© agora em aplicativos de desktop ou aplicativos da Internet.
Em vez de compor a parte indivisĂvel do cĂłdigo com a função principal que vocĂȘ começa a executar, os aplicativos Android sĂŁo mais modulares. No caso de usar o Android, vocĂȘ pode apresentar um aplicativo como um conjunto de componentes. O artigo da palestra descreve 4 tipos de componentes que a estrutura do Android fornece ao desenvolvedor. O primeiro componente Ă© Atividade, ou atividade. Isso Ă© algo que representa a interface do usuĂĄrio e permite que o usuĂĄrio interaja com o aplicativo, exibe informaçÔes para ele e recebe pressionamentos de teclas dele, e assim por diante.
Do ponto de vista da segurança, a atividade tem uma propriedade interessante - a entrada do usuĂĄrio Ă© reduzida a uma ação por vez. A estrutura do Android realmente garante que apenas um tipo de atividade Ă© possĂvel por vez, ou seja, se vocĂȘ executar um aplicativo bancĂĄrio, nenhum aplicativo funcionarĂĄ em segundo plano para interceptar o cĂłdigo PIN do aplicativo bancĂĄrio por meio de cliques de toque. Portanto, a estrutura fornece o uso de alguns recursos de segurança em relação Ă entrada do usuĂĄrio. Assim, a atividade Ă© um componente da interface do usuĂĄrio.
TrĂȘs outros tipos de componentes ajudam a lĂłgica do aplicativo a interagir com outros componentes. Portanto, o segundo componente Ă© chamado Serviço, ou serviço. Essas coisas funcionam em segundo plano. Por exemplo, vocĂȘ pode ter um serviço que rastreia sua localização, como no aplicativo que esses caras descrevem no artigo. VocĂȘ pode ter serviços que recuperam informaçÔes da rede em segundo plano e assim por diante.
O terceiro componente Ă© o componente do provedor de conteĂșdo, provedor de conteĂșdo. Ele pode ser representado como um banco de dados SQL no qual vocĂȘ pode definir vĂĄrias tabelas com um esquema e assim por diante. VocĂȘ pode acessar consultas SQL com todos os dados armazenados neste aplicativo. Este componente permite controlar o acesso ao banco de dados, dizendo quem tem permissĂŁo para acessĂĄ-lo.
No "Android", hĂĄ algo incomum que nĂŁo existe em outros sistemas. Este Ă© o quarto componente - receptor de transmissĂŁo ou receptor de transmissĂŁo. Ă usado para receber mensagens de outras partes do sistema. Portanto, falaremos sobre como os aplicativos interagem entre si em termos de mensagens.

Portanto, essa Ă© uma ideia muito lĂłgica do que sĂŁo os aplicativos Android. Mas, na realidade, tudo isso sĂŁo apenas classes Java ou cĂłdigo Java escrito por um desenvolvedor.
HĂĄ apenas uma certa interface padrĂŁo que vocĂȘ implementa para atividade, serviços, para o receptor de transmissĂŁo e para o provedor de conteĂșdo, e Ă© claro que isso Ă© apenas cĂłdigo Java. E todos os componentes colocados no retĂąngulo sĂŁo apenas um tempo de execução Java que Ă© executado no seu telefone, Ă© apenas um Ășnico processo do kernel Linux que Ă© executado no seu telefone. E todos esses componentes sĂŁo diferentes classes ou partes de cĂłdigo que sĂŁo executadas no processo de tempo de execução Java. Veja como isso pode ser reduzido aos processos tradicionais e mais compreensĂveis para vocĂȘ.
Outra coisa que interage com o aplicativo é chamada manifesto. O código para todos os componentes é gravado ou compilado pelo desenvolvedor do aplicativo, mas além disso, também hå um manifesto no sistema que estå fora dos componentes do aplicativo. à um texto ou um arquivo XML que descreve todos esses componentes e como outras partes do sistema devem interagir com os componentes deste aplicativo.

Em particular, este manifesto fala dos chamados rĂłtulos Lables, sobre os quais falaremos em um segundo, que determinam os privilĂ©gios desse aplicativo em termos do que Ă© permitido fazer e tambĂ©m determinam as restriçÔes sobre quem mais pode interagir com vĂĄrios componentes deste. aplicaçÔes. VocĂȘ quer perguntar como isso funciona?
Aluno: o rótulo é algo que define "este aplicativo não pode fazer uma ligação telefÎnica" ou "este aplicativo pode enviar uma mensagem"?
Professor: sim, essas marcas estabelecem se esse aplicativo pode fazer uma chamada, enviar SMS ou usar a Internet. Existem dois tipos de etiquetas, vou desenhĂĄ-las aqui. Cada aplicativo possui uma lista de rĂłtulos que descrevem os privilĂ©gios que o aplicativo possui. Ă como permissĂ”es para discar um nĂșmero de telefone, ativar a conexĂŁo com a Internet e assim por diante. Mais tarde vou lhe dizer como eles funcionam.
Portanto, esses sĂŁo os privilĂ©gios que o aplicativo possui. AlĂ©m disso, vocĂȘ tambĂ©m pode anexar etiquetas a componentes individuais, e elas assumem um significado diferente - esses sĂŁo privilĂ©gios para um aplicativo especĂfico. Se vocĂȘ tiver um componente com um rĂłtulo, para interagir com ele, qualquer outro componente tambĂ©m deverĂĄ ter um rĂłtulo correspondente.
Por exemplo, vocĂȘ pode ter uma tag com o privilĂ©gio Visualizar amigos que pode ser usado para exibir a localização de seus amigos. Este Ă© um privilĂ©gio que um aplicativo pode ter. Mas, para garantir esse privilĂ©gio, vocĂȘ deve anexar esse rĂłtulo a um componente especĂfico, nesse caso, ao componente Provedor de ConteĂșdo, ao banco de dados, onde hĂĄ informaçÔes sobre a localização de seus amigos. E agora quem quiser acessar esse banco de dados precisa ter o mesmo rĂłtulo em seus privilĂ©gios.

Ă assim que vocĂȘ define as permissĂ”es. VocĂȘ pode pensar nisso como IDs de usuĂĄrio ou de grupo no Unix, com exceção de seqĂŒĂȘncias arbitrĂĄrias que os tornam um pouco mais flexĂveis. Ou seja, vocĂȘ nunca ficarĂĄ sem esses IDs e nĂŁo se preocuparĂĄ com a falta de alguĂ©m.
Acontece que os desenvolvedores do Android nĂŁo foram particularmente cuidadosos ao determinar o escopo desses rĂłtulos. VocĂȘ pode ter dois aplicativos que optam por rotular o mesmo. Assim, esses rĂłtulos sĂŁo parcialmente definidos pelo aplicativo. Suponha que vocĂȘ tenha dois aplicativos em seu telefone - Facebook e Google+, e ambos declaram que gostariam de uma nova linha de permissĂŁo para a função âVer amigosâ na rede social. VocĂȘ diz: "nĂŁo hĂĄ problema, esta Ă© a mesma linha".
Ă claro que, na realidade, essa linha da lista de marcadores Ă© muito mais longa do que eu desenhei. HĂĄ um domĂnio no estilo de aplicativo Java que define o nome em minĂșscula do rĂłtulo. Por exemplo, a permissĂŁo de chamada DIALPERM que pintei se parece com com.google.android.dialperm. Mas, grosso modo, essas sĂŁo as linhas que aparecem nas permissĂ”es. Portanto, se vocĂȘ tiver aplicativos bem-intencionados, eles nĂŁo entrarĂŁo em conflito com essas linhas de permissĂŁo.
Mas acontece que, infelizmente, no sistema operacional Android, nada força o aplicativo a esse comportamento, e isso cria problemas em potencial. Eu não sei por que eles não foram corrigidos. Vamos ver o que acontece se tivermos dois aplicativos em conflito com os nomes dos rótulos.
Portanto, eis a aparĂȘncia do aplicativo: Ă© um conjunto de programas Java que formam componentes, um manifesto que descreve permissĂ”es para aplicativos e restriçÔes necessĂĄrias para todos os componentes. A interação entre os aplicativos Ă© realizada usando o que foi inventado pelos desenvolvedores do Android e Ă© chamado de Intenção - Intenção. A intenção Ă© uma mensagem estruturada e, em um segundo, veremos como Ă© usada. Por enquanto, direi que a intenção tem trĂȘs coisas principais. Obviamente, a intenção contĂ©m outros campos, mas o mais importante Ă© o nome do componente Component ao qual vocĂȘ deseja enviar uma mensagem. Isso Ă© seguido pela ação Ação que o componente precisa executar e os dados dos Dados, juntamente com o tipo MIME que vocĂȘ deseja enviar para o outro componente.

Como um exemplo abstrato, vocĂȘ pode imaginar que esse componente Ă© com.android.dialer / Dial - Ă© assim que o nome do componente Ă© indicado no Android; esse Ă© um tipo de nome de domĂnio Java. Portanto, com.android.dialer Ă© o nome do aplicativo como um todo, para o qual vocĂȘ deseja enviar a intenção e, atravĂ©s de uma barra, vocĂȘ escreve o nome do componente do aplicativo de destino para o qual vocĂȘ envia esta mensagem - / Dial. Dessa forma, vocĂȘ nomeia o componente especĂfico ao qual a mensagem Ă© endereçada. Ação representa um conjunto especĂfico de açÔes que podem se parecer com android.intend.Dial.
Essa Ă© uma sequĂȘncia predefinida que os aplicativos colocam no campo de ação Ação se desejam que o discador telefĂŽnico ligue para um nĂșmero especĂfico. Por exemplo, se vocĂȘ deseja visualizar algum tipo de documento no telefone, no campo Ação, insere uma linha de ação como android.intend.ViewDoc. Isso informa ao componente receptor que vocĂȘ deseja apenas examinar o contato chamado antes de discar seu nĂșmero de telefone.
Finalmente, os dados dos dados sĂŁo basicamente uma URL arbitrĂĄria ou a URL dos dados que vocĂȘ deseja enviar com esta mensagem. Pode ser algo como um nĂșmero de telefone ou um URL HTTP que vocĂȘ deseja exibir ou abrir ou qualquer outro aplicativo indicado por um URL no sistema.

Ă assim que vocĂȘ envia mensagens enviadas pelo sistema usando o prĂłprio tempo de execução do Android, localizado em todos esses aplicativos. Assim, o tempo de execução do Android pode ser percebido como um cruzamento entre aplicativos e o kernel. Isso nĂŁo estĂĄ totalmente correto, mas tentaremos desenhar algum tipo de imagem para esclarecer como Ă© a arquitetura dessa coisa.
Digamos que temos um aplicativo que roda no Android e outro. Esses retĂąngulos sĂŁo App1 e App 2, e cada um representa o que Ă© mostrado na figura superior - componentes, manifesto, rĂłtulos.

Todos esses sĂŁo processos em execução no kernel do Linux, o que fornece algum grau de isolamento entre os aplicativos. HĂĄ tambĂ©m o que o artigo da palestra chama de Monitor de ReferĂȘncia. Ele mediarĂĄ todas as interaçÔes intencionais entre diferentes aplicativos. Portanto, se o ApĂȘndice 1 quiser enviar uma mensagem para o ApĂȘndice 2, ele primeiro enviarĂĄ uma mensagem para o monitor de link.
Portanto, a maneira como vocĂȘ envia todas as intençÔes do Intend para o Android Ă© criar uma dessas mensagens de intenção e encaminhĂĄ-la atravĂ©s de algum canal para este Monitor de referĂȘncia.

O sistema Android possui sua própria implementação de canais para o envio de tais intençÔes, chamada Binder, ou Bundle. Cada aplicativo Android, por contrato, abrirå o Binder - conectando-se a um monitor de link para que ele possa receber intençÔes desse aplicativo, além de enviar mensagens para esse aplicativo.
No nosso caso, se o ApĂȘndice 1 gravar o Intent para o ApĂȘndice 2 no monitor de link, primeiro o monitor de link descobrirĂĄ para onde essa intenção deve ir e depois a transmitirĂĄ ao ApĂȘndice 2. Em seguida, o ApĂȘndice 2 pode desencadear alguma ação, receber uma mensagem ou executar uma solicitação SQL para aplicação 1.
: â Reference Monitor?
: , â , . , , , RM, ? ? , 1. ?
: , - , , .
: , . , , , . , , . . , 2?
: , PKI. .
: , , . , , , , RM , App 1. PKI . . , , , . , , . , ?
: , , .
: . , «» , . , , , . , Labels. ?
: , , . , , , , « ».
: , , . , RM , . , - . .
, 2 , . â , . , , , . .
, . , . â , , . , , , . , , - .
Android , , , , . , , , «» . , Google Voice, VoIP, Skype , . : « , - ». , , â , PDF JPEG .

. , PDF , , . RM .
: « , , , , ». , , .
: ?
: . , , . , , . , , .
Android RPC. , , Bind intent, , : « ». , , .

, - , , Bind intent.
: , ?
: , 2. , , 2. , - .
, 2 bind, - , . , , .

, , , , Service, . , , .
: , , . , .
: , , , . . , bind. RPC , .
, . , , RM . , RPC , , , , , RPC .
, , RPC, RPC, RPC .
27:40
Curso MIT "Segurança de sistemas de computadores". 20: « », 2.
, . ? ? ,
30% entry-level , : VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps $20 ? ( RAID1 RAID10, 24 40GB DDR4).
VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps ,
.
Dell R730xd 2 ? 2 Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 $249 ! . c Dell R730xd 5-2650 v4 9000 ?