Partilhar via


Sanitizador de Endereço de Kernel (KASAN)

O Kernel Address Sanitizer (KASAN) é uma tecnologia de deteção de bugs suportada nos drivers do kernel do Windows que permite detetar várias classes de acessos ilegais à memória, como estouros de buffer e eventos de uso após liberação. Ele requer que você habilite o KASAN em seu sistema e recompile seu driver do kernel com um sinalizador de compilador MSVC específico.

Pre-requisites

Para utilizar KASAN, necessita:

  • Versão do SO do sistema de destino, na qual o driver do kernel será carregado:
    • Cliente: Windows 11 24H2 ou superior.
    • Servidor: Windows Server 2025 ou superior.
  • VisualStudio: versão 17.11 ou superior.
  • WDK: versão 10.0.26100.2161 ou superior.

KASAN é suportado apenas em x64.

Como ativar o KASAN no driver do kernel

  1. Digite a seguinte linha de comando em uma janela do prompt de comando do administrador no sistema de destino:

    reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1
    

    A configuração dessa chave do Registro instrui o kernel do Windows a se preparar e aceitar o carregamento de drivers instrumentados KASAN. Não definir essa chave do Registro faz com que o kernel do Windows recuse o carregamento de drivers instrumentados KASAN.

  2. Reinicialize o sistema de destino para que a alteração entre em vigor.

  3. Recompile o driver do kernel com a instrumentação KASAN ativada passando um novo sinalizador para o compilador MSVC. Use um dos seguintes métodos:

    • GUI: no VisualStudio, navegue até o Gerenciador de Soluções, clique com o botão direito do mouse no projeto de driver do kernel e selecione Propriedades. Na página de propriedades, navegue até Configuration Properties>>C/C++>>General e defina Enable Kernel Address Sanitizer como Yes. Em seguida, reconstrua sua solução.
    • Prompt de comando: adicione o parâmetro /fsanitize=kernel-address à linha de comando do compilador. Em seguida, reconstrua sua solução.
  4. Carregue o driver do kernel recompilado em seu sistema de destino e faça um teste de estresse como faria normalmente. KASAN opera em tempo de execução e relata eventos ilegais de acesso à memória via Bug Check 0x1F2: KASAN_ILLEGAL_ACCESS.

Regressão no Visual Studio 17.12

Se você estiver usando o VisualStudio 17.12, você pode encontrar o seguinte erro de compilação:

error LNK2019: unresolved external symbol __asan_wrap_wcscat referenced in function

Você pode contornar esse erro adicionando o seguinte sinalizador à linha de comando do vinculador:

/alternatename:__asan_wrap_wcscat=wcscat

Essa regressão foi corrigida no VisualStudio 17.14.15.

Regressão no VisualStudio 17.14 a 17.14.14

Se você estiver usando o VisualStudio 17.14, você pode encontrar o seguinte erro de compilação:

error LNK2001: unresolved external symbol __LINK_WITH_asan_compat.lib_TO_USE_NEW_COMPILER_WITH_OLDER_ASAN_RUNTIME

Você pode contornar esse erro adicionando o seguinte sinalizador à linha de comando do compilador:

/fno-sanitize-address-asan-compat-lib

E os seguintes sinalizadores para a linha de comando do vinculador:

/alternatename:__asan_wrap_wcscat=wcscat
/alternatename:__asan_wrap_wcscpy=wcscpy
/alternatename:__asan_wrap_wcsncpy=wcsncpy

Essa regressão foi corrigida no VisualStudio 17.14.15.

Como verificar se o KASAN está ativado no driver do kernel

Os drivers do kernel compilados com KASAN têm uma seção PE chamada "KASAN". Verifique se o KASAN está ativado no driver executando o seguinte comando em um prompt de comando do desenvolvedor:

dumpbin /ALL YourDriver.sys

Se a saída contiver uma seção chamada "KASAN", então o KASAN está ativado no seu driver.

Como analisar relatórios KASAN

Quando o KASAN deteta um acesso ilegal à memória no seu driver, ele emite o Bug Check 0x1F2: KASAN_ILLEGAL_ACCESS. Inspecione o despejo de memória do kernel gerado para determinar onde exatamente seu driver executou um acesso ilegal à memória.

Use KASAN com um depurador de kernel conectado ao sistema de destino para que a memória possa ser inspecionada dinamicamente assim que a checagem de erro for emitida, em vez de ser feita post-mortem com um despejo de memória.

Parâmetros de verificação de bugs

