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

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-alvo: se esse UID fornecer acesso somente leitura a esse arquivo e vocĂȘ tambĂ©m tiver um descritor de arquivo, se perder o UID , ainda poderĂĄ obter permissĂŁo para ler esse arquivo?

Professor: sim, pois ele aparecerĂĄ em catĂĄlogos. Porque assim que vocĂȘ adiciona o recurso ao arquivo, Ă© isso. EstĂĄ aberto para vocĂȘ com privilĂ©gios especiais e assim por diante. Mas o problema Ă© que eles tĂȘm esse design hĂ­brido.

Ou seja, eles dizem - vocĂȘ realmente pode adicionar recursos aos diretĂłrios e pode abrir um novo arquivo enquanto trabalha em paralelo. Pode ser que vocĂȘ adicione o recurso a um diretĂłrio, como / etc , mas vocĂȘ nĂŁo tem acesso obrigatĂłrio a todos os arquivos no diretĂłrio / etc. Mas assim que vocĂȘ entra no modo de recursos, pode tentar abrir esses arquivos, sabendo que tem acesso ao diretĂłrio / etc. Afinal, ele jĂĄ estĂĄ aberto. Por que vocĂȘ nĂŁo me fornece um arquivo chamado "senha" localizado neste diretĂłrio?



E entĂŁo o kernel precisa decidir se vocĂȘ deseja abrir o arquivo neste diretĂłrio no modo de leitura ou gravação ou o que vocĂȘ possui. EntĂŁo, acho que este Ă© o Ășnico lugar em que vocĂȘ ainda precisa desse privilĂ©gio externo, porque eles tentaram criar um design compatĂ­vel, onde usavam semĂąnticas nĂŁo muito naturais para descrever a operação de diretĂłrios. Este parece ser o Ășnico local onde permanecem os princĂ­pios para a configuração de um sistema de arquivos Unix .

PĂșblico: existem outros lugares?

Professor: boa pergunta. Acho que terei que obter o cĂłdigo-fonte anterior para descobrir o que estĂĄ acontecendo, mas a maioria das outras situaçÔes realmente nĂŁo exige verificação de UID . Porque, por exemplo, nĂŁo Ă© usado para redes. Essas sĂŁo provavelmente as operaçÔes usuais do sistema de arquivos - se vocĂȘ possui um segmento de memĂłria compartilhada, basta abri-lo e pronto.

PĂșblico: poderia explicar novamente qual Ă© exatamente o ID do usuĂĄrio, se vocĂȘ tiver o recurso de capacidade ?

Professor: isso Ă© importante quando vocĂȘ tem a oportunidade de catalogar. A questĂŁo Ă©: o que essa oportunidade apresenta a vocĂȘ? Considere uma interpretação, por exemplo, o estado dos recursos de um sistema limpo, nĂŁo o Capsicum . Se nesse sistema vocĂȘ tiver a oportunidade de um diretĂłrio, terĂĄ acesso incondicional a todos os arquivos desse diretĂłrio.

No Unix, esse geralmente nĂŁo Ă© o caso. VocĂȘ pode abrir o diretĂłrio como / etc , mas ele possui muitos arquivos de sistema nos quais as informaçÔes confidenciais podem ser armazenadas, por exemplo, a chave privada do servidor. E o fato de poder abrir e rolar por esse diretĂłrio nĂŁo significa que vocĂȘ nĂŁo pode abrir arquivos nesse diretĂłrio. Ou seja, tendo acesso ao diretĂłrio, vocĂȘ tem acesso aos arquivos.

No Capsicum , se vocĂȘ abrir o diretĂłrio / etc e entrar no modo de recurso, acontece o seguinte. VocĂȘ diz: “NĂŁo sei o que Ă© esse diretĂłrio. Acabei de adicionar um descritor de arquivo. " HĂĄ um arquivo chamado "chave". Por que vocĂȘ nĂŁo abre este arquivo "chave" ? SĂł porque naquele momento, vocĂȘ provavelmente nĂŁo deseja que esse processo baseado em recursos abra esse arquivo, porque vocĂȘ nĂŁo precisa dele. Embora isso permita que vocĂȘ ignore as permissĂ”es do Unix para o arquivo.

Portanto, acho que os autores deste artigo abordaram cuidadosamente o desenvolvimento de um sistema que não violaria os mecanismos de segurança existentes.

PĂșblico: ou seja, vocĂȘ diz que, em alguns casos, pode usar uma combinação desses dois fatores de segurança? Ou seja, embora o usuĂĄrio possa alterar o arquivo no diretĂłrio, quais arquivos ele acessa depende de seu ID de usuĂĄrio?

