Construir sistemas seguros

Privilégio mínimo, memória e isolamento, Android, containers, seccomp, TPM e mediação.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Uma aplicação de notas não deve dar à conta que consulta pautas o poder de mudar utilizadores. Se essa conta for roubada, os seus privilégios determinam o que o atacante consegue fazer. Os privilégios são as operações permitidas à conta. Limitá-los reduz as consequências do seu comprometimento. Para arranque verificado, esta página usa apenas a ideia de assinatura para verificar componentes e de resumo para medir software; os detalhes dessas primitivas estão em criptografia.

Princípios de construção

A conta de consulta só precisa de ler a sua pauta durante o semestre: privilégio mínimo pergunta se retiramos a escrita e o acesso depois do prazo; negar por defeito pergunta se um pedido novo é recusado sem regra explícita; mediação completa pergunta se existe algum caminho que contorna a verificação. Os princípios de Saltzer e Schroeder ajudam a avaliar um desenho:

PrincípioPergunta a fazer
Privilégio mínimoCada entidade recebe só as permissões necessárias, pelo tempo necessário?
Negar por defeitoUm pedido só é permitido quando existe uma autorização explícita?
Mediação completaCada acesso passa pela verificação relevante?
Simplicidade do mecanismoO mecanismo é pequeno e compreensível o suficiente para ser revisto?
Desenho abertoA proteção depende de segredos como chaves, e não de esconder o algoritmo?
Separação de privilégiosUma operação crítica exige condições independentes?
Mínimo mecanismo comumReduzimos recursos partilhados que criam dependências e fugas?
Aceitação psicológicaO caminho seguro é compreensível e utilizável?

Exigir aprovação de dois responsáveis para publicar uma pauta separa a autoridade de decisão. Pedir a mesma palavra-passe duas vezes à mesma pessoa não cria essa separação. Também não é autenticação multifator: essa distingue categorias de prova de identidade, e não responsáveis por uma decisão.

Isolamento limita a comunicação e os recursos acessíveis entre componentes. Um processo separado, uma sandbox ou uma máquina virtual oferece isolamento com hipóteses diferentes. Por exemplo, dois processos com o mesmo ficheiro temporário gravável por todos continuam a comunicar por esse ficheiro. Essa comunicação pode quebrar a separação pretendida.

Memória virtual e fronteira do kernel

Cada processo usa um espaço de endereços virtual. As tabelas de páginas traduzem endereços virtuais em páginas físicas e atribuem permissões. O endereço virtual 0x4000 em A não identifica necessariamente a mesma página física que 0x4000 em B. Partilha explícita de memória pode, contudo, mapear a mesma página nos dois processos.

A separação entre modo utilizador e modo kernel impede o código comum de aceder livremente a memória e operações privilegiadas. Uma chamada de sistema faz uma transição controlada. O kernel tem de validar os pedidos, incluindo ponteiros, tamanhos e autoridade. A transição não torna confiável o argumento recebido.

Em modelos históricos de x86, páginas do kernel podiam estar nas tabelas do processo com acesso reservado ao modo supervisor. Estarem mapeadas não as tornava legíveis pelo processo. Sistemas com KPTI usam tabelas distintas para reduzir certas exposições, incluindo riscos de execução especulativa. A disposição depende da arquitetura e da configuração; não assumes que todo kernel atual está mapeado da mesma forma.

Caso: mesmo endereço, outro objeto

A tem um buffer de 4 KiB em 0x4000; B usa o mesmo endereço virtual para outra alocação. Uma instrução de A que escreve em 0x4000 segue a tradução de A, não a de B, porque cada processo usa a sua tabela de páginas. Só uma partilha configurada, uma operação autorizada ou uma falha numa fronteira de proteção altera essa conclusão. A memória virtual isola traduções e permissões, não a intenção dos programas.

Variantes e limites deste caso

Se existir uma página explicitamente partilhada, ambos os números traduzem para a mesma página física. KPTI, execução especulativa e permissões de página mudam exposições concretas, mas não mudam a regra base: o número virtual só ganha significado através da tabela do processo.

