Compartir a través de


Lista de control de acceso

Una lista de control de acceso (ACL) es una lista de entradas de control de acceso (ACE) creadas por el sistema operativo para controlar el comportamiento de seguridad asociado a un objeto determinado (protegido) de algún tipo. En Windows hay dos tipos de ACL:

  • Una ACL discrecional es una lista de cero o más ACE que describen los derechos de acceso de un objeto protegido. Es discrecional porque el acceso concedido es a discreción del propietario o de cualquier usuario con los derechos adecuados.

  • Una ACL del sistema es una lista de cero o más ACE que describen la directiva de auditoría y alarma para un objeto protegido.

El término "discrecional" hace referencia a la diferenciación entre el control discrecional y obligatorio. En un entorno que usa controles obligatorios, es posible que el propietario de un objeto no pueda conceder acceso al objeto. En un entorno discrecional, como Windows, el propietario de un objeto puede conceder dicho acceso. Normalmente, los controles obligatorios están asociados a entornos de seguridad estrictos, como los que usan seguridad compartimentada, donde el sistema debe impedir la divulgación de información confidencial entre los usuarios del mismo sistema.

Un controlador que construye una ACL sigue algunos pasos clave:

  1. Asigna el almacenamiento para la ACL.

  2. Inicializa la ACL.

  3. Agrega cero (o más) ACE a la ACL.

En el siguiente ejemplo de código se muestra cómo construir una ACL:

    dacl = ExAllocatePool(PagedPool, PAGE_SIZE);
    if (!dacl) {
        return;
    }
    status = RtlCreateAcl(dacl, PAGE_SIZE, ACL_REVISION);
    if (!NT_SUCCESS(status)) {
        ExFreePool(dacl);
        return;
    }

El fragmento de código anterior crea una ACL vacía. El ejemplo de código asigna una cantidad significativa de memoria, ya que no sabemos el tamaño necesario para la ACL.

En este momento, la ACL está vacía porque no tiene entradas ACE. Una ACL vacía deniega el acceso a cualquier usuario que intente acceder al objeto porque no hay entradas que concedan dicho acceso. El fragmento de código siguiente agrega una ACE a esta ACL:

    status = RtlAddAccessAllowedAce(dacl, ACL_REVISION,  FILE_ALL_ACCESS, SeExports->SeWorldSid);
    if (!NT_SUCCESS(status)) {
        ExFreePool(dacl);
        return;
    }

La ACE agregada concede acceso a cualquier entidad que tenga acceso al objeto, que es el propósito del SID de acceso mundial (SeWorldSid). Este SID se representa normalmente como acceso de "Todos" en otras utilidades del sistema de Windows.

Al construir ACL, es importante colocar entradas ACE con acceso denegado al principio de la ACL y entradas ACE con acceso permitido al final de la ACL. Este orden es importante. De lo contrario, el monitor de referencia de seguridad concederá acceso si encuentra una ACE con acceso permitido antes que una ACE con acceso denegado cuando evalúa la ACL. Este comportamiento está bien documentado en el SDK de Microsoft Windows, pero se relaciona con el mecanismo específico que usa el monitor de referencia de seguridad para determinar si se debe conceder o denegar el acceso.