1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#define pr_fmt(fmt) "seccomp: " fmt
17
18#include <linux/refcount.h>
19#include <linux/audit.h>
20#include <linux/compat.h>
21#include <linux/coredump.h>
22#include <linux/kmemleak.h>
23#include <linux/nospec.h>
24#include <linux/prctl.h>
25#include <linux/sched.h>
26#include <linux/sched/task_stack.h>
27#include <linux/seccomp.h>
28#include <linux/slab.h>
29#include <linux/syscalls.h>
30#include <linux/sysctl.h>
31
32#ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER
33#include <asm/syscall.h>
34#endif
35
36#ifdef CONFIG_SECCOMP_FILTER
37#include <linux/file.h>
38#include <linux/filter.h>
39#include <linux/pid.h>
40#include <linux/ptrace.h>
41#include <linux/capability.h>
42#include <linux/tracehook.h>
43#include <linux/uaccess.h>
44#include <linux/anon_inodes.h>
45#include <linux/lockdep.h>
46
47
48
49
50
51
52
53#define SECCOMP_IOCTL_NOTIF_ID_VALID_WRONG_DIR SECCOMP_IOR(2, __u64)
54
55enum notify_state {
56 SECCOMP_NOTIFY_INIT,
57 SECCOMP_NOTIFY_SENT,
58 SECCOMP_NOTIFY_REPLIED,
59};
60
61struct seccomp_knotif {
62
63 struct task_struct *task;
64
65
66 u64 id;
67
68
69
70
71
72
73 const struct seccomp_data *data;
74
75
76
77
78
79
80
81
82
83 enum notify_state state;
84
85
86 int error;
87 long val;
88 u32 flags;
89
90
91
92
93
94 struct completion ready;
95
96 struct list_head list;
97
98
99 struct list_head addfd;
100};
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117struct seccomp_kaddfd {
118 struct file *file;
119 int fd;
120 unsigned int flags;
121
122
123 int ret;
124 struct completion completion;
125 struct list_head list;
126};
127
128
129
130
131
132
133
134
135
136
137
138
139
140struct notification {
141 struct semaphore request;
142 u64 next_id;
143 struct list_head notifications;
144};
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179struct seccomp_filter {
180 refcount_t refs;
181 refcount_t users;
182 bool log;
183 struct seccomp_filter *prev;
184 struct bpf_prog *prog;
185 struct notification *notif;
186 struct mutex notify_lock;
187 wait_queue_head_t wqh;
188};
189
190
191#define MAX_INSNS_PER_PATH ((1 << 18) / sizeof(struct sock_filter))
192
193
194
195
196
197static void populate_seccomp_data(struct seccomp_data *sd)
198{
199
200
201
202
203 struct task_struct *task = current;
204 struct pt_regs *regs = task_pt_regs(task);
205 unsigned long args[6];
206
207 sd->nr = syscall_get_nr(task, regs);
208 sd->arch = syscall_get_arch(task);
209 syscall_get_arguments(task, regs, args);
210 sd->args[0] = args[0];
211 sd->args[1] = args[1];
212 sd->args[2] = args[2];
213 sd->args[3] = args[3];
214 sd->args[4] = args[4];
215 sd->args[5] = args[5];
216 sd->instruction_pointer = KSTK_EIP(task);
217}
218
219
220
221
222
223
224
225
226
227
228
229
230
231static int seccomp_check_filter(struct sock_filter *filter, unsigned int flen)
232{
233 int pc;
234 for (pc = 0; pc < flen; pc++) {
235 struct sock_filter *ftest = &filter[pc];
236 u16 code = ftest->code;
237 u32 k = ftest->k;
238
239 switch (code) {
240 case BPF_LD | BPF_W | BPF_ABS:
241 ftest->code = BPF_LDX | BPF_W | BPF_ABS;
242
243 if (k >= sizeof(struct seccomp_data) || k & 3)
244 return -EINVAL;
245 continue;
246 case BPF_LD | BPF_W | BPF_LEN:
247 ftest->code = BPF_LD | BPF_IMM;
248 ftest->k = sizeof(struct seccomp_data);
249 continue;
250 case BPF_LDX | BPF_W | BPF_LEN:
251 ftest->code = BPF_LDX | BPF_IMM;
252 ftest->k = sizeof(struct seccomp_data);
253 continue;
254
255 case BPF_RET | BPF_K:
256 case BPF_RET | BPF_A:
257 case BPF_ALU | BPF_ADD | BPF_K:
258 case BPF_ALU | BPF_ADD | BPF_X:
259 case BPF_ALU | BPF_SUB | BPF_K:
260 case BPF_ALU | BPF_SUB | BPF_X:
261 case BPF_ALU | BPF_MUL | BPF_K:
262 case BPF_ALU | BPF_MUL | BPF_X:
263 case BPF_ALU | BPF_DIV | BPF_K:
264 case BPF_ALU | BPF_DIV | BPF_X:
265 case BPF_ALU | BPF_AND | BPF_K:
266 case BPF_ALU | BPF_AND | BPF_X:
267 case BPF_ALU | BPF_OR | BPF_K:
268 case BPF_ALU | BPF_OR | BPF_X:
269 case BPF_ALU | BPF_XOR | BPF_K:
270 case BPF_ALU | BPF_XOR | BPF_X:
271 case BPF_ALU | BPF_LSH | BPF_K:
272 case BPF_ALU | BPF_LSH | BPF_X:
273 case BPF_ALU | BPF_RSH | BPF_K:
274 case BPF_ALU | BPF_RSH | BPF_X:
275 case BPF_ALU | BPF_NEG:
276 case BPF_LD | BPF_IMM:
277 case BPF_LDX | BPF_IMM:
278 case BPF_MISC | BPF_TAX:
279 case BPF_MISC | BPF_TXA:
280 case BPF_LD | BPF_MEM:
281 case BPF_LDX | BPF_MEM:
282 case BPF_ST:
283 case BPF_STX:
284 case BPF_JMP | BPF_JA:
285 case BPF_JMP | BPF_JEQ | BPF_K:
286 case BPF_JMP | BPF_JEQ | BPF_X:
287 case BPF_JMP | BPF_JGE | BPF_K:
288 case BPF_JMP | BPF_JGE | BPF_X:
289 case BPF_JMP | BPF_JGT | BPF_K:
290 case BPF_JMP | BPF_JGT | BPF_X:
291 case BPF_JMP | BPF_JSET | BPF_K:
292 case BPF_JMP | BPF_JSET | BPF_X:
293 continue;
294 default:
295 return -EINVAL;
296 }
297 }
298 return 0;
299}
300
301
302
303
304
305
306
307
308
309
310#define ACTION_ONLY(ret) ((s32)((ret) & (SECCOMP_RET_ACTION_FULL)))
311static u32 seccomp_run_filters(const struct seccomp_data *sd,
312 struct seccomp_filter **match)
313{
314 u32 ret = SECCOMP_RET_ALLOW;
315
316 struct seccomp_filter *f =
317 READ_ONCE(current->seccomp.filter);
318
319
320 if (WARN_ON(f == NULL))
321 return SECCOMP_RET_KILL_PROCESS;
322
323
324
325
326
327 for (; f; f = f->prev) {
328 u32 cur_ret = bpf_prog_run_pin_on_cpu(f->prog, sd);
329
330 if (ACTION_ONLY(cur_ret) < ACTION_ONLY(ret)) {
331 ret = cur_ret;
332 *match = f;
333 }
334 }
335 return ret;
336}
337#endif
338
339static inline bool seccomp_may_assign_mode(unsigned long seccomp_mode)
340{
341 assert_spin_locked(¤t->sighand->siglock);
342
343 if (current->seccomp.mode && current->seccomp.mode != seccomp_mode)
344 return false;
345
346 return true;
347}
348
349void __weak arch_seccomp_spec_mitigate(struct task_struct *task) { }
350
351static inline void seccomp_assign_mode(struct task_struct *task,
352 unsigned long seccomp_mode,
353 unsigned long flags)
354{
355 assert_spin_locked(&task->sighand->siglock);
356
357 task->seccomp.mode = seccomp_mode;
358
359
360
361
362 smp_mb__before_atomic();
363
364 if ((flags & SECCOMP_FILTER_FLAG_SPEC_ALLOW) == 0)
365 arch_seccomp_spec_mitigate(task);
366 set_tsk_thread_flag(task, TIF_SECCOMP);
367}
368
369#ifdef CONFIG_SECCOMP_FILTER
370
371static int is_ancestor(struct seccomp_filter *parent,
372 struct seccomp_filter *child)
373{
374
375 if (parent == NULL)
376 return 1;
377 for (; child; child = child->prev)
378 if (child == parent)
379 return 1;
380 return 0;
381}
382
383
384
385
386
387
388
389
390
391
392static inline pid_t seccomp_can_sync_threads(void)
393{
394 struct task_struct *thread, *caller;
395
396 BUG_ON(!mutex_is_locked(¤t->signal->cred_guard_mutex));
397 assert_spin_locked(¤t->sighand->siglock);
398
399
400 caller = current;
401 for_each_thread(caller, thread) {
402 pid_t failed;
403
404
405 if (thread == caller)
406 continue;
407
408 if (thread->seccomp.mode == SECCOMP_MODE_DISABLED ||
409 (thread->seccomp.mode == SECCOMP_MODE_FILTER &&
410 is_ancestor(thread->seccomp.filter,
411 caller->seccomp.filter)))
412 continue;
413
414
415 failed = task_pid_vnr(thread);
416
417 if (WARN_ON(failed == 0))
418 failed = -ESRCH;
419 return failed;
420 }
421
422 return 0;
423}
424
425static inline void seccomp_filter_free(struct seccomp_filter *filter)
426{
427 if (filter) {
428 bpf_prog_destroy(filter->prog);
429 kfree(filter);
430 }
431}
432
433static void __seccomp_filter_orphan(struct seccomp_filter *orig)
434{
435 while (orig && refcount_dec_and_test(&orig->users)) {
436 if (waitqueue_active(&orig->wqh))
437 wake_up_poll(&orig->wqh, EPOLLHUP);
438 orig = orig->prev;
439 }
440}
441
442static void __put_seccomp_filter(struct seccomp_filter *orig)
443{
444
445 while (orig && refcount_dec_and_test(&orig->refs)) {
446 struct seccomp_filter *freeme = orig;
447 orig = orig->prev;
448 seccomp_filter_free(freeme);
449 }
450}
451
452static void __seccomp_filter_release(struct seccomp_filter *orig)
453{
454
455 __seccomp_filter_orphan(orig);
456
457 __put_seccomp_filter(orig);
458}
459
460
461
462
463
464
465
466
467
468
469void seccomp_filter_release(struct task_struct *tsk)
470{
471 struct seccomp_filter *orig = tsk->seccomp.filter;
472
473
474 tsk->seccomp.filter = NULL;
475 __seccomp_filter_release(orig);
476}
477
478
479
480
481
482
483
484
485
486static inline void seccomp_sync_threads(unsigned long flags)
487{
488 struct task_struct *thread, *caller;
489
490 BUG_ON(!mutex_is_locked(¤t->signal->cred_guard_mutex));
491 assert_spin_locked(¤t->sighand->siglock);
492
493
494 caller = current;
495 for_each_thread(caller, thread) {
496
497 if (thread == caller)
498 continue;
499
500
501 get_seccomp_filter(caller);
502
503
504
505
506
507
508 __seccomp_filter_release(thread->seccomp.filter);
509
510
511 smp_store_release(&thread->seccomp.filter,
512 caller->seccomp.filter);
513 atomic_set(&thread->seccomp.filter_count,
514 atomic_read(&thread->seccomp.filter_count));
515
516
517
518
519
520
521
522 if (task_no_new_privs(caller))
523 task_set_no_new_privs(thread);
524
525
526
527
528
529
530
531 if (thread->seccomp.mode == SECCOMP_MODE_DISABLED)
532 seccomp_assign_mode(thread, SECCOMP_MODE_FILTER,
533 flags);
534 }
535}
536
537
538
539
540
541
542
543static struct seccomp_filter *seccomp_prepare_filter(struct sock_fprog *fprog)
544{
545 struct seccomp_filter *sfilter;
546 int ret;
547 const bool save_orig = IS_ENABLED(CONFIG_CHECKPOINT_RESTORE);
548
549 if (fprog->len == 0 || fprog->len > BPF_MAXINSNS)
550 return ERR_PTR(-EINVAL);
551
552 BUG_ON(INT_MAX / fprog->len < sizeof(struct sock_filter));
553
554
555
556
557
558
559
560 if (!task_no_new_privs(current) &&
561 !ns_capable_noaudit(current_user_ns(), CAP_SYS_ADMIN))
562 return ERR_PTR(-EACCES);
563
564
565 sfilter = kzalloc(sizeof(*sfilter), GFP_KERNEL | __GFP_NOWARN);
566 if (!sfilter)
567 return ERR_PTR(-ENOMEM);
568
569 mutex_init(&sfilter->notify_lock);
570 ret = bpf_prog_create_from_user(&sfilter->prog, fprog,
571 seccomp_check_filter, save_orig);
572 if (ret < 0) {
573 kfree(sfilter);
574 return ERR_PTR(ret);
575 }
576
577 refcount_set(&sfilter->refs, 1);
578 refcount_set(&sfilter->users, 1);
579 init_waitqueue_head(&sfilter->wqh);
580
581 return sfilter;
582}
583
584
585
586
587
588
589
590static struct seccomp_filter *
591seccomp_prepare_user_filter(const char __user *user_filter)
592{
593 struct sock_fprog fprog;
594 struct seccomp_filter *filter = ERR_PTR(-EFAULT);
595
596#ifdef CONFIG_COMPAT
597 if (in_compat_syscall()) {
598 struct compat_sock_fprog fprog32;
599 if (copy_from_user(&fprog32, user_filter, sizeof(fprog32)))
600 goto out;
601 fprog.len = fprog32.len;
602 fprog.filter = compat_ptr(fprog32.filter);
603 } else
604#endif
605 if (copy_from_user(&fprog, user_filter, sizeof(fprog)))
606 goto out;
607 filter = seccomp_prepare_filter(&fprog);
608out:
609 return filter;
610}
611
612
613
614
615
616
617
618
619
620
621
622
623
624static long seccomp_attach_filter(unsigned int flags,
625 struct seccomp_filter *filter)
626{
627 unsigned long total_insns;
628 struct seccomp_filter *walker;
629
630 assert_spin_locked(¤t->sighand->siglock);
631
632
633 total_insns = filter->prog->len;
634 for (walker = current->seccomp.filter; walker; walker = walker->prev)
635 total_insns += walker->prog->len + 4;
636 if (total_insns > MAX_INSNS_PER_PATH)
637 return -ENOMEM;
638
639
640 if (flags & SECCOMP_FILTER_FLAG_TSYNC) {
641 int ret;
642
643 ret = seccomp_can_sync_threads();
644 if (ret) {
645 if (flags & SECCOMP_FILTER_FLAG_TSYNC_ESRCH)
646 return -ESRCH;
647 else
648 return ret;
649 }
650 }
651
652
653 if (flags & SECCOMP_FILTER_FLAG_LOG)
654 filter->log = true;
655
656
657
658
659
660 filter->prev = current->seccomp.filter;
661 current->seccomp.filter = filter;
662 atomic_inc(¤t->seccomp.filter_count);
663
664
665 if (flags & SECCOMP_FILTER_FLAG_TSYNC)
666 seccomp_sync_threads(flags);
667
668 return 0;
669}
670
671static void __get_seccomp_filter(struct seccomp_filter *filter)
672{
673 refcount_inc(&filter->refs);
674}
675
676
677void get_seccomp_filter(struct task_struct *tsk)
678{
679 struct seccomp_filter *orig = tsk->seccomp.filter;
680 if (!orig)
681 return;
682 __get_seccomp_filter(orig);
683 refcount_inc(&orig->users);
684}
685
686static void seccomp_init_siginfo(kernel_siginfo_t *info, int syscall, int reason)
687{
688 clear_siginfo(info);
689 info->si_signo = SIGSYS;
690 info->si_code = SYS_SECCOMP;
691 info->si_call_addr = (void __user *)KSTK_EIP(current);
692 info->si_errno = reason;
693 info->si_arch = syscall_get_arch(current);
694 info->si_syscall = syscall;
695}
696
697
698
699
700
701
702
703
704static void seccomp_send_sigsys(int syscall, int reason)
705{
706 struct kernel_siginfo info;
707 seccomp_init_siginfo(&info, syscall, reason);
708 force_sig_info(&info);
709}
710#endif
711
712
713#define SECCOMP_LOG_KILL_PROCESS (1 << 0)
714#define SECCOMP_LOG_KILL_THREAD (1 << 1)
715#define SECCOMP_LOG_TRAP (1 << 2)
716#define SECCOMP_LOG_ERRNO (1 << 3)
717#define SECCOMP_LOG_TRACE (1 << 4)
718#define SECCOMP_LOG_LOG (1 << 5)
719#define SECCOMP_LOG_ALLOW (1 << 6)
720#define SECCOMP_LOG_USER_NOTIF (1 << 7)
721
722static u32 seccomp_actions_logged = SECCOMP_LOG_KILL_PROCESS |
723 SECCOMP_LOG_KILL_THREAD |
724 SECCOMP_LOG_TRAP |
725 SECCOMP_LOG_ERRNO |
726 SECCOMP_LOG_USER_NOTIF |
727 SECCOMP_LOG_TRACE |
728 SECCOMP_LOG_LOG;
729
730static inline void seccomp_log(unsigned long syscall, long signr, u32 action,
731 bool requested)
732{
733 bool log = false;
734
735 switch (action) {
736 case SECCOMP_RET_ALLOW:
737 break;
738 case SECCOMP_RET_TRAP:
739 log = requested && seccomp_actions_logged & SECCOMP_LOG_TRAP;
740 break;
741 case SECCOMP_RET_ERRNO:
742 log = requested && seccomp_actions_logged & SECCOMP_LOG_ERRNO;
743 break;
744 case SECCOMP_RET_TRACE:
745 log = requested && seccomp_actions_logged & SECCOMP_LOG_TRACE;
746 break;
747 case SECCOMP_RET_USER_NOTIF:
748 log = requested && seccomp_actions_logged & SECCOMP_LOG_USER_NOTIF;
749 break;
750 case SECCOMP_RET_LOG:
751 log = seccomp_actions_logged & SECCOMP_LOG_LOG;
752 break;
753 case SECCOMP_RET_KILL_THREAD:
754 log = seccomp_actions_logged & SECCOMP_LOG_KILL_THREAD;
755 break;
756 case SECCOMP_RET_KILL_PROCESS:
757 default:
758 log = seccomp_actions_logged & SECCOMP_LOG_KILL_PROCESS;
759 }
760
761
762
763
764
765
766
767 if (!log)
768 return;
769
770 audit_seccomp(syscall, signr, action);
771}
772
773
774
775
776
777
778static const int mode1_syscalls[] = {
779 __NR_seccomp_read, __NR_seccomp_write, __NR_seccomp_exit, __NR_seccomp_sigreturn,
780 -1,
781};
782
783static void __secure_computing_strict(int this_syscall)
784{
785 const int *allowed_syscalls = mode1_syscalls;
786#ifdef CONFIG_COMPAT
787 if (in_compat_syscall())
788 allowed_syscalls = get_compat_mode1_syscalls();
789#endif
790 do {
791 if (*allowed_syscalls == this_syscall)
792 return;
793 } while (*++allowed_syscalls != -1);
794
795#ifdef SECCOMP_DEBUG
796 dump_stack();
797#endif
798 seccomp_log(this_syscall, SIGKILL, SECCOMP_RET_KILL_THREAD, true);
799 do_exit(SIGKILL);
800}
801
802#ifndef CONFIG_HAVE_ARCH_SECCOMP_FILTER
803void secure_computing_strict(int this_syscall)
804{
805 int mode = current->seccomp.mode;
806
807 if (IS_ENABLED(CONFIG_CHECKPOINT_RESTORE) &&
808 unlikely(current->ptrace & PT_SUSPEND_SECCOMP))
809 return;
810
811 if (mode == SECCOMP_MODE_DISABLED)
812 return;
813 else if (mode == SECCOMP_MODE_STRICT)
814 __secure_computing_strict(this_syscall);
815 else
816 BUG();
817}
818#else
819
820#ifdef CONFIG_SECCOMP_FILTER
821static u64 seccomp_next_notify_id(struct seccomp_filter *filter)
822{
823
824
825
826
827 lockdep_assert_held(&filter->notify_lock);
828 return filter->notif->next_id++;
829}
830
831static void seccomp_handle_addfd(struct seccomp_kaddfd *addfd)
832{
833
834
835
836
837 list_del_init(&addfd->list);
838 addfd->ret = receive_fd_replace(addfd->fd, addfd->file, addfd->flags);
839 complete(&addfd->completion);
840}
841
842static int seccomp_do_user_notification(int this_syscall,
843 struct seccomp_filter *match,
844 const struct seccomp_data *sd)
845{
846 int err;
847 u32 flags = 0;
848 long ret = 0;
849 struct seccomp_knotif n = {};
850 struct seccomp_kaddfd *addfd, *tmp;
851
852 mutex_lock(&match->notify_lock);
853 err = -ENOSYS;
854 if (!match->notif)
855 goto out;
856
857 n.task = current;
858 n.state = SECCOMP_NOTIFY_INIT;
859 n.data = sd;
860 n.id = seccomp_next_notify_id(match);
861 init_completion(&n.ready);
862 list_add(&n.list, &match->notif->notifications);
863 INIT_LIST_HEAD(&n.addfd);
864
865 up(&match->notif->request);
866 wake_up_poll(&match->wqh, EPOLLIN | EPOLLRDNORM);
867 mutex_unlock(&match->notify_lock);
868
869
870
871
872wait:
873 err = wait_for_completion_interruptible(&n.ready);
874 mutex_lock(&match->notify_lock);
875 if (err == 0) {
876
877 addfd = list_first_entry_or_null(&n.addfd,
878 struct seccomp_kaddfd, list);
879 if (addfd && n.state != SECCOMP_NOTIFY_REPLIED) {
880 seccomp_handle_addfd(addfd);
881 mutex_unlock(&match->notify_lock);
882 goto wait;
883 }
884 ret = n.val;
885 err = n.error;
886 flags = n.flags;
887 }
888
889
890 list_for_each_entry_safe(addfd, tmp, &n.addfd, list) {
891
892 addfd->ret = -ESRCH;
893 list_del_init(&addfd->list);
894 complete(&addfd->completion);
895 }
896
897
898
899
900
901
902
903
904
905
906
907 if (match->notif)
908 list_del(&n.list);
909out:
910 mutex_unlock(&match->notify_lock);
911
912
913 if (flags & SECCOMP_USER_NOTIF_FLAG_CONTINUE)
914 return 0;
915
916 syscall_set_return_value(current, current_pt_regs(),
917 err, ret);
918 return -1;
919}
920
921static int __seccomp_filter(int this_syscall, const struct seccomp_data *sd,
922 const bool recheck_after_trace)
923{
924 u32 filter_ret, action;
925 struct seccomp_filter *match = NULL;
926 int data;
927 struct seccomp_data sd_local;
928
929
930
931
932
933 rmb();
934
935 if (!sd) {
936 populate_seccomp_data(&sd_local);
937 sd = &sd_local;
938 }
939
940 filter_ret = seccomp_run_filters(sd, &match);
941 data = filter_ret & SECCOMP_RET_DATA;
942 action = filter_ret & SECCOMP_RET_ACTION_FULL;
943
944 switch (action) {
945 case SECCOMP_RET_ERRNO:
946
947 if (data > MAX_ERRNO)
948 data = MAX_ERRNO;
949 syscall_set_return_value(current, current_pt_regs(),
950 -data, 0);
951 goto skip;
952
953 case SECCOMP_RET_TRAP:
954
955 syscall_rollback(current, current_pt_regs());
956
957 seccomp_send_sigsys(this_syscall, data);
958 goto skip;
959
960 case SECCOMP_RET_TRACE:
961
962 if (recheck_after_trace)
963 return 0;
964
965
966 if (!ptrace_event_enabled(current, PTRACE_EVENT_SECCOMP)) {
967 syscall_set_return_value(current,
968 current_pt_regs(),
969 -ENOSYS, 0);
970 goto skip;
971 }
972
973
974 ptrace_event(PTRACE_EVENT_SECCOMP, data);
975
976
977
978
979
980
981
982
983
984
985 if (fatal_signal_pending(current))
986 goto skip;
987
988 this_syscall = syscall_get_nr(current, current_pt_regs());
989 if (this_syscall < 0)
990 goto skip;
991
992
993
994
995
996
997
998 if (__seccomp_filter(this_syscall, NULL, true))
999 return -1;
1000
1001 return 0;
1002
1003 case SECCOMP_RET_USER_NOTIF:
1004 if (seccomp_do_user_notification(this_syscall, match, sd))
1005 goto skip;
1006
1007 return 0;
1008
1009 case SECCOMP_RET_LOG:
1010 seccomp_log(this_syscall, 0, action, true);
1011 return 0;
1012
1013 case SECCOMP_RET_ALLOW:
1014
1015
1016
1017
1018
1019 return 0;
1020
1021 case SECCOMP_RET_KILL_THREAD:
1022 case SECCOMP_RET_KILL_PROCESS:
1023 default:
1024 seccomp_log(this_syscall, SIGSYS, action, true);
1025
1026 if (action != SECCOMP_RET_KILL_THREAD ||
1027 get_nr_threads(current) == 1) {
1028 kernel_siginfo_t info;
1029
1030
1031 syscall_rollback(current, current_pt_regs());
1032
1033 seccomp_init_siginfo(&info, this_syscall, data);
1034 do_coredump(&info);
1035 }
1036 if (action == SECCOMP_RET_KILL_THREAD)
1037 do_exit(SIGSYS);
1038 else
1039 do_group_exit(SIGSYS);
1040 }
1041
1042 unreachable();
1043
1044skip:
1045 seccomp_log(this_syscall, 0, action, match ? match->log : false);
1046 return -1;
1047}
1048#else
1049static int __seccomp_filter(int this_syscall, const struct seccomp_data *sd,
1050 const bool recheck_after_trace)
1051{
1052 BUG();
1053}
1054#endif
1055
1056int __secure_computing(const struct seccomp_data *sd)
1057{
1058 int mode = current->seccomp.mode;
1059 int this_syscall;
1060
1061 if (IS_ENABLED(CONFIG_CHECKPOINT_RESTORE) &&
1062 unlikely(current->ptrace & PT_SUSPEND_SECCOMP))
1063 return 0;
1064
1065 this_syscall = sd ? sd->nr :
1066 syscall_get_nr(current, current_pt_regs());
1067
1068 switch (mode) {
1069 case SECCOMP_MODE_STRICT:
1070 __secure_computing_strict(this_syscall);
1071 return 0;
1072 case SECCOMP_MODE_FILTER:
1073 return __seccomp_filter(this_syscall, sd, false);
1074 default:
1075 BUG();
1076 }
1077}
1078#endif
1079
1080long prctl_get_seccomp(void)
1081{
1082 return current->seccomp.mode;
1083}
1084
1085
1086
1087
1088
1089
1090
1091
1092static long seccomp_set_mode_strict(void)
1093{
1094 const unsigned long seccomp_mode = SECCOMP_MODE_STRICT;
1095 long ret = -EINVAL;
1096
1097 spin_lock_irq(¤t->sighand->siglock);
1098
1099 if (!seccomp_may_assign_mode(seccomp_mode))
1100 goto out;
1101
1102#ifdef TIF_NOTSC
1103 disable_TSC();
1104#endif
1105 seccomp_assign_mode(current, seccomp_mode, 0);
1106 ret = 0;
1107
1108out:
1109 spin_unlock_irq(¤t->sighand->siglock);
1110
1111 return ret;
1112}
1113
1114#ifdef CONFIG_SECCOMP_FILTER
1115static void seccomp_notify_free(struct seccomp_filter *filter)
1116{
1117 kfree(filter->notif);
1118 filter->notif = NULL;
1119}
1120
1121static void seccomp_notify_detach(struct seccomp_filter *filter)
1122{
1123 struct seccomp_knotif *knotif;
1124
1125 if (!filter)
1126 return;
1127
1128 mutex_lock(&filter->notify_lock);
1129
1130
1131
1132
1133
1134 list_for_each_entry(knotif, &filter->notif->notifications, list) {
1135 if (knotif->state == SECCOMP_NOTIFY_REPLIED)
1136 continue;
1137
1138 knotif->state = SECCOMP_NOTIFY_REPLIED;
1139 knotif->error = -ENOSYS;
1140 knotif->val = 0;
1141
1142
1143
1144
1145
1146
1147 complete(&knotif->ready);
1148 }
1149
1150 seccomp_notify_free(filter);
1151 mutex_unlock(&filter->notify_lock);
1152}
1153
1154static int seccomp_notify_release(struct inode *inode, struct file *file)
1155{
1156 struct seccomp_filter *filter = file->private_data;
1157
1158 seccomp_notify_detach(filter);
1159 __put_seccomp_filter(filter);
1160 return 0;
1161}
1162
1163
1164static inline struct seccomp_knotif *
1165find_notification(struct seccomp_filter *filter, u64 id)
1166{
1167 struct seccomp_knotif *cur;
1168
1169 lockdep_assert_held(&filter->notify_lock);
1170
1171 list_for_each_entry(cur, &filter->notif->notifications, list) {
1172 if (cur->id == id)
1173 return cur;
1174 }
1175
1176 return NULL;
1177}
1178
1179
1180static long seccomp_notify_recv(struct seccomp_filter *filter,
1181 void __user *buf)
1182{
1183 struct seccomp_knotif *knotif = NULL, *cur;
1184 struct seccomp_notif unotif;
1185 ssize_t ret;
1186
1187
1188 ret = check_zeroed_user(buf, sizeof(unotif));
1189 if (ret < 0)
1190 return ret;
1191 if (!ret)
1192 return -EINVAL;
1193
1194 memset(&unotif, 0, sizeof(unotif));
1195
1196 ret = down_interruptible(&filter->notif->request);
1197 if (ret < 0)
1198 return ret;
1199
1200 mutex_lock(&filter->notify_lock);
1201 list_for_each_entry(cur, &filter->notif->notifications, list) {
1202 if (cur->state == SECCOMP_NOTIFY_INIT) {
1203 knotif = cur;
1204 break;
1205 }
1206 }
1207
1208
1209
1210
1211
1212
1213 if (!knotif) {
1214 ret = -ENOENT;
1215 goto out;
1216 }
1217
1218 unotif.id = knotif->id;
1219 unotif.pid = task_pid_vnr(knotif->task);
1220 unotif.data = *(knotif->data);
1221
1222 knotif->state = SECCOMP_NOTIFY_SENT;
1223 wake_up_poll(&filter->wqh, EPOLLOUT | EPOLLWRNORM);
1224 ret = 0;
1225out:
1226 mutex_unlock(&filter->notify_lock);
1227
1228 if (ret == 0 && copy_to_user(buf, &unotif, sizeof(unotif))) {
1229 ret = -EFAULT;
1230
1231
1232
1233
1234
1235
1236
1237 mutex_lock(&filter->notify_lock);
1238 knotif = find_notification(filter, unotif.id);
1239 if (knotif) {
1240 knotif->state = SECCOMP_NOTIFY_INIT;
1241 up(&filter->notif->request);
1242 }
1243 mutex_unlock(&filter->notify_lock);
1244 }
1245
1246 return ret;
1247}
1248
1249static long seccomp_notify_send(struct seccomp_filter *filter,
1250 void __user *buf)
1251{
1252 struct seccomp_notif_resp resp = {};
1253 struct seccomp_knotif *knotif;
1254 long ret;
1255
1256 if (copy_from_user(&resp, buf, sizeof(resp)))
1257 return -EFAULT;
1258
1259 if (resp.flags & ~SECCOMP_USER_NOTIF_FLAG_CONTINUE)
1260 return -EINVAL;
1261
1262 if ((resp.flags & SECCOMP_USER_NOTIF_FLAG_CONTINUE) &&
1263 (resp.error || resp.val))
1264 return -EINVAL;
1265
1266 ret = mutex_lock_interruptible(&filter->notify_lock);
1267 if (ret < 0)
1268 return ret;
1269
1270 knotif = find_notification(filter, resp.id);
1271 if (!knotif) {
1272 ret = -ENOENT;
1273 goto out;
1274 }
1275
1276
1277 if (knotif->state != SECCOMP_NOTIFY_SENT) {
1278 ret = -EINPROGRESS;
1279 goto out;
1280 }
1281
1282 ret = 0;
1283 knotif->state = SECCOMP_NOTIFY_REPLIED;
1284 knotif->error = resp.error;
1285 knotif->val = resp.val;
1286 knotif->flags = resp.flags;
1287 complete(&knotif->ready);
1288out:
1289 mutex_unlock(&filter->notify_lock);
1290 return ret;
1291}
1292
1293static long seccomp_notify_id_valid(struct seccomp_filter *filter,
1294 void __user *buf)
1295{
1296 struct seccomp_knotif *knotif;
1297 u64 id;
1298 long ret;
1299
1300 if (copy_from_user(&id, buf, sizeof(id)))
1301 return -EFAULT;
1302
1303 ret = mutex_lock_interruptible(&filter->notify_lock);
1304 if (ret < 0)
1305 return ret;
1306
1307 knotif = find_notification(filter, id);
1308 if (knotif && knotif->state == SECCOMP_NOTIFY_SENT)
1309 ret = 0;
1310 else
1311 ret = -ENOENT;
1312
1313 mutex_unlock(&filter->notify_lock);
1314 return ret;
1315}
1316
1317static long seccomp_notify_addfd(struct seccomp_filter *filter,
1318 struct seccomp_notif_addfd __user *uaddfd,
1319 unsigned int size)
1320{
1321 struct seccomp_notif_addfd addfd;
1322 struct seccomp_knotif *knotif;
1323 struct seccomp_kaddfd kaddfd;
1324 int ret;
1325
1326 BUILD_BUG_ON(sizeof(addfd) < SECCOMP_NOTIFY_ADDFD_SIZE_VER0);
1327 BUILD_BUG_ON(sizeof(addfd) != SECCOMP_NOTIFY_ADDFD_SIZE_LATEST);
1328
1329 if (size < SECCOMP_NOTIFY_ADDFD_SIZE_VER0 || size >= PAGE_SIZE)
1330 return -EINVAL;
1331
1332 ret = copy_struct_from_user(&addfd, sizeof(addfd), uaddfd, size);
1333 if (ret)
1334 return ret;
1335
1336 if (addfd.newfd_flags & ~O_CLOEXEC)
1337 return -EINVAL;
1338
1339 if (addfd.flags & ~SECCOMP_ADDFD_FLAG_SETFD)
1340 return -EINVAL;
1341
1342 if (addfd.newfd && !(addfd.flags & SECCOMP_ADDFD_FLAG_SETFD))
1343 return -EINVAL;
1344
1345 kaddfd.file = fget(addfd.srcfd);
1346 if (!kaddfd.file)
1347 return -EBADF;
1348
1349 kaddfd.flags = addfd.newfd_flags;
1350 kaddfd.fd = (addfd.flags & SECCOMP_ADDFD_FLAG_SETFD) ?
1351 addfd.newfd : -1;
1352 init_completion(&kaddfd.completion);
1353
1354 ret = mutex_lock_interruptible(&filter->notify_lock);
1355 if (ret < 0)
1356 goto out;
1357
1358 knotif = find_notification(filter, addfd.id);
1359 if (!knotif) {
1360 ret = -ENOENT;
1361 goto out_unlock;
1362 }
1363
1364
1365
1366
1367
1368
1369 if (knotif->state != SECCOMP_NOTIFY_SENT) {
1370 ret = -EINPROGRESS;
1371 goto out_unlock;
1372 }
1373
1374 list_add(&kaddfd.list, &knotif->addfd);
1375 complete(&knotif->ready);
1376 mutex_unlock(&filter->notify_lock);
1377
1378
1379 ret = wait_for_completion_interruptible(&kaddfd.completion);
1380 if (ret == 0) {
1381
1382
1383
1384
1385
1386
1387
1388 ret = kaddfd.ret;
1389 goto out;
1390 }
1391
1392 mutex_lock(&filter->notify_lock);
1393
1394
1395
1396
1397
1398
1399
1400 if (list_empty(&kaddfd.list))
1401 ret = kaddfd.ret;
1402 else
1403 list_del(&kaddfd.list);
1404
1405out_unlock:
1406 mutex_unlock(&filter->notify_lock);
1407out:
1408 fput(kaddfd.file);
1409
1410 return ret;
1411}
1412
1413static long seccomp_notify_ioctl(struct file *file, unsigned int cmd,
1414 unsigned long arg)
1415{
1416 struct seccomp_filter *filter = file->private_data;
1417 void __user *buf = (void __user *)arg;
1418
1419
1420 switch (cmd) {
1421 case SECCOMP_IOCTL_NOTIF_RECV:
1422 return seccomp_notify_recv(filter, buf);
1423 case SECCOMP_IOCTL_NOTIF_SEND:
1424 return seccomp_notify_send(filter, buf);
1425 case SECCOMP_IOCTL_NOTIF_ID_VALID_WRONG_DIR:
1426 case SECCOMP_IOCTL_NOTIF_ID_VALID:
1427 return seccomp_notify_id_valid(filter, buf);
1428 }
1429
1430
1431#define EA_IOCTL(cmd) ((cmd) & ~(IOC_INOUT | IOCSIZE_MASK))
1432 switch (EA_IOCTL(cmd)) {
1433 case EA_IOCTL(SECCOMP_IOCTL_NOTIF_ADDFD):
1434 return seccomp_notify_addfd(filter, buf, _IOC_SIZE(cmd));
1435 default:
1436 return -EINVAL;
1437 }
1438}
1439
1440static __poll_t seccomp_notify_poll(struct file *file,
1441 struct poll_table_struct *poll_tab)
1442{
1443 struct seccomp_filter *filter = file->private_data;
1444 __poll_t ret = 0;
1445 struct seccomp_knotif *cur;
1446
1447 poll_wait(file, &filter->wqh, poll_tab);
1448
1449 if (mutex_lock_interruptible(&filter->notify_lock) < 0)
1450 return EPOLLERR;
1451
1452 list_for_each_entry(cur, &filter->notif->notifications, list) {
1453 if (cur->state == SECCOMP_NOTIFY_INIT)
1454 ret |= EPOLLIN | EPOLLRDNORM;
1455 if (cur->state == SECCOMP_NOTIFY_SENT)
1456 ret |= EPOLLOUT | EPOLLWRNORM;
1457 if ((ret & EPOLLIN) && (ret & EPOLLOUT))
1458 break;
1459 }
1460
1461 mutex_unlock(&filter->notify_lock);
1462
1463 if (refcount_read(&filter->users) == 0)
1464 ret |= EPOLLHUP;
1465
1466 return ret;
1467}
1468
1469static const struct file_operations seccomp_notify_ops = {
1470 .poll = seccomp_notify_poll,
1471 .release = seccomp_notify_release,
1472 .unlocked_ioctl = seccomp_notify_ioctl,
1473 .compat_ioctl = seccomp_notify_ioctl,
1474};
1475
1476static struct file *init_listener(struct seccomp_filter *filter)
1477{
1478 struct file *ret;
1479
1480 ret = ERR_PTR(-ENOMEM);
1481 filter->notif = kzalloc(sizeof(*(filter->notif)), GFP_KERNEL);
1482 if (!filter->notif)
1483 goto out;
1484
1485 sema_init(&filter->notif->request, 0);
1486 filter->notif->next_id = get_random_u64();
1487 INIT_LIST_HEAD(&filter->notif->notifications);
1488
1489 ret = anon_inode_getfile("seccomp notify", &seccomp_notify_ops,
1490 filter, O_RDWR);
1491 if (IS_ERR(ret))
1492 goto out_notif;
1493
1494
1495 __get_seccomp_filter(filter);
1496
1497out_notif:
1498 if (IS_ERR(ret))
1499 seccomp_notify_free(filter);
1500out:
1501 return ret;
1502}
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512static bool has_duplicate_listener(struct seccomp_filter *new_child)
1513{
1514 struct seccomp_filter *cur;
1515
1516
1517 lockdep_assert_held(¤t->sighand->siglock);
1518
1519 if (!new_child->notif)
1520 return false;
1521 for (cur = current->seccomp.filter; cur; cur = cur->prev) {
1522 if (cur->notif)
1523 return true;
1524 }
1525
1526 return false;
1527}
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542static long seccomp_set_mode_filter(unsigned int flags,
1543 const char __user *filter)
1544{
1545 const unsigned long seccomp_mode = SECCOMP_MODE_FILTER;
1546 struct seccomp_filter *prepared = NULL;
1547 long ret = -EINVAL;
1548 int listener = -1;
1549 struct file *listener_f = NULL;
1550
1551
1552 if (flags & ~SECCOMP_FILTER_FLAG_MASK)
1553 return -EINVAL;
1554
1555
1556
1557
1558
1559
1560
1561
1562 if ((flags & SECCOMP_FILTER_FLAG_TSYNC) &&
1563 (flags & SECCOMP_FILTER_FLAG_NEW_LISTENER) &&
1564 ((flags & SECCOMP_FILTER_FLAG_TSYNC_ESRCH) == 0))
1565 return -EINVAL;
1566
1567
1568 prepared = seccomp_prepare_user_filter(filter);
1569 if (IS_ERR(prepared))
1570 return PTR_ERR(prepared);
1571
1572 if (flags & SECCOMP_FILTER_FLAG_NEW_LISTENER) {
1573 listener = get_unused_fd_flags(O_CLOEXEC);
1574 if (listener < 0) {
1575 ret = listener;
1576 goto out_free;
1577 }
1578
1579 listener_f = init_listener(prepared);
1580 if (IS_ERR(listener_f)) {
1581 put_unused_fd(listener);
1582 ret = PTR_ERR(listener_f);
1583 goto out_free;
1584 }
1585 }
1586
1587
1588
1589
1590
1591 if (flags & SECCOMP_FILTER_FLAG_TSYNC &&
1592 mutex_lock_killable(¤t->signal->cred_guard_mutex))
1593 goto out_put_fd;
1594
1595 spin_lock_irq(¤t->sighand->siglock);
1596
1597 if (!seccomp_may_assign_mode(seccomp_mode))
1598 goto out;
1599
1600 if (has_duplicate_listener(prepared)) {
1601 ret = -EBUSY;
1602 goto out;
1603 }
1604
1605 ret = seccomp_attach_filter(flags, prepared);
1606 if (ret)
1607 goto out;
1608
1609 prepared = NULL;
1610
1611 seccomp_assign_mode(current, seccomp_mode, flags);
1612out:
1613 spin_unlock_irq(¤t->sighand->siglock);
1614 if (flags & SECCOMP_FILTER_FLAG_TSYNC)
1615 mutex_unlock(¤t->signal->cred_guard_mutex);
1616out_put_fd:
1617 if (flags & SECCOMP_FILTER_FLAG_NEW_LISTENER) {
1618 if (ret) {
1619 listener_f->private_data = NULL;
1620 fput(listener_f);
1621 put_unused_fd(listener);
1622 seccomp_notify_detach(prepared);
1623 } else {
1624 fd_install(listener, listener_f);
1625 ret = listener;
1626 }
1627 }
1628out_free:
1629 seccomp_filter_free(prepared);
1630 return ret;
1631}
1632#else
1633static inline long seccomp_set_mode_filter(unsigned int flags,
1634 const char __user *filter)
1635{
1636 return -EINVAL;
1637}
1638#endif
1639
1640static long seccomp_get_action_avail(const char __user *uaction)
1641{
1642 u32 action;
1643
1644 if (copy_from_user(&action, uaction, sizeof(action)))
1645 return -EFAULT;
1646
1647 switch (action) {
1648 case SECCOMP_RET_KILL_PROCESS:
1649 case SECCOMP_RET_KILL_THREAD:
1650 case SECCOMP_RET_TRAP:
1651 case SECCOMP_RET_ERRNO:
1652 case SECCOMP_RET_USER_NOTIF:
1653 case SECCOMP_RET_TRACE:
1654 case SECCOMP_RET_LOG:
1655 case SECCOMP_RET_ALLOW:
1656 break;
1657 default:
1658 return -EOPNOTSUPP;
1659 }
1660
1661 return 0;
1662}
1663
1664static long seccomp_get_notif_sizes(void __user *usizes)
1665{
1666 struct seccomp_notif_sizes sizes = {
1667 .seccomp_notif = sizeof(struct seccomp_notif),
1668 .seccomp_notif_resp = sizeof(struct seccomp_notif_resp),
1669 .seccomp_data = sizeof(struct seccomp_data),
1670 };
1671
1672 if (copy_to_user(usizes, &sizes, sizeof(sizes)))
1673 return -EFAULT;
1674
1675 return 0;
1676}
1677
1678
1679static long do_seccomp(unsigned int op, unsigned int flags,
1680 void __user *uargs)
1681{
1682 switch (op) {
1683 case SECCOMP_SET_MODE_STRICT:
1684 if (flags != 0 || uargs != NULL)
1685 return -EINVAL;
1686 return seccomp_set_mode_strict();
1687 case SECCOMP_SET_MODE_FILTER:
1688 return seccomp_set_mode_filter(flags, uargs);
1689 case SECCOMP_GET_ACTION_AVAIL:
1690 if (flags != 0)
1691 return -EINVAL;
1692
1693 return seccomp_get_action_avail(uargs);
1694 case SECCOMP_GET_NOTIF_SIZES:
1695 if (flags != 0)
1696 return -EINVAL;
1697
1698 return seccomp_get_notif_sizes(uargs);
1699 default:
1700 return -EINVAL;
1701 }
1702}
1703
1704SYSCALL_DEFINE3(seccomp, unsigned int, op, unsigned int, flags,
1705 void __user *, uargs)
1706{
1707 return do_seccomp(op, flags, uargs);
1708}
1709
1710
1711
1712
1713
1714
1715
1716
1717long prctl_set_seccomp(unsigned long seccomp_mode, void __user *filter)
1718{
1719 unsigned int op;
1720 void __user *uargs;
1721
1722 switch (seccomp_mode) {
1723 case SECCOMP_MODE_STRICT:
1724 op = SECCOMP_SET_MODE_STRICT;
1725
1726
1727
1728
1729
1730 uargs = NULL;
1731 break;
1732 case SECCOMP_MODE_FILTER:
1733 op = SECCOMP_SET_MODE_FILTER;
1734 uargs = filter;
1735 break;
1736 default:
1737 return -EINVAL;
1738 }
1739
1740
1741 return do_seccomp(op, 0, uargs);
1742}
1743
1744#if defined(CONFIG_SECCOMP_FILTER) && defined(CONFIG_CHECKPOINT_RESTORE)
1745static struct seccomp_filter *get_nth_filter(struct task_struct *task,
1746 unsigned long filter_off)
1747{
1748 struct seccomp_filter *orig, *filter;
1749 unsigned long count;
1750
1751
1752
1753
1754
1755 spin_lock_irq(&task->sighand->siglock);
1756
1757 if (task->seccomp.mode != SECCOMP_MODE_FILTER) {
1758 spin_unlock_irq(&task->sighand->siglock);
1759 return ERR_PTR(-EINVAL);
1760 }
1761
1762 orig = task->seccomp.filter;
1763 __get_seccomp_filter(orig);
1764 spin_unlock_irq(&task->sighand->siglock);
1765
1766 count = 0;
1767 for (filter = orig; filter; filter = filter->prev)
1768 count++;
1769
1770 if (filter_off >= count) {
1771 filter = ERR_PTR(-ENOENT);
1772 goto out;
1773 }
1774
1775 count -= filter_off;
1776 for (filter = orig; filter && count > 1; filter = filter->prev)
1777 count--;
1778
1779 if (WARN_ON(count != 1 || !filter)) {
1780 filter = ERR_PTR(-ENOENT);
1781 goto out;
1782 }
1783
1784 __get_seccomp_filter(filter);
1785
1786out:
1787 __put_seccomp_filter(orig);
1788 return filter;
1789}
1790
1791long seccomp_get_filter(struct task_struct *task, unsigned long filter_off,
1792 void __user *data)
1793{
1794 struct seccomp_filter *filter;
1795 struct sock_fprog_kern *fprog;
1796 long ret;
1797
1798 if (!capable(CAP_SYS_ADMIN) ||
1799 current->seccomp.mode != SECCOMP_MODE_DISABLED) {
1800 return -EACCES;
1801 }
1802
1803 filter = get_nth_filter(task, filter_off);
1804 if (IS_ERR(filter))
1805 return PTR_ERR(filter);
1806
1807 fprog = filter->prog->orig_prog;
1808 if (!fprog) {
1809
1810
1811
1812
1813 ret = -EMEDIUMTYPE;
1814 goto out;
1815 }
1816
1817 ret = fprog->len;
1818 if (!data)
1819 goto out;
1820
1821 if (copy_to_user(data, fprog->filter, bpf_classic_proglen(fprog)))
1822 ret = -EFAULT;
1823
1824out:
1825 __put_seccomp_filter(filter);
1826 return ret;
1827}
1828
1829long seccomp_get_metadata(struct task_struct *task,
1830 unsigned long size, void __user *data)
1831{
1832 long ret;
1833 struct seccomp_filter *filter;
1834 struct seccomp_metadata kmd = {};
1835
1836 if (!capable(CAP_SYS_ADMIN) ||
1837 current->seccomp.mode != SECCOMP_MODE_DISABLED) {
1838 return -EACCES;
1839 }
1840
1841 size = min_t(unsigned long, size, sizeof(kmd));
1842
1843 if (size < sizeof(kmd.filter_off))
1844 return -EINVAL;
1845
1846 if (copy_from_user(&kmd.filter_off, data, sizeof(kmd.filter_off)))
1847 return -EFAULT;
1848
1849 filter = get_nth_filter(task, kmd.filter_off);
1850 if (IS_ERR(filter))
1851 return PTR_ERR(filter);
1852
1853 if (filter->log)
1854 kmd.flags |= SECCOMP_FILTER_FLAG_LOG;
1855
1856 ret = size;
1857 if (copy_to_user(data, &kmd, size))
1858 ret = -EFAULT;
1859
1860 __put_seccomp_filter(filter);
1861 return ret;
1862}
1863#endif
1864
1865#ifdef CONFIG_SYSCTL
1866
1867
1868#define SECCOMP_RET_KILL_PROCESS_NAME "kill_process"
1869#define SECCOMP_RET_KILL_THREAD_NAME "kill_thread"
1870#define SECCOMP_RET_TRAP_NAME "trap"
1871#define SECCOMP_RET_ERRNO_NAME "errno"
1872#define SECCOMP_RET_USER_NOTIF_NAME "user_notif"
1873#define SECCOMP_RET_TRACE_NAME "trace"
1874#define SECCOMP_RET_LOG_NAME "log"
1875#define SECCOMP_RET_ALLOW_NAME "allow"
1876
1877static const char seccomp_actions_avail[] =
1878 SECCOMP_RET_KILL_PROCESS_NAME " "
1879 SECCOMP_RET_KILL_THREAD_NAME " "
1880 SECCOMP_RET_TRAP_NAME " "
1881 SECCOMP_RET_ERRNO_NAME " "
1882 SECCOMP_RET_USER_NOTIF_NAME " "
1883 SECCOMP_RET_TRACE_NAME " "
1884 SECCOMP_RET_LOG_NAME " "
1885 SECCOMP_RET_ALLOW_NAME;
1886
1887struct seccomp_log_name {
1888 u32 log;
1889 const char *name;
1890};
1891
1892static const struct seccomp_log_name seccomp_log_names[] = {
1893 { SECCOMP_LOG_KILL_PROCESS, SECCOMP_RET_KILL_PROCESS_NAME },
1894 { SECCOMP_LOG_KILL_THREAD, SECCOMP_RET_KILL_THREAD_NAME },
1895 { SECCOMP_LOG_TRAP, SECCOMP_RET_TRAP_NAME },
1896 { SECCOMP_LOG_ERRNO, SECCOMP_RET_ERRNO_NAME },
1897 { SECCOMP_LOG_USER_NOTIF, SECCOMP_RET_USER_NOTIF_NAME },
1898 { SECCOMP_LOG_TRACE, SECCOMP_RET_TRACE_NAME },
1899 { SECCOMP_LOG_LOG, SECCOMP_RET_LOG_NAME },
1900 { SECCOMP_LOG_ALLOW, SECCOMP_RET_ALLOW_NAME },
1901 { }
1902};
1903
1904static bool seccomp_names_from_actions_logged(char *names, size_t size,
1905 u32 actions_logged,
1906 const char *sep)
1907{
1908 const struct seccomp_log_name *cur;
1909 bool append_sep = false;
1910
1911 for (cur = seccomp_log_names; cur->name && size; cur++) {
1912 ssize_t ret;
1913
1914 if (!(actions_logged & cur->log))
1915 continue;
1916
1917 if (append_sep) {
1918 ret = strscpy(names, sep, size);
1919 if (ret < 0)
1920 return false;
1921
1922 names += ret;
1923 size -= ret;
1924 } else
1925 append_sep = true;
1926
1927 ret = strscpy(names, cur->name, size);
1928 if (ret < 0)
1929 return false;
1930
1931 names += ret;
1932 size -= ret;
1933 }
1934
1935 return true;
1936}
1937
1938static bool seccomp_action_logged_from_name(u32 *action_logged,
1939 const char *name)
1940{
1941 const struct seccomp_log_name *cur;
1942
1943 for (cur = seccomp_log_names; cur->name; cur++) {
1944 if (!strcmp(cur->name, name)) {
1945 *action_logged = cur->log;
1946 return true;
1947 }
1948 }
1949
1950 return false;
1951}
1952
1953static bool seccomp_actions_logged_from_names(u32 *actions_logged, char *names)
1954{
1955 char *name;
1956
1957 *actions_logged = 0;
1958 while ((name = strsep(&names, " ")) && *name) {
1959 u32 action_logged = 0;
1960
1961 if (!seccomp_action_logged_from_name(&action_logged, name))
1962 return false;
1963
1964 *actions_logged |= action_logged;
1965 }
1966
1967 return true;
1968}
1969
1970static int read_actions_logged(struct ctl_table *ro_table, void __user *buffer,
1971 size_t *lenp, loff_t *ppos)
1972{
1973 char names[sizeof(seccomp_actions_avail)];
1974 struct ctl_table table;
1975
1976 memset(names, 0, sizeof(names));
1977
1978 if (!seccomp_names_from_actions_logged(names, sizeof(names),
1979 seccomp_actions_logged, " "))
1980 return -EINVAL;
1981
1982 table = *ro_table;
1983 table.data = names;
1984 table.maxlen = sizeof(names);
1985 return proc_dostring(&table, 0, buffer, lenp, ppos);
1986}
1987
1988static int write_actions_logged(struct ctl_table *ro_table, void __user *buffer,
1989 size_t *lenp, loff_t *ppos, u32 *actions_logged)
1990{
1991 char names[sizeof(seccomp_actions_avail)];
1992 struct ctl_table table;
1993 int ret;
1994
1995 if (!capable(CAP_SYS_ADMIN))
1996 return -EPERM;
1997
1998 memset(names, 0, sizeof(names));
1999
2000 table = *ro_table;
2001 table.data = names;
2002 table.maxlen = sizeof(names);
2003 ret = proc_dostring(&table, 1, buffer, lenp, ppos);
2004 if (ret)
2005 return ret;
2006
2007 if (!seccomp_actions_logged_from_names(actions_logged, table.data))
2008 return -EINVAL;
2009
2010 if (*actions_logged & SECCOMP_LOG_ALLOW)
2011 return -EINVAL;
2012
2013 seccomp_actions_logged = *actions_logged;
2014 return 0;
2015}
2016
2017static void audit_actions_logged(u32 actions_logged, u32 old_actions_logged,
2018 int ret)
2019{
2020 char names[sizeof(seccomp_actions_avail)];
2021 char old_names[sizeof(seccomp_actions_avail)];
2022 const char *new = names;
2023 const char *old = old_names;
2024
2025 if (!audit_enabled)
2026 return;
2027
2028 memset(names, 0, sizeof(names));
2029 memset(old_names, 0, sizeof(old_names));
2030
2031 if (ret)
2032 new = "?";
2033 else if (!actions_logged)
2034 new = "(none)";
2035 else if (!seccomp_names_from_actions_logged(names, sizeof(names),
2036 actions_logged, ","))
2037 new = "?";
2038
2039 if (!old_actions_logged)
2040 old = "(none)";
2041 else if (!seccomp_names_from_actions_logged(old_names,
2042 sizeof(old_names),
2043 old_actions_logged, ","))
2044 old = "?";
2045
2046 return audit_seccomp_actions_logged(new, old, !ret);
2047}
2048
2049static int seccomp_actions_logged_handler(struct ctl_table *ro_table, int write,
2050 void *buffer, size_t *lenp,
2051 loff_t *ppos)
2052{
2053 int ret;
2054
2055 if (write) {
2056 u32 actions_logged = 0;
2057 u32 old_actions_logged = seccomp_actions_logged;
2058
2059 ret = write_actions_logged(ro_table, buffer, lenp, ppos,
2060 &actions_logged);
2061 audit_actions_logged(actions_logged, old_actions_logged, ret);
2062 } else
2063 ret = read_actions_logged(ro_table, buffer, lenp, ppos);
2064
2065 return ret;
2066}
2067
2068static struct ctl_path seccomp_sysctl_path[] = {
2069 { .procname = "kernel", },
2070 { .procname = "seccomp", },
2071 { }
2072};
2073
2074static struct ctl_table seccomp_sysctl_table[] = {
2075 {
2076 .procname = "actions_avail",
2077 .data = (void *) &seccomp_actions_avail,
2078 .maxlen = sizeof(seccomp_actions_avail),
2079 .mode = 0444,
2080 .proc_handler = proc_dostring,
2081 },
2082 {
2083 .procname = "actions_logged",
2084 .mode = 0644,
2085 .proc_handler = seccomp_actions_logged_handler,
2086 },
2087 { }
2088};
2089
2090static int __init seccomp_sysctl_init(void)
2091{
2092 struct ctl_table_header *hdr;
2093
2094 hdr = register_sysctl_paths(seccomp_sysctl_path, seccomp_sysctl_table);
2095 if (!hdr)
2096 pr_warn("sysctl registration failed\n");
2097 else
2098 kmemleak_not_leak(hdr);
2099
2100 return 0;
2101}
2102
2103device_initcall(seccomp_sysctl_init)
2104
2105#endif
2106