Llista de controle de acesso
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, há dois tipos de ACLs:
Uma ACL discricionária é uma lista de zero ou mais ACEs que descrevem os direitos de acesso para um objeto protegido. É discricionária porque o acesso concedido fica a critério do proprietário ou de qualquer usuário com os 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 controle obrigatório e 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 controles obrigatórios são normalmente associados a ambientes de segurança rígidos, como aqueles que usam segurança compartimentada, em que o sistema deve impedir a divulgação de informações confidenciais entre usuários no mesmo sistema.
Um driver que constrói uma ACL segue algumas etapas principais:
Alocar armazenamento para a ACL.
Inicializar a ACL.
Adicionar zero (ou mais) ACEs à ACL.
Os exemplos de código a seguir demonstram como criar 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, já 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 o 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;
}
A ACE adicionada concede acesso a qualquer entidade que acesse o objeto, que é a finalidade do SID de acesso mundial (SeWorldSid). Esse SID normalmente é representado como acesso "Todos" em outros utilitários do sistema Windows.
Ao criar ACLs, é importante colocar entradas ACE com acesso negado no início da ACL e entradas ACE permitidas no final da ACL. Esta ordem é importante. Caso contrário, o monitor de referência de segurança concederá acesso se encontrar uma ACE com permissão de acesso antes de uma ACE com acesso negado 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.