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:

  1. Alocar armazenamento para a ACL.

  2. Inicializar a ACL.

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