projects/linux·commit 0302e28d

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

0302e28d · Linus Torvalds <[email protected]> · 2017-05-03 08:50:52 -07:00

Pull security subsystem updates from James Morris:
 "Highlights:

  IMA:
   - provide ">" and "<" operators for fowner/uid/euid rules

  KEYS:
   - add a system blacklist keyring

   - add KEYCTL_RESTRICT_KEYRING, exposes keyring link restriction
     functionality to userland via keyctl()

  LSM:
   - harden LSM API with __ro_after_init

   - add prlmit security hook, implement for SELinux

   - revive security_task_alloc hook

  TPM:
   - implement contextual TPM command 'spaces'"

* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security: (98 commits)
  tpm: Fix reference count to main device
  tpm_tis: convert to using locality callbacks
  tpm: fix handling of the TPM 2.0 event logs
  tpm_crb: remove a cruft constant
  keys: select CONFIG_CRYPTO when selecting DH / KDF
  apparmor: Make path_max parameter readonly
  apparmor: fix parameters so that the permission test is bypassed at boot
  apparmor: fix invalid reference to index variable of iterator line 836
  apparmor: use SHASH_DESC_ON_STACK
  security/apparmor/lsm.c: set debug messages
  apparmor: fix boolreturn.cocci warnings
  Smack: Use GFP_KERNEL for smk_netlbl_mls().
  smack: fix double free in smack_parse_opts_str()
  KEYS: add SP800-56A KDF support for DH
  KEYS: Keyring asymmetric key restrict method with chaining
  KEYS: Restrict asymmetric key linkage using a specific keychain
  KEYS: Add a lookup_restriction function for the asymmetric key type
  KEYS: Add KEYCTL_RESTRICT_KEYRING
  KEYS: Consistent ordering for __key_link_begin and restrict check
  KEYS: Add an optional lookup_restriction hook to key_type
  ...
Commit
0302e28dee643932ee7b3c112ebccdbb9f8ec32c
Parents
89c9fea3 · 8979b02a

Merge commit. Changes below are compared with the first parent: 89c9fea3.

Changes

95 files changed · +3240 −1120

