From: Ondrej Mosnacek <omosn...@redhat.com>

efi,lockdown: fix kernel lockdown on Secure Boot

Upstream commit 77b644c39d6a ("init/main.c: Initialize early LSMs after
arch code, static keys and calls") changed the order of initialization
of LSM hooks, so the Fedora/RHEL code to automatically put the kernel
into integrity lockdown mode stopped working (because at the time
setup_arch() calls security_lock_kernel_down(), the LSM hooks are not
yet initialized).

Fix this by making security_lock_kernel_down() a normal function
directly defined in security/lockdown/lockdown.c (there is no reason to
make it an LSM hook, anyway), which allows it to be called before
early_security_init()/security_init() gets called.

CVE: CVE-2025-1272
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2333706
RH-Fixes: 77b644c39d6a ("init/main.c: Initialize early LSMs after arch code, 
static keys and calls")
Upstream Status: RHEL only
Signed-off-by: Ondrej Mosnacek <omosn...@redhat.com>

diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h
index blahblah..blahblah 100644
--- a/include/linux/lsm_hook_defs.h
+++ b/include/linux/lsm_hook_defs.h
@@ -443,7 +443,6 @@ LSM_HOOK(int, 0, bpf_token_capable, const struct bpf_token 
*token, int cap)
 #endif /* CONFIG_BPF_SYSCALL */
 
 LSM_HOOK(int, 0, locked_down, enum lockdown_reason what)
-LSM_HOOK(int, 0, lock_kernel_down, const char *where, enum lockdown_reason 
level)
 
 
 #ifdef CONFIG_PERF_EVENTS
diff --git a/include/linux/security.h b/include/linux/security.h
index blahblah..blahblah 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -574,7 +574,6 @@ int security_inode_notifysecctx(struct inode *inode, void 
*ctx, u32 ctxlen);
 int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen);
 int security_inode_getsecctx(struct inode *inode, struct lsm_context *cp);
 int security_locked_down(enum lockdown_reason what);
-int security_lock_kernel_down(const char *where, enum lockdown_reason level);
 int lsm_fill_user_ctx(struct lsm_ctx __user *uctx, u32 *uctx_len,
                      void *val, size_t val_len, u64 id, u64 flags);
 int security_bdev_alloc(struct block_device *bdev);
@@ -1581,10 +1580,6 @@ static inline int security_locked_down(enum 
lockdown_reason what)
 {
        return 0;
 }
-static inline int security_lock_kernel_down(const char *where, enum 
lockdown_reason level)
-{
-       return 0;
-}
 static inline int lsm_fill_user_ctx(struct lsm_ctx __user *uctx,
                                    u32 *uctx_len, void *val, size_t val_len,
                                    u64 id, u64 flags)
@@ -2391,4 +2386,13 @@ static inline void security_initramfs_populated(void)
 }
 #endif /* CONFIG_SECURITY */
 
+#ifdef CONFIG_SECURITY_LOCKDOWN_LSM
+extern int security_lock_kernel_down(const char *where, enum lockdown_reason 
level);
+#else
+static inline int security_lock_kernel_down(const char *where, enum 
lockdown_reason level)
+{
+       return 0;
+}
+#endif /* CONFIG_SECURITY_LOCKDOWN_LSM */
+
 #endif /* ! __LINUX_SECURITY_H */
diff --git a/security/lockdown/lockdown.c b/security/lockdown/lockdown.c
index blahblah..blahblah 100644
--- a/security/lockdown/lockdown.c
+++ b/security/lockdown/lockdown.c
@@ -72,9 +72,19 @@ static int lockdown_is_locked_down(enum lockdown_reason what)
        return 0;
 }
 
+/**
+ * security_lock_kernel_down() - Put the kernel into lock-down mode.
+ *
+ * @where: Where the lock-down is originating from (e.g. command line option)
+ * @level: The lock-down level (can only increase)
+ */
+int security_lock_kernel_down(const char *where, enum lockdown_reason level)
+{
+       return lock_kernel_down(where, level);
+}
+
 static struct security_hook_list lockdown_hooks[] __ro_after_init = {
        LSM_HOOK_INIT(locked_down, lockdown_is_locked_down),
-       LSM_HOOK_INIT(lock_kernel_down, lock_kernel_down),
 };
 
 static const struct lsm_id lockdown_lsmid = {
diff --git a/security/security.c b/security/security.c
index blahblah..blahblah 100644
--- a/security/security.c
+++ b/security/security.c
@@ -5801,18 +5801,6 @@ int security_locked_down(enum lockdown_reason what)
 }
 EXPORT_SYMBOL(security_locked_down);
 
-/**
- * security_lock_kernel_down() - Put the kernel into lock-down mode.
- *
- * @where: Where the lock-down is originating from (e.g. command line option)
- * @level: The lock-down level (can only increase)
- */
-int security_lock_kernel_down(const char *where, enum lockdown_reason level)
-{
-       return call_int_hook(lock_kernel_down, where, level);
-}
-EXPORT_SYMBOL(security_lock_kernel_down);
-
 /**
  * security_bdev_alloc() - Allocate a block device LSM blob
  * @bdev: block device

--
https://gitlab.com/cki-project/kernel-ark/-/merge_requests/3694

-- 
_______________________________________________
kernel mailing list -- kernel@lists.fedoraproject.org
To unsubscribe send an email to kernel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/kernel@lists.fedoraproject.org
Do not reply to spam, report it: 
https://pagure.io/fedora-infrastructure/new_issue

Reply via email to