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 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 minContinuação:Curso MIT "Segurança de sistemas de computadores". Palestra 6: âOportunidadesâ, parte 3A 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?