Curso MIT "Segurança de sistemas de computadores". Palestra 6: Oportunidades, Parte 2

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 3
Palestra 2: “Controle de ataques de hackers” Parte 1 / Parte 2 / Parte 3
Aula 3: “Estouros de Buffer: ExploraçÔes e Proteção” Parte 1 / Parte 2 / Parte 3
Palestra 4: “Separação de PrivilĂ©gios” Parte 1 / Parte 2 / Parte 3
Palestra 5: “De onde vĂȘm os sistemas de segurança?” Parte 1 / Parte 2
Palestra 6: “Oportunidades” Parte 1 / Parte 2 / Parte 3

PĂșblico: podemos concluir que cada oportunidade tem um processo?

Professor: Eu duvido. VocĂȘ pode ter quantos processos quiser, pois uma possibilidade pode existir vĂĄrios processos. Simplificando, vocĂȘ nĂŁo precisa necessariamente de um processo separado para cada oportunidade. Porque existe um processo fort1 que pode abrir muitos arquivos e passar muitos recursos ao componente privilegiado do fort .



A razĂŁo pela qual vocĂȘ acha que precisa de um processo separado para cada oportunidade com a qual lidamos diz respeito a essa estranha interação entre recursos e privilĂ©gios externos.

Porque fort1 tem um privilĂ©gio externo. E o que estamos fazendo Ă© basicamente transformar esse privilĂ©gio externo em capacidade neste forte processo. Portanto, se vocĂȘ tiver vĂĄrios tipos diferentes de privilĂ©gios externos ou vĂĄrios privilĂ©gios diferentes que deseja usar com cautela, provavelmente desejarĂĄ um processo separado que tenha esse privilĂ©gio. E sempre que desejar usar um conjunto especĂ­fico de privilĂ©gios, vocĂȘ solicitarĂĄ o processo apropriado para realizar a separação e, se isso for bem-sucedido, solicitarĂĄ que o processo devolva o recurso a vocĂȘ.

De fato, havia um design do sistema operacional completamente baseado em recursos e sem privilĂ©gios externos. E isso Ă© legal, mas nĂŁo muito prĂĄtico para uso em um sistema real. Acontece que, na realidade, vocĂȘ nĂŁo deseja privilĂ©gios externos, mas oportunidades para nomear um objeto e contar a alguĂ©m sobre esse objeto sem transferir os direitos para esse objeto sem falha.

Talvez eu nĂŁo saiba quais privilĂ©gios vocĂȘ pode ter em relação a algum documento geral, mas quero informar que temos esse documento geral. Se vocĂȘ pode ler, leia. Se vocĂȘ escrever, tudo bem, escreva. Mas nĂŁo quero transferir nenhum direito a ele. Eu sĂł quero lhe dizer: "Ei, essa coisa, tente!" Portanto, isso Ă© um inconveniente no mundo das oportunidades, porque realmente obriga a nunca falar sobre objetos sem transferir direitos para esse objeto.

Portanto, é importante saber sobre isso e usar esse recurso em algumas partes do sistema, mas não confiar nisso para ser a solução para a segurança do sistema.



PĂșblico: suponha que o processo possua os recursos atribuĂ­dos a ele por algum outro processo, mas acontece que ele jĂĄ possui Ăłtimos recursos em relação a algum objeto. Um processo pode comparĂĄ-los para garantir que eles estejam tocando o mesmo objeto? Ou ele usarĂĄ as grandes oportunidades?

Professor: o fato Ă© que o processo nĂŁo utiliza recursos de maneira implĂ­cita, portanto, essa Ă© uma propriedade muito Ăștil dos recursos. VocĂȘ deve definitivamente indicar qual das opçÔes que estĂĄ usando. EntĂŁo pense nisso em termos de um descritor de arquivo. Suponha que eu lhe forneça um descritor de arquivo aberto para algum arquivo, e ele Ă© somente leitura. Depois, outra pessoa oferece outra oportunidade para outros arquivos, que podem incluir esse arquivo. E um novo recurso permite que vocĂȘ leia e grave em arquivos.

