Anel de proteção - Protection ring

Anéis de privilégio para o x86 disponíveis no modo protegido

Na ciência da computação , os domínios de proteção hierárquica , frequentemente chamados de anéis de proteção , são mecanismos para proteger dados e funcionalidade de falhas (melhorando a tolerância a falhas ) e comportamento malicioso (fornecendo segurança de computador ). Essa abordagem é diametralmente oposta à da segurança baseada em capacidade .

Os sistemas operacionais de computador fornecem diferentes níveis de acesso aos recursos. Um anel de proteção é um de dois ou mais níveis hierárquicos ou camadas de privilégio dentro da arquitetura de um sistema de computador . Isso geralmente é reforçado por hardware por algumas arquiteturas de CPU que fornecem diferentes modos de CPU no nível de hardware ou microcódigo . Os anéis são organizados em uma hierarquia do mais privilegiado (mais confiável, geralmente numerado como zero) ao menos privilegiado (menos confiável, geralmente com o número de toque mais alto). Na maioria dos sistemas operacionais, o Anel 0 é o nível com mais privilégios e interage mais diretamente com o hardware físico, como a CPU e a memória.

Portas de chamada especiais entre os anéis são fornecidas para permitir que um anel externo acesse os recursos de um anel interno de uma maneira predefinida, ao invés de permitir o uso arbitrário. O bloqueio correto do acesso entre os anéis pode melhorar a segurança, evitando que os programas de um anel ou nível de privilégio usem indevidamente os recursos destinados a programas em outro. Por exemplo, o spyware executado como um programa do usuário no Anel 3 deve ser impedido de ligar uma câmera da web sem informar o usuário, uma vez que o acesso ao hardware deve ser uma função do Anel 1 reservada para drivers de dispositivo . Programas como navegadores da web em execução em anéis de numeração mais alta devem solicitar acesso à rede, um recurso restrito a um anel de numeração inferior.

Implementações

Vários anéis de proteção estavam entre os conceitos mais revolucionários introduzidos pelo sistema operacional Multics , um predecessor altamente seguro da família de sistemas operacionais Unix de hoje . O computador mainframe GE 645 tinha algum controle de acesso ao hardware, mas isso não era suficiente para fornecer suporte total para anéis no hardware, então o Multics os apoiou prendendo as transições dos anéis no software; seu sucessor, o Honeywell 6180 , os implementou em hardware, com suporte para oito anéis. No entanto, a maioria dos sistemas de uso geral usa apenas dois anéis, mesmo que o hardware em que são executados forneça mais modos de CPU do que isso. Por exemplo, o Windows 7 e o Windows Server 2008 (e seus predecessores) usam apenas dois anéis, com o anel 0 correspondendo ao modo kernel e o anel 3 ao modo do usuário , porque as versões anteriores do Windows eram executadas em processadores que suportavam apenas dois níveis de proteção.

Muitas arquiteturas modernas de CPU (incluindo a popular arquitetura Intel x86 ) incluem alguma forma de proteção em anel, embora o sistema operacional Windows NT , como o Unix, não utilize totalmente esse recurso. O OS / 2 o faz até certo ponto, usando três anéis: toque 0 para código do kernel e drivers de dispositivo, toque 2 para código privilegiado (programas do usuário com permissões de acesso de E / S) e toque 3 para código não privilegiado (quase todos os programas do usuário). No DOS , o kernel, os drivers e os aplicativos normalmente são executados no anel 3 (no entanto, isso é exclusivo para o caso em que drivers de modo protegido e / ou extensores DOS são usados; como um sistema operacional de modo real, o sistema funciona efetivamente sem proteção ), enquanto 386 gerenciadores de memória, como o EMM386, são executados no anel 0. Além disso, o DR-DOS 'EMM386 3.xx pode, opcionalmente, executar alguns módulos (como o DPMS ) no anel 1. O OpenVMS usa quatro modos chamados (em ordem decrescente de privilégios) Kernel, Executivo, Supervisor e Usuário.

Um interesse renovado nesta estrutura de design veio com a proliferação do software Xen VMM , discussão contínua sobre monolítico versus micro-kernels (particularmente em grupos de notícias Usenet e fóruns da Web ), estrutura de design Ring-1 da Microsoft como parte de sua iniciativa NGSCB , e hipervisores baseados em virtualização x86 , como Intel VT-x (anteriormente Vanderpool).

