]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
lsm: Only build lsm_audit.c if CONFIG_SECURITY and CONFIG_AUDIT are set
authorMickaël Salaün <mic@digikod.net>
Fri, 22 Nov 2024 14:33:31 +0000 (15:33 +0100)
committerPaul Moore <paul@paul-moore.com>
Sat, 4 Jan 2025 16:50:44 +0000 (11:50 -0500)
When CONFIG_AUDIT is set, its CONFIG_NET dependency is also set, and the
dev_get_by_index and init_net symbols (used by dump_common_audit_data)
are found by the linker.  dump_common_audit_data() should then failed to
build when CONFIG_NET is not set. However, because the compiler is
smart, it knows that audit_log_start() always return NULL when
!CONFIG_AUDIT, and it doesn't build the body of common_lsm_audit().  As
a side effect, dump_common_audit_data() is not built and the linker
doesn't error out because of missing symbols.

Let's only build lsm_audit.o when CONFIG_SECURITY and CONFIG_AUDIT are
both set, which is checked with the new CONFIG_HAS_SECURITY_AUDIT.

ipv4_skb_to_auditdata() and ipv6_skb_to_auditdata() are only used by
Smack if CONFIG_AUDIT is set, so they don't need fake implementations.

Because common_lsm_audit() is used in multiple places without
CONFIG_AUDIT checks, add a fake implementation.

Link: https://lore.kernel.org/r/20241122143353.59367-2-mic@digikod.net
Cc: Casey Schaufler <casey@schaufler-ca.com>
Cc: James Morris <jmorris@namei.org>
Cc: Paul Moore <paul@paul-moore.com>
Cc: Serge E. Hallyn <serge@hallyn.com>
Signed-off-by: Mickaël Salaün <mic@digikod.net>
Signed-off-by: Paul Moore <paul@paul-moore.com>
include/linux/lsm_audit.h
security/Kconfig
security/Makefile

index 97a8b21eb03339166c96e94743148e9e96fb2bc4..c2b01380262cfeb9a2f30d2084607b136862edec 100644 (file)
@@ -116,14 +116,28 @@ struct common_audit_data {
 #define v4info fam.v4
 #define v6info fam.v6
 
+#ifdef CONFIG_AUDIT
+
 int ipv4_skb_to_auditdata(struct sk_buff *skb,
                struct common_audit_data *ad, u8 *proto);
 
+#if IS_ENABLED(CONFIG_IPV6)
 int ipv6_skb_to_auditdata(struct sk_buff *skb,
                struct common_audit_data *ad, u8 *proto);
+#endif /* IS_ENABLED(CONFIG_IPV6) */
 
 void common_lsm_audit(struct common_audit_data *a,
        void (*pre_audit)(struct audit_buffer *, void *),
        void (*post_audit)(struct audit_buffer *, void *));
 
+#else /* CONFIG_AUDIT */
+
+static inline void common_lsm_audit(struct common_audit_data *a,
+       void (*pre_audit)(struct audit_buffer *, void *),
+       void (*post_audit)(struct audit_buffer *, void *))
+{
+}
+
+#endif /* CONFIG_AUDIT */
+
 #endif
index 28e685f53bd1a1d85f9e62a8ff86abd7d45f4123..f10dbf15c29479da6b9c8c84052731f12c01dedd 100644 (file)
@@ -64,6 +64,11 @@ config SECURITY
 
          If you are unsure how to answer this question, answer N.
 
+config HAS_SECURITY_AUDIT
+       def_bool y
+       depends on AUDIT
+       depends on SECURITY
+
 config SECURITYFS
        bool "Enable the securityfs filesystem"
        help
index cc0982214b84ccc3924f9e562d60596833321604..22ff4c8bd8cecebf79047c46798fb7ced03e9d91 100644 (file)
@@ -15,7 +15,7 @@ obj-$(CONFIG_SECURITY)                        += security.o
 obj-$(CONFIG_SECURITYFS)               += inode.o
 obj-$(CONFIG_SECURITY_SELINUX)         += selinux/
 obj-$(CONFIG_SECURITY_SMACK)           += smack/
-obj-$(CONFIG_SECURITY)                 += lsm_audit.o
+obj-$(CONFIG_HAS_SECURITY_AUDIT)       += lsm_audit.o
 obj-$(CONFIG_SECURITY_TOMOYO)          += tomoyo/
 obj-$(CONFIG_SECURITY_APPARMOR)                += apparmor/
 obj-$(CONFIG_SECURITY_YAMA)            += yama/