Professor: sim, exatamente. Na prĂĄtica, no Capsicum , antes de entrar no modo de recursos, vocĂȘ precisa adivinhar quais arquivos podem ser necessĂĄrios posteriormente. VocĂȘ pode precisar de bibliotecas compartilhadas, arquivos de texto, modelos, conexĂ”es de rede e assim por diante. Portanto, vocĂȘ abre tudo isso com antecedĂȘncia. E nem sempre Ă© necessĂĄrio saber qual arquivo vocĂȘ precisa. EntĂŁo esses caras fizeram isso para que vocĂȘ possa simplesmente abrir o descritor de arquivo do diretĂłrio e visualizar os arquivos necessĂĄrios mais tarde. No entanto, pode ser que esses arquivos nĂŁo tenham as mesmas permissĂ”es que vocĂȘ possui. É precisamente por esse motivo que uma combinação de dois fatores de segurança Ă© usada - verificando os recursos e o uid do usuĂĄrio. Portanto, isso faz parte do mecanismo do kernel.



Por que eles precisam de uma biblioteca como libcapsicum ? Eu acho que hĂĄ duas coisas principais que eles apĂłiam nesta biblioteca.

Uma delas Ă© que eles implementam uma função chamada lch_start , que vocĂȘ deve usar em vez da função cap_enter . Outra função que libcapsicum fornece Ă© o conceito de listas fd, que Ă© usado para passar descritores de arquivo por nĂșmeros. O objetivo desta lista fd Ă© fĂĄcil de explicar. Isso Ă© basicamente uma generalização de como o Unix gerencia e passa descritores de arquivos entre processos. No Unix e Linux tradicional, que vocĂȘ usa hoje, alguns descritores de arquivo sĂŁo passados ​​para ele quando o processo Ă© iniciado. VocĂȘ simplesmente abre alguns descritores de arquivo com valores inteiros nesta tabela e inicia o processo filho de que precisa. Ou vocĂȘ executa um binĂĄrio especĂ­fico e ele herda todos esses slots abertos na tabela fd . No entanto, nĂŁo hĂĄ outra maneira boa de nomear essas coisas alĂ©m de usar nĂșmeros como nomes.

Considere um exemplo no qual o slot 0 serĂĄ usado para entrada, slot 1 para saĂ­da e slot 2 para impressĂŁo de mensagens de erro. É assim que funciona no Unix . E funciona bem se vocĂȘ apenas transferir esses trĂȘs arquivos ou trĂȘs fluxos de dados para o processo.



Mas no Capsicum, acontece que vocĂȘ “passa por” muito mais descritores de arquivos no seu caminho. Portanto, quando vocĂȘ passa um descritor de arquivo para alguns arquivos, passa por um descritor de arquivo para uma conexĂŁo de rede, um descritor para uma biblioteca compartilhada que vocĂȘ possui e assim por diante. Gerenciar todos esses nĂșmeros Ă© bastante tedioso. Portanto, de fato, libcapsicum fornece a capacidade de abstrair o nome desses descritores de arquivo anteriores entre processos usando um nome hierĂĄrquico usado em vez desses nĂșmeros inteiros obscuros.
Essa Ă© uma das coisas simples que eles fornecem em sua biblioteca. Para que eu possa passar o descritor de arquivo para o processo e dar um nome, nĂŁo importa qual nĂșmero seja indicado. Este mĂ©todo Ă© muito mais simples.

Eles ainda tĂȘm outro mecanismo de inicialização de sandbox mais complexo. Isso Ă© lch , a API do host da sandbox usada em vez de apenas entrar no modo de recursos de capacidade . Por que eles precisavam de algo mais do que uma simples entrada no modo de oportunidade? O que geralmente incomoda vocĂȘ ao criar uma sandbox?

PĂșblico: provavelmente, lch apaga todas as coisas herdadas para garantir um inĂ­cio "limpo" do sistema.

Professor: sim. Eu acho que eles estĂŁo preocupados em tentar levar em conta tudo o que a sandbox tem acesso. O problema Ă© que, se vocĂȘ simplesmente chamar cap_enter , tecnicamente, no nĂ­vel do mecanismo do kernel, ele funcionarĂĄ. Certo? Isso apenas impede que vocĂȘ descubra novas oportunidades.

Mas o problema Ă© que pode haver muitas coisas existentes Ă s quais o processo jĂĄ tem acesso.