O sistema Multics original tinha oito anéis, mas muitos sistemas modernos têm menos. O hardware permanece ciente do anel atual do thread de instrução em execução o tempo todo, com a ajuda de um registro de máquina especial. Em alguns sistemas, as áreas da memória virtual recebem, em vez disso, números de anel no hardware. Um exemplo é o Data General Eclipse MV / 8000 , no qual os três primeiros bits do contador do programa (PC) serviram como o registrador de anel. Assim, o código em execução com o PC virtual definido como 0xE200000, por exemplo, estaria automaticamente no anel 7, e chamar uma sub-rotina em uma seção diferente da memória causaria automaticamente uma transferência de anel.

O hardware restringe severamente as maneiras pelas quais o controle pode ser passado de um anel para outro e também impõe restrições sobre os tipos de acesso à memória que podem ser realizados entre os anéis. Usando x86 como exemplo, há uma estrutura de porta especial que é referenciada pela instrução de chamada que transfere o controle de uma maneira segura para pontos de entrada predefinidos em anéis de nível inferior (mais confiáveis); isso funciona como uma chamada de supervisor em muitos sistemas operacionais que usam a arquitetura em anel. As restrições de hardware são projetadas para limitar as oportunidades de violações acidentais ou maliciosas de segurança. Além disso, o anel mais privilegiado pode receber recursos especiais (como endereçamento de memória real que ignora o hardware de memória virtual).

A  arquitetura ARM v7 implementa três níveis de privilégio: aplicativo, sistema operacional e hipervisor. Excepcionalmente, o nível 0 (PL0) é o nível menos privilegiado, enquanto o nível 2 (PL2) é o nível mais privilegiado (hipervisor).

A proteção de anel pode ser combinada com os modos do processador ( modo mestre / kernel / privilegiado / supervisor versus modo escravo / não privilegiado / usuário) em alguns sistemas. Os sistemas operacionais executados em hardware que ofereça suporte a ambos podem usar as duas formas de proteção ou apenas uma.

O uso eficaz da arquitetura em anel requer uma cooperação estreita entre o hardware e o sistema operacional. Os sistemas operacionais projetados para funcionar em várias plataformas de hardware podem fazer uso limitado de anéis apenas se eles não estiverem presentes em todas as plataformas suportadas. Freqüentemente, o modelo de segurança é simplificado para "kernel" e "usuário", mesmo que o hardware forneça granularidade mais fina por meio de anéis.

Modos

Modo supervisor

Em termos de computador, o modo supervisor é um sinalizador mediado por hardware que pode ser alterado por código executado em software de nível de sistema. As tarefas ou threads no nível do sistema terão este sinalizador definido enquanto estão em execução, enquanto os aplicativos do espaço do usuário não. Este sinalizador determina se seria possível executar operações de código de máquina, como modificar registros para várias tabelas de descritores, ou realizar operações como desabilitar interrupções. A ideia de ter dois modos diferentes para operar vem de "com mais controle vem mais responsabilidade" - um programa no modo supervisor é confiável para nunca falhar, uma vez que uma falha pode causar o travamento de todo o sistema do computador.

O modo supervisor é "um modo de execução em alguns processadores que permite a execução de todas as instruções, incluindo instruções privilegiadas. Também pode dar acesso a um espaço de endereço diferente, ao hardware de gerenciamento de memória e a outros periféricos. Este é o modo em que o sistema operacional geralmente funciona. "

Em um kernel monolítico , o sistema operacional é executado no modo supervisor e os aplicativos são executados no modo do usuário. Outros tipos de sistemas operacionais , como aqueles com um exokernel ou microkernel , não necessariamente compartilham esse comportamento.

Alguns exemplos do mundo do PC:

  • Linux , macOS e Windows são três sistemas operacionais que usam o modo supervisor / usuário. Para executar funções especializadas, o código do modo de usuário deve realizar uma chamada de sistema no modo supervisor ou mesmo para o espaço do kernel onde o código confiável do sistema operacional executará a tarefa necessária e retornará a execução ao espaço do usuário. O código adicional pode ser adicionado ao espaço do kernel por meio do uso de módulos do kernel carregáveis , mas apenas por um usuário com as permissões necessárias, pois esse código não está sujeito ao controle de acesso e às limitações de segurança do modo de usuário.
  • DOS (enquanto nenhum gerenciador de memória 386 como o EMM386 estiver carregado), bem como outros sistemas operacionais simples e muitos dispositivos incorporados rodam em modo supervisor permanentemente, o que significa que os drivers podem ser escritos diretamente como programas do usuário.

A maioria dos processadores tem pelo menos dois modos diferentes. Os processadores x86 têm quatro modos diferentes divididos em quatro anéis diferentes. Os programas executados no Anel 0 podem fazer qualquer coisa com o sistema, e o código executado no Anel 3 deve ser capaz de falhar a qualquer momento, sem impacto para o resto do sistema do computador. O Anel 1 e o Anel 2 raramente são usados, mas podem ser configurados com diferentes níveis de acesso.

