Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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
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 1A 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.
Reinicialize o sistema de destino para que a alteração entre em vigor.
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.
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:
- Parâmetro 1: Endereço 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 adicionais sobre o acesso à memória:
- Bits [0:7]: o código de sombra KASAN. Veja a tabela abaixo.
- Bit 8:
1se o acesso foi uma gravação,0se 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:
- Parâmetro 1:
0xFFFFFFFFFFFFABCD - Parâmetro 2:
0x0000000000000004 - Parâmetro 3:
0xFFFFFFFF12345678 - 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.