Android: isolamento por aplicação

O Android atribui normalmente um UID a cada aplicação e usa processos e permissões Linux para separar os seus dados. A fronteira também se aplica a código nativo. Nesse modelo, o UID distingue aplicações, SELinux acrescenta controlo obrigatório sobre operações e filtros seccomp restringem que chamadas de sistema cada processo pode pedir.

Permissões pedidas no manifesto e consentimento do utilizador regulam capacidades específicas, mas não são toda a sandbox. Uma aplicação autorizada a usar a câmara não recebe automaticamente acesso aos ficheiros privados de outra. Partilhas explicitamente autorizadas e componentes expostos têm regras próprias. Vulnerabilidades do kernel ou uma configuração privilegiada podem comprometer a fronteira.

Containers, máquinas virtuais e seccomp

Um container Linux típico partilha o kernel do anfitrião. Namespaces separam vistas de recursos, por exemplo cada container vê os seus próprios processos. Cgroups contabilizam e limitam recursos, por exemplo memória e CPU. As Linux capabilities e políticas de acesso limitam autoridade, por exemplo retirar o poder de montar sistemas de ficheiros. Uma máquina virtual tem o seu próprio kernel convidado e comunica com hardware virtual através do hipervisor. Ambas dependem de componentes privilegiados e de configuração correta.

Um hipervisor de tipo 1 executa diretamente sobre o hardware; um de tipo 2 depende de um sistema anfitrião. Esta classificação descreve a organização, não garante ausência de vulnerabilidades ou canais laterais. O isolamento de uma VM continua a depender do hipervisor e dos dispositivos expostos.

Seccomp-BPF permite decidir sobre chamadas de sistema usando o número, arquitetura e argumentos disponíveis ao filtro. Pode devolver erro, terminar o processo ou aplicar outras ações previstas. Não interpreta livremente o conteúdo dos ponteiros fornecidos: uma regra sobre o número da chamada não verifica o texto de um caminho.

Por exemplo, um conversor que não precisa de criar processos pode ter uma política que bloqueia essa chamada. Se uma vulnerabilidade tentar usá-la, o filtro limita esse caminho. Ainda são necessários limites de ficheiros, memória, rede e acesso, porque seccomp reduz superfície exposta do kernel e sozinho não é uma sandbox completa. Um container privilegiado, um volume sensível montado ou acesso ao controlo do runtime pode anular a separação pretendida.

Interposição e isolamento por software

System Call Interposition, ou SCI, medeia chamadas de sistema para observar ou limitar operações. O filtro seccomp é um exemplo. A decisão de negar uma chamada pode limitar efeitos de código comprometido, mas não verifica automaticamente todas as leituras e escritas que esse código faz dentro da sua memória.

Software Fault Isolation, ou SFI, restringe código de um domínio, por exemplo instrumentando acessos e desvios para os manter na região permitida. Atua na execução do código, em vez de depender apenas de filtrar chamadas ao kernel. SCI e SFI podem complementar-se: manter um acesso em determinada região não autoriza abrir qualquer ficheiro, e negar uma chamada não torna válido um acesso fora dos limites de um buffer.

Arranque verificado, medições e TPM

Secure Boot verifica assinaturas de componentes de arranque segundo uma política de confiança, podendo recusar um componente não autorizado. Measured Boot regista medições criptográficas do que arrancou. Um TPM pode proteger chaves e acumular essas medições em registos PCR. Medir não é automaticamente bloquear.

Numa atestação, segue a decisão de um servidor que só aceita determinadas medições:

PassoEstado ou decisão
MedirO arranque acumula medições nos PCR do TPM.
Proteger a chaveA chave de atestação fica sujeita à proteção e à política do TPM.
Pedir uma provaO servidor envia um desafio novo; a resposta autenticada liga as medições a esse desafio.
DecidirO servidor valida a prova e compara as medições com os estados aceites.