Nesse caso, se vocĂȘ tentar gravar no primeiro arquivo, sem dĂșvida terĂĄ ĂȘxito, porque um descritor de arquivo adicional serĂĄ aberto para ele, o que permite nĂŁo apenas a leitura, mas tambĂ©m a gravação. Portanto, isso Ă© uma coisa interessante quando vocĂȘ nĂŁo precisa de privilĂ©gios externos extras. VocĂȘ simplesmente tem todas essas possibilidades, porque as pessoas realmente criaram essas bibliotecas e, em princĂ­pio, elas gerenciam seus recursos para vocĂȘ. Eles meio que os colecionam. E quando tentam executar uma operação, procuram oportunidades e encontram aquelas que a fazem funcionar.

Isso retorna ao controle externo da autoridade ambiental que vocĂȘ estava tentando evitar. Uma caracterĂ­stica positiva das possibilidades Ă© que Ă© um design de software que simplifica sua vida. Isso Ă© incomum em soluçÔes de segurança. Essa propriedade facilita a gravação de um cĂłdigo que aponta para os privilĂ©gios que vocĂȘ deseja usar do ponto de vista da segurança. E isso Ă© muito fĂĄcil de escrever cĂłdigo.
No entanto, o recurso pode resolver outros problemas. Portanto, problemas de gerenciamento de privilĂ©gios geralmente surgem quando vocĂȘ precisa executar algum cĂłdigo nĂŁo confiĂĄvel. Porque vocĂȘ realmente deseja controlar quais privilĂ©gios vocĂȘ concede, caso contrĂĄrio, existe o risco de uso indevido de todos os privilĂ©gios que vocĂȘ concede. E esse Ă© um ponto de vista ligeiramente diferente do qual os autores do artigo sobre Capsicum abordam oportunidades. É claro que eles estĂŁo cientes do problema da autoridade externa, mas esse Ă© um problema ligeiramente diferente que vocĂȘ pode ou nĂŁo pode resolver. Mas, basicamente, eles se preocupam com o fato de terem um aplicativo privilegiado muito grande e se preocupam com a ocorrĂȘncia de erros em diferentes partes do cĂłdigo-fonte desse aplicativo. Portanto, eles gostariam de reduzir os privilĂ©gios dos vĂĄrios componentes deste aplicativo.

Nesse sentido, a histĂłria Ă© muito semelhante Ă  OKWS . Portanto, vocĂȘ tem um aplicativo grande, divide-o em componentes e restringe os privilĂ©gios para cada componente. Isso certamente faz sentido no OKWS . Existem outras situaçÔes em que vocĂȘ pode se preocupar em compartilhar privilĂ©gios? Eu acho que no artigo deles eles descrevem exemplos que eu deveria tentar executar, por exemplo, tcpdump e outros aplicativos que analisam dados de rede. Por que eles estĂŁo tĂŁo preocupados com aplicativos que analisam entradas de rede? O que acontece no tcpdump ? Qual Ă© o motivo de sua paranĂłia?

PĂșblico: um invasor pode controlar o que Ă© enviado e o que Ă© chamado para executar, por exemplo, pacotes.

Professor: sim, eles realmente se preocupam com ataques desse tipo e se o invasor pode realmente controlar os dados de entrada? Porque Ă© bastante problemĂĄtico se vocĂȘ escrever cĂłdigo C que deve lidar com estruturas de dados. Obviamente, vocĂȘ farĂĄ muita manipulação de ponteiros copiando bytes para matrizes que alocam memĂłria. Ao mesmo tempo, Ă© fĂĄcil cometer um erro no gerenciamento de memĂłria, o que levarĂĄ a consequĂȘncias bastante desastrosas.

Portanto, essa Ă© a razĂŁo pela qual eles decidiram fazer o trabalho de seu protocolo de rede e outras coisas na sandbox.



Outro exemplo do mundo real onde o compartilhamento de privilĂ©gios Ă© necessĂĄrio Ă© o seu navegador. VocĂȘ provavelmente desejarĂĄ isolar seu plug-in Flash, sua extensĂŁo Java ou qualquer outra coisa. Porque eles representam um amplo campo para ataques que sĂŁo usados ​​de forma bastante agressiva.