FileStatusAddDelContent
Documentation/crypto/asymmetric-keys.txtmodified+51−0View file
Documentation/security/keys.txtmodified+76−24View file
certs/Kconfigmodified+18−0View file
certs/Makefilemodified+6−0View file
certs/blacklist.cadded+174−0View file
certs/blacklist.hadded+3−0View file
certs/blacklist_hashes.cadded+6−0View file
certs/blacklist_nohashes.cadded+5−0View file
certs/system_keyring.cmodified+31−8View file
crypto/asymmetric_keys/asymmetric_type.cmodified+94−8View file
crypto/asymmetric_keys/pkcs7_parser.hmodified+1−0View file
crypto/asymmetric_keys/pkcs7_verify.cmodified+24−8View file
crypto/asymmetric_keys/restrict.cmodified+158−3View file
crypto/asymmetric_keys/x509_parser.hmodified+1−0View file
crypto/asymmetric_keys/x509_public_key.cmodified+15−0View file
drivers/char/tpm/Kconfigmodified+2−1View file
drivers/char/tpm/Makefilemodified+2−1View file
drivers/char/tpm/st33zp24/i2c.cmodified+20−3View file
drivers/char/tpm/st33zp24/spi.cmodified+20−3View file
drivers/char/tpm/st33zp24/st33zp24.cmodified+6−6View file
drivers/char/tpm/tpm-chip.cmodified+70−1View file
drivers/char/tpm/tpm-dev-common.cadded+148−0View file
drivers/char/tpm/tpm-dev.cmodified+14−129View file
drivers/char/tpm/tpm-dev.hadded+27−0View file
drivers/char/tpm/tpm-interface.cmodified+117−35View file
drivers/char/tpm/tpm-sysfs.cmodified+1−1View file
drivers/char/tpm/tpm.hmodified+48−4View file
drivers/char/tpm/tpm2-cmd.cmodified+123−50View file
drivers/char/tpm/tpm2-space.cadded+528−0View file
drivers/char/tpm/tpm2_eventlog.cmodified+10−4View file
drivers/char/tpm/tpm_crb.cmodified+229−50View file
drivers/char/tpm/tpm_i2c_infineon.cmodified+6−6View file
drivers/char/tpm/tpm_i2c_nuvoton.cmodified+16−8View file
drivers/char/tpm/tpm_ibmvtpm.cmodified+6−2View file
drivers/char/tpm/tpm_tis_core.cmodified+23−37View file
drivers/char/tpm/tpm_tis_spi.cmodified+68−92View file
drivers/char/tpm/tpmrm-dev.cadded+65−0View file
fs/namei.cmodified+10−10View file
include/acpi/actbl2.hmodified+1−0View file
include/crypto/public_key.hmodified+13−2View file
include/keys/system_keyring.hmodified+16−2View file
include/linux/compat.hmodified+7−0View file
include/linux/init_task.hmodified+7−0View file
include/linux/key-type.hmodified+8−0View file
include/linux/key.hmodified+25−14View file
include/linux/lsm_hooks.hmodified+30−4View file
include/linux/sched.hmodified+4−0View file
include/linux/security.hmodified+20−0View file
include/linux/tpm.hmodified+2−1View file
include/uapi/linux/keyctl.hmodified+8−0View file
kernel/fork.cmodified+6−1View file
kernel/sys.cmodified+18−12View file
scripts/selinux/genheaders/genheaders.cmodified+1−0View file
scripts/selinux/mdp/mdp.cmodified+1−0View file
security/Kconfigmodified+5−0View file
security/apparmor/crypto.cmodified+13−19View file
security/apparmor/include/lib.hmodified+1−1View file
security/apparmor/lib.cmodified+2−2View file
security/apparmor/lsm.cmodified+25−28View file
security/apparmor/policy.cmodified+4−2View file
security/commoncap.cmodified+1−1View file
security/integrity/digsig.cmodified+8−1View file
security/integrity/ima/ima_appraise.cmodified+3−2View file
security/integrity/ima/ima_mok.cmodified+10−1View file
security/integrity/ima/ima_policy.cmodified+91−32View file
security/keys/Kconfigmodified+2−0View file
security/keys/Makefilemodified+2−1View file
security/keys/compat.cmodified+7−2View file
security/keys/compat_dh.cadded+38−0View file
security/keys/dh.cmodified+208−12View file
security/keys/gc.cmodified+12−1View file
security/keys/internal.hmodified+29−3View file
security/keys/key.cmodified+31−27View file
security/keys/keyctl.cmodified+59−1View file
security/keys/keyring.cmodified+175−12View file
security/keys/proc.cmodified+2−2View file
security/keys/process_keys.cmodified+1−1View file
security/keys/request_key_auth.cmodified+1−1View file
security/loadpin/loadpin.cmodified+1−1View file
security/security.cmodified+18−352View file
security/selinux/Kconfigmodified+6−0View file
security/selinux/hooks.cmodified+25−1View file
security/selinux/include/classmap.hmodified+1−1View file
security/selinux/nlmsgtab.cmodified+5−5View file
security/selinux/selinuxfs.cmodified+4−4View file
security/selinux/ss/conditional.cmodified+7−7View file
security/selinux/ss/hashtab.cmodified+5−5View file
security/selinux/ss/policydb.cmodified+24−35View file
security/selinux/ss/services.cmodified+1−1View file
security/selinux/ss/sidtab.cmodified+3−3View file
security/smack/smack_access.cmodified+1−1View file
security/smack/smack_lsm.cmodified+2−4View file
security/tomoyo/file.cmodified+6−6View file
security/tomoyo/tomoyo.cmodified+11−11View file
security/yama/yama_lsm.cmodified+1−1View file

Only the first 600 diff lines are shown. Download the complete patch.

Documentation/crypto/asymmetric-keys.txt