Portanto, acho que o exemplo mais simples Ă© a presença de descritores de arquivos abertos lĂĄ que vocĂȘ esqueceu, e eles simplesmente serĂŁo herdados por esse processo.



Por exemplo, eles consideraram tcpdump . Primeiro, eles mudaram o tcpdump simplesmente chamando cap_enter antes mesmo de analisar todas as conexĂ”es de rede recebidas. De certa forma, isso funciona bem porque vocĂȘ nĂŁo pode obter mais recursos de capacidade . Mas entĂŁo, olhando para o descritor de arquivo aberto, eles perceberam que vocĂȘ tem acesso total ao terminal do usuĂĄrio, porque vocĂȘ possui um descritor de arquivo aberto. Para que vocĂȘ possa interceptar todas as teclas digitadas pelo usuĂĄrio e assim por diante. Portanto, este provavelmente nĂŁo Ă© um bom plano para o tcpdump . Porque vocĂȘ nĂŁo deseja que alguĂ©m intercepte sua atividade no teclado.

Portanto, no caso do tcpdump, eles alteraram manualmente os descritores de arquivo e adicionaram alguns bits de recursos a eles para limitar os tipos de operaçÔes que vocĂȘ pode executar. Se vocĂȘ se lembra, no Capsicum, o recurso tambĂ©m possui esses bits extras, indicando a classe de operaçÔes que podem ser executadas para um determinado descritor de arquivo. Assim, eles assumem basicamente que o descritor de arquivo Ă© 0. Aponta para o terminal do usuĂĄrio tty. Inicialmente, era apenas um ponteiro direto para a estrutura tty no kernel. Para limitar o tipo de operaçÔes que podem ser executadas para esse descritor, eles introduziram alguma estrutura beta intermediĂĄria de recursos no meio. Portanto, o descritor de arquivo aponta para essa estrutura de recursos e jĂĄ aponta para o arquivo real que vocĂȘ estĂĄ tentando acessar. E essa estrutura de recursos contĂ©m alguns bits ou permissĂ”es restritivos para um objeto descritor de arquivo que pode ser implementado.

Assim, com a entrada de dados padrĂŁo no tcpdump, vocĂȘ nĂŁo pode fazer nada com ele. VocĂȘ pode apenas ver que existe, e Ă© isso. Para o descritor do arquivo de saĂ­da, eles forneceram uma oportunidade quando vocĂȘ pode gravar algo nele, mas nĂŁo pode alterar o registro, ou seja, nĂŁo Ă© possĂ­vel cancelar as alteraçÔes feitas.



EntĂŁo, o que mais vocĂȘ poderia se preocupar em lançar a sandbox ? Penso no estado do descritor de arquivo. Mais alguma coisa importa? Eu acho que no Unix sĂŁo descritores de arquivos e memĂłria.

Outra coisa Ă© que esses caras estĂŁo preocupados com o fato de que no seu espaço de endereço possa haver dados confidenciais alocados anteriormente. E o processo que vocĂȘ vai isolar na caixa de areia pode ler toda a memĂłria disponĂ­vel. Portanto, se houver algum tipo de senha que vocĂȘ verificou anteriormente, quando o usuĂĄrio efetuar login e vocĂȘ ainda nĂŁo tiver limpado a memĂłria, esse processo poderĂĄ lĂȘ-la e fazer algo "interessante".

Eles resolveram esse problema da seguinte maneira: no lch_start, vocĂȘ precisa executar um programa "novo". VocĂȘ pega o programa e empacota todos os argumentos nele, todos os descritores de arquivos que deseja fornecer. Em seguida, vocĂȘ inicia um novo processo ou inicia a operação de reinicialização de todo o espaço de memĂłria virtual. E nĂŁo hĂĄ dĂșvida de que esse processo nĂŁo receberĂĄ privilĂ©gios adicionais para afetar o conjunto de dados confidenciais. Isso Ă© exatamente o que vocĂȘ passou para a função lch_start , em termos de nomes binĂĄrios, argumentos e recursos do programa.

PĂșblico: o que acontece se o processo iniciado contiver setuid binĂĄrio = 0 ?

Professor: Eu acho que esses caras nĂŁo usam "binĂĄrios" setuid no modo de recurso para evitar algumas interaçÔes estranhas que possam aparecer. Eles implementam esta regra: vocĂȘ pode ter um programa setuid que obtĂ©m seus privilĂ©gios do binĂĄrio setuid e, em seguida, pode chamar cap_enter ou lch_start . Mas depois que vocĂȘ entra no modo de recursos, nĂŁo pode restaurar preferĂȘncias adicionais.