Portanto, este parece ser um plano inteligente. Por exemplo, se vocĂȘ escreve algum software, deseja verificar o comportamento de seus componentes na caixa de areia. Geralmente, isso se refere ao que vocĂȘ baixou da Internet e pretende executar com menos privilĂ©gios. O estilo de isolamento oferecido pela Capsicum combina com isso ? Eu poderia baixar algum protetor de tela aleatĂłrio ou algum jogo da Internet. E eu quero executĂĄ-los no meu computador, mas primeiro verifique se eles nĂŁo estragam tudo o que tenho. VocĂȘ usaria Capsicum para isso?

PĂșblico: vocĂȘ pode escrever um programa sandbox no qual usarĂĄ o Capsicum .

Professor: certo. Como vocĂȘ o usaria? Bem, vocĂȘ entra no modo sandbox com o comando cap_enter e executa o programa. VocĂȘ espera que isso funcione? Eu acho que haverĂĄ um problema. Ele estarĂĄ conectado ao fato de que, se o programa nĂŁo esperar que seja isolado pelo Capsicum , ele poderĂĄ tentar abrir a biblioteca compartilhada, mas nĂŁo poderĂĄ fazer isso, porque nĂŁo poderĂĄ abrir algo como / lib / ... , porque nĂŁo permitido no modo de capacidade .

Portanto, esses mĂ©todos de sandbox devem ser usados ​​para as coisas pelas quais o desenvolvedor previu que eles podem ser executados nesse modo. Provavelmente, existem outros mĂ©todos de sandbox que podem ser usados ​​para cĂłdigo nĂŁo modificado, mas os requisitos podem mudar um pouco. Portanto, os criadores de Capsicum nĂŁo estĂŁo muito preocupados com a compatibilidade com versĂ”es anteriores. Se tivermos que abrir arquivos de maneira diferente, nĂłs os abriremos de maneira diferente. Mas se vocĂȘ quiser deixar o cĂłdigo existente, precisarĂĄ de algo mais, por exemplo, uma mĂĄquina virtual completa para poder executar o cĂłdigo nela. Isso levanta a questĂŁo - devemos usar mĂĄquinas virtuais para a caixa de proteção Capsicum ?

PĂșblico: neste caso, a saturação de memĂłria Ă© possĂ­vel.

Professor: sim, Ă©. Mas e se nĂŁo nos importarmos com a memĂłria? Portanto, as mĂĄquinas virtuais provavelmente sĂŁo muito boas e nĂŁo usam muita memĂłria. EntĂŁo, por que outro motivo nĂŁo devemos usar VM no Capsicum ?

PĂșblico: É difĂ­cil controlar a atividade da rede.

Professor: Isso mesmo! É difĂ­cil controlar o que estĂĄ acontecendo na rede porque vocĂȘ nĂŁo estĂĄ dando acesso Ă  mĂĄquina virtual Ă  rede ou estĂĄ se conectando Ă  rede atravĂ©s do modo NAT ou usando o Preview ou o VMWare . Mas entĂŁo sua caixa de areia pode acessar toda a Internet. Portanto, vocĂȘ precisarĂĄ gerenciar a rede com mais detalhes, talvez definindo regras de firewall para a mĂĄquina virtual e assim por diante. Isso nĂŁo Ă© muito bom.

Mas e se vocĂȘ nĂŁo se importa com a rede? Suponha que vocĂȘ tenha algum tipo de vĂ­deo, e se vocĂȘ processar um vĂ­deo simples ou analisar o tcpdump . Nesse caso, vocĂȘ simplesmente inicia a mĂĄquina virtual, ela começa a analisar seus pacotes tcpdump e faz com que vocĂȘ retorne apĂłs a apresentação que o tcpdump deseja gravar para o usuĂĄrio, porque nĂŁo hĂĄ E / S de rede real. EntĂŁo, existe algum outro motivo?



PĂșblico: porque a sobrecarga da inicialização ainda Ă© alta.

Professor: sim, isso pode ser a sobrecarga inicial de iniciar uma mĂĄquina virtual, o que reduz o desempenho. EntĂŁo Ă© verdade.

PĂșblico: Bem, vocĂȘ ainda pode querer ter direitos sobre um banco de dados e similares.

