Compartilhar via


Separação de Estado

A separação de estados é um modelo aprimorado de manutenção e segurança que usa limites de segurança mais claros para:

  • Ajude a aumentar a segurança nas principais áreas do sistema
  • Habilite atualizações e redefinições de sistema mais rápidas e limpas

Esse modelo é usado em todas as imagens do sistema operacional de fábrica. Os limites de segurança são classificados pelos seguintes estados:

Estadual Descrição Exemplos
Imutável Esta área não pode ser alterada permanentemente, exceto pelo próprio sistema operacional.
  • Os binários do sistema operacional
  • Hives do Registro: HKLM\SYSTEM e HKLM\SOFTWARE
Mutável, alto valor Você pode fazer alterações e esperar que elas persistam após uma reinicialização ou atualização, mas não após uma redefinição do sistema
  • Configurações do sistema
  • Arquivos de log
  • Dados do programa.
    Observação: use APIs ou variáveis de ambiente, como %PROGRAMDATA% para se referir a essas pastas. Se o código incluir caminhos absolutos como C:\Program Data\ ou gravações em outras áreas do sistema, a operação de gravação poderá falhar com uma violação de acesso.
Mutável, baixo valor Você pode fazer alterações, mas elas desaparecerão após uma reinicialização ou reinicialização do sistema. Alguns componentes podem precisar gravar em hives do Registro, como HKLM\SYSTEM e HKLM\SOFTWARE. Essas áreas do Registro são carregadas como voláteis, portanto, seus componentes ainda podem executar a operação de gravação para um runtime específico. Na próxima reinicialização, as alterações desaparecerão.
Dados do usuário Pode ser alterado. Cada perfil de dados do usuário é criptografado em sua própria partição, portanto, as alterações afetam apenas o usuário conectado
  • Perfil de usuário NT
  • Hive do Registro: HKCU

Para testes de fábrica, não há problema em armazenar arquivos de log e outros arquivos de teste na partição de dados ou no %PROGRAMDATA%.

Violações de separação do Estado

As violações de separação estadual ocorrem quando:

  • Um componente tenta gravar no sistema de arquivos no volume do MainOS.
  • Um componente grava nos hives do HKLM\SYSTEM registro ou HKLM\SOFTWARE .

Para ajudá-lo a desenvolver componentes que atendam a essas regras, o Windows pode registrar sempre que um componente tentar gravar em um desses locais.

Observe que só porque o Windows rastreia uma operação de gravação não significa necessariamente que haja um problema: um componente pode, às vezes, gravar intencionalmente nos HKLM\SYSTEM hives do registro ou HKLM\SOFTWARE esperando que a alteração seja volátil.

Instrumentação

Existem alguns métodos para coletar logs de atividade do registro e do sistema de arquivos. Determinar o método adequado a ser usado depende do caso de uso e quando, na sequência de inicialização, o driver se torna ativo. Abaixo está uma tabela que resume quando usar cada método para encontrar violações de separação de estado e isolamento de driver.

Método Quando correr? O que ele encontra?
Registrador automático de inicialização antecipada Deseja localizar violações de arquivo que não podem ser encontradas com o Verificador de Driver ou deseja ver violações de arquivo e registro no mesmo rastreamento Todas as violações de arquivo e a maioria das violações de registro
Registrador sob demanda Deseja localizar violações de arquivo que não podem ser encontradas com o Verificador de Driver ou deseja ver violações de arquivo e registro no mesmo rastreamento Todas as violações de arquivo e a maioria das violações de registro
Rastreamento de inicialização Deseja ter informações detalhadas sobre a pilha que levam a uma violação Todas as operações de arquivo e registro, independentemente de serem uma violação ou não
Verificações de isolamento de driver do verificador de driver Deseja encontrar todas as violações do registro durante a ativação do dispositivo, teste de driver genérico e/ou teste de certificação Nenhuma violação de arquivo e todas as violações de registro