Em princĂ­pio, isso poderia funcionar, mas seria muito estranho. Porque, se vocĂȘ se lembrar, a Ășnica coisa em que o UID importa quando vocĂȘ estĂĄ no modo de recurso Ă© abrir arquivos dentro de um diretĂłrio. Portanto, nĂŁo estĂĄ claro se esse Ă© realmente um excelente plano para obter privilĂ©gios adicionais ou se hĂĄ falhas nele.

PĂșblico: Anteriormente, falamos sobre por que a biblioteca nĂŁo suporta realmente uma separação estrita entre os dois fatores de segurança. Mas nĂŁo precisamos usar lch_start ?

Professor: isso mesmo. Suponha que vocĂȘ tenha algo como tcpdump ou gzip - essa Ă© outra coisa com a qual eles trabalham. VocĂȘ supĂ”e que o aplicativo provavelmente nĂŁo esteja comprometido, e hĂĄ alguma função bĂĄsica do aplicativo e se preocupa com o modo como ele se comporta na caixa de proteção. No caso do tcpdump, Ă© uma anĂĄlise de pacotes provenientes da rede; no caso do gzip , estĂĄ descompactando arquivos. E atĂ© certo ponto, vocĂȘ assume que o processo estĂĄ fazendo tudo certo e que nĂŁo haverĂĄ vulnerabilidades. Portanto, vocĂȘ confia nele para executar lch_start e acredita que ele criarĂĄ a imagem corretamente, configurarĂĄ corretamente todos os recursos e se limitarĂĄ a qualquer outra chamada de sistema fora do modo de recursos.

E entĂŁo vocĂȘ lança coisas perigosas. Mas atĂ© entĂŁo a instalação estava correta e vocĂȘ nĂŁo tem como sair dessa sandbox. EntĂŁo, acho que vocĂȘ precisa ver como realmente pode usar o modo de recurso para aplicativos sandbox.

EntĂŁo conversamos um pouco sobre o tcpdump . Como vocĂȘ isola esse processo? Outro exemplo interessante Ă© o programa gzip , que compacta e descompacta arquivos. EntĂŁo, por que eles estĂŁo preocupados com a caixa de areia? Acho que eles estĂŁo preocupados com o fato de o cĂłdigo de descompactação poder ser potencialmente defeituoso ou com erros no gerenciamento de memĂłria, gerenciamento de buffer durante a descompactação etc.



Outra questĂŁo interessante Ă© por que as alteraçÔes no gzip parecem muito mais complicadas do que no tcpdump ? Eu acho que isso se deve Ă  forma como o aplicativo Ă© estruturado internamente, certo? Portanto, se vocĂȘ tiver um aplicativo que simplesmente compactou ou descompactou um arquivo, Ă© normal iniciĂĄ-lo sem alterĂĄ-lo no modo de recursos. VocĂȘ simplesmente atribui um novo padrĂŁo para descompactar algo, e o padrĂŁo fornece dados descompactados na saĂ­da, e isso funcionarĂĄ bem.

O problema, como quase sempre acontece com esses mĂ©todos de sandbox, Ă© que o aplicativo realmente tem uma lĂłgica de processo muito mais complexa. Por exemplo, o gzip pode compactar vĂĄrios arquivos de uma vez e assim por diante. E, nesse caso, vocĂȘ tem algum tipo de processo de liderança no inĂ­cio do aplicativo, que na verdade possui direitos adicionais para abrir vĂĄrios arquivos, compactĂĄ-los e assim por diante. E a lĂłgica principal geralmente precisa ser outro processo de suporte. No caso do gzip, o aplicativo nĂŁo foi estruturado para que a compactação e descompactação atuassem como processos separados. Portanto, eles tiveram que mudar a implementação do kernel gzip e alguma estrutura do prĂłprio aplicativo, para que, alĂ©m de apenas passar dados para a função de descompressĂŁo, eles fossem enviados por uma chamada RPC ou realmente gravados em algum tipo de descritor de arquivo. Isso foi para evitar problemas de terceiros e descompactar praticamente sem privilĂ©gios. A Ășnica coisa que o gzip poderia fazer ao mesmo tempo era retornar os dados descompactados ou compactados para o processo que o chamou.

Outra coisa de lição de casa Ă© como vocĂȘ realmente usa Capsicum no OKWS ? O que vocĂȘ acha disso? Seria Ăștil? O pessoal do OKWS ficaria feliz em atualizar para o FreeBSD porque Ă© muito mais fĂĄcil de usar? Como vocĂȘ usaria Capsicum no FreeBSD ?

