Liste de contrôle d’accès
Une liste de contrôle d’accès (ACL) est une liste d’entrées de contrôle d’accès (ACE) créée par le système d’exploitation pour contrôler le comportement de sécurité associé à un objet (protégé) donné. Sous Windows, il existe deux types d’ACL :
Une ACL discrétionnaire est une liste de zéro ou plusieurs ACEs qui décrivent les droits d’accès pour un objet protégé. Elle est discrétionnaire car l’accès accordé est à la discrétion du propriétaire ou de tout utilisateur disposant des droits appropriés.
Une ACL système est une liste de zéro ou plusieurs ACEs qui décrivent la politique d’audit et d’alarme pour un objet protégé.
Le terme « discrétionnaire » fait référence à la différenciation entre le contrôle obligatoire et le contrôle discrétionnaire. Dans un environnement utilisant des contrôles obligatoires, le propriétaire d’un objet peut ne pas être en mesure d’accorder l’accès à l’objet. Dans un environnement discrétionnaire, comme Windows, le propriétaire d’un objet est autorisé à accorder cet accès. Les contrôles obligatoires sont généralement associés à des environnements de haute sécurité, tels que ceux utilisant la sécurité compartimentée, où le système doit empêcher la divulgation d’informations sensibles entre utilisateurs du même système.
Un pilote construisant une ACL suit quelques étapes clés :
Allouer un espace de stockage pour l’ACL.
Initialiser l’ACL.
Ajouter zéro (ou plus) ACEs à l’ACL.
Les exemples de code suivants démontrent comment construire une ACL :
dacl = ExAllocatePool(PagedPool, PAGE_SIZE);
if (!dacl) {
return;
}
status = RtlCreateAcl(dacl, PAGE_SIZE, ACL_REVISION);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
Le fragment de code précédent crée une ACL vide. L’exemple de code alloue une quantité importante de mémoire, car nous ne connaissons pas la taille requise pour l’ACL.
À ce stade, l’ACL est vide car elle ne contient aucune entrée ACE. Une ACL vide refuse l’accès à toute personne tentant d’accéder à l’objet car il n’y a aucune entrée qui accorde cet accès. Le fragment de code suivant ajoute une ACE à cette ACL :
status = RtlAddAccessAllowedAce(dacl, ACL_REVISION, FILE_ALL_ACCESS, SeExports->SeWorldSid);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
L’ACE ajoutée accorde l’accès à toute entité qui accède à l’objet, ce qui est l’objectif du SID d’accès mondial (SeWorldSid). Ce SID est généralement représenté comme un accès « Tout le monde » dans d’autres utilitaires système Windows.
Lors de la construction des ACL, il est important de placer les entrées ACE refusant l’accès au début de l’ACL, et les entrées ACE accordant l’accès à la fin de l’ACL. Cet ordre est important. Sinon, le moniteur de référence de sécurité accordera l’accès s’il trouve une ACE accordant l’accès avant une ACE refusant l’accès lorsqu’il évalue l’ACL. Ce comportement est bien documenté dans le Microsoft Windows SDK, mais il est lié au mécanisme spécifique que le moniteur de référence de sécurité utilise pour déterminer si l’accès doit être accordé ou refusé.