| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Nayna Jain <nayna@linux.ibm.com> |
| Date: Wed, 30 Oct 2019 23:31:27 -0400 |
| Subject: [PATCH 03/19] powerpc/ima: Add support to initialize ima policy rules |
| |
| PowerNV systems use a Linux-based bootloader, which rely on the IMA |
| subsystem to enforce different secure boot modes. Since the |
| verification policy may differ based on the secure boot mode of the |
| system, the policies must be defined at runtime. |
| |
| This patch implements arch-specific support to define IMA policy rules |
| based on the runtime secure boot mode of the system. |
| |
| This patch provides arch-specific IMA policies if PPC_SECURE_BOOT |
| config is enabled. |
| |
| Signed-off-by: Nayna Jain <nayna@linux.ibm.com> |
| Signed-off-by: Mimi Zohar <zohar@linux.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/1572492694-6520-3-git-send-email-zohar@linux.ibm.com |
| (cherry picked from commit 4238fad366a660cbc6499ca1ea4be42bd4d1ac5b) |
| Signed-off-by: Joel Stanley <joel@jms.id.au> |
| --- |
| arch/powerpc/Kconfig | 1 + |
| arch/powerpc/kernel/Makefile | 2 +- |
| arch/powerpc/kernel/ima_arch.c | 43 ++++++++++++++++++++++++++++++++++ |
| include/linux/ima.h | 3 ++- |
| 4 files changed, 47 insertions(+), 2 deletions(-) |
| create mode 100644 arch/powerpc/kernel/ima_arch.c |
| |
| diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig |
| index d654bdc9e4dc..32ce6c0b43f1 100644 |
| --- a/arch/powerpc/Kconfig |
| +++ b/arch/powerpc/Kconfig |
| @@ -939,6 +939,7 @@ config PPC_SECURE_BOOT |
| prompt "Enable secure boot support" |
| bool |
| depends on PPC_POWERNV |
| + depends on IMA_ARCH_POLICY |
| help |
| Systems with firmware secure boot enabled need to define security |
| policies to extend secure boot to the OS. This config allows a user |
| diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile |
| index 40170ee52178..b82f7f5e5121 100644 |
| --- a/arch/powerpc/kernel/Makefile |
| +++ b/arch/powerpc/kernel/Makefile |
| @@ -158,7 +158,7 @@ ifneq ($(CONFIG_PPC_POWERNV)$(CONFIG_PPC_SVM),) |
| obj-y += ucall.o |
| endif |
| |
| -obj-$(CONFIG_PPC_SECURE_BOOT) += secure_boot.o |
| +obj-$(CONFIG_PPC_SECURE_BOOT) += secure_boot.o ima_arch.o |
| |
| # Disable GCOV, KCOV & sanitizers in odd or sensitive code |
| GCOV_PROFILE_prom_init.o := n |
| diff --git a/arch/powerpc/kernel/ima_arch.c b/arch/powerpc/kernel/ima_arch.c |
| new file mode 100644 |
| index 000000000000..d88913dc0da7 |
| --- /dev/null |
| +++ b/arch/powerpc/kernel/ima_arch.c |
| @@ -0,0 +1,43 @@ |
| +// SPDX-License-Identifier: GPL-2.0 |
| +/* |
| + * Copyright (C) 2019 IBM Corporation |
| + * Author: Nayna Jain |
| + */ |
| + |
| +#include <linux/ima.h> |
| +#include <asm/secure_boot.h> |
| + |
| +bool arch_ima_get_secureboot(void) |
| +{ |
| + return is_ppc_secureboot_enabled(); |
| +} |
| + |
| +/* |
| + * The "secure_rules" are enabled only on "secureboot" enabled systems. |
| + * These rules verify the file signatures against known good values. |
| + * The "appraise_type=imasig|modsig" option allows the known good signature |
| + * to be stored as an xattr or as an appended signature. |
| + * |
| + * To avoid duplicate signature verification as much as possible, the IMA |
| + * policy rule for module appraisal is added only if CONFIG_MODULE_SIG_FORCE |
| + * is not enabled. |
| + */ |
| +static const char *const secure_rules[] = { |
| + "appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig|modsig", |
| +#ifndef CONFIG_MODULE_SIG_FORCE |
| + "appraise func=MODULE_CHECK appraise_type=imasig|modsig", |
| +#endif |
| + NULL |
| +}; |
| + |
| +/* |
| + * Returns the relevant IMA arch-specific policies based on the system secure |
| + * boot state. |
| + */ |
| +const char *const *arch_get_ima_policy(void) |
| +{ |
| + if (is_ppc_secureboot_enabled()) |
| + return secure_rules; |
| + |
| + return NULL; |
| +} |
| diff --git a/include/linux/ima.h b/include/linux/ima.h |
| index 1c37f17f7203..6d904754d858 100644 |
| --- a/include/linux/ima.h |
| +++ b/include/linux/ima.h |
| @@ -29,7 +29,8 @@ extern void ima_kexec_cmdline(const void *buf, int size); |
| extern void ima_add_kexec_buffer(struct kimage *image); |
| #endif |
| |
| -#if (defined(CONFIG_X86) && defined(CONFIG_EFI)) || defined(CONFIG_S390) |
| +#if (defined(CONFIG_X86) && defined(CONFIG_EFI)) || defined(CONFIG_S390) \ |
| + || defined(CONFIG_PPC_SECURE_BOOT) |
| extern bool arch_ima_get_secureboot(void); |
| extern const char * const *arch_get_ima_policy(void); |
| #else |