Atributos estendidos do kernel
Do Windows 8 em diante, o NTFS oferece suporte aos EAs (atributos estendidos) do kernel. Verificar a assinatura de uma imagem é uma operação cara. Armazenar informações sobre se um binário validado anteriormente foi alterado reduz o número de instâncias em que uma imagem precisa passar por uma verificação completa de assinatura. O uso de EAs do kernel por esse motivo impulsiona o desempenho da validação da assinatura do arquivo de imagem.
EAs com o prefixo de nome $Kernel
só podem ser modificados no modo kernel. Qualquer EA que comece com essa cadeia de caracteres é considerado um EA do kernel. Antes de recuperar o USN (número de sequência de atualização) necessário, é recomendável primeiro emitir FSCTL_WRITE_USN_CLOSE_RECORD para confirmar todas as atualizações pendentes do diário de USN no arquivo que possam ter ocorrido anteriormente. Caso contrário, o valor FileUSN pode mudar logo após a configuração do EA do kernel.
É recomendável que um EA do kernel contenha pelo menos as seguintes informações:
USN UsnJournalID
- O campo UsnJournalID é um GUID que identifica a encarnação atual do arquivo de diário de USN. O diário de USN pode ser excluído e criado no modo de usuário por volume. Cada vez que o diário de USN é criado, um novo GUID UsnJournalID é gerado. Com esse campo, você poderá saber se houve um período em que o diário de USN foi desativado e poderá revalidar.
- Esse valor poderá ser recuperado usando o comando FSCTL_QUERY_USN_JOURNAL.
- O campo UsnJournalID é um GUID que identifica a encarnação atual do arquivo de diário de USN. O diário de USN pode ser excluído e criado no modo de usuário por volume. Cada vez que o diário de USN é criado, um novo GUID UsnJournalID é gerado. Com esse campo, você poderá saber se houve um período em que o diário de USN foi desativado e poderá revalidar.
USN FileUSN
- O valor FileUSN contém a ID do USN da última alteração feita no arquivo e é rastreado dentro do registro da MFT (tabela mestra de arquivos) para o arquivo fornecido.
- Quando o diário do USN é excluído, FileUSN é redefinido como zero.
- O valor FileUSN contém a ID do USN da última alteração feita no arquivo e é rastreado dentro do registro da MFT (tabela mestra de arquivos) para o arquivo fornecido.
Essas informações, juntamente com qualquer outra que um determinado uso possa precisar, são definidas no arquivo como um EA do kernel.
Configurar um atributo estendido do kernel
Para definir um EA do kernel, ele deve começar com o prefixo "$Kernel."
seguido por uma cadeia de caracteres de nome de EA válida. Uma tentativa de definir um EA do kernel no modo de usuário é ignorada silenciosamente. A solicitação retorna o valor STATUS_SUCCESS, mas nenhuma modificação real do EA é feita. Chamar uma API, como ZwSetEaFile ou FltSetEaFile, para definir um EA de kernel no modo kernel não é suficiente, pois o SMB aceita a configuração de EAs na rede, e essas solicitações são emitidas do modo kernel no servidor.
Para definir um EA do kernel, o chamador também deve definir o valor IRP_MN_KERNEL_CALL no campo MinorFunction do IRP (pacote de solicitação de E/S). Como a única maneira de definir esse campo é gerando um IRP personalizado, a rotina FsRtlSetKernelEaFile foi exportada do pacote FsRtl como uma função de suporte para configurar um EA do kernel.
Do Windows 10 versão 1803 em diante, os EAs de usuário e os EAs do kernel poderão ser misturados. Definir um EA do kernel não gera um registro USN_REASON_EA_CHANGE para o diário de USN. O sistema gera USN_REASON_EA_CHANGE quando qualquer EA de usuário é definido.
Consultar um atributo estendido
Consultar os EAs em um arquivo no modo de usuário retorna EAs normais e do kernel. Eles são retornados ao modo de usuário para minimizar problemas de compatibilidade de aplicativos. As operações normais ZwQueryEaFile e FltQueryEaFile retornam EAs normais e do kernel dos modos de usuário e kernel.
Quando apenas um FileObject está disponível, usar FsRtlQueryKernelEaFile pode ser mais conveniente para uso para consultar EAs do kernel no modo kernel.
Consultar informações do diário de número de sequência de atualização
A operação FSCTL_QUERY_USN_JOURNAL requer SE_MANAGE_VOLUME_PRIVILEGE mesmo quando emitida do modo kernel, a menos que o valor IRP_MN_KERNEL_CALL tenha sido definido no campo MinorFunction do IRP. A rotina FsRtlKernelFsControlFile foi exportada do pacote FsRtl no kernel para permitir facilmente que os componentes do modo kernel emitam essa solicitação de USN.
OBSERVAÇÃO Do Windows 10 versão 1703 e posterior em diante, essa operação não exige mais SE_MANAGE_VOLUME_PRIVILEGE.
Exclusão automática de atributos estendidos do kernel
Simplesmente verificar novamente um arquivo porque o ID de USN do arquivo foi alterado pode custar caro, pois há muitos motivos inofensivos pelos quais uma atualização do USN pode ser postada no arquivo. Para simplificar, um recurso de exclusão automática de EAs do kernel foi adicionado ao NTFS.
Nesse cenário, pode não ser conveniente excluir todos os EAs do kernel, então um nome de prefixo de EA é usado. Se um EA do kernel começar com: "$Kernel.Purge."
, então, se qualquer um dos seguintes motivos de USN for gravado no diário do USN, o NTFS excluirá todos os EAs do kernel existentes no arquivo em questão que estejam em conformidade com a sintaxe de nomenclatura fornecida:
- USN_REASON_DATA_OVERWRITE
- USN_REASON_DATA_EXTEND
- USN_REASON_DATA_TRUNCATION
- USN_REASON_REPARSE_POINT_CHANGE
Essa exclusão de EAs do kernel é bem-sucedida mesmo em situações de pouca memória.
Comentários
Os componentes do modo de usuário não podem adulterar EAs do kernel. Os EAs do kernel podem existir no mesmo arquivo que um EA normal.
Confira também
FltQueryEaFile
FltSetEaFile
FSCTL_QUERY_USN_JOURNAL
FsRtlQueryKernelEaFileFsRtlSetKernelEaFile
ZwQueryEaFile
ZwSetEaFile