[PATCH 5/6] selinux: Use security_capable_lsm() for CAP_MAC_ADMIN checks
From: Mickaël Salaün
Date: Tue Nov 10 2026 - 15:40:05 EST
has_cap_mac_admin() checks CAP_MAC_ADMIN with cap_capable() and then
with SELinux's own check, so that other stacked LSMs do not have to
authorize it (see commit db59000ab760 ("selinux: only invoke
capabilities and selinux for CAP_MAC_ADMIN checks")). This also lets a
process in a Landlock domain that denies CAP_MAC_ADMIN get or set
security contexts unknown to the loaded policy.
Switch this check to security_capable_lsm(), as for AppArmor and Smack
in the previous commits. The cred_has_capability() check is kept.
Cc: Günther Noack <gnoack@xxxxxxxxxx>
Cc: Ondrej Mosnáček <omosnacek@xxxxxxxxx>
Cc: Paul Moore <paul@xxxxxxxxxxxxxx>
Cc: Stephen Smalley <stephen.smalley.work@xxxxxxxxx>
Fixes: 97c8386f1d74 ("landlock: Enforce capability restrictions")
Signed-off-by: Mickaël Salaün <mic@xxxxxxxxxxx>
---
security/selinux/hooks.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 9950f89dfaa2..5d85bc06f4c5 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -3363,7 +3363,8 @@ static bool has_cap_mac_admin(bool audit)
const struct cred *cred = current_cred();
unsigned int opts = audit ? CAP_OPT_NONE : CAP_OPT_NOAUDIT;
- if (cap_capable(cred, &init_user_ns, CAP_MAC_ADMIN, opts))
+ if (security_capable_lsm(cred, &init_user_ns, CAP_MAC_ADMIN, opts,
+ LSM_ID_SELINUX))
return false;
if (cred_has_capability(cred, CAP_MAC_ADMIN, opts, true))
return false;
--
2.56.0