Enabled the in-kernel idmapper.
keyring: allow special keyrings to be cleared
This commit is contained in:
parent
59806edb4d
commit
f3fbdcb713
@ -3706,7 +3706,7 @@ CONFIG_NFSD_V3_ACL=y
|
|||||||
CONFIG_NFSD_V4=y
|
CONFIG_NFSD_V4=y
|
||||||
CONFIG_NFS_FSCACHE=y
|
CONFIG_NFS_FSCACHE=y
|
||||||
# CONFIG_NFS_USE_LEGACY_DNS is not set
|
# CONFIG_NFS_USE_LEGACY_DNS is not set
|
||||||
# CONFIG_NFS_USE_NEW_IDMAPPER is not set
|
CONFIG_NFS_USE_NEW_IDMAPPER=y
|
||||||
CONFIG_PNFS_OBJLAYOUT=m
|
CONFIG_PNFS_OBJLAYOUT=m
|
||||||
CONFIG_PNFS_BLOCK=m
|
CONFIG_PNFS_BLOCK=m
|
||||||
CONFIG_LOCKD=m
|
CONFIG_LOCKD=m
|
||||||
|
@ -464,7 +464,7 @@ Summary: The Linux kernel
|
|||||||
# First the general kernel 2.6 required versions as per
|
# First the general kernel 2.6 required versions as per
|
||||||
# Documentation/Changes
|
# Documentation/Changes
|
||||||
#
|
#
|
||||||
%define kernel_dot_org_conflicts ppp < 2.4.3-3, isdn4k-utils < 3.2-32, nfs-utils < 1.0.7-12, e2fsprogs < 1.37-4, util-linux < 2.12, jfsutils < 1.1.7-2, reiserfs-utils < 3.6.19-2, xfsprogs < 2.6.13-4, procps < 3.2.5-6.3, oprofile < 0.9.1-2, device-mapper-libs < 1.02.63-2, mdadm < 3.2.1-5
|
%define kernel_dot_org_conflicts ppp < 2.4.3-3, isdn4k-utils < 3.2-32, nfs-utils < 1.2.5-7.fc17, e2fsprogs < 1.37-4, util-linux < 2.12, jfsutils < 1.1.7-2, reiserfs-utils < 3.6.19-2, xfsprogs < 2.6.13-4, procps < 3.2.5-6.3, oprofile < 0.9.1-2, device-mapper-libs < 1.02.63-2, mdadm < 3.2.1-5
|
||||||
|
|
||||||
#
|
#
|
||||||
# Then a series of requirements that are distribution specific, either
|
# Then a series of requirements that are distribution specific, either
|
||||||
@ -697,6 +697,7 @@ Patch2901: linux-2.6-v4l-dvb-experimental.patch
|
|||||||
# fs fixes
|
# fs fixes
|
||||||
|
|
||||||
# NFSv4
|
# NFSv4
|
||||||
|
Patch1101: linux-3.1-keys-remove-special-keyring.patch
|
||||||
|
|
||||||
# patches headed upstream
|
# patches headed upstream
|
||||||
Patch12016: disable-i8042-check-on-apple-mac.patch
|
Patch12016: disable-i8042-check-on-apple-mac.patch
|
||||||
@ -1297,6 +1298,7 @@ ApplyPatch arm-smsc-support-reading-mac-address-from-device-tree.patch
|
|||||||
# eCryptfs
|
# eCryptfs
|
||||||
|
|
||||||
# NFSv4
|
# NFSv4
|
||||||
|
ApplyPatch linux-3.1-keys-remove-special-keyring.patch
|
||||||
|
|
||||||
# USB
|
# USB
|
||||||
|
|
||||||
@ -2229,6 +2231,10 @@ fi
|
|||||||
# ||----w |
|
# ||----w |
|
||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Dec 14 2011 Steve Dickson <steved@redhat.com>
|
||||||
|
- Enabled the in-kernel idmapper.
|
||||||
|
- keyring: allow special keyrings to be cleared
|
||||||
|
|
||||||
* Wed Dec 14 2011 Dave Jones <davej@redhat.com> - 3.2.0-0.rc5.git2.1
|
* Wed Dec 14 2011 Dave Jones <davej@redhat.com> - 3.2.0-0.rc5.git2.1
|
||||||
- Linux 3.2-rc5-git2 (373da0a2a33018d560afcb2c77f8842985d79594)
|
- Linux 3.2-rc5-git2 (373da0a2a33018d560afcb2c77f8842985d79594)
|
||||||
|
|
||||||
|
110
linux-3.1-keys-remove-special-keyring.patch
Normal file
110
linux-3.1-keys-remove-special-keyring.patch
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
diff -up linux-3.1.x86_64/Documentation/networking/dns_resolver.txt.orig linux-3.1.x86_64/Documentation/networking/dns_resolver.txt
|
||||||
|
--- linux-3.1.x86_64/Documentation/networking/dns_resolver.txt.orig 2011-10-24 03:10:05.000000000 -0400
|
||||||
|
+++ linux-3.1.x86_64/Documentation/networking/dns_resolver.txt 2011-12-13 15:09:35.705766078 -0500
|
||||||
|
@@ -102,6 +102,10 @@ implemented in the module can be called
|
||||||
|
If _expiry is non-NULL, the expiry time (TTL) of the result will be
|
||||||
|
returned also.
|
||||||
|
|
||||||
|
+The kernel maintains an internal keyring in which it caches looked up keys.
|
||||||
|
+This can be cleared by any process that has the CAP_SYS_ADMIN capability by
|
||||||
|
+the use of KEYCTL_KEYRING_CLEAR on the keyring ID.
|
||||||
|
+
|
||||||
|
|
||||||
|
===============================
|
||||||
|
READING DNS KEYS FROM USERSPACE
|
||||||
|
diff -up linux-3.1.x86_64/Documentation/security/keys.txt.orig linux-3.1.x86_64/Documentation/security/keys.txt
|
||||||
|
--- linux-3.1.x86_64/Documentation/security/keys.txt.orig 2011-10-24 03:10:05.000000000 -0400
|
||||||
|
+++ linux-3.1.x86_64/Documentation/security/keys.txt 2011-12-13 15:09:35.706766099 -0500
|
||||||
|
@@ -554,6 +554,10 @@ The keyctl syscall functions are:
|
||||||
|
process must have write permission on the keyring, and it must be a
|
||||||
|
keyring (or else error ENOTDIR will result).
|
||||||
|
|
||||||
|
+ This function can also be used to clear special kernel keyrings if they
|
||||||
|
+ are appropriately marked if the user has CAP_SYS_ADMIN capability. The
|
||||||
|
+ DNS resolver cache keyring is an example of this.
|
||||||
|
+
|
||||||
|
|
||||||
|
(*) Link a key into a keyring:
|
||||||
|
|
||||||
|
diff -up linux-3.1.x86_64/fs/cifs/cifsacl.c.orig linux-3.1.x86_64/fs/cifs/cifsacl.c
|
||||||
|
--- linux-3.1.x86_64/fs/cifs/cifsacl.c.orig 2011-12-13 12:54:12.221145867 -0500
|
||||||
|
+++ linux-3.1.x86_64/fs/cifs/cifsacl.c 2011-12-13 15:09:35.707766122 -0500
|
||||||
|
@@ -556,6 +556,7 @@ init_cifs_idmap(void)
|
||||||
|
|
||||||
|
/* instruct request_key() to use this special keyring as a cache for
|
||||||
|
* the results it looks up */
|
||||||
|
+ set_bit(KEY_FLAG_ROOT_CAN_CLEAR, &keyring->flags);
|
||||||
|
cred->thread_keyring = keyring;
|
||||||
|
cred->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING;
|
||||||
|
root_cred = cred;
|
||||||
|
diff -up linux-3.1.x86_64/fs/nfs/idmap.c.orig linux-3.1.x86_64/fs/nfs/idmap.c
|
||||||
|
--- linux-3.1.x86_64/fs/nfs/idmap.c.orig 2011-12-13 12:54:14.657203507 -0500
|
||||||
|
+++ linux-3.1.x86_64/fs/nfs/idmap.c 2011-12-13 15:10:14.731681691 -0500
|
||||||
|
@@ -115,6 +115,7 @@ int nfs_idmap_init(void)
|
||||||
|
if (ret < 0)
|
||||||
|
goto failed_put_key;
|
||||||
|
|
||||||
|
+ set_bit(KEY_FLAG_ROOT_CAN_CLEAR, &keyring->flags);
|
||||||
|
cred->thread_keyring = keyring;
|
||||||
|
cred->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING;
|
||||||
|
id_resolver_cache = cred;
|
||||||
|
@@ -185,7 +186,7 @@ static ssize_t nfs_idmap_request_key(con
|
||||||
|
}
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
|
- rkey->perm |= KEY_USR_VIEW;
|
||||||
|
+ rkey->perm |= KEY_USR_VIEW|KEY_USR_WRITE;
|
||||||
|
|
||||||
|
ret = key_validate(rkey);
|
||||||
|
if (ret < 0)
|
||||||
|
diff -up linux-3.1.x86_64/include/linux/key.h.orig linux-3.1.x86_64/include/linux/key.h
|
||||||
|
--- linux-3.1.x86_64/include/linux/key.h.orig 2011-10-24 03:10:05.000000000 -0400
|
||||||
|
+++ linux-3.1.x86_64/include/linux/key.h 2011-12-13 15:09:35.748767078 -0500
|
||||||
|
@@ -155,6 +155,7 @@ struct key {
|
||||||
|
#define KEY_FLAG_IN_QUOTA 3 /* set if key consumes quota */
|
||||||
|
#define KEY_FLAG_USER_CONSTRUCT 4 /* set if key is being constructed in userspace */
|
||||||
|
#define KEY_FLAG_NEGATIVE 5 /* set if key is negative */
|
||||||
|
+#define KEY_FLAG_ROOT_CAN_CLEAR 6 /* set if key can be cleared by root without permission */
|
||||||
|
|
||||||
|
/* the description string
|
||||||
|
* - this is used to match a key against search criteria
|
||||||
|
diff -up linux-3.1.x86_64/net/dns_resolver/dns_key.c.orig linux-3.1.x86_64/net/dns_resolver/dns_key.c
|
||||||
|
--- linux-3.1.x86_64/net/dns_resolver/dns_key.c.orig 2011-10-24 03:10:05.000000000 -0400
|
||||||
|
+++ linux-3.1.x86_64/net/dns_resolver/dns_key.c 2011-12-13 15:09:35.748767078 -0500
|
||||||
|
@@ -281,6 +281,7 @@ static int __init init_dns_resolver(void
|
||||||
|
|
||||||
|
/* instruct request_key() to use this special keyring as a cache for
|
||||||
|
* the results it looks up */
|
||||||
|
+ set_bit(KEY_FLAG_ROOT_CAN_CLEAR, &keyring->flags);
|
||||||
|
cred->thread_keyring = keyring;
|
||||||
|
cred->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING;
|
||||||
|
dns_resolver_cache = cred;
|
||||||
|
diff -up linux-3.1.x86_64/security/keys/keyctl.c.orig linux-3.1.x86_64/security/keys/keyctl.c
|
||||||
|
--- linux-3.1.x86_64/security/keys/keyctl.c.orig 2011-12-13 12:54:30.322571289 -0500
|
||||||
|
+++ linux-3.1.x86_64/security/keys/keyctl.c 2011-12-13 15:09:35.756767271 -0500
|
||||||
|
@@ -388,11 +388,24 @@ long keyctl_keyring_clear(key_serial_t r
|
||||||
|
keyring_ref = lookup_user_key(ringid, KEY_LOOKUP_CREATE, KEY_WRITE);
|
||||||
|
if (IS_ERR(keyring_ref)) {
|
||||||
|
ret = PTR_ERR(keyring_ref);
|
||||||
|
+
|
||||||
|
+ /* Root is permitted to invalidate certain special keyrings */
|
||||||
|
+ if (capable(CAP_SYS_ADMIN)) {
|
||||||
|
+ keyring_ref = lookup_user_key(ringid, 0, 0);
|
||||||
|
+ if (IS_ERR(keyring_ref))
|
||||||
|
+ goto error;
|
||||||
|
+ if (test_bit(KEY_FLAG_ROOT_CAN_CLEAR,
|
||||||
|
+ &key_ref_to_ptr(keyring_ref)->flags))
|
||||||
|
+ goto clear;
|
||||||
|
+ goto error_put;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
+clear:
|
||||||
|
ret = keyring_clear(key_ref_to_ptr(keyring_ref));
|
||||||
|
-
|
||||||
|
+error_put:
|
||||||
|
key_ref_put(keyring_ref);
|
||||||
|
error:
|
||||||
|
return ret;
|
Loading…
Reference in New Issue
Block a user