Partilhar via


Lista de Controlo 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 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:

  1. Alocar armazenamento para a ACL.

  2. Inicialize a ACL.

  3. 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.