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-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?