mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'integrity-v7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity
Pull integrity updates from Mimi Zohar:
"There are two main changes, one feature removal, some code cleanup,
and a number of bug fixes.
Main changes:
- Detecting secure boot mode was limited to IMA. Make detecting
secure boot mode accessible to EVM and other LSMs
- IMA sigv3 support was limited to fsverity. Add IMA sigv3 support
for IMA regular file hashes and EVM portable signatures
Remove:
- Remove IMA support for asychronous hash calculation originally
added for hardware acceleration
Cleanup:
- Remove unnecessary Kconfig CONFIG_MODULE_SIG and CONFIG_KEXEC_SIG
tests
- Add descriptions of the IMA atomic flags
Bug fixes:
- Like IMA, properly limit EVM "fix" mode
- Define and call evm_fix_hmac() to update security.evm
- Fallback to using i_version to detect file change for filesystems
that do not support STATX_CHANGE_COOKIE
- Address missing kernel support for configured (new) TPM hash
algorithms
- Add missing crypto_shash_final() return value"
* tag 'integrity-v7.1' of git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity:
evm: Enforce signatures version 3 with new EVM policy 'bit 3'
integrity: Allow sigv3 verification on EVM_XATTR_PORTABLE_DIGSIG
ima: add support to require IMA sigv3 signatures
ima: add regular file data hash signature version 3 support
ima: Define asymmetric_verify_v3() to verify IMA sigv3 signatures
ima: remove buggy support for asynchronous hashes
integrity: Eliminate weak definition of arch_get_secureboot()
ima: Add code comments to explain IMA iint cache atomic_flags
ima_fs: Correctly create securityfs files for unsupported hash algos
ima: check return value of crypto_shash_final() in boot aggregate
ima: Define and use a digest_size field in the ima_algo_desc structure
powerpc/ima: Drop unnecessary check for CONFIG_MODULE_SIG
ima: efi: Drop unnecessary check for CONFIG_MODULE_SIG/CONFIG_KEXEC_SIG
ima: fallback to using i_version to detect file change
evm: fix security.evm for a file with IMA signature
s390: Drop unnecessary CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT
evm: Don't enable fix mode when secure boot is enabled
integrity: Make arch_ima_get_secureboot integrity-wide
This commit is contained in:
@@ -26,6 +26,7 @@ Description:
|
||||
2 Permit modification of EVM-protected metadata at
|
||||
runtime. Not supported if HMAC validation and
|
||||
creation is enabled (deprecated).
|
||||
3 Require asymmetric signatures to be version 3
|
||||
31 Disable further runtime modification of EVM policy
|
||||
=== ==================================================
|
||||
|
||||
|
||||
@@ -53,10 +53,7 @@ Description:
|
||||
where 'imasig' is the original or the signature
|
||||
format v2.
|
||||
where 'modsig' is an appended signature,
|
||||
where 'sigv3' is the signature format v3. (Currently
|
||||
limited to fsverity digest based signatures
|
||||
stored in security.ima xattr. Requires
|
||||
specifying "digest_type=verity" first.)
|
||||
where 'sigv3' is the signature format v3.
|
||||
|
||||
appraise_flag:= [check_blacklist] (deprecated)
|
||||
Setting the check_blacklist flag is no longer necessary.
|
||||
@@ -186,6 +183,11 @@ Description:
|
||||
appraise func=BPRM_CHECK digest_type=verity \
|
||||
appraise_type=sigv3
|
||||
|
||||
Example of a regular IMA file hash 'appraise' rule requiring
|
||||
signature version 3 format stored in security.ima xattr.
|
||||
|
||||
appraise func=BPRM_CHECK appraise_type=sigv3
|
||||
|
||||
All of these policy rules could, for example, be constrained
|
||||
either based on a filesystem's UUID (fsuuid) or based on LSM
|
||||
labels.
|
||||
|
||||
@@ -2410,23 +2410,6 @@ Kernel parameters
|
||||
[IMA] Define a custom template format.
|
||||
Format: { "field1|...|fieldN" }
|
||||
|
||||
ima.ahash_minsize= [IMA] Minimum file size for asynchronous hash usage
|
||||
Format: <min_file_size>
|
||||
Set the minimal file size for using asynchronous hash.
|
||||
If left unspecified, ahash usage is disabled.
|
||||
|
||||
ahash performance varies for different data sizes on
|
||||
different crypto accelerators. This option can be used
|
||||
to achieve the best performance for a particular HW.
|
||||
|
||||
ima.ahash_bufsize= [IMA] Asynchronous hash buffer size
|
||||
Format: <bufsize>
|
||||
Set hashing buffer size. Default: 4k.
|
||||
|
||||
ahash performance varies for different chunk sizes on
|
||||
different crypto accelerators. This option can be used
|
||||
to achieve best performance for particular HW.
|
||||
|
||||
ima= [IMA] Enable or disable IMA
|
||||
Format: { "off" | "on" }
|
||||
Default: "on"
|
||||
|
||||
@@ -12732,6 +12732,7 @@ R: Eric Snowberg <eric.snowberg@oracle.com>
|
||||
L: linux-integrity@vger.kernel.org
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
|
||||
F: include/linux/secure_boot.h
|
||||
F: security/integrity/
|
||||
F: security/integrity/ima/
|
||||
|
||||
|
||||
@@ -1839,4 +1839,7 @@ config ARCH_WANTS_PRE_LINK_VMLINUX
|
||||
config ARCH_HAS_CPU_ATTACK_VECTORS
|
||||
bool
|
||||
|
||||
config HAVE_ARCH_GET_SECUREBOOT
|
||||
def_bool EFI
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -1058,6 +1058,7 @@ config PPC_SECURE_BOOT
|
||||
depends on IMA_ARCH_POLICY
|
||||
imply IMA_SECURE_AND_OR_TRUSTED_BOOT
|
||||
select PSERIES_PLPKS if PPC_PSERIES
|
||||
select HAVE_ARCH_GET_SECUREBOOT
|
||||
help
|
||||
Systems with firmware secure boot enabled need to define security
|
||||
policies to extend secure boot to the OS. This config allows a user
|
||||
|
||||
@@ -7,11 +7,6 @@
|
||||
#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.
|
||||
@@ -63,8 +58,7 @@ static const char *const secure_and_trusted_rules[] = {
|
||||
const char *const *arch_get_ima_policy(void)
|
||||
{
|
||||
if (is_ppc_secureboot_enabled()) {
|
||||
if (IS_ENABLED(CONFIG_MODULE_SIG))
|
||||
set_module_sig_enforced();
|
||||
set_module_sig_enforced();
|
||||
|
||||
if (is_ppc_trustedboot_enabled())
|
||||
return secure_and_trusted_rules;
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/secure_boot.h>
|
||||
#include <linux/string_choices.h>
|
||||
#include <asm/secure_boot.h>
|
||||
|
||||
@@ -44,6 +45,11 @@ out:
|
||||
return enabled;
|
||||
}
|
||||
|
||||
bool arch_get_secureboot(void)
|
||||
{
|
||||
return is_ppc_secureboot_enabled();
|
||||
}
|
||||
|
||||
bool is_ppc_trustedboot_enabled(void)
|
||||
{
|
||||
struct device_node *node;
|
||||
|
||||
+1
-1
@@ -80,7 +80,6 @@ config S390
|
||||
#
|
||||
# Note: keep this list sorted alphabetically
|
||||
#
|
||||
imply IMA_SECURE_AND_OR_TRUSTED_BOOT
|
||||
select ALTERNATE_USER_ADDRESS_SPACE
|
||||
select ARCH_32BIT_USTAT_F_TINODE
|
||||
select ARCH_CORRECT_STACKTRACE_ON_KRETPROBE
|
||||
@@ -181,6 +180,7 @@ config S390
|
||||
select GENERIC_IOREMAP if PCI
|
||||
select HAVE_ALIGNED_STRUCT_PAGE
|
||||
select HAVE_ARCH_AUDITSYSCALL
|
||||
select HAVE_ARCH_GET_SECUREBOOT
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
||||
select HAVE_ARCH_KASAN
|
||||
|
||||
@@ -71,7 +71,6 @@ obj-$(CONFIG_STACKPROTECTOR) += stackprotector.o
|
||||
obj-$(CONFIG_KEXEC_FILE) += machine_kexec_file.o kexec_image.o
|
||||
obj-$(CONFIG_KEXEC_FILE) += kexec_elf.o
|
||||
obj-$(CONFIG_CERT_STORE) += cert_store.o
|
||||
obj-$(CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT) += ima_arch.o
|
||||
|
||||
obj-$(CONFIG_PERF_EVENTS) += perf_event.o
|
||||
obj-$(CONFIG_PERF_EVENTS) += perf_cpum_cf.o perf_cpum_sf.o
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <linux/ima.h>
|
||||
#include <asm/boot_data.h>
|
||||
|
||||
bool arch_ima_get_secureboot(void)
|
||||
{
|
||||
return ipl_secure_flag;
|
||||
}
|
||||
|
||||
const char * const *arch_get_ima_policy(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/crash_dump.h>
|
||||
#include <linux/debug_locks.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/secure_boot.h>
|
||||
#include <asm/asm-extable.h>
|
||||
#include <asm/machine.h>
|
||||
#include <asm/diag.h>
|
||||
@@ -2387,6 +2388,11 @@ void __no_stack_protector s390_reset_system(void)
|
||||
diag_amode31_ops.diag308_reset();
|
||||
}
|
||||
|
||||
bool arch_get_secureboot(void)
|
||||
{
|
||||
return ipl_secure_flag;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
|
||||
int ipl_report_add_component(struct ipl_report *report, struct kexec_buf *kbuf,
|
||||
|
||||
@@ -401,9 +401,9 @@ extern int __init efi_memmap_split_count(efi_memory_desc_t *md,
|
||||
extern void __init efi_memmap_insert(struct efi_memory_map *old_memmap,
|
||||
void *buf, struct efi_mem_range *mem);
|
||||
|
||||
extern enum efi_secureboot_mode __x86_ima_efi_boot_mode(void);
|
||||
enum efi_secureboot_mode __x86_efi_boot_mode(void);
|
||||
|
||||
#define arch_ima_efi_boot_mode __x86_ima_efi_boot_mode()
|
||||
#define arch_efi_boot_mode __x86_efi_boot_mode()
|
||||
|
||||
#ifdef CONFIG_EFI_RUNTIME_MAP
|
||||
int efi_get_runtime_map_size(void);
|
||||
|
||||
@@ -920,7 +920,7 @@ umode_t efi_attr_is_visible(struct kobject *kobj, struct attribute *attr, int n)
|
||||
return attr->mode;
|
||||
}
|
||||
|
||||
enum efi_secureboot_mode __x86_ima_efi_boot_mode(void)
|
||||
enum efi_secureboot_mode __x86_efi_boot_mode(void)
|
||||
{
|
||||
return boot_params.secure_boot;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,8 @@ extern enum integrity_status evm_verifyxattr(struct dentry *dentry,
|
||||
const char *xattr_name,
|
||||
void *xattr_value,
|
||||
size_t xattr_value_len);
|
||||
int evm_fix_hmac(struct dentry *dentry, const char *xattr_name,
|
||||
const char *xattr_value, size_t xattr_value_len);
|
||||
int evm_inode_init_security(struct inode *inode, struct inode *dir,
|
||||
const struct qstr *qstr, struct xattr *xattrs,
|
||||
int *xattr_count);
|
||||
@@ -51,6 +53,12 @@ static inline enum integrity_status evm_verifyxattr(struct dentry *dentry,
|
||||
{
|
||||
return INTEGRITY_UNKNOWN;
|
||||
}
|
||||
|
||||
static inline int evm_fix_hmac(struct dentry *dentry, const char *xattr_name,
|
||||
const char *xattr_value, size_t xattr_value_len)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int evm_inode_init_security(struct inode *inode, struct inode *dir,
|
||||
|
||||
+1
-6
@@ -11,6 +11,7 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/secure_boot.h>
|
||||
#include <crypto/hash_info.h>
|
||||
struct linux_binprm;
|
||||
|
||||
@@ -73,14 +74,8 @@ int ima_validate_range(phys_addr_t phys, size_t size);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT
|
||||
extern bool arch_ima_get_secureboot(void);
|
||||
extern const char * const *arch_get_ima_policy(void);
|
||||
#else
|
||||
static inline bool arch_ima_get_secureboot(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline const char * const *arch_get_ima_policy(void)
|
||||
{
|
||||
return NULL;
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2026 Red Hat, Inc. All Rights Reserved.
|
||||
*
|
||||
* Author: Coiby Xu <coxu@redhat.com>
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_SECURE_BOOT_H
|
||||
#define _LINUX_SECURE_BOOT_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef CONFIG_HAVE_ARCH_GET_SECUREBOOT
|
||||
/*
|
||||
* Returns true if the platform secure boot is enabled.
|
||||
* Returns false if disabled or not supported.
|
||||
*/
|
||||
bool arch_get_secureboot(void);
|
||||
#else
|
||||
static inline bool arch_get_secureboot(void) { return false; }
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_SECURE_BOOT_H */
|
||||
@@ -18,6 +18,7 @@ integrity-$(CONFIG_LOAD_IPL_KEYS) += platform_certs/load_ipl_s390.o
|
||||
integrity-$(CONFIG_LOAD_PPC_KEYS) += platform_certs/efi_parser.o \
|
||||
platform_certs/load_powerpc.o \
|
||||
platform_certs/keyring_handler.o
|
||||
integrity-$(CONFIG_EFI) += efi_secureboot.o
|
||||
# The relative order of the 'ima' and 'evm' LSMs depends on the order below.
|
||||
obj-$(CONFIG_IMA) += ima/
|
||||
obj-$(CONFIG_EVM) += evm/
|
||||
|
||||
@@ -59,7 +59,7 @@ static struct key *integrity_keyring_from_id(const unsigned int id)
|
||||
}
|
||||
|
||||
int integrity_digsig_verify(const unsigned int id, const char *sig, int siglen,
|
||||
const char *digest, int digestlen)
|
||||
const char *digest, int digestlen, u8 algo)
|
||||
{
|
||||
struct key *keyring;
|
||||
|
||||
@@ -76,9 +76,11 @@ int integrity_digsig_verify(const unsigned int id, const char *sig, int siglen,
|
||||
return digsig_verify(keyring, sig + 1, siglen - 1, digest,
|
||||
digestlen);
|
||||
case 2: /* regular file data hash based signature */
|
||||
case 3: /* struct ima_file_id data based signature */
|
||||
return asymmetric_verify(keyring, sig, siglen, digest,
|
||||
digestlen);
|
||||
digestlen);
|
||||
case 3: /* struct ima_file_id data based signature */
|
||||
return asymmetric_verify_v3(keyring, sig, siglen, digest,
|
||||
digestlen, algo);
|
||||
}
|
||||
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@@ -131,3 +131,62 @@ out:
|
||||
pr_debug("%s() = %d\n", __func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* calc_file_id_hash - calculate the hash of the ima_file_id struct data
|
||||
* @type: xattr type [enum evm_ima_xattr_type]
|
||||
* @algo: hash algorithm [enum hash_algo]
|
||||
* @digest: pointer to the digest to be hashed
|
||||
* @hash: (out) pointer to the hash
|
||||
*
|
||||
* IMA signature version 3 disambiguates the data that is signed by
|
||||
* indirectly signing the hash of the ima_file_id structure data.
|
||||
*
|
||||
* Return 0 on success, error code otherwise.
|
||||
*/
|
||||
static int calc_file_id_hash(enum evm_ima_xattr_type type,
|
||||
enum hash_algo algo, const u8 *digest,
|
||||
struct ima_max_digest_data *hash)
|
||||
{
|
||||
struct ima_file_id file_id = {.hash_type = type, .hash_algorithm = algo};
|
||||
size_t digest_size = hash_digest_size[algo];
|
||||
struct crypto_shash *tfm;
|
||||
size_t file_id_size;
|
||||
int rc;
|
||||
|
||||
if (type != IMA_VERITY_DIGSIG && type != EVM_IMA_XATTR_DIGSIG &&
|
||||
type != EVM_XATTR_PORTABLE_DIGSIG)
|
||||
return -EINVAL;
|
||||
|
||||
tfm = crypto_alloc_shash(hash_algo_name[algo], 0, 0);
|
||||
if (IS_ERR(tfm))
|
||||
return PTR_ERR(tfm);
|
||||
|
||||
memcpy(file_id.hash, digest, digest_size);
|
||||
|
||||
/* Calculate the ima_file_id struct hash on the portion used. */
|
||||
file_id_size = sizeof(file_id) - (HASH_MAX_DIGESTSIZE - digest_size);
|
||||
|
||||
hash->hdr.algo = algo;
|
||||
hash->hdr.length = digest_size;
|
||||
rc = crypto_shash_tfm_digest(tfm, (const u8 *)&file_id, file_id_size,
|
||||
hash->digest);
|
||||
|
||||
crypto_free_shash(tfm);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int asymmetric_verify_v3(struct key *keyring, const char *sig, int siglen,
|
||||
const char *data, int datalen, u8 algo)
|
||||
{
|
||||
struct signature_v2_hdr *hdr = (struct signature_v2_hdr *)sig;
|
||||
struct ima_max_digest_data hash;
|
||||
int rc;
|
||||
|
||||
rc = calc_file_id_hash(hdr->type, algo, data, &hash);
|
||||
if (rc)
|
||||
return -EINVAL;
|
||||
|
||||
return asymmetric_verify(keyring, sig, siglen, hash.digest,
|
||||
hash.hdr.length);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user