Kernel Address Sanitizer (KASAN)
O Kasaner (Kernel Address Sanitizer) é uma tecnologia de detecção de bugs com suporte em drivers de kernel do Windows que permite detectar 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 o driver do kernel com um sinalizador de compilador MSVC específico.
Pré-requisitos
Para usar o KASAN, você precisa:
- Versão do sistema operacional do sistema de destino, no 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.
O KASAN é suportado apenas em x64.
Como habilitar o KASAN no driver do kernel
Insira 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
Reinicialize o sistema de destino para que a alteração entre em vigor.
Recompile o driver do kernel com a instrumentação KASAN habilitada 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é Propriedades de Configuração>>C/C++>>Geral e defina Habilitar Kernel Em seguida, recompile sua solução.
- Prompt de comando: adicione o parâmetro /fsanitize=kernel-address à linha de comando do compilador. Em seguida, recompile sua solução.
Carregue o driver do kernel recompilado no sistema de destino e teste-o como faria normalmente. O KASAN opera em tempo de execução e relata eventos ilegais de acesso à memória por meio do 0x1F2 de verificação de bugs: KASAN_ILLEGAL_ACCESS.
Como verificar se o KASAN está habilitado no driver do kernel
Os drivers do kernel compilados com KASAN têm uma seção PE chamada "KASAN
". Verifique se o KASAN está habilitado 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 KASAN está habilitado em seu driver.
Como analisar relatórios KASAN
Quando o KASAN detecta um acesso ilegal à memória em seu driver, ele emite a Verificação de Bugs 0x1F2: KASAN_ILLEGAL_ACCESS. Inspecione o despejo de memória do kernel gerado para determinar onde exatamente o driver executou um acesso ilegal à memória.
Use o KASAN com um depurador de kernel anexado ao sistema de destino para que a memória possa ser inspecionada dinamicamente assim que a verificação de bugs for emitida, em vez de 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:
- Parâmetro 1: Endereço que está sendo acessado ilegalmente.
- Parâmetro 2: Tamanho do acesso à memória.
- Parâmetro 3: Endereço do chamador que executa o acesso ilegal à memória.
- Parâmetro 4: Informações extras 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, consideramos que toda a memória do kernel é dividida em pedaços contíguos de células de oito bytes alinhadas a 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:
Valor | Significado |
---|---|
0x00 |
A célula é totalmente válida: os acessos a todos os oito bytes da célula são legais. |
0x01 ->0x07 |
A célula é parcialmente válida: os bytes do primeiro valor na célula são válidos, mas o restante é inválido. |
>= 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 totalmente inválidas para indicar ainda mais a que tipo de memória a célula está associada e por que ela é inválida:
0x81
: Zona vermelha esquerda de Alloca.0x82
: Zona vermelha média de Alloca.0x83
: zona vermelha direita de alloca.0x84
: zona vermelha direita da variável global.0x85
: redzone genérico.0x86
: zona vermelha direita da memória do pool.0x87
: memória liberada.0x8A
: zona vermelha esquerda da memória contígua.0x8B
: zona vermelha direita da memória contígua.0x8C
: memória lookasidelist liberada.0x8D
: redzone esquerda da memória do pool.0xF1
: redzone esquerda da variável de pilha.0xF2
: redzone médio da variável de pilha.0xF3
: redzone direita da variável de pilha.0xF5
: variável de pilha used-after-ret.0xF8
: variável de pilha fora do escopo.
Entenda as verificações de bugs do KASAN: um exemplo
Suponha que o KASAN emitiu uma verificação de bug quando o driver estava em execução, com estes parâmetros:
- Parâmetro 1:
0xFFFFFFFFFFFFABCD
- Parâmetro 2:
0x0000000000000004
- Parâmetro 3:
0xFFFFFFFF12345678
- Parâmetro 4:
0x0000000000000184
O parâmetro 1 informa que o driver tentou acessar o endereço 0xFFFFFFFFFFFFABCD
e que esse acesso era ilegal. O parâmetro 2 informa que foi um acesso de quatro bytes. O parâmetro 3 fornece o endereço do ponteiro de instrução no qual o driver executou o acesso ilegal. O parâmetro 4 informa que esse foi um acesso de gravação e que a memória que está sendo tocada era a redzone correta 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 no desempenho do KASAN
O KASAN aumenta o consumo de memória do kernel e introduz uma desaceleração aproximada de duas vezes nos drivers compilados com o KASAN habilitado.
Comparação com o Verificador de Driver
O KASAN e o Verificador de Driver são recursos totalmente separados, mas são mutuamente compatíveis.
O KASAN está focado na detecção de acessos ilegais à memória e é mais eficiente do que o Verificador de Driver nesse domínio, pois usa uma abordagem mais refinada e abrange mais regiões de memória. O Verificador de Driver possui regras específicas do driver que visam encontrar outros tipos de bugs, que o KASAN não detecta. Para obter mais informações, consulte Microsoft: Introdução aos sanitizadores de kernel nas plataformas Microsoft.
Use o KASAN em conjunto com o Verificador de Driver para maximizar a detecção de bugs em seu driver.