mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 10:00:03 -04:00
landlock: Check landlock_restrict_self(2)'s flags before privileges
landlock_restrict_self(2) currently checks the no_new_privs / CAP_SYS_ADMIN requirement before validating the flags argument. An unprivileged caller without no_new_privs thus gets EPERM even when the passed flags are invalid, hiding the EINVAL error. Move the no_new_privs / CAP_SYS_ADMIN check just after the flags check so that malformed calls consistently error out with EINVAL whatever the caller's privileges, the same way seccomp(2) validates its flags before checking no_new_privs. Update the restrict_self_checks_ordering test accordingly. Cc: Mickaël Salaün <mic@digikod.net> Signed-off-by: Justin Suess <utilityemal77@gmail.com> Link: https://patch.msgid.link/20260809154544.1253100-2-utilityemal77@gmail.com Signed-off-by: Mickaël Salaün <mic@digikod.net>
This commit is contained in:
committed by
Mickaël Salaün
parent
bfff8bec73
commit
c2fe8b60b8
@@ -535,6 +535,10 @@ SYSCALL_DEFINE2(landlock_restrict_self, const int, ruleset_fd, const __u32,
|
||||
if (!is_initialized())
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if ((flags | LANDLOCK_MASK_RESTRICT_SELF) !=
|
||||
LANDLOCK_MASK_RESTRICT_SELF)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Similar checks as for seccomp(2), except that an -EPERM may be
|
||||
* returned.
|
||||
@@ -543,10 +547,6 @@ SYSCALL_DEFINE2(landlock_restrict_self, const int, ruleset_fd, const __u32,
|
||||
!ns_capable_noaudit(current_user_ns(), CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if ((flags | LANDLOCK_MASK_RESTRICT_SELF) !=
|
||||
LANDLOCK_MASK_RESTRICT_SELF)
|
||||
return -EINVAL;
|
||||
|
||||
/* Translates "off" flag to boolean. */
|
||||
log_same_exec = !(flags & LANDLOCK_RESTRICT_SELF_LOG_SAME_EXEC_OFF);
|
||||
/* Translates "on" flag to boolean. */
|
||||
|
||||
@@ -255,8 +255,12 @@ TEST(restrict_self_checks_ordering)
|
||||
|
||||
/* Checks unprivileged enforcement without no_new_privs. */
|
||||
drop_caps(_metadata);
|
||||
/*
|
||||
* The flags validity is checked before the no_new_privs /
|
||||
* CAP_SYS_ADMIN requirement.
|
||||
*/
|
||||
ASSERT_EQ(-1, landlock_restrict_self(-1, -1));
|
||||
ASSERT_EQ(EPERM, errno);
|
||||
ASSERT_EQ(EINVAL, errno);
|
||||
ASSERT_EQ(-1, landlock_restrict_self(-1, 0));
|
||||
ASSERT_EQ(EPERM, errno);
|
||||
ASSERT_EQ(-1, landlock_restrict_self(ruleset_fd, 0));
|
||||
|
||||
Reference in New Issue
Block a user