Visualização em tempo real das violações

O método mais fácil de rastrear violações de separação de estado é examinar os Rastreamentos de Eventos para Windows (ETW) em tempo real por meio do Portal de Dispositivos do Windows.

Observação

O driver de filtro que fornece essa telemetria pode ser carregado após o componente. Se o seu componente for exercitado no início do processo de inicialização, você precisará examinar a próxima seção.

  1. Faça logon no Portal de Dispositivos do Windows, no dispositivo em teste
  2. Vá para a guia Log do ETW à esquerda.
  3. Em Provedor personalizado, habilite o seguinte provedor: d6e1490c-c3a6-4533-8de2-18b16ce47517 .
  4. Reproduza seu cenário. As violações aparecerão na tabela.
  5. Depois de coletar dados suficientes, clique em Salvar em arquivo para obter um arquivo de texto (.csv) contendo as violações capturadas. Muitas vezes, é mais fácil trabalhar com os dados baixados do que fazer uma análise em tempo real.

AutoLogger de inicialização antecipada

Use um AutoLogger de inicialização antecipada para capturar rastreamentos ETW para operações executadas no início do caminho de inicialização:

  1. Conecte-se ao dispositivo com TShell.

  2. Execute o Tracelog para configurar o autologger para escutar o GUID do provedor: d6e1490c-c3a6-4533-8de2-18b16ce47517.

    Defina buffers como 128 kilobytes, com um mínimo de 12 buffers e um máximo de 34 buffers (valores mais baixos podem fazer com que os eventos sejam descartados).

    Para o guid da sessão, você pode gerar um GUID usando uuidgen e adicionar um sinal de número (#) antes dele ou pode fornecer um nome de arquivo que inclua um GUID.

    Você pode salvar o arquivo de log em qualquer lugar, embora seja recomendável usar um local nas pastas de dados do usuário ou do aplicativo, como -f %ProgramData%\Fabrikam\log.etl.

    Tracelog.exe -addautologger StateSeparationViolationsAutologger -sessionguid #aabbccdd-1234-5678-90ab-a00bb00ccdd -f %ProgramData%\Fabrikam\log.etl -guid #d6e1490c-c3a6-4533-8de2-18b16ce47517 -b 128 -min 12 -max 34
    
  3. Reinicialize o dispositivo para iniciar a sessão de rastreamento do AutoLogger

  4. Conecte-se ao dispositivo com TShell.

  5. Pare o registrador automático:

    Tracelog.exe -stop StateSeparationViolationsAutologger
    
  6. Obtenha o arquivo ETL e revise os dados:

    a. Capture o valor do diretório ProgramData do dispositivo (por exemplo, E:\ProgramData).

    cmd-device -InformationVariable echoInfo echo %ProgramData% $deviceProgramData = $echoInfo[0]
    

    b. Use esse valor para copiar o arquivo ETL do dispositivo para o computador local. Exemplo:

    PS C:\> getd E:\ProgramData\Fabrikam\log.etl C:\hostdir\log.etl
    
  7. Revise os dados de atividade do Log de Rastreamento usando o Windows Performance Analzyer (WPA) ou outras ferramentas.

Registrador sob demanda

Use um agente sob demanda para capturar um rastreamento ETW sob demanda.

  1. Configure uma sessão de log para escutar o GUID do provedor d6e1490c-c3a6-4533-8de2-18b16ce47517:

    Tracelog.exe -start StateSeparationViolations -f <path to save ETL> -guid #d6e1490c-c3a6-4533-8de2-18b16ce47517
    
  2. Reproduza seu cenário ou execute seu teste (desde que o dispositivo não seja reinicializado).

  3. Pare a sessão de log.

    Tracelog.exe -stop StateSeparationViolations
    
  4. Copie o arquivo ETL do dispositivo.

    PS C:\> getd C:\ProgramData\Fabrikam\log.etl C:\hostdir\log.etl
    
  5. Abra o arquivo de log e examine os dados de atividade do Log de Rastreamento usando o Windows Performance Analyzer.

Rastreamento de inicialização

Com um rastreamento ETW de inicialização antecipada configurado corretamente, todas as operações do Registro e/ou operações de arquivo podem ser capturadas em um rastreamento e ter pilhas capturadas para cada operação detalhando o caminho do código que leva a essa operação do Registro.

  1. Conecte-se ao dispositivo com TShell

  2. Registrar rastreamento de inicialização (registro, fileio ou ambos)

    wpr -boottrace -addboot registry
    wpr -boottrace -addboot fileio
    
  3. Reinicialize o dispositivo para começar a capturar o rastreamento.

  4. Conecte-se ao dispositivo com TShell novamente.

  5. Pare o rastreamento:

    wpr -boottrace -stopboot <path where to write ETL>
    
  6. Copie o arquivo ETL do dispositivo.

    PS C:\> getd C:\<path on device to the>\log.etl C:\hostdir\log.etl
    
  7. Abra o arquivo de log e abra os dados de atividade do Log de Rastreamento usando o Windows Performance Analyzer.

  8. No WPA, diga a ele para carregar símbolos para que o binário que está sendo investigado possa ser resolvido nos rastreamentos de pilha e, em seguida, abra uma tabela de resumo do Registro.

    Recomendamos que você filtre a tabela para mostrar apenas as operações para os hives SYSTEM e SOFTWARE. Se estiver exibindo a coluna "árvore de chaves base", expanda REGISTRO e, em seguida, MÁQUINA. Selecione SYSTEM e SOFTWARE, clique com o botão direito do mouse e selecione Filter To Selection.

    Recomendamos que você filtre a tabela apenas para operações em que a pilha envolve o binário que está sendo investigado. Essa filtragem pode ser feita sobre a filtragem apenas para o hive SYSTEM e SOFTWARE recomendado acima. Clique na coluna Pilha e abra a caixa de pesquisa. Insira o nome do binário que está sendo investigado e clique em Localizar tudo. Clique com o botão direito do mouse em uma das linhas realçadas na pilha que continha o nome binário e selecione Filtrar para seleção.

Verificações de isolamento do driver do Verificador de Driver

O DV (Verificador de Driver) é uma ferramenta fornecida com o Windows que é usada para monitorar drivers em busca de chamadas de função inadequadas ou ações que podem corromper o sistema. A partir do build 19568 do sistema operacional, o Verificador de Driver tem uma nova funcionalidade para dar suporte aos desenvolvedores de drivers Windows monitorando violações dos requisitos de isolamento do pacote de driver. O isolamento do pacote de driver é o principal requisito que os drivers devem cumprir nos sistemas do sistema operacional de fábrica para aderir aos requisitos de separação de estado.

O Verificador de Driver monitorará leituras e gravações inadequadas do Registro que não são permitidas em sistemas de sistema operacional de fábrica. Use essa ferramenta no início do desenvolvimento do driver para entender e corrigir onde seu componente está violando os requisitos de isolamento do driver.

Sintaxe:

Observação

Se estiver habilitando em um sistema operacional de fábrica, consulte Conectar usando SSH para conectar-se ao sistema operacional de fábrica remotamente via SSH

verifier /rc 33 36 /driver myDriver.sys

Isso habilitará as verificações de isolamento do driver no driver de destino (myDriver.sys). Você também pode selecionar vários drivers separando a lista com um espaço:

verifier /rc 33 36 /driver myDriver1.sys myDriver2.sys

Uma reinicialização será necessária para que as configurações de verificação sejam habilitadas. Você pode fazer isso especificando:

shutdown /r /t 0

Comportamento esperado - Modo de telemetria:

Durante os estágios iniciais da ativação do driver, o comportamento recomendado para essas verificações é o modo de telemetria. Esse é o comportamento padrão e fornecerá uma maneira para os desenvolvedores visualizarem todas as violações sem que uma verificação de bugs interrompa o progresso.

É recomendável que as verificações de isolamento do driver DV sejam habilitadas usando a sintaxe especificada na seção acima com um depurador de kernel anexado. Depois que uma reinicialização habilitar as configurações de DV, você poderá ver violações na saída do depurador de kernel.

Abaixo estão alguns cenários de exemplo de um driver violando os requisitos de isolamento do driver e como seria a saída típica:

Cenário: ZwCreateKey usando o caminho absoluto completo:

"DRIVER_ISOLATION_VIOLATION: <nome> do driver: as operações do Registro não devem usar caminhos absolutos. Detectada a criação da chave do Registro não isolada '\Registry\Machine\SYSTEM'"

Cenário: ZwCreateKey usando o caminho relativo a um identificador que não é da API aprovada:

"DRIVER_ISOLATION_VIOLATION: <nome> do driver: as operações do Registro só devem usar identificadores de chave retornados de APIs WDF ou WDM. Detectada a criação da chave do Registro não isolada '\REGISTRY\MACHINE\SYSTEM\SomeKeyThatShouldNotExist'"

Aproveite o modo de telemetria para estabelecer uma linha de base de todas as violações do seu componente e comece a corrigi-las uma a uma, testando à medida que avança.

Comportamento esperado - Modo Bucheck:

Mais adiante no processo de desenvolvimento do driver, pode ser valioso habilitar as verificações de isolamento do driver em um modo que tornará uma violação óbvia. O DV pode ser configurado para induzir a verificação de bugs quando ocorre uma violação.

Isso gerará um despejo de memória que fornece detalhes precisos de onde ocorreu a violação. Para habilitar o DV no modo de verificação de bugs, use a seguinte sintaxe:

verifier /onecheck /rc 33 36 /driver myDriver1.sys

Esse modo é útil quando o driver está se aproximando da prontidão de produção e está passando por estágios finais de validação e teste.

Maximizando caminhos de código:

As regras de isolamento do driver DV podem ser habilitadas durante a execução de um IHV de suas estruturas de teste existentes. Isso ajudará a maximizar os caminhos de código exercidos pelo driver que está sendo testado.

Os testes de conceitos básicos do dispositivo por meio da linha de comando são uma boa linha de base de testes para exercitar caminhos de código típicos para o driver. Os desenvolvedores podem habilitar esses testes com verificações de isolamento de driver DV para maximizar o potencial de detectar violações de isolamento de driver o mais cedo possível.

Modo de desenvolvimento: desabilitar a aplicação

Para fins de desenvolvimento, você pode desativar a imposição da Separação de Estado executando no Modo de Desenvolvimento de Separação de Estado. Isso permite que você desenvolva, teste e execute aplicativos e drivers (como aplicativos de teste de fábrica) que não estão em conformidade com os requisitos.

No modo de desenvolvimento:

  • A partição do sistema operacional principal é gravável.
  • Alterações no HKLM\SYSTEMe HKLM\SOFTWARE persistem entre reinicializações.
  • O Windows continua monitorando atividades que, de outra forma, violariam as regras de Separação de Estado.

Você pode configurar o modo de desenvolvimento no momento da criação da imagem, substituindo o recurso: STATESEPARATION_ON por STATESEPARATION_DEVMODE.

A tabela a seguir detalha as diferenças entre cada modo.

Modo de separação de estado Acesso imutável ao sistema de arquivos Acesso imutável ao Registro
Modo de imposição Gravações não permitidas As alterações do Registro não persistem durante a reinicialização
Aviso de violação no ETW e na saída do depurador Aviso de violação no ETW e na saída do depurador
Modo Dev Leitura/gravação permitida As alterações do registro persistem durante a reinicialização
Aviso de violação no ETW e na saída do depurador Aviso de violação no ETW e na saída do depurador