• Daniel Burgener's avatar
    selinux: Create new booleans and class dirs out of tree · 0eea6091
    Daniel Burgener authored
    In order to avoid concurrency issues around selinuxfs resource availability
    during policy load, we first create new directories out of tree for
    reloaded resources, then swap them in, and finally delete the old versions.
    
    This fix focuses on concurrency in each of the two subtrees swapped, and
    not concurrency between the trees.  This means that it is still possible
    that subsequent reads to eg the booleans directory and the class directory
    during a policy load could see the old state for one and the new for the other.
    The problem of ensuring that policy loads are fully atomic from the perspective
    of userspace is larger than what is dealt with here.  This commit focuses on
    ensuring that the directories contents always match either the new or the old
    policy state from the perspective of userspace.
    
    In the previous implementation, on policy load /sys/fs/selinux is updated
    by deleting the previous contents of
    /sys/fs/selinux/{class,booleans} and then recreating them.  This means
    that there is a period of time when the contents of these directories do not
    exist which can cause race conditions as userspace relies on them for
    information about the policy.  In addition, it means that error recovery in
    the event of failure is challenging.
    
    In order to demonstrate the race condition that this series fixes, you
    can use the following commands:
    
    while true; do cat /sys/fs/selinux/class/service/perms/status
    >/dev/null; done &
    while true; do load_policy; done;
    
    In the existing code, this will display errors fairly often as the class
    lookup fails.  (In normal operation from systemd, this would result in a
    permission check which would be allowed or denied based on policy settings
    around unknown object classes.) After applying this patch series you
    should expect to no longer see such error messages.
    Signed-off-by: default avatarDaniel Burgener <dburgener@linux.microsoft.com>
    Acked-by: default avatarStephen Smalley <stephen.smalley.work@gmail.com>
    Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
    0eea6091
selinuxfs.c 53.3 KB