Professor: sim. Mas, de maneira geral, isso significa que vocĂȘ tem dados reais com os quais estĂĄ trabalhando e Ă© realmente difĂ­cil separĂĄ-los. Assim, as mĂĄquinas virtuais sĂŁo realmente um mecanismo de compartilhamento muito maior, pelo qual vocĂȘ nĂŁo pode compartilhar coisas facilmente. Portanto, isso Ă© bom para situaçÔes em que vocĂȘ tem um programa completamente isolado que deseja executar e, ao mesmo tempo, nĂŁo deseja compartilhar arquivos, diretĂłrios, processos e apenas deixĂĄ-los trabalhar separadamente.

EntĂŁo isso Ă© Ăłtimo. Provavelmente, isso Ă©, de alguma forma, um isolamento mais forte do que o fornecido pelo Capsicum , porque hĂĄ menos opçÔes para que as coisas dĂȘem errado. No entanto, esse isolamento nĂŁo Ă© aplicĂĄvel em muitas situaçÔes quando vocĂȘ deseja usar o Capsicum . Como no Capsicum, vocĂȘ pode trocar arquivos com grande precisĂŁo, usando os recursos da sandbox.

EntĂŁo, vamos pegar o tcpdump e ver por que Ă© difĂ­cil isolĂĄ-lo usando o mecanismo Unix . Se vocĂȘ se lembra, no Capsicum, o funcionamento do tcpdump Ă© que ele abre alguns soquetes especiais e executa a lĂłgica de anĂĄlise nos pacotes de rede, apĂłs o que Ă© impresso nos terminais do usuĂĄrio. EntĂŁo, o que Ă© necessĂĄrio para uma sandbox tcpdump baseada em Unix ? Seus privilĂ©gios sĂŁo limitados? O problema com o Unix Ă© que a Ășnica maneira de realmente alterar privilĂ©gios Ă© alterar a entrada na função de decisĂŁo, que decide se vocĂȘ pode realmente acessar algum objeto ou nĂŁo. E a Ășnica coisa que vocĂȘ pode realmente mudar Ă© os privilĂ©gios do processo. Isso significa que o processo poderĂĄ enviar o UID para outra pessoa.

Ou vocĂȘ pode alterar as permissĂ”es para vĂĄrios objetos que estĂŁo no seu sistema. De fato, vocĂȘ pode usar essas duas soluçÔes.

Se vocĂȘ deseja isolar o tcpdump na sandbox, provavelmente precisarĂĄ selecionar um ID de usuĂĄrio adicional e alternar para ele enquanto trabalha. Mas esse nĂŁo Ă© um plano ideal, pois vocĂȘ nĂŁo executarĂĄ vĂĄrias instĂąncias do tcpdump com o mesmo ID do usuĂĄrio. Portanto, se eu comprometer uma instĂąncia do tcpdump , isso nĂŁo significa que desejo que um invasor use esse fator para controlar outras instĂąncias do tcpdump em execução na minha mĂĄquina. Portanto, essa Ă© potencialmente uma mĂĄ decisĂŁo de usar o uid neste caso.

Outro problema Ă© que, no Unix, vocĂȘ deve ter privilĂ©gios de root para alterar o ID do usuĂĄrio, privilĂ©gios, processo ou outra coisa, ou alternĂĄ-los para outra coisa. Isso tambĂ©m Ă© ruim.

E outro problema Ă© que, independentemente do seu ID , podem existir arquivos de acesso aberto. Portanto, seu sistema pode ter um grupo inteiro de arquivos legĂ­veis ou gravĂĄveis, por exemplo, um arquivo de senha. De fato, nĂŁo importa qual ID vocĂȘ tenha, o processo ainda poderĂĄ ler essa senha. Portanto, isso tambĂ©m nĂŁo Ă© muito bom.

Assim, para organizar uma caixa de proteção no Unix , vocĂȘ provavelmente deve fazer as duas coisas: alterar o UID e revisar cuidadosamente as permissĂ”es de todos os objetos para garantir que vocĂȘ nĂŁo tenha arquivos abertos nĂŁo isolados sensĂ­veis a serem substituĂ­dos ou legĂ­veis por um hacker. Eu acho que, ao fazer isso, vocĂȘ obtĂ©m outro mecanismo que pode usar. Se vocĂȘ enviĂĄ-lo atĂ© o final, poderĂĄ ter dificuldade em compartilhar arquivos ou diretĂłrios.