Na maioria dos sistemas existentes, alternar do modo de usuário para o modo kernel tem um alto custo de desempenho associado. Foi medido, na solicitação básica getpid, para custar de 1.000 a 1.500 ciclos na maioria das máquinas. Destes, apenas cerca de 100 são para a troca real (70 do espaço do usuário para o kernel e 40 de volta), o resto é "sobrecarga do kernel". No microkernel L3 , a minimização dessa sobrecarga reduziu o custo geral para cerca de 150 ciclos.

Maurice Wilkes escreveu:

... eventualmente ficou claro que a proteção hierárquica fornecida pelos anéis não correspondia exatamente aos requisitos do programador do sistema e deu pouca ou nenhuma melhoria no sistema simples de ter apenas dois modos. Os anéis de proteção se prestavam a uma implementação eficiente em hardware, mas havia pouco mais a ser dito sobre eles. [...] A atratividade da proteção refinada permaneceu, mesmo depois de ter sido visto que os anéis de proteção não forneciam a resposta ... Isso novamente provou ser um beco sem saída ...

Para obter desempenho e determinismo, alguns sistemas colocam funções que provavelmente seriam vistas como lógica de aplicativo, em vez de drivers de dispositivo, no modo kernel; aplicativos de segurança ( controle de acesso , firewalls , etc.) e monitores de sistema operacional são citados como exemplos. Pelo menos um sistema de gerenciamento de banco de dados embutido, e X treme DB Kernel Mode , foi desenvolvido especificamente para a implantação do modo kernel, para fornecer um banco de dados local para funções de aplicativo baseadas em kernel e para eliminar as mudanças de contexto que de outra forma ocorreriam quando as funções do kernel interagem com um sistema de banco de dados em execução no modo de usuário.

Às vezes, as funções também são movidas pelos anéis na outra direção. O kernel do Linux, por exemplo, injeta uma seção vDSO em processos que contém funções que normalmente exigiriam uma chamada de sistema, ou seja, uma transição de anel. Mas, em vez de fazer uma syscall, essas funções usam dados estáticos fornecidos pelo kernel, o que evita a necessidade de uma transição de anel que é mais leve do que uma syscall. A função gettimeofday pode ser fornecida dessa forma.

Modo hipervisor

CPUs recentes da Intel e AMD oferecem instruções de virtualização x86 para um hipervisor controlar o acesso ao hardware Ring 0. Embora sejam mutuamente incompatíveis, ambos Intel VT-x (codinome "Vanderpool") e AMD-V (codinome "Pacifica") criam um novo "Ring -1" para que um sistema operacional convidado possa executar operações Ring 0 nativamente sem afetar outras convidados ou o sistema operacional host.

Para auxiliar a virtualização, VT-x e SVM inserem um novo nível de privilégio abaixo do Anel 0. Ambos adicionam nove novas instruções de código de máquina que funcionam apenas em "Anel −1", destinadas a serem usadas pelo hipervisor.

Nível de privilégio

Um nível de privilégio no conjunto de instruções x86 controla o acesso do programa atualmente em execução no processador a recursos como regiões de memória, portas de E / S e instruções especiais. Existem 4 níveis de privilégio que variam de 0, que é o mais privilegiado, a 3, que é o menos privilegiado. A maioria dos sistemas operacionais modernos usa o nível 0 para o kernel / executivo e o nível 3 para programas aplicativos. Qualquer recurso disponível para o nível n também está disponível para os níveis 0 a n, portanto, os níveis de privilégio são anéis. Quando um processo com menos privilégios tenta acessar um processo com mais privilégios, uma exceção de falha de proteção geral é relatada ao SO.

Não é necessário usar todos os quatro níveis de privilégio. Os sistemas operacionais atuais com ampla participação de mercado, incluindo Microsoft Windows , macOS , Linux , iOS e Android, usam principalmente um mecanismo de paging com apenas um bit para especificar o nível de privilégio como Supervisor ou Usuário (U / S Bit). O Windows NT usa o sistema de dois níveis. Os programas de modo real no 8086 são executados no nível 0 (nível de privilégio mais alto), enquanto o modo virtual no 8086 executa todos os programas no nível 3.

