xref: /openbmc/linux/security/keys/request_key.c (revision baa7eb025ab14f3cba2e35c0a8648f9c9f01d24f)
1 /* Request a key from userspace
2  *
3  * Copyright (C) 2004-2007 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells (dhowells@redhat.com)
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version
9  * 2 of the License, or (at your option) any later version.
10  *
11  * See Documentation/keys-request-key.txt
12  */
13 
14 #include <linux/module.h>
15 #include <linux/sched.h>
16 #include <linux/kmod.h>
17 #include <linux/err.h>
18 #include <linux/keyctl.h>
19 #include <linux/slab.h>
20 #include "internal.h"
21 
22 #define key_negative_timeout	60	/* default timeout on a negative key's existence */
23 
24 /*
25  * wait_on_bit() sleep function for uninterruptible waiting
26  */
27 static int key_wait_bit(void *flags)
28 {
29 	schedule();
30 	return 0;
31 }
32 
33 /*
34  * wait_on_bit() sleep function for interruptible waiting
35  */
36 static int key_wait_bit_intr(void *flags)
37 {
38 	schedule();
39 	return signal_pending(current) ? -ERESTARTSYS : 0;
40 }
41 
42 /*
43  * call to complete the construction of a key
44  */
45 void complete_request_key(struct key_construction *cons, int error)
46 {
47 	kenter("{%d,%d},%d", cons->key->serial, cons->authkey->serial, error);
48 
49 	if (error < 0)
50 		key_negate_and_link(cons->key, key_negative_timeout, NULL,
51 				    cons->authkey);
52 	else
53 		key_revoke(cons->authkey);
54 
55 	key_put(cons->key);
56 	key_put(cons->authkey);
57 	kfree(cons);
58 }
59 EXPORT_SYMBOL(complete_request_key);
60 
61 static int umh_keys_init(struct subprocess_info *info)
62 {
63 	struct cred *cred = (struct cred*)current_cred();
64 	struct key *keyring = info->data;
65 	/*
66 	 * This is called in context of freshly forked kthread before
67 	 * kernel_execve(), we can just change our ->session_keyring.
68 	 */
69 	return install_session_keyring_to_cred(cred, keyring);
70 }
71 
72 static void umh_keys_cleanup(struct subprocess_info *info)
73 {
74 	struct key *keyring = info->data;
75 	key_put(keyring);
76 }
77 
78 static int call_usermodehelper_keys(char *path, char **argv, char **envp,
79 			 struct key *session_keyring, enum umh_wait wait)
80 {
81 	gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL;
82 	struct subprocess_info *info =
83 		call_usermodehelper_setup(path, argv, envp, gfp_mask);
84 
85 	if (!info)
86 		return -ENOMEM;
87 
88 	call_usermodehelper_setfns(info, umh_keys_init, umh_keys_cleanup,
89 					key_get(session_keyring));
90 	return call_usermodehelper_exec(info, wait);
91 }
92 
93 /*
94  * request userspace finish the construction of a key
95  * - execute "/sbin/request-key <op> <key> <uid> <gid> <keyring> <keyring> <keyring>"
96  */
97 static int call_sbin_request_key(struct key_construction *cons,
98 				 const char *op,
99 				 void *aux)
100 {
101 	const struct cred *cred = current_cred();
102 	key_serial_t prkey, sskey;
103 	struct key *key = cons->key, *authkey = cons->authkey, *keyring,
104 		*session;
105 	char *argv[9], *envp[3], uid_str[12], gid_str[12];
106 	char key_str[12], keyring_str[3][12];
107 	char desc[20];
108 	int ret, i;
109 
110 	kenter("{%d},{%d},%s", key->serial, authkey->serial, op);
111 
112 	ret = install_user_keyrings();
113 	if (ret < 0)
114 		goto error_alloc;
115 
116 	/* allocate a new session keyring */
117 	sprintf(desc, "_req.%u", key->serial);
118 
119 	cred = get_current_cred();
120 	keyring = keyring_alloc(desc, cred->fsuid, cred->fsgid, cred,
121 				KEY_ALLOC_QUOTA_OVERRUN, NULL);
122 	put_cred(cred);
123 	if (IS_ERR(keyring)) {
124 		ret = PTR_ERR(keyring);
125 		goto error_alloc;
126 	}
127 
128 	/* attach the auth key to the session keyring */
129 	ret = key_link(keyring, authkey);
130 	if (ret < 0)
131 		goto error_link;
132 
133 	/* record the UID and GID */
134 	sprintf(uid_str, "%d", cred->fsuid);
135 	sprintf(gid_str, "%d", cred->fsgid);
136 
137 	/* we say which key is under construction */
138 	sprintf(key_str, "%d", key->serial);
139 
140 	/* we specify the process's default keyrings */
141 	sprintf(keyring_str[0], "%d",
142 		cred->thread_keyring ? cred->thread_keyring->serial : 0);
143 
144 	prkey = 0;
145 	if (cred->tgcred->process_keyring)
146 		prkey = cred->tgcred->process_keyring->serial;
147 	sprintf(keyring_str[1], "%d", prkey);
148 
149 	rcu_read_lock();
150 	session = rcu_dereference(cred->tgcred->session_keyring);
151 	if (!session)
152 		session = cred->user->session_keyring;
153 	sskey = session->serial;
154 	rcu_read_unlock();
155 
156 	sprintf(keyring_str[2], "%d", sskey);
157 
158 	/* set up a minimal environment */
159 	i = 0;
160 	envp[i++] = "HOME=/";
161 	envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
162 	envp[i] = NULL;
163 
164 	/* set up the argument list */
165 	i = 0;
166 	argv[i++] = "/sbin/request-key";
167 	argv[i++] = (char *) op;
168 	argv[i++] = key_str;
169 	argv[i++] = uid_str;
170 	argv[i++] = gid_str;
171 	argv[i++] = keyring_str[0];
172 	argv[i++] = keyring_str[1];
173 	argv[i++] = keyring_str[2];
174 	argv[i] = NULL;
175 
176 	/* do it */
177 	ret = call_usermodehelper_keys(argv[0], argv, envp, keyring,
178 				       UMH_WAIT_PROC);
179 	kdebug("usermode -> 0x%x", ret);
180 	if (ret >= 0) {
181 		/* ret is the exit/wait code */
182 		if (test_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags) ||
183 		    key_validate(key) < 0)
184 			ret = -ENOKEY;
185 		else
186 			/* ignore any errors from userspace if the key was
187 			 * instantiated */
188 			ret = 0;
189 	}
190 
191 error_link:
192 	key_put(keyring);
193 
194 error_alloc:
195 	complete_request_key(cons, ret);
196 	kleave(" = %d", ret);
197 	return ret;
198 }
199 
200 /*
201  * call out to userspace for key construction
202  * - we ignore program failure and go on key status instead
203  */
204 static int construct_key(struct key *key, const void *callout_info,
205 			 size_t callout_len, void *aux,
206 			 struct key *dest_keyring)
207 {
208 	struct key_construction *cons;
209 	request_key_actor_t actor;
210 	struct key *authkey;
211 	int ret;
212 
213 	kenter("%d,%p,%zu,%p", key->serial, callout_info, callout_len, aux);
214 
215 	cons = kmalloc(sizeof(*cons), GFP_KERNEL);
216 	if (!cons)
217 		return -ENOMEM;
218 
219 	/* allocate an authorisation key */
220 	authkey = request_key_auth_new(key, callout_info, callout_len,
221 				       dest_keyring);
222 	if (IS_ERR(authkey)) {
223 		kfree(cons);
224 		ret = PTR_ERR(authkey);
225 		authkey = NULL;
226 	} else {
227 		cons->authkey = key_get(authkey);
228 		cons->key = key_get(key);
229 
230 		/* make the call */
231 		actor = call_sbin_request_key;
232 		if (key->type->request_key)
233 			actor = key->type->request_key;
234 
235 		ret = actor(cons, "create", aux);
236 
237 		/* check that the actor called complete_request_key() prior to
238 		 * returning an error */
239 		WARN_ON(ret < 0 &&
240 			!test_bit(KEY_FLAG_REVOKED, &authkey->flags));
241 		key_put(authkey);
242 	}
243 
244 	kleave(" = %d", ret);
245 	return ret;
246 }
247 
248 /*
249  * get the appropriate destination keyring for the request
250  * - we return whatever keyring we select with an extra reference upon it which
251  *   the caller must release
252  */
253 static void construct_get_dest_keyring(struct key **_dest_keyring)
254 {
255 	struct request_key_auth *rka;
256 	const struct cred *cred = current_cred();
257 	struct key *dest_keyring = *_dest_keyring, *authkey;
258 
259 	kenter("%p", dest_keyring);
260 
261 	/* find the appropriate keyring */
262 	if (dest_keyring) {
263 		/* the caller supplied one */
264 		key_get(dest_keyring);
265 	} else {
266 		/* use a default keyring; falling through the cases until we
267 		 * find one that we actually have */
268 		switch (cred->jit_keyring) {
269 		case KEY_REQKEY_DEFL_DEFAULT:
270 		case KEY_REQKEY_DEFL_REQUESTOR_KEYRING:
271 			if (cred->request_key_auth) {
272 				authkey = cred->request_key_auth;
273 				down_read(&authkey->sem);
274 				rka = authkey->payload.data;
275 				if (!test_bit(KEY_FLAG_REVOKED,
276 					      &authkey->flags))
277 					dest_keyring =
278 						key_get(rka->dest_keyring);
279 				up_read(&authkey->sem);
280 				if (dest_keyring)
281 					break;
282 			}
283 
284 		case KEY_REQKEY_DEFL_THREAD_KEYRING:
285 			dest_keyring = key_get(cred->thread_keyring);
286 			if (dest_keyring)
287 				break;
288 
289 		case KEY_REQKEY_DEFL_PROCESS_KEYRING:
290 			dest_keyring = key_get(cred->tgcred->process_keyring);
291 			if (dest_keyring)
292 				break;
293 
294 		case KEY_REQKEY_DEFL_SESSION_KEYRING:
295 			rcu_read_lock();
296 			dest_keyring = key_get(
297 				rcu_dereference(cred->tgcred->session_keyring));
298 			rcu_read_unlock();
299 
300 			if (dest_keyring)
301 				break;
302 
303 		case KEY_REQKEY_DEFL_USER_SESSION_KEYRING:
304 			dest_keyring =
305 				key_get(cred->user->session_keyring);
306 			break;
307 
308 		case KEY_REQKEY_DEFL_USER_KEYRING:
309 			dest_keyring = key_get(cred->user->uid_keyring);
310 			break;
311 
312 		case KEY_REQKEY_DEFL_GROUP_KEYRING:
313 		default:
314 			BUG();
315 		}
316 	}
317 
318 	*_dest_keyring = dest_keyring;
319 	kleave(" [dk %d]", key_serial(dest_keyring));
320 	return;
321 }
322 
323 /*
324  * allocate a new key in under-construction state and attempt to link it in to
325  * the requested place
326  * - may return a key that's already under construction instead
327  */
328 static int construct_alloc_key(struct key_type *type,
329 			       const char *description,
330 			       struct key *dest_keyring,
331 			       unsigned long flags,
332 			       struct key_user *user,
333 			       struct key **_key)
334 {
335 	struct keyring_list *prealloc;
336 	const struct cred *cred = current_cred();
337 	struct key *key;
338 	key_ref_t key_ref;
339 	int ret;
340 
341 	kenter("%s,%s,,,", type->name, description);
342 
343 	*_key = NULL;
344 	mutex_lock(&user->cons_lock);
345 
346 	key = key_alloc(type, description, cred->fsuid, cred->fsgid, cred,
347 			KEY_POS_ALL, flags);
348 	if (IS_ERR(key))
349 		goto alloc_failed;
350 
351 	set_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags);
352 
353 	if (dest_keyring) {
354 		ret = __key_link_begin(dest_keyring, type, description,
355 				       &prealloc);
356 		if (ret < 0)
357 			goto link_prealloc_failed;
358 	}
359 
360 	/* attach the key to the destination keyring under lock, but we do need
361 	 * to do another check just in case someone beat us to it whilst we
362 	 * waited for locks */
363 	mutex_lock(&key_construction_mutex);
364 
365 	key_ref = search_process_keyrings(type, description, type->match, cred);
366 	if (!IS_ERR(key_ref))
367 		goto key_already_present;
368 
369 	if (dest_keyring)
370 		__key_link(dest_keyring, key, &prealloc);
371 
372 	mutex_unlock(&key_construction_mutex);
373 	if (dest_keyring)
374 		__key_link_end(dest_keyring, type, prealloc);
375 	mutex_unlock(&user->cons_lock);
376 	*_key = key;
377 	kleave(" = 0 [%d]", key_serial(key));
378 	return 0;
379 
380 	/* the key is now present - we tell the caller that we found it by
381 	 * returning -EINPROGRESS  */
382 key_already_present:
383 	key_put(key);
384 	mutex_unlock(&key_construction_mutex);
385 	key = key_ref_to_ptr(key_ref);
386 	if (dest_keyring) {
387 		ret = __key_link_check_live_key(dest_keyring, key);
388 		if (ret == 0)
389 			__key_link(dest_keyring, key, &prealloc);
390 		__key_link_end(dest_keyring, type, prealloc);
391 		if (ret < 0)
392 			goto link_check_failed;
393 	}
394 	mutex_unlock(&user->cons_lock);
395 	*_key = key;
396 	kleave(" = -EINPROGRESS [%d]", key_serial(key));
397 	return -EINPROGRESS;
398 
399 link_check_failed:
400 	mutex_unlock(&user->cons_lock);
401 	key_put(key);
402 	kleave(" = %d [linkcheck]", ret);
403 	return ret;
404 
405 link_prealloc_failed:
406 	mutex_unlock(&user->cons_lock);
407 	kleave(" = %d [prelink]", ret);
408 	return ret;
409 
410 alloc_failed:
411 	mutex_unlock(&user->cons_lock);
412 	kleave(" = %ld", PTR_ERR(key));
413 	return PTR_ERR(key);
414 }
415 
416 /*
417  * commence key construction
418  */
419 static struct key *construct_key_and_link(struct key_type *type,
420 					  const char *description,
421 					  const char *callout_info,
422 					  size_t callout_len,
423 					  void *aux,
424 					  struct key *dest_keyring,
425 					  unsigned long flags)
426 {
427 	struct key_user *user;
428 	struct key *key;
429 	int ret;
430 
431 	kenter("");
432 
433 	user = key_user_lookup(current_fsuid(), current_user_ns());
434 	if (!user)
435 		return ERR_PTR(-ENOMEM);
436 
437 	construct_get_dest_keyring(&dest_keyring);
438 
439 	ret = construct_alloc_key(type, description, dest_keyring, flags, user,
440 				  &key);
441 	key_user_put(user);
442 
443 	if (ret == 0) {
444 		ret = construct_key(key, callout_info, callout_len, aux,
445 				    dest_keyring);
446 		if (ret < 0) {
447 			kdebug("cons failed");
448 			goto construction_failed;
449 		}
450 	} else if (ret == -EINPROGRESS) {
451 		ret = 0;
452 	} else {
453 		key = ERR_PTR(ret);
454 	}
455 
456 	key_put(dest_keyring);
457 	kleave(" = key %d", key_serial(key));
458 	return key;
459 
460 construction_failed:
461 	key_negate_and_link(key, key_negative_timeout, NULL, NULL);
462 	key_put(key);
463 	key_put(dest_keyring);
464 	kleave(" = %d", ret);
465 	return ERR_PTR(ret);
466 }
467 
468 /*
469  * request a key
470  * - search the process's keyrings
471  * - check the list of keys being created or updated
472  * - call out to userspace for a key if supplementary info was provided
473  * - cache the key in an appropriate keyring
474  */
475 struct key *request_key_and_link(struct key_type *type,
476 				 const char *description,
477 				 const void *callout_info,
478 				 size_t callout_len,
479 				 void *aux,
480 				 struct key *dest_keyring,
481 				 unsigned long flags)
482 {
483 	const struct cred *cred = current_cred();
484 	struct key *key;
485 	key_ref_t key_ref;
486 	int ret;
487 
488 	kenter("%s,%s,%p,%zu,%p,%p,%lx",
489 	       type->name, description, callout_info, callout_len, aux,
490 	       dest_keyring, flags);
491 
492 	/* search all the process keyrings for a key */
493 	key_ref = search_process_keyrings(type, description, type->match,
494 					  cred);
495 
496 	if (!IS_ERR(key_ref)) {
497 		key = key_ref_to_ptr(key_ref);
498 		if (dest_keyring) {
499 			construct_get_dest_keyring(&dest_keyring);
500 			ret = key_link(dest_keyring, key);
501 			key_put(dest_keyring);
502 			if (ret < 0) {
503 				key_put(key);
504 				key = ERR_PTR(ret);
505 				goto error;
506 			}
507 		}
508 	} else if (PTR_ERR(key_ref) != -EAGAIN) {
509 		key = ERR_CAST(key_ref);
510 	} else  {
511 		/* the search failed, but the keyrings were searchable, so we
512 		 * should consult userspace if we can */
513 		key = ERR_PTR(-ENOKEY);
514 		if (!callout_info)
515 			goto error;
516 
517 		key = construct_key_and_link(type, description, callout_info,
518 					     callout_len, aux, dest_keyring,
519 					     flags);
520 	}
521 
522 error:
523 	kleave(" = %p", key);
524 	return key;
525 }
526 
527 /*
528  * wait for construction of a key to complete
529  */
530 int wait_for_key_construction(struct key *key, bool intr)
531 {
532 	int ret;
533 
534 	ret = wait_on_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT,
535 			  intr ? key_wait_bit_intr : key_wait_bit,
536 			  intr ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
537 	if (ret < 0)
538 		return ret;
539 	if (test_bit(KEY_FLAG_NEGATIVE, &key->flags))
540 		return -ENOKEY;
541 	return key_validate(key);
542 }
543 EXPORT_SYMBOL(wait_for_key_construction);
544 
545 /*
546  * request a key
547  * - search the process's keyrings
548  * - check the list of keys being created or updated
549  * - call out to userspace for a key if supplementary info was provided
550  * - waits uninterruptible for creation to complete
551  */
552 struct key *request_key(struct key_type *type,
553 			const char *description,
554 			const char *callout_info)
555 {
556 	struct key *key;
557 	size_t callout_len = 0;
558 	int ret;
559 
560 	if (callout_info)
561 		callout_len = strlen(callout_info);
562 	key = request_key_and_link(type, description, callout_info, callout_len,
563 				   NULL, NULL, KEY_ALLOC_IN_QUOTA);
564 	if (!IS_ERR(key)) {
565 		ret = wait_for_key_construction(key, false);
566 		if (ret < 0) {
567 			key_put(key);
568 			return ERR_PTR(ret);
569 		}
570 	}
571 	return key;
572 }
573 EXPORT_SYMBOL(request_key);
574 
575 /*
576  * request a key with auxiliary data for the upcaller
577  * - search the process's keyrings
578  * - check the list of keys being created or updated
579  * - call out to userspace for a key if supplementary info was provided
580  * - waits uninterruptible for creation to complete
581  */
582 struct key *request_key_with_auxdata(struct key_type *type,
583 				     const char *description,
584 				     const void *callout_info,
585 				     size_t callout_len,
586 				     void *aux)
587 {
588 	struct key *key;
589 	int ret;
590 
591 	key = request_key_and_link(type, description, callout_info, callout_len,
592 				   aux, NULL, KEY_ALLOC_IN_QUOTA);
593 	if (!IS_ERR(key)) {
594 		ret = wait_for_key_construction(key, false);
595 		if (ret < 0) {
596 			key_put(key);
597 			return ERR_PTR(ret);
598 		}
599 	}
600 	return key;
601 }
602 EXPORT_SYMBOL(request_key_with_auxdata);
603 
604 /*
605  * request a key (allow async construction)
606  * - search the process's keyrings
607  * - check the list of keys being created or updated
608  * - call out to userspace for a key if supplementary info was provided
609  */
610 struct key *request_key_async(struct key_type *type,
611 			      const char *description,
612 			      const void *callout_info,
613 			      size_t callout_len)
614 {
615 	return request_key_and_link(type, description, callout_info,
616 				    callout_len, NULL, NULL,
617 				    KEY_ALLOC_IN_QUOTA);
618 }
619 EXPORT_SYMBOL(request_key_async);
620 
621 /*
622  * request a key with auxiliary data for the upcaller (allow async construction)
623  * - search the process's keyrings
624  * - check the list of keys being created or updated
625  * - call out to userspace for a key if supplementary info was provided
626  */
627 struct key *request_key_async_with_auxdata(struct key_type *type,
628 					   const char *description,
629 					   const void *callout_info,
630 					   size_t callout_len,
631 					   void *aux)
632 {
633 	return request_key_and_link(type, description, callout_info,
634 				    callout_len, aux, NULL, KEY_ALLOC_IN_QUOTA);
635 }
636 EXPORT_SYMBOL(request_key_async_with_auxdata);
637