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.
Uma lista de controle de acesso (ACL) é uma lista de entradas de controle de acesso (ACEs) criadas pelo sistema operacional para controlar o comportamento de segurança associado a um determinado objeto (protegido) de algum tipo. No Windows existem dois tipos de ACLs:
Um ACL discricionário é uma lista de zero ou mais ACEs que descrevem os direitos de acesso para um objeto protegido. É discricionário porque o acesso concedido fica a critério do proprietário ou de qualquer usuário com direitos apropriados.
Uma ACL do sistema é uma lista de zero ou mais ACEs que descrevem a política de auditoria e alarme para um objeto protegido.
O termo "discricionário" refere-se à diferenciação entre controlo obrigatório e controlo discricionário. Em um ambiente que usa controles obrigatórios, o proprietário de um objeto pode não ser capaz de conceder acesso ao objeto. Em um ambiente discricionário, como o Windows, o proprietário de um objeto tem permissão para conceder esse acesso. Os controlos obrigatórios estão normalmente associados a ambientes de segurança apertada, como os que utilizam segurança compartimentada, em que o sistema deve impedir a divulgação de informações sensíveis entre utilizadores no mesmo sistema.
Um driver que constrói uma ACL segue algumas etapas principais:
Alocar armazenamento para a ACL.
Inicialize a ACL.
Adicione zero (ou mais) ACEs à ACL.
Os exemplos de código a seguir demonstram como construir uma ACL:
dacl = ExAllocatePool(PagedPool, PAGE_SIZE);
if (!dacl) {
return;
}
status = RtlCreateAcl(dacl, PAGE_SIZE, ACL_REVISION);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
O fragmento de código anterior cria uma ACL vazia. O exemplo de código aloca uma quantidade significativa de memória, uma vez que não sabemos o tamanho necessário para a ACL.
Neste ponto, a ACL está vazia porque não tem entradas ACE. Uma ACL vazia nega acesso a qualquer pessoa que tente acessar o objeto porque não há entradas que concedam esse acesso. O fragmento de código a seguir adiciona uma ACE a essa ACL:
status = RtlAddAccessAllowedAce(dacl, ACL_REVISION, FILE_ALL_ACCESS, SeExports->SeWorldSid);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
O ACE adicionado concede acesso a qualquer entidade que acesse o objeto, que é a finalidade do SID de acesso mundial (SeWorldSid). Este SID é normalmente representado como acesso "Todos" em outros utilitários de sistema do Windows.
Ao construir ACLs, é importante colocar entradas ACE de acesso negado no início da ACL e entradas ACE de acesso permitido no final da ACL. Esta ordem é importante. Caso contrário, o monitor de referência de segurança concederá acesso se encontrar uma ACE de permissão de acesso antes de uma ACE de negação de acesso ao avaliar a ACL. Esse comportamento está bem documentado no SDK do Microsoft Windows, mas está relacionado ao mecanismo específico que o monitor de referência de segurança usa para determinar se o acesso deve ser concedido ou negado.