Os possíveis usos futuros para os vários níveis de privilégio suportados pela família x86 ISA incluem conteinerização e máquinas virtuais . Um kernel do sistema operacional host pode usar instruções com acesso de privilégio total ( modo kernel ), enquanto os aplicativos em execução no sistema operacional convidado em uma máquina virtual ou contêiner podem usar o nível mais baixo de privilégios no modo de usuário. A máquina virtual e o kernel do sistema operacional convidado podem usar um nível intermediário de privilégio de instrução para invocar e virtualizar as operações do modo kernel, como chamadas de sistema, do ponto de vista do sistema operacional convidado.

IOPL

O sinalizador IOPL ( nível de privilégio de E / S ) é um sinalizador encontrado em todas as CPUs x86 compatíveis com IA-32 . Ocupa os bits 12 e 13 no registro FLAGS . No modo protegido e no modo longo , mostra o nível de privilégio de E / S do programa ou tarefa atual. O privilégio atual Nível (CPL) (CPL0, CPL1, CPL2, CPL3) da tarefa ou programa deve ser menor ou igual ao IOPL, para que a tarefa ou programa para o acesso I / portas S .

O IOPL pode ser alterado usando POPF(D)e IRET(D)somente quando o nível de privilégio atual é Ring 0.

Além do IOPL, as Permissões da Porta de E / S no TSS também participam da determinação da capacidade de uma tarefa de acessar uma porta de E / S.

Diversos

Em sistemas x86, a virtualização de hardware x86 ( VT-x e SVM ) é referida como "ring -1", o Modo de Gerenciamento do Sistema é referido como "ring -2", o Intel Management Engine e AMD Platform Security Processor são algumas vezes referidos como "anel -3".

Uso de recursos de hardware

Muitas arquiteturas de hardware de CPU fornecem muito mais flexibilidade do que a explorada pelos sistemas operacionais que normalmente executam. O uso adequado de modos complexos de CPU requer uma cooperação muito próxima entre o sistema operacional e a CPU e, portanto, tende a vincular o SO à arquitetura da CPU. Quando o sistema operacional e a CPU são projetados especificamente um para o outro, isso não é um problema (embora alguns recursos de hardware ainda possam ser deixados inexplorados), mas quando o sistema operacional é projetado para ser compatível com várias arquiteturas de CPU diferentes, uma grande parte do os recursos do modo CPU podem ser ignorados pelo sistema operacional. Por exemplo, o motivo pelo qual o Windows usa apenas dois níveis (anel 0 e anel 3) é que algumas arquiteturas de hardware que eram suportadas no passado (como PowerPC ou MIPS ) implementavam apenas dois níveis de privilégio.

Multics era um sistema operacional projetado especificamente para uma arquitetura de CPU especial (que por sua vez foi projetada especificamente para Multics) e aproveitou ao máximo os modos de CPU disponíveis. No entanto, foi uma exceção à regra. Hoje, esse alto grau de interoperação entre o sistema operacional e o hardware nem sempre é econômico, apesar das vantagens potenciais de segurança e estabilidade.

Em última análise, o objetivo dos modos operacionais distintos para a CPU é fornecer proteção de hardware contra corrupção acidental ou deliberada do ambiente do sistema (e violações correspondentes da segurança do sistema) pelo software. Apenas as partes "confiáveis" do software do sistema podem ser executadas no ambiente irrestrito do modo kernel e, em seguida, em designs paradigmáticos, apenas quando absolutamente necessário. Todos os outros softwares são executados em um ou mais modos de usuário. Se um processador gerar uma condição de falha ou exceção em modo de usuário, na maioria dos casos, a estabilidade do sistema não é afetada; se um processador gerar uma condição de falha ou exceção no modo kernel, a maioria dos sistemas operacionais irá parar o sistema com um erro irrecuperável. Quando existe uma hierarquia de modos (segurança baseada em anel), as falhas e exceções em um nível de privilégio podem desestabilizar apenas os níveis de privilégio com números mais altos. Assim, uma falha no Anel 0 (o modo kernel com o maior privilégio) travará todo o sistema, mas uma falha no Anel 2 afetará apenas os Anéis 3 e além e o próprio Anel 2, no máximo.

As transições entre os modos ficam a critério do thread em execução quando a transição é de um nível de alto privilégio para um de baixo privilégio (como do kernel para os modos de usuário), mas as transições de níveis inferiores para superiores de privilégio podem ocorrer apenas por meio de segurança , "portas" controladas por hardware que são atravessadas pela execução de instruções especiais ou quando interrupções externas são recebidas.

Os sistemas operacionais de microkernel tentam minimizar a quantidade de código em execução no modo privilegiado, para fins de segurança e elegância , mas, em última análise, sacrificando o desempenho.

Veja também

Referências

  • Referência do programador Intel 80386

Leitura adicional