Merge branch 'next-integrity' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security

Pull integrity updates from James Morris:
 "In Linux 4.19, a new LSM hook named security_kernel_load_data was
  upstreamed, allowing LSMs and IMA to prevent the kexec_load syscall.
  Different signature verification methods exist for verifying the
  kexec'ed kernel image. This adds additional support in IMA to prevent
  loading unsigned kernel images via the kexec_load syscall,
  independently of the IMA policy rules, based on the runtime "secure
  boot" flag. An initial IMA kselftest is included.

  In addition, this pull request defines a new, separate keyring named
  ".platform" for storing the preboot/firmware keys needed for verifying
  the kexec'ed kernel image's signature and includes the associated IMA
  kexec usage of the ".platform" keyring.

  (David Howell's and Josh Boyer's patches for reading the
  preboot/firmware keys, which were previously posted for a different
  use case scenario, are included here)"

* 'next-integrity' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security:
  integrity: Remove references to module keyring
  ima: Use inode_is_open_for_write
  ima: Support platform keyring for kernel appraisal
  efi: Allow the "db" UEFI variable to be suppressed
  efi: Import certificates from UEFI Secure Boot
  efi: Add an EFI signature blob parser
  efi: Add EFI signature data types
  integrity: Load certs to the platform keyring
  integrity: Define a trusted platform keyring
  selftests/ima: kexec_load syscall test
  ima: don't measure/appraise files on efivarfs
  x86/ima: retry detecting secure boot mode
  docs: Extend trusted keys documentation for TPM 2.0
  x86/ima: define arch_get_ima_policy() for x86
  ima: add support for arch specific policies
  ima: refactor ima_init_policy()
  ima: prevent kexec_load syscall based on runtime secureboot flag
  x86/ima: define arch_ima_get_secureboot
  integrity: support new struct public_key_signature encoding field
This commit is contained in:
Linus Torvalds 2019-01-02 09:43:14 -08:00
commit f218a29c25
20 changed files with 861 additions and 93 deletions

View file

@ -14,6 +14,7 @@ TARGETS += firmware
TARGETS += ftrace
TARGETS += futex
TARGETS += gpio
TARGETS += ima
TARGETS += intel_pstate
TARGETS += ipc
TARGETS += ir

View file

@ -0,0 +1,11 @@
# Makefile for kexec_load
uname_M := $(shell uname -m 2>/dev/null || echo not)
ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
ifeq ($(ARCH),x86)
TEST_PROGS := test_kexec_load.sh
include ../lib.mk
endif

View file

@ -0,0 +1,4 @@
CONFIG_IMA_APPRAISE
CONFIG_IMA_ARCH_POLICY
CONFIG_SECURITYFS
CONFIG_KEXEC_VERIFY_SIG

View file

@ -0,0 +1,54 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0+
# Loading a kernel image via the kexec_load syscall should fail
# when the kerne is CONFIG_KEXEC_VERIFY_SIG enabled and the system
# is booted in secureboot mode.
TEST="$0"
EFIVARFS="/sys/firmware/efi/efivars"
rc=0
# Kselftest framework requirement - SKIP code is 4.
ksft_skip=4
# kexec requires root privileges
if [ $UID != 0 ]; then
echo "$TEST: must be run as root" >&2
exit $ksft_skip
fi
# Make sure that efivars is mounted in the normal location
if ! grep -q "^\S\+ $EFIVARFS efivarfs" /proc/mounts; then
echo "$TEST: efivars is not mounted on $EFIVARFS" >&2
exit $ksft_skip
fi
# Get secureboot mode
file="$EFIVARFS/SecureBoot-*"
if [ ! -e $file ]; then
echo "$TEST: unknown secureboot mode" >&2
exit $ksft_skip
fi
secureboot=`hexdump $file | awk '{print substr($4,length($4),1)}'`
# kexec_load should fail in secure boot mode
KERNEL_IMAGE="/boot/vmlinuz-`uname -r`"
kexec -l $KERNEL_IMAGE &>> /dev/null
if [ $? == 0 ]; then
kexec -u
if [ "$secureboot" == "1" ]; then
echo "$TEST: kexec_load succeeded [FAIL]"
rc=1
else
echo "$TEST: kexec_load succeeded [PASS]"
fi
else
if [ "$secureboot" == "1" ]; then
echo "$TEST: kexec_load failed [PASS]"
else
echo "$TEST: kexec_load failed [FAIL]"
rc=1
fi
fi
exit $rc