View file
diff --git a/Documentation/crypto/asymmetric-keys.txt b/Documentation/crypto/asymmetric-keys.txt
index 2b7816d..5ad6480 100644
--- a/Documentation/crypto/asymmetric-keys.txt
+++ b/Documentation/crypto/asymmetric-keys.txt
@@ -311,3 +311,54 @@ Functions are provided to register and unregister parsers:
Parsers may not have the same name. The names are otherwise only used for
displaying in debugging messages.
+
+
+=========================
+KEYRING LINK RESTRICTIONS
+=========================
+
+Keyrings created from userspace using add_key can be configured to check the
+signature of the key being linked.
+
+Several restriction methods are available:
+
+ (1) Restrict using the kernel builtin trusted keyring
+
+ - Option string used with KEYCTL_RESTRICT_KEYRING:
+ - "builtin_trusted"
+
+ The kernel builtin trusted keyring will be searched for the signing
+ key. The ca_keys kernel parameter also affects which keys are used for
+ signature verification.
+
+ (2) Restrict using the kernel builtin and secondary trusted keyrings
+
+ - Option string used with KEYCTL_RESTRICT_KEYRING:
+ - "builtin_and_secondary_trusted"
+
+ The kernel builtin and secondary trusted keyrings will be searched for the
+ signing key. The ca_keys kernel parameter also affects which keys are used
+ for signature verification.
+
+ (3) Restrict using a separate key or keyring
+
+ - Option string used with KEYCTL_RESTRICT_KEYRING:
+ - "key_or_keyring:<key or keyring serial number>[:chain]"
+
+ Whenever a key link is requested, the link will only succeed if the key
+ being linked is signed by one of the designated keys. This key may be
+ specified directly by providing a serial number for one asymmetric key, or
+ a group of keys may be searched for the signing key by providing the
+ serial number for a keyring.
+
+ When the "chain" option is provided at the end of the string, the keys
+ within the destination keyring will also be searched for signing keys.
+ This allows for verification of certificate chains by adding each
+ cert in order (starting closest to the root) to one keyring.
+
+In all of these cases, if the signing key is found the signature of the key to
+be linked will be verified using the signing key. The requested key is added
+to the keyring only if the signature is successfully verified. -ENOKEY is
+returned if the parent certificate could not be found, or -EKEYREJECTED is
+returned if the signature check fails or the key is blacklisted. Other errors
+may be returned if the signature check could not be performed.

Documentation/security/keys.txt

View file
diff --git a/Documentation/security/keys.txt b/Documentation/security/keys.txt
index 0e03baf..cd50199 100644
--- a/Documentation/security/keys.txt
+++ b/Documentation/security/keys.txt
@@ -827,7 +827,7 @@ The keyctl syscall functions are:
long keyctl(KEYCTL_DH_COMPUTE, struct keyctl_dh_params *params,
char *buffer, size_t buflen,
- void *reserved);
+ struct keyctl_kdf_params *kdf);
The params struct contains serial numbers for three keys:
@@ -844,18 +844,61 @@ The keyctl syscall functions are:
public key. If the base is the remote public key, the result is
the shared secret.
- The reserved argument must be set to NULL.
+ If the parameter kdf is NULL, the following applies:
- The buffer length must be at least the length of the prime, or zero.
+ - The buffer length must be at least the length of the prime, or zero.
- If the buffer length is nonzero, the length of the result is
- returned when it is successfully calculated and copied in to the
- buffer. When the buffer length is zero, the minimum required
- buffer length is returned.
+ - If the buffer length is nonzero, the length of the result is
+ returned when it is successfully calculated and copied in to the
+ buffer. When the buffer length is zero, the minimum required
+ buffer length is returned.
+
+ The kdf parameter allows the caller to apply a key derivation function
+ (KDF) on the Diffie-Hellman computation where only the result
+ of the KDF is returned to the caller. The KDF is characterized with
+ struct keyctl_kdf_params as follows:
+
+ - char *hashname specifies the NUL terminated string identifying
+ the hash used from the kernel crypto API and applied for the KDF
+ operation. The KDF implemenation complies with SP800-56A as well
+ as with SP800-108 (the counter KDF).
+
+ - char *otherinfo specifies the OtherInfo data as documented in
+ SP800-56A section 5.8.1.2. The length of the buffer is given with
+ otherinfolen. The format of OtherInfo is defined by the caller.
+ The otherinfo pointer may be NULL if no OtherInfo shall be used.
This function will return error EOPNOTSUPP if the key type is not
supported, error ENOKEY if the key could not be found, or error
- EACCES if the key is not readable by the caller.
+ EACCES if the key is not readable by the caller. In addition, the
+ function will return EMSGSIZE when the parameter kdf is non-NULL
+ and either the buffer length or the OtherInfo length exceeds the
+ allowed length.
+
+ (*) Restrict keyring linkage
+
+ long keyctl(KEYCTL_RESTRICT_KEYRING, key_serial_t keyring,
+ const char *type, const char *restriction);
+
+ An existing keyring can restrict linkage of additional keys by evaluating
+ the contents of the key according to a restriction scheme.
+
+ "keyring" is the key ID for an existing keyring to apply a restriction
+ to. It may be empty or may already have keys linked. Existing linked keys
+ will remain in the keyring even if the new restriction would reject them.
+
+ "type" is a registered key type.
+
+ "restriction" is a string describing how key linkage is to be restricted.
+ The format varies depending on the key type, and the string is passed to
+ the lookup_restriction() function for the requested type. It may specify
+ a method and relevant data for the restriction such as signature
+ verification or constraints on key payload. If the requested key type is
+ later unregistered, no keys may be added to the keyring after the key type
+ is removed.
+
+ To apply a keyring restriction the process must have Set Attribute
+ permission and the keyring must not be previously restricted.
===============
KERNEL SERVICES
@@ -1032,10 +1075,7 @@ payload contents" for more information.
struct key *keyring_alloc(const char *description, uid_t uid, gid_t gid,
const struct cred *cred,
key_perm_t perm,
- int (*restrict_link)(struct key *,
- const struct key_type *,
- unsigned long,
- const union key_payload *),
+ struct key_restriction *restrict_link,
unsigned long flags,
struct key *dest);
@@ -1047,20 +1087,23 @@ payload contents" for more information.
KEY_ALLOC_NOT_IN_QUOTA in flags if the keyring shouldn't be accounted
towards the user's quota). Error ENOMEM can also be returned.
- If restrict_link not NULL, it should point to a function that will be
- called each time an attempt is made to link a key into the new keyring.
- This function is called to check whether a key may be added into the keying
- or not. Callers of key_create_or_update() within the kernel can pass
- KEY_ALLOC_BYPASS_RESTRICTION to suppress the check. An example of using
- this is to manage rings of cryptographic keys that are set up when the
- kernel boots where userspace is also permitted to add keys - provided they
- can be verified by a key the kernel already has.
+ If restrict_link is not NULL, it should point to a structure that contains
+ the function that will be called each time an attempt is made to link a
+ key into the new keyring. The structure may also contain a key pointer
+ and an associated key type. The function is called to check whether a key
+ may be added into the keyring or not. The key type is used by the garbage
+ collector to clean up function or data pointers in this structure if the
+ given key type is unregistered. Callers of key_create_or_update() within
+ the kernel can pass KEY_ALLOC_BYPASS_RESTRICTION to suppress the check.
+ An example of using this is to manage rings of cryptographic keys that are
+ set up when the kernel boots where userspace is also permitted to add keys
+ - provided they can be verified by a key the kernel already has.
When called, the restriction function will be passed the keyring being
- added to, the key flags value and the type and payload of the key being
- added. Note that when a new key is being created, this is called between
- payload preparsing and actual key creation. The function should return 0
- to allow the link or an error to reject it.
+ added to, the key type, the payload of the key being added, and data to be
+ used in the restriction check. Note that when a new key is being created,
+ this is called between payload preparsing and actual key creation. The
+ function should return 0 to allow the link or an error to reject it.
A convenience function, restrict_link_reject, exists to always return
-EPERM to in this case.
@@ -1445,6 +1488,15 @@ The structure has a number of fields, some of which are mandatory:
The authorisation key.
+ (*) struct key_restriction *(*lookup_restriction)(const char *params);
+
+ This optional method is used to enable userspace configuration of keyring
+ restrictions. The restriction parameter string (not including the key type
+ name) is passed in, and this method returns a pointer to a key_restriction
+ structure containing the relevant functions and data to evaluate each
+ attempted key link operation. If there is no match, -EINVAL is returned.
+
+
============================
REQUEST-KEY CALLBACK SERVICE
============================

