Skip to content

Commit

Permalink
landlock: Use f_cred in security_file_open() hook
Browse files Browse the repository at this point in the history
Use landlock_cred(file->f_cred)->domain instead of
landlock_get_current_domain() in security_file_open() hook
implementation.

This should not change the current behavior but could avoid potential
race conditions in case of current task's credentials change.

This will also ensure consistency with upcoming audit support relying on
file->f_cred.

Add and use a new get_fs_domain() helper to mask non-filesystem domains.

file->f_cred is set by path_openat()/alloc_empty_file()/init_file() just
before calling security_file_alloc().

Cc: Christian Brauner <[email protected]>
Cc: Günther Noack <[email protected]>
Cc: Jann Horn <[email protected]>
Cc: Paul Moore <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Mickaël Salaün <[email protected]>
  • Loading branch information
l0kod committed Mar 8, 2024
1 parent e3e37fe commit 63817fe
Showing 1 changed file with 11 additions and 7 deletions.
18 changes: 11 additions & 7 deletions security/landlock/fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,15 +248,18 @@ get_handled_fs_accesses(const struct landlock_ruleset *const domain)
LANDLOCK_ACCESS_FS_INITIALLY_DENIED;
}

static const struct landlock_ruleset *get_current_fs_domain(void)
static const struct landlock_ruleset *
get_fs_domain(const struct landlock_ruleset *const domain)
{
const struct landlock_ruleset *const dom =
landlock_get_current_domain();

if (!dom || !get_raw_handled_fs_accesses(dom))
if (!domain || !get_raw_handled_fs_accesses(domain))
return NULL;

return dom;
return domain;
}

static const struct landlock_ruleset *get_current_fs_domain(void)
{
return get_fs_domain(landlock_get_current_domain());
}

/*
Expand Down Expand Up @@ -1334,7 +1337,8 @@ static int hook_file_open(struct file *const file)
layer_mask_t layer_masks[LANDLOCK_NUM_ACCESS_FS] = {};
access_mask_t open_access_request, full_access_request, allowed_access;
const access_mask_t optional_access = LANDLOCK_ACCESS_FS_TRUNCATE;
const struct landlock_ruleset *const dom = get_current_fs_domain();
const struct landlock_ruleset *const dom =
get_fs_domain(landlock_cred(file->f_cred)->domain);

if (!dom)
return 0;
Expand Down

0 comments on commit 63817fe

Please sign in to comment.