PĂșblico: Pode-se livrar-se de algumas restriçÔes estritas.

Professor: sim, podemos substituĂ­-los completamente pela presença de um diretĂłrio de descritores e recursos de arquivos. VocĂȘ nĂŁo precisaria configurar um chroot confuso. Em vez de usar o chroot com muitas pequenas coisas, vocĂȘ pode definir permissĂ”es com cuidado. VocĂȘ pode simplesmente abrir os arquivos exatos que precisa. EntĂŁo isso parece uma grande vantagem.

Em seguida, no OKWS , vocĂȘ tem o serviço de inicialização OK , que deve iniciar todos os processos pai. Assim que eles morrem, o sinal volta ao okld para reiniciar o processo "morto". E isso teria que ser executado como root , porque ele tinha que isolar os processos na caixa de areia. Mas hĂĄ vĂĄrias coisas no OKWS que podem ser melhoradas com Capsicum .

Por exemplo, vocĂȘ pode fornecer ao okld muito menos privilĂ©gios. Porque, por exemplo, para obter a porta 80, vocĂȘ precisa de privilĂ©gios de root. Mas depois disso, vocĂȘ pode colocar com segurança todo o resto na sandbox, porque os direitos de root nĂŁo sĂŁo mais necessĂĄrios. EntĂŁo Ă© bem legal. Talvez vocĂȘ possa atĂ© delegar ao processo o direito de responder Ă s solicitaçÔes de outra pessoa, por exemplo, um processo de monitoramento do sistema que apenas possui esse descritor de processo ou descritor de processo para o processo filho e, sempre que esse processo falha, ele inicia um novo. Portanto, acho que a capacidade de criar uma caixa de proteção sem privilĂ©gios de root Ă© muito Ăștil.

PĂșblico-alvo: vocĂȘ pode atribuir a cada processo um descritor de arquivo que permita adicionar apenas entradas ao log.

Professor: sim, e isso Ă© muito legal. Como dissemos na Ășltima vez, o oklogd pode "bagunçar" o arquivo de log. E quem sabe o que o kernel permitirĂĄ que ele faça quando tiver o descritor de arquivo do prĂłprio arquivo de log. No entanto, podemos determinar com mais precisĂŁo os recursos do descritor de arquivo, fornecendo um arquivo de log e indicando que ele pode apenas gravar, mas nĂŁo procurar nada. Assim, obtemos a função somente acrĂ©scimo se vocĂȘ Ă© apenas um "escritor" para este arquivo. É muito conveniente VocĂȘ pode conceder ao processo permissĂ”es para gravar no arquivo, mas nĂŁo lĂȘ-lo, o que Ă© muito difĂ­cil de fazer usando apenas as permissĂ”es do Unix .

Capsicum ?

: , , , . , , , .

: , . Capsicum , , . .

: , , okld . , .

: , . . , , Capability , . , , , , , .
, OKWS . . , , , . .

, , «». , . , , , , . .
: «» , , ?

: , FreeBSD . , - , . FreeBSD Casper , , Capability . , «».

- , , , - , , Casper .



, «» . . , , , Casper - .

, , - . , Unix FD . , . , , .

, FreeBSD , DNS . DNS -, «». , tcpdump . tcpdump , IP-. , , DNS -.

, , DNS- DNS-, . Casper , DNS-.

, , , Capsicum? ? ? , , . Capsicum , ?

tcpdump GZIP , , . ?



: , , , . , Capability .

: , . Capsicum , , . , , . , , , , Capsicum , .

, «». , TCP — helper , , , , . , , , .

: , .

: , . . , . lth_start , . , , , - .

, , Capsicum . , , , . Unix - , .

, . , . , , . , .

, Chrome . , , , Unix, -, Unix .

, ?

: .

: . . , . , , , , .

Unix , . , . , . . , .

. Linux , setcall , , . , Capsicum , , Capsicum , . Linux setcall , . , , Linux .

, — , , , , . , - , «//», . Capsicum onde vocĂȘ pode iniciar o processo para um arquivo especĂ­fico e nĂŁo para o diretĂłrio pessoal inteiro.


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

3 meses de graça ao pagar por um novo Dell R630 por um perĂ­odo de seis meses - 2 x HDD Intel Deca-Core Xeon E5-2630 v4 / 128GB DDR4 / 4x1TB ou SSD 2x240GB / 1Gbps 10 TB - de US $ 99,33 por mĂȘs , apenas atĂ© o final de agosto, faça o pedido pode estar 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?

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


All Articles