certs/Kconfig

View file
diff --git a/certs/Kconfig b/certs/Kconfig
index fc5955f..6ce51ed 100644
--- a/certs/Kconfig
+++ b/certs/Kconfig
@@ -64,4 +64,22 @@ config SECONDARY_TRUSTED_KEYRING
those keys are not blacklisted and are vouched for by a key built
into the kernel or already in the secondary trusted keyring.
+config SYSTEM_BLACKLIST_KEYRING
+ bool "Provide system-wide ring of blacklisted keys"
+ depends on KEYS
+ help
+ Provide a system keyring to which blacklisted keys can be added.
+ Keys in the keyring are considered entirely untrusted. Keys in this
+ keyring are used by the module signature checking to reject loading
+ of modules signed with a blacklisted key.
+
+config SYSTEM_BLACKLIST_HASH_LIST
+ string "Hashes to be preloaded into the system blacklist keyring"
+ depends on SYSTEM_BLACKLIST_KEYRING
+ help
+ If set, this option should be the filename of a list of hashes in the
+ form "<hash>", "<hash>", ... . This will be included into a C
+ wrapper to incorporate the list into the kernel. Each <hash> should
+ be a string of hex digits.
+
endmenu

certs/Makefile

View file
diff --git a/certs/Makefile b/certs/Makefile
index 2773c4a..4119bb3 100644
--- a/certs/Makefile
+++ b/certs/Makefile
@@ -3,6 +3,12 @@
#
obj-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += system_keyring.o system_certificates.o
+obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist.o
+ifneq ($(CONFIG_SYSTEM_BLACKLIST_HASH_LIST),"")
+obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist_hashes.o
+else
+obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist_nohashes.o
+endif
ifeq ($(CONFIG_SYSTEM_TRUSTED_KEYRING),y)

