diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-06 11:06:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-06 11:06:39 -0400 |
commit | bb2cbf5e9367d8598fecd0c48dead69560750223 (patch) | |
tree | fb2c620451b90f41a31726bdd82077813f941e39 /fs | |
parent | e7fda6c4c3c1a7d6996dd75fd84670fa0b5d448f (diff) | |
parent | 478d085524c57cf4283699f529d5a4c22188ea69 (diff) |
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
Pull security subsystem updates from James Morris:
"In this release:
- PKCS#7 parser for the key management subsystem from David Howells
- appoint Kees Cook as seccomp maintainer
- bugfixes and general maintenance across the subsystem"
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security: (94 commits)
X.509: Need to export x509_request_asymmetric_key()
netlabel: shorter names for the NetLabel catmap funcs/structs
netlabel: fix the catmap walking functions
netlabel: fix the horribly broken catmap functions
netlabel: fix a problem when setting bits below the previously lowest bit
PKCS#7: X.509 certificate issuer and subject are mandatory fields in the ASN.1
tpm: simplify code by using %*phN specifier
tpm: Provide a generic means to override the chip returned timeouts
tpm: missing tpm_chip_put in tpm_get_random()
tpm: Properly clean sysfs entries in error path
tpm: Add missing tpm_do_selftest to ST33 I2C driver
PKCS#7: Use x509_request_asymmetric_key()
Revert "selinux: fix the default socket labeling in sock_graft()"
X.509: x509_request_asymmetric_keys() doesn't need string length arguments
PKCS#7: fix sparse non static symbol warning
KEYS: revert encrypted key change
ima: add support for measuring and appraising firmware
firmware_class: perform new LSM checks
security: introduce kernel_fw_from_file hook
PKCS#7: Missing inclusion of linux/err.h
...
Diffstat (limited to 'fs')
-rw-r--r-- | fs/exec.c | 6 | ||||
-rw-r--r-- | fs/nfs/idmap.c | 10 | ||||
-rw-r--r-- | fs/proc/array.c | 11 |
3 files changed, 12 insertions, 15 deletions
@@ -1216,7 +1216,7 @@ EXPORT_SYMBOL(install_exec_creds); | |||
1216 | /* | 1216 | /* |
1217 | * determine how safe it is to execute the proposed program | 1217 | * determine how safe it is to execute the proposed program |
1218 | * - the caller must hold ->cred_guard_mutex to protect against | 1218 | * - the caller must hold ->cred_guard_mutex to protect against |
1219 | * PTRACE_ATTACH | 1219 | * PTRACE_ATTACH or seccomp thread-sync |
1220 | */ | 1220 | */ |
1221 | static void check_unsafe_exec(struct linux_binprm *bprm) | 1221 | static void check_unsafe_exec(struct linux_binprm *bprm) |
1222 | { | 1222 | { |
@@ -1234,7 +1234,7 @@ static void check_unsafe_exec(struct linux_binprm *bprm) | |||
1234 | * This isn't strictly necessary, but it makes it harder for LSMs to | 1234 | * This isn't strictly necessary, but it makes it harder for LSMs to |
1235 | * mess up. | 1235 | * mess up. |
1236 | */ | 1236 | */ |
1237 | if (current->no_new_privs) | 1237 | if (task_no_new_privs(current)) |
1238 | bprm->unsafe |= LSM_UNSAFE_NO_NEW_PRIVS; | 1238 | bprm->unsafe |= LSM_UNSAFE_NO_NEW_PRIVS; |
1239 | 1239 | ||
1240 | t = p; | 1240 | t = p; |
@@ -1272,7 +1272,7 @@ int prepare_binprm(struct linux_binprm *bprm) | |||
1272 | bprm->cred->egid = current_egid(); | 1272 | bprm->cred->egid = current_egid(); |
1273 | 1273 | ||
1274 | if (!(bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) && | 1274 | if (!(bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) && |
1275 | !current->no_new_privs && | 1275 | !task_no_new_privs(current) && |
1276 | kuid_has_mapping(bprm->cred->user_ns, inode->i_uid) && | 1276 | kuid_has_mapping(bprm->cred->user_ns, inode->i_uid) && |
1277 | kgid_has_mapping(bprm->cred->user_ns, inode->i_gid)) { | 1277 | kgid_has_mapping(bprm->cred->user_ns, inode->i_gid)) { |
1278 | /* Set-uid? */ | 1278 | /* Set-uid? */ |
diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c index 567983d2c0eb..7dd55b745c4d 100644 --- a/fs/nfs/idmap.c +++ b/fs/nfs/idmap.c | |||
@@ -174,7 +174,9 @@ static int nfs_map_numeric_to_string(__u32 id, char *buf, size_t buflen) | |||
174 | 174 | ||
175 | static struct key_type key_type_id_resolver = { | 175 | static struct key_type key_type_id_resolver = { |
176 | .name = "id_resolver", | 176 | .name = "id_resolver", |
177 | .instantiate = user_instantiate, | 177 | .preparse = user_preparse, |
178 | .free_preparse = user_free_preparse, | ||
179 | .instantiate = generic_key_instantiate, | ||
178 | .match = user_match, | 180 | .match = user_match, |
179 | .revoke = user_revoke, | 181 | .revoke = user_revoke, |
180 | .destroy = user_destroy, | 182 | .destroy = user_destroy, |
@@ -282,6 +284,8 @@ static struct key *nfs_idmap_request_key(const char *name, size_t namelen, | |||
282 | desc, "", 0, idmap); | 284 | desc, "", 0, idmap); |
283 | mutex_unlock(&idmap->idmap_mutex); | 285 | mutex_unlock(&idmap->idmap_mutex); |
284 | } | 286 | } |
287 | if (!IS_ERR(rkey)) | ||
288 | set_bit(KEY_FLAG_ROOT_CAN_INVAL, &rkey->flags); | ||
285 | 289 | ||
286 | kfree(desc); | 290 | kfree(desc); |
287 | return rkey; | 291 | return rkey; |
@@ -394,7 +398,9 @@ static const struct rpc_pipe_ops idmap_upcall_ops = { | |||
394 | 398 | ||
395 | static struct key_type key_type_id_resolver_legacy = { | 399 | static struct key_type key_type_id_resolver_legacy = { |
396 | .name = "id_legacy", | 400 | .name = "id_legacy", |
397 | .instantiate = user_instantiate, | 401 | .preparse = user_preparse, |
402 | .free_preparse = user_free_preparse, | ||
403 | .instantiate = generic_key_instantiate, | ||
398 | .match = user_match, | 404 | .match = user_match, |
399 | .revoke = user_revoke, | 405 | .revoke = user_revoke, |
400 | .destroy = user_destroy, | 406 | .destroy = user_destroy, |
diff --git a/fs/proc/array.c b/fs/proc/array.c index d7f9199217bb..cd3653e4f35c 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -297,15 +297,11 @@ static void render_cap_t(struct seq_file *m, const char *header, | |||
297 | seq_puts(m, header); | 297 | seq_puts(m, header); |
298 | CAP_FOR_EACH_U32(__capi) { | 298 | CAP_FOR_EACH_U32(__capi) { |
299 | seq_printf(m, "%08x", | 299 | seq_printf(m, "%08x", |
300 | a->cap[(_KERNEL_CAPABILITY_U32S-1) - __capi]); | 300 | a->cap[CAP_LAST_U32 - __capi]); |
301 | } | 301 | } |
302 | seq_putc(m, '\n'); | 302 | seq_putc(m, '\n'); |
303 | } | 303 | } |
304 | 304 | ||
305 | /* Remove non-existent capabilities */ | ||
306 | #define NORM_CAPS(v) (v.cap[CAP_TO_INDEX(CAP_LAST_CAP)] &= \ | ||
307 | CAP_TO_MASK(CAP_LAST_CAP + 1) - 1) | ||
308 | |||
309 | static inline void task_cap(struct seq_file *m, struct task_struct *p) | 305 | static inline void task_cap(struct seq_file *m, struct task_struct *p) |
310 | { | 306 | { |
311 | const struct cred *cred; | 307 | const struct cred *cred; |
@@ -319,11 +315,6 @@ static inline void task_cap(struct seq_file *m, struct task_struct *p) | |||
319 | cap_bset = cred->cap_bset; | 315 | cap_bset = cred->cap_bset; |
320 | rcu_read_unlock(); | 316 | rcu_read_unlock(); |
321 | 317 | ||
322 | NORM_CAPS(cap_inheritable); | ||
323 | NORM_CAPS(cap_permitted); | ||
324 | NORM_CAPS(cap_effective); | ||
325 | NORM_CAPS(cap_bset); | ||
326 | |||
327 | render_cap_t(m, "CapInh:\t", &cap_inheritable); | 318 | render_cap_t(m, "CapInh:\t", &cap_inheritable); |
328 | render_cap_t(m, "CapPrm:\t", &cap_permitted); | 319 | render_cap_t(m, "CapPrm:\t", &cap_permitted); |
329 | render_cap_t(m, "CapEff:\t", &cap_effective); | 320 | render_cap_t(m, "CapEff:\t", &cap_effective); |