Agora vamos ver como o Capsicum estĂĄ tentando resolver esse problema. Aqui, assim que entrarmos no modo "sandbox", tudo estarĂĄ disponĂ­vel apenas atravĂ©s de oportunidades. Portanto, se vocĂȘ nĂŁo tiver Capacidade , vocĂȘ simplesmente nĂŁo poderĂĄ acessar nenhum objeto.

Esses caras no artigo fazem uma enorme aposta no espaço para nome global. Então, o que é esse espaço de nome global e por que eles estão tão preocupados com isso?

O prĂłprio sistema de arquivos Ă© um tipo de exemplo brilhante de um espaço para nome global. VocĂȘ pode escrever uma barra e listar qualquer arquivo que desejar por trĂĄs dela. Por exemplo, vĂĄ para alguĂ©m no diretĂłrio inicial, por exemplo, / home / nickolai / ... Por que isso Ă© ruim? Por que eles sĂŁo contra o espaço para nome global no Capsicum ? O que vocĂȘ acha?



PĂșblico: se vocĂȘ tiver as permissĂ”es erradas, ao usar a autoridade, poderĂĄ ter problemas.

Professor: sim. O problema Ă© que ainda Ă© o Unix . Portanto, ainda existem permissĂ”es de arquivo regulares. Portanto, talvez, se vocĂȘ realmente deseja isolar algum processo na caixa de areia, nĂŁo poderĂĄ ler ou escrever nada no sistema. Mas se vocĂȘ conseguir encontrar um arquivo gravĂĄvel no diretĂłrio inicial de algum usuĂĄrio estĂșpido, isso serĂĄ bastante desagradĂĄvel para o cliente sandbox.

De maneira mais geral, a ideia deles era listar com precisĂŁo todos os objetos que o processo possui. Porque vocĂȘ pode simplesmente listar todos os recursos em uma tabela de descritores de arquivos ou em qualquer outro lugar onde os recursos estĂŁo armazenados para vocĂȘ. E esta Ă© a Ășnica coisa que o processo pode tocar.

Mas se vocĂȘ tiver acesso ao espaço para nome global, isso Ă© potencialmente impossĂ­vel. Porque, mesmo que vocĂȘ tenha um conjunto limitado de recursos, ainda poderĂĄ iniciar a linha com uma barra e escrever um novo arquivo e nunca conhecerĂĄ o conjunto de operaçÔes ou objetos que esse processo pode acessar.

É por isso que eles estĂŁo tĂŁo preocupados com o espaço para nome global, porque isso contradiz o objetivo de controlar com precisĂŁo tudo o que o processo sandbox deve ter acesso. Dessa forma, eles tentaram eliminar os namespaces globais com muitas alteraçÔes no kernel no FreeBSD . No caso deles, o kernel precisava garantir que todas as operaçÔes passassem por alguns recursos, a saber, pelo descritor de arquivo.

Vamos verificar se realmente precisamos de alteraçÔes no kernel. E se apenas fizermos isso na biblioteca? Afinal, estamos implementando o Capsicum , que jå possui uma biblioteca. E tudo o que fazemos é alterar todos esses recursos, como "abrir, ler, escrever", para usar exclusivamente os recursos de capacidade . Todas as operaçÔes passarão por alguns recursos, procurå-los na tabela de arquivos e assim por diante. Isso vai funcionar?



PĂșblico: vocĂȘ sempre pode fazer a chamada do sistema syscall .

Professor: sim. O problema Ă© que houve um conjunto de chamadas de sistema que o kernel aceita e, mesmo que vocĂȘ implemente uma boa biblioteca, isso nĂŁo impedirĂĄ a possibilidade de que um processo ruim ou comprometido faça uma chamada de sistema diretamente. Portanto, vocĂȘ deve de alguma forma fortalecer o nĂșcleo.

No compilador, o modelo de ameaça não estå no processo comprometido do compilador e não no código arbitrårio, mas no descuido do programador. Portanto, se o desenvolvedor do programa não estiver enganado e fizer a coisa certa, a biblioteca provavelmente 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. Acontece que eu tenho centenas de processos em execução no meu computador e não tenho ideia do que é. Portanto, destruir o UID não é um bom plano para fins de gerenciamento.

54:14 min

Continuação:

Curso MIT "Segurança de sistemas de computadores". Palestra 6: “Oportunidades”, parte 3


A 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 de 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).

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?

Source: https://habr.com/ru/post/pt418219/


All Articles