certs/blacklist.c

View file
diff --git a/certs/blacklist.c b/certs/blacklist.c
new file mode 100644
index 0000000..3eddce0
--- /dev/null
+++ b/certs/blacklist.c
@@ -0,0 +1,174 @@
+/* System hash blacklist.
+ *
+ * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells ([email protected])
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public Licence
+ * as published by the Free Software Foundation; either version
+ * 2 of the Licence, or (at your option) any later version.
+ */
+
+#define pr_fmt(fmt) "blacklist: "fmt
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/key.h>
+#include <linux/key-type.h>
+#include <linux/sched.h>
+#include <linux/ctype.h>
+#include <linux/err.h>
+#include <linux/seq_file.h>
+#include <keys/system_keyring.h>
+#include "blacklist.h"
+
+static struct key *blacklist_keyring;
+
+/*
+ * The description must be a type prefix, a colon and then an even number of
+ * hex digits. The hash is kept in the description.
+ */
+static int blacklist_vet_description(const char *desc)
+{
+ int n = 0;
+
+ if (*desc == ':')
+ return -EINVAL;
+ for (; *desc; desc++)
+ if (*desc == ':')
+ goto found_colon;
+ return -EINVAL;
+
+found_colon:
+ desc++;
+ for (; *desc; desc++) {
+ if (!isxdigit(*desc))
+ return -EINVAL;
+ n++;
+ }
+
+ if (n == 0 || n & 1)
+ return -EINVAL;
+ return 0;
+}
+
+/*
+ * The hash to be blacklisted is expected to be in the description. There will
+ * be no payload.
+ */
+static int blacklist_preparse(struct key_preparsed_payload *prep)
+{
+ if (prep->datalen > 0)
+ return -EINVAL;
+ return 0;
+}
+
+static void blacklist_free_preparse(struct key_preparsed_payload *prep)
+{
+}
+
+static void blacklist_describe(const struct key *key, struct seq_file *m)
+{
+ seq_puts(m, key->description);
+}
+
+static struct key_type key_type_blacklist = {
+ .name = "blacklist",
+ .vet_description = blacklist_vet_description,
+ .preparse = blacklist_preparse,
+ .free_preparse = blacklist_free_preparse,
+ .instantiate = generic_key_instantiate,
+ .describe = blacklist_describe,
+};
+
+/**
+ * mark_hash_blacklisted - Add a hash to the system blacklist
+ * @hash - The hash as a hex string with a type prefix (eg. "tbs:23aa429783")
+ */
+int mark_hash_blacklisted(const char *hash)
+{
+ key_ref_t key;
+
+ key = key_create_or_update(make_key_ref(blacklist_keyring, true),
+ "blacklist",
+ hash,
+ NULL,
+ 0,
+ ((KEY_POS_ALL & ~KEY_POS_SETATTR) |
+ KEY_USR_VIEW),
+ KEY_ALLOC_NOT_IN_QUOTA |
+ KEY_ALLOC_BUILT_IN);
+ if (IS_ERR(key)) {
+ pr_err("Problem blacklisting hash (%ld)\n", PTR_ERR(key));
+ return PTR_ERR(key);
+ }
+ return 0;
+}
+
+/**
+ * is_hash_blacklisted - Determine if a hash is blacklisted
+ * @hash: The hash to be checked as a binary blob
+ * @hash_len: The length of the binary hash
+ * @type: Type of hash
+ */
+int is_hash_blacklisted(const u8 *hash, size_t hash_len, const char *type)
+{
+ key_ref_t kref;
+ size_t type_len = strlen(type);
+ char *buffer, *p;
+ int ret = 0;
+
+ buffer = kmalloc(type_len + 1 + hash_len * 2 + 1, GFP_KERNEL);
+ if (!buffer)
+ return -ENOMEM;
+ p = memcpy(buffer, type, type_len);
+ p += type_len;
+ *p++ = ':';
+ bin2hex(p, hash, hash_len);
+ p += hash_len * 2;
+ *p = 0;
+
+ kref = keyring_search(make_key_ref(blacklist_keyring, true),
+ &key_type_blacklist, buffer);
+ if (!IS_ERR(kref)) {
+ key_ref_put(kref);
+ ret = -EKEYREJECTED;
+ }
+
+ kfree(buffer);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(is_hash_blacklisted);
+
+/*
+ * Intialise the blacklist
+ */
+static int __init blacklist_init(void)
+{
+ const char *const *bl;
+
+ if (register_key_type(&key_type_blacklist) < 0)
+ panic("Can't allocate system blacklist key type\n");
+
+ blacklist_keyring =
+ keyring_alloc(".blacklist",
+ KUIDT_INIT(0), KGIDT_INIT(0),
+ current_cred(),
+ (KEY_POS_ALL & ~KEY_POS_SETATTR) |
+ KEY_USR_VIEW | KEY_USR_READ |
+ KEY_USR_SEARCH,
+ KEY_ALLOC_NOT_IN_QUOTA |
+ KEY_FLAG_KEEP,
+ NULL, NULL);
+ if (IS_ERR(blacklist_keyring))
+ panic("Can't allocate system blacklist keyring\n");
+
+ for (bl = blacklist_hashes; *bl; bl++)
+ if (mark_hash_blacklisted(*bl) < 0)
+ pr_err("- blacklisting failed\n");
+ return 0;
+}
+
+/*
+ * Must be initialised before we try and load the keys into the keyring.
+ */
+device_initcall(blacklist_init);

certs/blacklist.h

View file
diff --git a/certs/blacklist.h b/certs/blacklist.h
new file mode 100644
index 0000000..150d82d
--- /dev/null
+++ b/certs/blacklist.h
@@ -0,0 +1,3 @@
+#include <linux/kernel.h>
+
+extern const char __initdata *const blacklist_hashes[];

certs/blacklist_hashes.c

View file
diff --git a/certs/blacklist_hashes.c b/certs/blacklist_hashes.c
new file mode 100644
index 0000000..5bd449f
--- /dev/null
+++ b/certs/blacklist_hashes.c
@@ -0,0 +1,6 @@
+#include "blacklist.h"
+
+const char __initdata *const blacklist_hashes[] = {
+#include CONFIG_SYSTEM_BLACKLIST_HASH_LIST
+ , NULL
+};

certs/blacklist_nohashes.c

View file
diff --git a/certs/blacklist_nohashes.c b/certs/blacklist_nohashes.c
new file mode 100644
index 0000000..851de10
--- /dev/null
+++ b/certs/blacklist_nohashes.c
@@ -0,0 +1,5 @@
+#include "blacklist.h"
+
+const char __initdata *const blacklist_hashes[] = {
+ NULL
+};

certs/system_keyring.c

View file
diff --git a/certs/system_keyring.c b/certs/system_keyring.c
index 50979d6..6251d1b 100644
--- a/certs/system_keyring.c
+++ b/certs/system_keyring.c
@@ -14,6 +14,7 @@
#include <linux/sched.h>
#include <linux/cred.h>
#include <linux/err.h>
+#include <linux/slab.h>
#include <keys/asymmetric-type.h>
#include <keys/system_keyring.h>
#include <crypto/pkcs7.h>
@@ -32,11 +33,13 @@ extern __initconst const unsigned long system_certificate_list_size;
* Restrict the addition of keys into a keyring based on the key-to-be-added
* being vouched for by a key in the built in system keyring.
*/
-int restrict_link_by_builtin_trusted(struct key *keyring,
+int restrict_link_by_builtin_trusted(struct key *dest_keyring,
const struct key_type *type,
- const union key_payload *payload)
+ const union key_payload *payload,
+ struct key *restriction_key)
{
- return restrict_link_by_signature(builtin_trusted_keys, type, payload);
+ return restrict_link_by_signature(dest_keyring, type, payload,
+ builtin_trusted_keys);
}
#ifdef CONFIG_SECONDARY_TRUSTED_KEYRING
@@ -49,20 +52,40 @@ int restrict_link_by_builtin_trusted(struct key *keyring,
* keyrings.
*/
int restrict_link_by_builtin_and_secondary_trusted(
- struct key *keyring,
+ struct key *dest_keyring,
const struct key_type *type,
- const union key_payload *payload)
+ const union key_payload *payload,
+ struct key *restrict_key)
{
/* If we have a secondary trusted keyring, then that contains a link
* through to the builtin keyring and the search will follow that link.
*/
if (type == &key_type_keyring &&
- keyring == secondary_trusted_keys &&
+ dest_keyring == secondary_trusted_keys &&
payload == &builtin_trusted_keys->payload)
/* Allow the builtin keyring to be added to the secondary */
return 0;
- return restrict_link_by_signature(secondary_trusted_keys, type, payload);
+ return restrict_link_by_signature(dest_keyring, type, payload,
+ secondary_trusted_keys);
+}
+
+/**
+ * Allocate a struct key_restriction for the "builtin and secondary trust"
+ * keyring. Only for use in system_trusted_keyring_init().
+ */
+static __init struct key_restriction *get_builtin_and_secondary_restriction(void)
+{
+ struct key_restriction *restriction;
+
+ restriction = kzalloc(sizeof(struct key_restriction), GFP_KERNEL);
+
+ if (!restriction)
+ panic("Can't allocate secondary trusted keyring restriction\n");
+
+ restriction->check = restrict_link_by_builtin_and_secondary_trusted;
+
+ return restriction;
}
#endif
@@ -91,7 +114,7 @@ static __init int system_trusted_keyring_init(void)
KEY_USR_VIEW | KEY_USR_READ | KEY_USR_SEARCH |
KEY_USR_WRITE),
KEY_ALLOC_NOT_IN_QUOTA,
- restrict_link_by_builtin_and_secondary_trusted,
+ get_builtin_and_secondary_restriction(),
NULL);
if (IS_ERR(secondary_trusted_keys))
panic("Can't allocate secondary trusted keyring\n");