Reutilizar uma resposta antiga não satisfaz o desafio novo. Registar uma medição, por si, também não aplica a política de acesso do servidor. Uma medição diferente pode levar o verificador a negar acesso; uma medição esperada não prova que o sistema nunca será comprometido depois do arranque. A decisão depende da cadeia medida, da confiança nas chaves e da política de aceitação.

Uma chave selada a determinada política de PCR pode ficar indisponível se o arranque mudar. Uma atualização legítima também pode mudar as medições, pelo que o desenho precisa de atualização e recuperação. TPM não é um antivírus nem uma garantia de que qualquer programa assinado é seguro.

Defesa em profundidade

A defesa em profundidade combina controlos com falhas diferentes. Na aplicação, o controlo de acessos restringe a consulta; a cifragem protege uma cópia de disco; as cópias de segurança permitem recuperar uma eliminação. Não são passos obrigatórios de uma única sequência de ataque.

Duas verificações que usam a mesma condição errada não são duas defesas independentes. Da mesma forma, guardar a chave de cifragem junto dos dados, com as mesmas permissões, pode deixar ambos expostos ao mesmo roubo.

Monitor de referência e TCB

Um monitor de referência é o modelo de um mecanismo que decide acessos entre sujeitos e objetos. Tem de mediar os acessos relevantes, resistir a alterações não autorizadas e ser suficientemente simples para permitir análise. O código e componentes de que a proteção depende formam a base de computação confiável, ou TCB.

Suponhamos que a interface esconde o botão “Alterar nota”, mas o servidor aceita POST /notas/42 de qualquer conta. O botão não é um monitor eficaz, porque o atacante envia o pedido diretamente. A verificação pertence ao servidor, junto da operação protegida.

O representante confuso

Um serviço de impressão pode ler ficheiros privados porque precisa de acesso técnico. Segue o pedido: o utilizador indica um caminho que não pode ler; o serviço abre esse caminho com a sua autoridade alargada; o serviço devolve o conteúdo ao utilizador. O serviço confundiu duas autoridades. É o problema do confused deputy, um representante privilegiado que confunde a sua autoridade com a de quem fez o pedido.

O serviço deve verificar a autoridade do requerente sobre o objeto antes de abrir, ou receber uma capacidade limitada ao ficheiro autorizado e usar apenas essa referência. Ter autenticado o utilizador não autoriza todos os seus pedidos.

Falhar de forma segura

Se o servidor de autorização não responde, permitir todos os acessos é uma falha aberta. Negar os acessos protegidos preserva a política de autorização, mas pode reduzir a disponibilidade. O desenho tem de explicitar a propriedade prioritária e uma recuperação segura, em vez de assumir que existe uma resposta universal para qualquer serviço.

Numa resposta de teste, identifica a fronteira de confiança, o componente que decide e a condição verificada. Depois segue um pedido que tenta contornar essa decisão. Para seguir um caso de autoridade que sobrevive à mudança de UID, continua em Set-UID e descritores.

Exercícios

O botão escondido

A interface esconde Alterar nota de contas de aluno, mas o servidor aceita o pedido de qualquer conta autenticada. Identifica o princípio em falta e onde deve existir a decisão.

Pista

Segue um pedido que não passa pela interface.

Solução

Falta uma verificação de autorização eficaz no servidor. A mediação deve estar junto da operação protegida e considerar sujeito, objeto e operação. Segue o ataque: o cliente envia POST /notas/42 sem passar pela interface; o servidor aceita porque só verifica autenticação; a correção verifica em cada pedido se aquela conta pode alterar aquela pauta. A interface pode orientar o uso, mas o cliente pode enviar o pedido diretamente.

Confere a tua resposta:

  • Identifica mediação completa/autorização no servidor.
  • Diz que esconder o botão não impede um pedido direto.
  • Especifica a política sobre utilizador, pauta e operação.

Erros frequentes

Autenticar novamente não decide se o aluno pode alterar notas.

Voltar à explicação
O serviço de impressão

Um serviço privilegiado imprime qualquer caminho pedido por uma conta autenticada. Qual alteração atua sobre a falha descrita?

A tua resposta

Pista