Os parâmetros do Bug Check 0x1F2: KASAN_ILLEGAL_ACCESS são:

  1. Parâmetro 1: Endereço acessado ilegalmente.
  2. Parâmetro 2: Tamanho do acesso à memória.
  3. Parâmetro 3: Endereço do chamador que executa o acesso ilegal à memória.
  4. Parâmetro 4: Informações adicionais sobre o acesso à memória:
    • Bits [0:7]: o código de sombra KASAN. Veja a tabela abaixo.
    • Bit 8: 1 se o acesso foi uma gravação, 0 se foi uma leitura.

Códigos de sombra KASAN

No KASAN, entendemos que toda a memória do kernel é dividida em fragmentos contíguos de células alinhadas de oito bytes. Com o KASAN, cada célula de oito bytes na memória do kernel tem um código de sombra associado a ela, que é um inteiro de um byte que indica a validade da célula. A codificação dos códigos de sombra é a seguinte:

Value Meaning
0x00 A célula é inteiramente válida: os acessos a todos os oito bytes da célula são legais.
0x01 ->0x07 A célula é parcialmente válida: os primeiros bytes de valor na célula são válidos, mas os restantes são inválidos.
0x08 ->0x7F A célula é condicionalmente válida: os acessos a todos os oito bytes da célula podem ser legais ou ilegais, dependendo de condições específicas.
>= 0x80 A célula é totalmente inválida: os acessos a todos os oito bytes da célula são ilegais.

Vários subcódigos são usados para as células condicionalmente válidas e totalmente inválidas para indicar melhor a que tipo de memória a célula está associada e por que o acesso a ela pode ser ilegal.

Subcódigos utilizados por células condicionalmente válidas:

  • 0x09: memória paginável, que é ilegal para acessar em DISPATCH_LEVEL ou acima, mas legal para acessar de outra forma.

Subcódigos utilizados por células totalmente inválidas:

  • 0x81: zona vermelha à esquerda de alloca.
  • 0x82: zona intermédia de proteção de memória de alloca.
  • 0x83: redzone direita de alloca.
  • 0x84: zona de proteção direita da variável global.
  • 0x85: zona vermelha genérica.
  • 0x86: redzone direita da memória do pool.
  • 0x87: Memória de pool liberada.
  • 0x8A: zona vermelha esquerda de memória contígua.
  • 0x8B: zona vermelha direita de memória contígua.
  • 0x8C: a memória lookaside list foi libertada.
  • 0x8D: redzone à esquerda da memória do pool.
  • 0xF1: redzone esquerda da variável de pilha.
  • 0xF2: zona vermelha do meio da variável pilha.
  • 0xF3: zona de proteção direita da variável de pilha.
  • 0xF5: variável de pilha usada após retorno.
  • 0xF8: variável de pilha fora do escopo.

Entenda as verificações de bugs da KASAN: um exemplo

Suponha que o KASAN emitiu uma verificação de bug quando seu driver estava em execução, com estes parâmetros:

  1. Parâmetro 1: 0xFFFFFFFFFFFFABCD
  2. Parâmetro 2: 0x0000000000000004
  3. Parâmetro 3: 0xFFFFFFFF12345678
  4. Parâmetro 4: 0x0000000000000184

O parâmetro 1 informa que seu driver tentou acessar o endereço 0xFFFFFFFFFFFFABCD e que esse acesso era ilegal. O parâmetro 2 informa que era um acesso de quatro bytes. O parâmetro 3 fornece o endereço do ponteiro de instrução no qual o motorista executou o acesso ilegal. O parâmetro 4 informa que se tratava de um acesso de gravação e que a memória que estava sendo tocada era a redzone direita de uma variável global.

Em outras palavras, seu driver provavelmente tentou executar um estouro de buffer de gravação em uma variável global. Use essas informações para investigar e determinar onde e como corrigir esse bug em seu driver.

Impacto do KASAN no desempenho

KASAN aumenta o consumo de memória do kernel e provoca uma lentidão aproximadamente duas vezes maior nos drivers compilados com o KASAN ativado.

Comparação com o Driver Verifier

KASAN e Driver Verifier são recursos totalmente separados, mas são mutuamente compatíveis.

O KASAN está focado em detetar acessos ilegais à memória e é mais eficiente do que o Verificador de Driver nesse domínio, porque usa uma abordagem mais refinada e cobre mais regiões de memória. Driver Verifier tem regras específicas do driver que visam encontrar outros tipos de bugs, que KASAN não deteta. Para obter mais informações, consulte Microsoft: Introduzindo saneadores de kernel nas plataformas Microsoft.

Use o KASAN em conjunto com o Driver Verifier para maximizar a deteção de bugs no seu driver.

Resources