Skip to content

Commit

Permalink
landlock: Optimize scope enforcement
Browse files Browse the repository at this point in the history
Do not walk through the domain hierarchy when the required scope is not
supported by this domain.  This is the same approach as for filesystem
and network restrictions.

Cc: Günther Noack <[email protected]>
Cc: Mikhail Ivanov <[email protected]>
Cc: Tahera Fahimi <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Mickaël Salaün <[email protected]>
  • Loading branch information
l0kod committed Oct 14, 2024
1 parent 059a40b commit fe76bd1
Showing 1 changed file with 19 additions and 3 deletions.
22 changes: 19 additions & 3 deletions security/landlock/task.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,12 +204,22 @@ static bool is_abstract_socket(struct sock *const sock)
return false;
}

static const struct landlock_ruleset *get_current_unix_scope_domain(void)
{
const union access_masks unix_scope = {
.scope = LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET,
};

return landlock_match_ruleset(landlock_get_current_domain(),
unix_scope);
}

static int hook_unix_stream_connect(struct sock *const sock,
struct sock *const other,
struct sock *const newsk)
{
const struct landlock_ruleset *const dom =
landlock_get_current_domain();
get_current_unix_scope_domain();

/* Quick return for non-landlocked tasks. */
if (!dom)
Expand All @@ -225,7 +235,7 @@ static int hook_unix_may_send(struct socket *const sock,
struct socket *const other)
{
const struct landlock_ruleset *const dom =
landlock_get_current_domain();
get_current_unix_scope_domain();

if (!dom)
return 0;
Expand All @@ -243,6 +253,10 @@ static int hook_unix_may_send(struct socket *const sock,
return 0;
}

static const union access_masks signal_scope = {
.scope = LANDLOCK_SCOPE_SIGNAL,
};

static int hook_task_kill(struct task_struct *const p,
struct kernel_siginfo *const info, const int sig,
const struct cred *const cred)
Expand All @@ -256,6 +270,7 @@ static int hook_task_kill(struct task_struct *const p,
} else {
dom = landlock_get_current_domain();
}
dom = landlock_match_ruleset(dom, signal_scope);

/* Quick return for non-landlocked tasks. */
if (!dom)
Expand All @@ -279,7 +294,8 @@ static int hook_file_send_sigiotask(struct task_struct *tsk,

/* Lock already held by send_sigio() and send_sigurg(). */
lockdep_assert_held(&fown->lock);
dom = landlock_file(fown->file)->fown_domain;
dom = landlock_match_ruleset(landlock_file(fown->file)->fown_domain,
signal_scope);

/* Quick return for unowned socket. */
if (!dom)
Expand Down

0 comments on commit fe76bd1

Please sign in to comment.