Distingue a autoridade do serviço da autoridade de quem pede.

Mais uma pista

O serviço pode ler mais ficheiros do que o requerente.

Solução

O representante deve atuar com autoridade limitada ao pedido autorizado, através de verificação adequada ou capacidade restrita. O problema é confundir as duas autoridades.

  • Verificar a autoridade do requerente sobre o ficheiro pedido.. O serviço não deve usar a sua autoridade para conceder ao requerente acessos que ele não tem.
  • Ocultar o campo de caminho na interface.. O cliente pode produzir pedidos diretamente.
  • Cifrar o disco do serviço.. O serviço legítimo continua a poder ler e imprimir o ficheiro.
  • Pedir duas vezes a palavra-passe.. Repetir a identificação não decide autoridade sobre o objeto.

Erros frequentes

Não atribuas o problema à ausência de autenticação: o enunciado já a fornece.

Voltar à explicação
Traduções e partilha explícita

A e B têm páginas virtuais em 0x8000. A traduz essa página para a página física F1; B traduz para F2, distinta de F1. A escreve no deslocamento 12. B vê a alteração? Depois o sistema configura ambos para usar F1, com leitura e escrita permitidas. O que muda? Assume que não existem outras falhas nem cópias durante estas operações.

Pista

Segue a página física referida por cada operação.

Solução

No primeiro estado, A altera F1 no deslocamento 12; B lê F2 e não vê essa escrita. No segundo, ambos usam F1: B pode observar o byte escrito por A no mesmo deslocamento, depois da escrita. O número virtual igual não decidiu a partilha; foram os mapeamentos. Se B não tivesse leitura, mapear a página também não lhe concederia esse acesso.

Confere a tua resposta:

  • Distingui número virtual de página física.
  • Usei a tradução de cada processo para prever o efeito.
  • Expliquei a condição de partilha e a necessidade de permissões.

Erros frequentes

Partilha explícita é compatível com espaços de endereços separados.

Voltar à explicação
O filtro deixou ler

Um conversor num container não pode criar processos por política seccomp. Continua autorizado a abrir e ler uma pasta privada montada no container. O filtro impede a fuga desses dados? Justifica o que falta restringir.

Pista

A operação que expõe os dados é criar processos?

Solução

Não. A leitura permitida pode alcançar a pasta montada; bloquear uma chamada diferente não limita essa autoridade. Remove a montagem desnecessária, aplica acesso mínimo e controla também os canais de saída. Namespaces, políticas e limites complementam seccomp. A fronteira continua a depender do kernel partilhado e da configuração.

Confere a tua resposta:

  • Explica que bloquear criação de processos não restringe todas as leituras.
  • Identifica permissões, montagens e políticas de acesso como controlos adicionais.
  • Reconhece o kernel partilhado como dependência do container.

Erros frequentes

Não tratar container ou seccomp como uma propriedade binária de segurança total.

Voltar à explicação
Atualização e prova antiga

Uma atualização legítima muda as medições de arranque de M1 para M2. O TPM regista M2. Um servidor só aceita M1 e envia um desafio novo. O cliente entrega uma atestação antiga de M1 ligada ao desafio anterior. O TPM impediu o arranque? O servidor deve aceitar essa prova? Como tratar a atualização sem ignorar a frescura?

Pista

Distingue a ocorrência do arranque da autorização remota.

Solução

Registar M2 não demonstra bloqueio do arranque. O servidor rejeita a prova antiga porque não está ligada ao desafio pendente, mesmo que M1 seja um estado aceite. Para admitir a atualização, verifica-a e atualiza a política de estados aceites; pede depois uma prova nova de M2. Aceitar a medição descreve o estado medido, não garante ausência de comprometimento posterior. A recuperação e a proteção das chaves continuam necessárias.

Confere a tua resposta:

  • Distingui medição de bloqueio.
  • Rejeitei a prova antiga que não responde ao desafio novo.
  • Expliquei atualização da política e limites de uma medição aceite.

Erros frequentes

Não aceitar uma prova antiga só porque contém uma medição conhecida.

Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.