Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
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
...
This commit is contained in:
@@ -1584,6 +1584,59 @@ long keyctl_session_to_parent(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Apply a restriction to a given keyring.
|
||||
*
|
||||
* The caller must have Setattr permission to change keyring restrictions.
|
||||
*
|
||||
* The requested type name may be a NULL pointer to reject all attempts
|
||||
* to link to the keyring. If _type is non-NULL, _restriction can be
|
||||
* NULL or a pointer to a string describing the restriction. If _type is
|
||||
* NULL, _restriction must also be NULL.
|
||||
*
|
||||
* Returns 0 if successful.
|
||||
*/
|
||||
long keyctl_restrict_keyring(key_serial_t id, const char __user *_type,
|
||||
const char __user *_restriction)
|
||||
{
|
||||
key_ref_t key_ref;
|
||||
bool link_reject = !_type;
|
||||
char type[32];
|
||||
char *restriction = NULL;
|
||||
long ret;
|
||||
|
||||
key_ref = lookup_user_key(id, 0, KEY_NEED_SETATTR);
|
||||
if (IS_ERR(key_ref))
|
||||
return PTR_ERR(key_ref);
|
||||
|
||||
if (_type) {
|
||||
ret = key_get_type_from_user(type, _type, sizeof(type));
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (_restriction) {
|
||||
if (!_type) {
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
restriction = strndup_user(_restriction, PAGE_SIZE);
|
||||
if (IS_ERR(restriction)) {
|
||||
ret = PTR_ERR(restriction);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
ret = keyring_restrict(key_ref, link_reject ? NULL : type, restriction);
|
||||
kfree(restriction);
|
||||
|
||||
error:
|
||||
key_ref_put(key_ref);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* The key control system call
|
||||
*/
|
||||
@@ -1693,7 +1746,12 @@ SYSCALL_DEFINE5(keyctl, int, option, unsigned long, arg2, unsigned long, arg3,
|
||||
case KEYCTL_DH_COMPUTE:
|
||||
return keyctl_dh_compute((struct keyctl_dh_params __user *) arg2,
|
||||
(char __user *) arg3, (size_t) arg4,
|
||||
(void __user *) arg5);
|
||||
(struct keyctl_kdf_params __user *) arg5);
|
||||
|
||||
case KEYCTL_RESTRICT_KEYRING:
|
||||
return keyctl_restrict_keyring((key_serial_t) arg2,
|
||||
(const char __user *) arg3,
|
||||
(const char __user *) arg4);
|
||||
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
Reference in New Issue
Block a user