crypto/asymmetric_keys/asymmetric_type.c

View file
diff --git a/crypto/asymmetric_keys/asymmetric_type.c b/crypto/asymmetric_keys/asymmetric_type.c
index 6600181..e4b0ed3 100644
--- a/crypto/asymmetric_keys/asymmetric_type.c
+++ b/crypto/asymmetric_keys/asymmetric_type.c
@@ -17,6 +17,7 @@
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/ctype.h>
+#include <keys/system_keyring.h>
#include "asymmetric_keys.h"
MODULE_LICENSE("GPL");
@@ -451,15 +452,100 @@ static void asymmetric_key_destroy(struct key *key)
asymmetric_key_free_kids(kids);
}
+static struct key_restriction *asymmetric_restriction_alloc(
+ key_restrict_link_func_t check,
+ struct key *key)
+{
+ struct key_restriction *keyres =
+ kzalloc(sizeof(struct key_restriction), GFP_KERNEL);
+
+ if (!keyres)
+ return ERR_PTR(-ENOMEM);
+
+ keyres->check = check;
+ keyres->key = key;
+ keyres->keytype = &key_type_asymmetric;
+
+ return keyres;
+}
+
+/*
+ * look up keyring restrict functions for asymmetric keys
+ */
+static struct key_restriction *asymmetric_lookup_restriction(
+ const char *restriction)
+{
+ char *restrict_method;
+ char *parse_buf;
+ char *next;
+ struct key_restriction *ret = ERR_PTR(-EINVAL);
+
+ if (strcmp("builtin_trusted", restriction) == 0)
+ return asymmetric_restriction_alloc(
+ restrict_link_by_builtin_trusted, NULL);
+
+ if (strcmp("builtin_and_secondary_trusted", restriction) == 0)
+ return asymmetric_restriction_alloc(
+ restrict_link_by_builtin_and_secondary_trusted, NULL);
+
+ parse_buf = kstrndup(restriction, PAGE_SIZE, GFP_KERNEL);
+ if (!parse_buf)
+ return ERR_PTR(-ENOMEM);
+

This diff is incomplete. Download the complete patch.

crypto/asymmetric_keys/pkcs7_parser.h

View file

This diff is incomplete. Download the complete patch.

crypto/asymmetric_keys/pkcs7_verify.c

View file

This diff is incomplete. Download the complete patch.

crypto/asymmetric_keys/restrict.c

View file

This diff is incomplete. Download the complete patch.

crypto/asymmetric_keys/x509_parser.h

View file

This diff is incomplete. Download the complete patch.

crypto/asymmetric_keys/x509_public_key.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/Kconfig

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/Makefile

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/st33zp24/i2c.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/st33zp24/spi.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/st33zp24/st33zp24.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm-chip.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm-dev-common.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm-dev.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm-dev.h

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm-interface.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm-sysfs.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm.h

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm2-cmd.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm2-space.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm2_eventlog.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm_crb.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm_i2c_infineon.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm_i2c_nuvoton.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm_ibmvtpm.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm_tis_core.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpm_tis_spi.c

View file

This diff is incomplete. Download the complete patch.

drivers/char/tpm/tpmrm-dev.c

View file

This diff is incomplete. Download the complete patch.

fs/namei.c

View file

This diff is incomplete. Download the complete patch.

include/acpi/actbl2.h

View file

This diff is incomplete. Download the complete patch.

include/crypto/public_key.h

View file

This diff is incomplete. Download the complete patch.

include/keys/system_keyring.h

View file

This diff is incomplete. Download the complete patch.

include/linux/compat.h

View file

This diff is incomplete. Download the complete patch.

include/linux/init_task.h

View file

This diff is incomplete. Download the complete patch.

include/linux/key-type.h

View file

This diff is incomplete. Download the complete patch.

include/linux/key.h

View file

This diff is incomplete. Download the complete patch.

include/linux/lsm_hooks.h

View file

This diff is incomplete. Download the complete patch.

include/linux/sched.h

View file

This diff is incomplete. Download the complete patch.

include/linux/security.h

View file

This diff is incomplete. Download the complete patch.

include/linux/tpm.h

View file

This diff is incomplete. Download the complete patch.

include/uapi/linux/keyctl.h

View file

This diff is incomplete. Download the complete patch.

kernel/fork.c

View file

This diff is incomplete. Download the complete patch.

kernel/sys.c

View file

This diff is incomplete. Download the complete patch.

scripts/selinux/genheaders/genheaders.c

View file

This diff is incomplete. Download the complete patch.

scripts/selinux/mdp/mdp.c

View file

This diff is incomplete. Download the complete patch.

security/Kconfig

View file

This diff is incomplete. Download the complete patch.

security/apparmor/crypto.c

View file

This diff is incomplete. Download the complete patch.

security/apparmor/include/lib.h

View file

This diff is incomplete. Download the complete patch.

security/apparmor/lib.c

View file

This diff is incomplete. Download the complete patch.

security/apparmor/lsm.c

View file

This diff is incomplete. Download the complete patch.

security/apparmor/policy.c

View file

This diff is incomplete. Download the complete patch.

security/commoncap.c

View file

This diff is incomplete. Download the complete patch.

security/integrity/digsig.c

View file

This diff is incomplete. Download the complete patch.

security/integrity/ima/ima_appraise.c

View file

This diff is incomplete. Download the complete patch.

security/integrity/ima/ima_mok.c

View file

This diff is incomplete. Download the complete patch.

security/integrity/ima/ima_policy.c

View file

This diff is incomplete. Download the complete patch.

security/keys/Kconfig

View file

This diff is incomplete. Download the complete patch.

security/keys/Makefile

View file

This diff is incomplete. Download the complete patch.

security/keys/compat.c

View file

This diff is incomplete. Download the complete patch.

security/keys/compat_dh.c

View file

This diff is incomplete. Download the complete patch.

security/keys/dh.c

View file

This diff is incomplete. Download the complete patch.

security/keys/gc.c

View file

This diff is incomplete. Download the complete patch.

security/keys/internal.h

View file

This diff is incomplete. Download the complete patch.

security/keys/key.c

View file

This diff is incomplete. Download the complete patch.

security/keys/keyctl.c

View file

This diff is incomplete. Download the complete patch.

security/keys/keyring.c

View file

This diff is incomplete. Download the complete patch.

security/keys/proc.c

View file

This diff is incomplete. Download the complete patch.

security/keys/process_keys.c

View file

This diff is incomplete. Download the complete patch.

security/keys/request_key_auth.c

View file

This diff is incomplete. Download the complete patch.

security/loadpin/loadpin.c

View file

This diff is incomplete. Download the complete patch.

security/security.c

View file

This diff is incomplete. Download the complete patch.

security/selinux/Kconfig

View file

This diff is incomplete. Download the complete patch.

security/selinux/hooks.c

View file

This diff is incomplete. Download the complete patch.

security/selinux/include/classmap.h

View file

This diff is incomplete. Download the complete patch.

security/selinux/nlmsgtab.c

View file

This diff is incomplete. Download the complete patch.

security/selinux/selinuxfs.c

View file

This diff is incomplete. Download the complete patch.

security/selinux/ss/conditional.c

View file

This diff is incomplete. Download the complete patch.

security/selinux/ss/hashtab.c

View file

This diff is incomplete. Download the complete patch.

security/selinux/ss/policydb.c

View file

This diff is incomplete. Download the complete patch.

security/selinux/ss/services.c

View file

This diff is incomplete. Download the complete patch.

security/selinux/ss/sidtab.c

View file

This diff is incomplete. Download the complete patch.

security/smack/smack_access.c

View file

This diff is incomplete. Download the complete patch.

security/smack/smack_lsm.c

View file

This diff is incomplete. Download the complete patch.

security/tomoyo/file.c

View file

This diff is incomplete. Download the complete patch.

security/tomoyo/tomoyo.c

View file

This diff is incomplete. Download the complete patch.

security/yama/yama_lsm.c

View file

This diff is incomplete. Download the complete patch.