1
2
3
4
5
6
7
8
9
10#include <linux/export.h>
11#include <linux/sched.h>
12#include <linux/kmod.h>
13#include <linux/err.h>
14#include <linux/keyctl.h>
15#include <linux/slab.h>
16#include <net/net_namespace.h>
17#include "internal.h"
18#include <keys/request_key_auth-type.h>
19
20#define key_negative_timeout 60
21
22static struct key *check_cached_key(struct keyring_search_context *ctx)
23{
24#ifdef CONFIG_KEYS_REQUEST_CACHE
25 struct key *key = current->cached_requested_key;
26
27 if (key &&
28 ctx->match_data.cmp(key, &ctx->match_data) &&
29 !(key->flags & ((1 << KEY_FLAG_INVALIDATED) |
30 (1 << KEY_FLAG_REVOKED))))
31 return key_get(key);
32#endif
33 return NULL;
34}
35
36static void cache_requested_key(struct key *key)
37{
38#ifdef CONFIG_KEYS_REQUEST_CACHE
39 struct task_struct *t = current;
40
41 key_put(t->cached_requested_key);
42 t->cached_requested_key = key_get(key);
43 set_tsk_thread_flag(t, TIF_NOTIFY_RESUME);
44#endif
45}
46
47
48
49
50
51
52
53
54
55
56void complete_request_key(struct key *authkey, int error)
57{
58 struct request_key_auth *rka = get_request_key_auth(authkey);
59 struct key *key = rka->target_key;
60
61 kenter("%d{%d},%d", authkey->serial, key->serial, error);
62
63 if (error < 0)
64 key_negate_and_link(key, key_negative_timeout, NULL, authkey);
65 else
66 key_revoke(authkey);
67}
68EXPORT_SYMBOL(complete_request_key);
69
70
71
72
73
74
75
76
77static int umh_keys_init(struct subprocess_info *info, struct cred *cred)
78{
79 struct key *keyring = info->data;
80
81 return install_session_keyring_to_cred(cred, keyring);
82}
83
84
85
86
87static void umh_keys_cleanup(struct subprocess_info *info)
88{
89 struct key *keyring = info->data;
90 key_put(keyring);
91}
92
93
94
95
96static int call_usermodehelper_keys(const char *path, char **argv, char **envp,
97 struct key *session_keyring, int wait)
98{
99 struct subprocess_info *info;
100
101 info = call_usermodehelper_setup(path, argv, envp, GFP_KERNEL,
102 umh_keys_init, umh_keys_cleanup,
103 session_keyring);
104 if (!info)
105 return -ENOMEM;
106
107 key_get(session_keyring);
108 return call_usermodehelper_exec(info, wait);
109}
110
111
112
113
114
115static int call_sbin_request_key(struct key *authkey, void *aux)
116{
117 static char const request_key[] = "/sbin/request-key";
118 struct request_key_auth *rka = get_request_key_auth(authkey);
119 const struct cred *cred = current_cred();
120 key_serial_t prkey, sskey;
121 struct key *key = rka->target_key, *keyring, *session, *user_session;
122 char *argv[9], *envp[3], uid_str[12], gid_str[12];
123 char key_str[12], keyring_str[3][12];
124 char desc[20];
125 int ret, i;
126
127 kenter("{%d},{%d},%s", key->serial, authkey->serial, rka->op);
128
129 ret = look_up_user_keyrings(NULL, &user_session);
130 if (ret < 0)
131 goto error_us;
132
133
134 sprintf(desc, "_req.%u", key->serial);
135
136 cred = get_current_cred();
137 keyring = keyring_alloc(desc, cred->fsuid, cred->fsgid, cred,
138 KEY_POS_ALL | KEY_USR_VIEW | KEY_USR_READ,
139 KEY_ALLOC_QUOTA_OVERRUN, NULL, NULL);
140 put_cred(cred);
141 if (IS_ERR(keyring)) {
142 ret = PTR_ERR(keyring);
143 goto error_alloc;
144 }
145
146
147 ret = key_link(keyring, authkey);
148 if (ret < 0)
149 goto error_link;
150
151
152 sprintf(uid_str, "%d", from_kuid(&init_user_ns, cred->fsuid));
153 sprintf(gid_str, "%d", from_kgid(&init_user_ns, cred->fsgid));
154
155
156 sprintf(key_str, "%d", key->serial);
157
158
159 sprintf(keyring_str[0], "%d",
160 cred->thread_keyring ? cred->thread_keyring->serial : 0);
161
162 prkey = 0;
163 if (cred->process_keyring)
164 prkey = cred->process_keyring->serial;
165 sprintf(keyring_str[1], "%d", prkey);
166
167 session = cred->session_keyring;
168 if (!session)
169 session = user_session;
170 sskey = session->serial;
171
172 sprintf(keyring_str[2], "%d", sskey);
173
174
175 i = 0;
176 envp[i++] = "HOME=/";
177 envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
178 envp[i] = NULL;
179
180
181 i = 0;
182 argv[i++] = (char *)request_key;
183 argv[i++] = (char *)rka->op;
184 argv[i++] = key_str;
185 argv[i++] = uid_str;
186 argv[i++] = gid_str;
187 argv[i++] = keyring_str[0];
188 argv[i++] = keyring_str[1];
189 argv[i++] = keyring_str[2];
190 argv[i] = NULL;
191
192
193 ret = call_usermodehelper_keys(request_key, argv, envp, keyring,
194 UMH_WAIT_PROC);
195 kdebug("usermode -> 0x%x", ret);
196 if (ret >= 0) {
197
198 if (test_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags) ||
199 key_validate(key) < 0)
200 ret = -ENOKEY;
201 else
202
203
204 ret = 0;
205 }
206
207error_link:
208 key_put(keyring);
209
210error_alloc:
211 key_put(user_session);
212error_us:
213 complete_request_key(authkey, ret);
214 kleave(" = %d", ret);
215 return ret;
216}
217
218
219
220
221
222
223static int construct_key(struct key *key, const void *callout_info,
224 size_t callout_len, void *aux,
225 struct key *dest_keyring)
226{
227 request_key_actor_t actor;
228 struct key *authkey;
229 int ret;
230
231 kenter("%d,%p,%zu,%p", key->serial, callout_info, callout_len, aux);
232
233
234 authkey = request_key_auth_new(key, "create", callout_info, callout_len,
235 dest_keyring);
236 if (IS_ERR(authkey))
237 return PTR_ERR(authkey);
238
239
240 actor = call_sbin_request_key;
241 if (key->type->request_key)
242 actor = key->type->request_key;
243
244 ret = actor(authkey, aux);
245
246
247
248 WARN_ON(ret < 0 &&
249 !test_bit(KEY_FLAG_INVALIDATED, &authkey->flags));
250
251 key_put(authkey);
252 kleave(" = %d", ret);
253 return ret;
254}
255
256
257
258
259
260
261
262static int construct_get_dest_keyring(struct key **_dest_keyring)
263{
264 struct request_key_auth *rka;
265 const struct cred *cred = current_cred();
266 struct key *dest_keyring = *_dest_keyring, *authkey;
267 int ret;
268
269 kenter("%p", dest_keyring);
270
271
272 if (dest_keyring) {
273
274 key_get(dest_keyring);
275 } else {
276 bool do_perm_check = true;
277
278
279
280 switch (cred->jit_keyring) {
281 case KEY_REQKEY_DEFL_DEFAULT:
282 case KEY_REQKEY_DEFL_REQUESTOR_KEYRING:
283 if (cred->request_key_auth) {
284 authkey = cred->request_key_auth;
285 down_read(&authkey->sem);
286 rka = get_request_key_auth(authkey);
287 if (!test_bit(KEY_FLAG_REVOKED,
288 &authkey->flags))
289 dest_keyring =
290 key_get(rka->dest_keyring);
291 up_read(&authkey->sem);
292 if (dest_keyring) {
293 do_perm_check = false;
294 break;
295 }
296 }
297
298 fallthrough;
299 case KEY_REQKEY_DEFL_THREAD_KEYRING:
300 dest_keyring = key_get(cred->thread_keyring);
301 if (dest_keyring)
302 break;
303
304 fallthrough;
305 case KEY_REQKEY_DEFL_PROCESS_KEYRING:
306 dest_keyring = key_get(cred->process_keyring);
307 if (dest_keyring)
308 break;
309
310 fallthrough;
311 case KEY_REQKEY_DEFL_SESSION_KEYRING:
312 dest_keyring = key_get(cred->session_keyring);
313
314 if (dest_keyring)
315 break;
316
317 fallthrough;
318 case KEY_REQKEY_DEFL_USER_SESSION_KEYRING:
319 ret = look_up_user_keyrings(NULL, &dest_keyring);
320 if (ret < 0)
321 return ret;
322 break;
323
324 case KEY_REQKEY_DEFL_USER_KEYRING:
325 ret = look_up_user_keyrings(&dest_keyring, NULL);
326 if (ret < 0)
327 return ret;
328 break;
329
330 case KEY_REQKEY_DEFL_GROUP_KEYRING:
331 default:
332 BUG();
333 }
334
335
336
337
338
339
340
341
342
343
344 if (dest_keyring && do_perm_check) {
345 ret = key_permission(make_key_ref(dest_keyring, 1),
346 KEY_NEED_WRITE);
347 if (ret) {
348 key_put(dest_keyring);
349 return ret;
350 }
351 }
352 }
353
354 *_dest_keyring = dest_keyring;
355 kleave(" [dk %d]", key_serial(dest_keyring));
356 return 0;
357}
358
359
360
361
362
363
364
365
366static int construct_alloc_key(struct keyring_search_context *ctx,
367 struct key *dest_keyring,
368 unsigned long flags,
369 struct key_user *user,
370 struct key **_key)
371{
372 struct assoc_array_edit *edit = NULL;
373 struct key *key;
374 key_perm_t perm;
375 key_ref_t key_ref;
376 int ret;
377
378 kenter("%s,%s,,,",
379 ctx->index_key.type->name, ctx->index_key.description);
380
381 *_key = NULL;
382 mutex_lock(&user->cons_lock);
383
384 perm = KEY_POS_VIEW | KEY_POS_SEARCH | KEY_POS_LINK | KEY_POS_SETATTR;
385 perm |= KEY_USR_VIEW;
386 if (ctx->index_key.type->read)
387 perm |= KEY_POS_READ;
388 if (ctx->index_key.type == &key_type_keyring ||
389 ctx->index_key.type->update)
390 perm |= KEY_POS_WRITE;
391
392 key = key_alloc(ctx->index_key.type, ctx->index_key.description,
393 ctx->cred->fsuid, ctx->cred->fsgid, ctx->cred,
394 perm, flags, NULL);
395 if (IS_ERR(key))
396 goto alloc_failed;
397
398 set_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags);
399
400 if (dest_keyring) {
401 ret = __key_link_lock(dest_keyring, &ctx->index_key);
402 if (ret < 0)
403 goto link_lock_failed;
404 ret = __key_link_begin(dest_keyring, &ctx->index_key, &edit);
405 if (ret < 0)
406 goto link_prealloc_failed;
407 }
408
409
410
411
412 mutex_lock(&key_construction_mutex);
413
414 rcu_read_lock();
415 key_ref = search_process_keyrings_rcu(ctx);
416 rcu_read_unlock();
417 if (!IS_ERR(key_ref))
418 goto key_already_present;
419
420 if (dest_keyring)
421 __key_link(dest_keyring, key, &edit);
422
423 mutex_unlock(&key_construction_mutex);
424 if (dest_keyring)
425 __key_link_end(dest_keyring, &ctx->index_key, edit);
426 mutex_unlock(&user->cons_lock);
427 *_key = key;
428 kleave(" = 0 [%d]", key_serial(key));
429 return 0;
430
431
432
433key_already_present:
434 key_put(key);
435 mutex_unlock(&key_construction_mutex);
436 key = key_ref_to_ptr(key_ref);
437 if (dest_keyring) {
438 ret = __key_link_check_live_key(dest_keyring, key);
439 if (ret == 0)
440 __key_link(dest_keyring, key, &edit);
441 __key_link_end(dest_keyring, &ctx->index_key, edit);
442 if (ret < 0)
443 goto link_check_failed;
444 }
445 mutex_unlock(&user->cons_lock);
446 *_key = key;
447 kleave(" = -EINPROGRESS [%d]", key_serial(key));
448 return -EINPROGRESS;
449
450link_check_failed:
451 mutex_unlock(&user->cons_lock);
452 key_put(key);
453 kleave(" = %d [linkcheck]", ret);
454 return ret;
455
456link_prealloc_failed:
457 __key_link_end(dest_keyring, &ctx->index_key, edit);
458link_lock_failed:
459 mutex_unlock(&user->cons_lock);
460 key_put(key);
461 kleave(" = %d [prelink]", ret);
462 return ret;
463
464alloc_failed:
465 mutex_unlock(&user->cons_lock);
466 kleave(" = %ld", PTR_ERR(key));
467 return PTR_ERR(key);
468}
469
470
471
472
473static struct key *construct_key_and_link(struct keyring_search_context *ctx,
474 const char *callout_info,
475 size_t callout_len,
476 void *aux,
477 struct key *dest_keyring,
478 unsigned long flags)
479{
480 struct key_user *user;
481 struct key *key;
482 int ret;
483
484 kenter("");
485
486 if (ctx->index_key.type == &key_type_keyring)
487 return ERR_PTR(-EPERM);
488
489 ret = construct_get_dest_keyring(&dest_keyring);
490 if (ret)
491 goto error;
492
493 user = key_user_lookup(current_fsuid());
494 if (!user) {
495 ret = -ENOMEM;
496 goto error_put_dest_keyring;
497 }
498
499 ret = construct_alloc_key(ctx, dest_keyring, flags, user, &key);
500 key_user_put(user);
501
502 if (ret == 0) {
503 ret = construct_key(key, callout_info, callout_len, aux,
504 dest_keyring);
505 if (ret < 0) {
506 kdebug("cons failed");
507 goto construction_failed;
508 }
509 } else if (ret == -EINPROGRESS) {
510 ret = 0;
511 } else {
512 goto error_put_dest_keyring;
513 }
514
515 key_put(dest_keyring);
516 kleave(" = key %d", key_serial(key));
517 return key;
518
519construction_failed:
520 key_negate_and_link(key, key_negative_timeout, NULL, NULL);
521 key_put(key);
522error_put_dest_keyring:
523 key_put(dest_keyring);
524error:
525 kleave(" = %d", ret);
526 return ERR_PTR(ret);
527}
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558struct key *request_key_and_link(struct key_type *type,
559 const char *description,
560 struct key_tag *domain_tag,
561 const void *callout_info,
562 size_t callout_len,
563 void *aux,
564 struct key *dest_keyring,
565 unsigned long flags)
566{
567 struct keyring_search_context ctx = {
568 .index_key.type = type,
569 .index_key.domain_tag = domain_tag,
570 .index_key.description = description,
571 .index_key.desc_len = strlen(description),
572 .cred = current_cred(),
573 .match_data.cmp = key_default_cmp,
574 .match_data.raw_data = description,
575 .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
576 .flags = (KEYRING_SEARCH_DO_STATE_CHECK |
577 KEYRING_SEARCH_SKIP_EXPIRED |
578 KEYRING_SEARCH_RECURSE),
579 };
580 struct key *key;
581 key_ref_t key_ref;
582 int ret;
583
584 kenter("%s,%s,%p,%zu,%p,%p,%lx",
585 ctx.index_key.type->name, ctx.index_key.description,
586 callout_info, callout_len, aux, dest_keyring, flags);
587
588 if (type->match_preparse) {
589 ret = type->match_preparse(&ctx.match_data);
590 if (ret < 0) {
591 key = ERR_PTR(ret);
592 goto error;
593 }
594 }
595
596 key = check_cached_key(&ctx);
597 if (key)
598 goto error_free;
599
600
601 rcu_read_lock();
602 key_ref = search_process_keyrings_rcu(&ctx);
603 rcu_read_unlock();
604
605 if (!IS_ERR(key_ref)) {
606 if (dest_keyring) {
607 ret = key_task_permission(key_ref, current_cred(),
608 KEY_NEED_LINK);
609 if (ret < 0) {
610 key_ref_put(key_ref);
611 key = ERR_PTR(ret);
612 goto error_free;
613 }
614 }
615
616 key = key_ref_to_ptr(key_ref);
617 if (dest_keyring) {
618 ret = key_link(dest_keyring, key);
619 if (ret < 0) {
620 key_put(key);
621 key = ERR_PTR(ret);
622 goto error_free;
623 }
624 }
625
626
627 cache_requested_key(key);
628 } else if (PTR_ERR(key_ref) != -EAGAIN) {
629 key = ERR_CAST(key_ref);
630 } else {
631
632
633 key = ERR_PTR(-ENOKEY);
634 if (!callout_info)
635 goto error_free;
636
637 key = construct_key_and_link(&ctx, callout_info, callout_len,
638 aux, dest_keyring, flags);
639 }
640
641error_free:
642 if (type->match_free)
643 type->match_free(&ctx.match_data);
644error:
645 kleave(" = %p", key);
646 return key;
647}
648
649
650
651
652
653
654
655
656
657
658
659
660int wait_for_key_construction(struct key *key, bool intr)
661{
662 int ret;
663
664 ret = wait_on_bit(&key->flags, KEY_FLAG_USER_CONSTRUCT,
665 intr ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
666 if (ret)
667 return -ERESTARTSYS;
668 ret = key_read_state(key);
669 if (ret < 0)
670 return ret;
671 return key_validate(key);
672}
673EXPORT_SYMBOL(wait_for_key_construction);
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690struct key *request_key_tag(struct key_type *type,
691 const char *description,
692 struct key_tag *domain_tag,
693 const char *callout_info)
694{
695 struct key *key;
696 size_t callout_len = 0;
697 int ret;
698
699 if (callout_info)
700 callout_len = strlen(callout_info);
701 key = request_key_and_link(type, description, domain_tag,
702 callout_info, callout_len,
703 NULL, NULL, KEY_ALLOC_IN_QUOTA);
704 if (!IS_ERR(key)) {
705 ret = wait_for_key_construction(key, false);
706 if (ret < 0) {
707 key_put(key);
708 return ERR_PTR(ret);
709 }
710 }
711 return key;
712}
713EXPORT_SYMBOL(request_key_tag);
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730struct key *request_key_with_auxdata(struct key_type *type,
731 const char *description,
732 struct key_tag *domain_tag,
733 const void *callout_info,
734 size_t callout_len,
735 void *aux)
736{
737 struct key *key;
738 int ret;
739
740 key = request_key_and_link(type, description, domain_tag,
741 callout_info, callout_len,
742 aux, NULL, KEY_ALLOC_IN_QUOTA);
743 if (!IS_ERR(key)) {
744 ret = wait_for_key_construction(key, false);
745 if (ret < 0) {
746 key_put(key);
747 return ERR_PTR(ret);
748 }
749 }
750 return key;
751}
752EXPORT_SYMBOL(request_key_with_auxdata);
753
754
755
756
757
758
759
760
761
762
763
764
765
766struct key *request_key_rcu(struct key_type *type,
767 const char *description,
768 struct key_tag *domain_tag)
769{
770 struct keyring_search_context ctx = {
771 .index_key.type = type,
772 .index_key.domain_tag = domain_tag,
773 .index_key.description = description,
774 .index_key.desc_len = strlen(description),
775 .cred = current_cred(),
776 .match_data.cmp = key_default_cmp,
777 .match_data.raw_data = description,
778 .match_data.lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT,
779 .flags = (KEYRING_SEARCH_DO_STATE_CHECK |
780 KEYRING_SEARCH_SKIP_EXPIRED),
781 };
782 struct key *key;
783 key_ref_t key_ref;
784
785 kenter("%s,%s", type->name, description);
786
787 key = check_cached_key(&ctx);
788 if (key)
789 return key;
790
791
792 key_ref = search_process_keyrings_rcu(&ctx);
793 if (IS_ERR(key_ref)) {
794 key = ERR_CAST(key_ref);
795 if (PTR_ERR(key_ref) == -EAGAIN)
796 key = ERR_PTR(-ENOKEY);
797 } else {
798 key = key_ref_to_ptr(key_ref);
799 cache_requested_key(key);
800 }
801
802 kleave(" = %p", key);
803 return key;
804}
805EXPORT_SYMBOL(request_key_rcu);
806