LCOV - code coverage report
Current view: top level - kernel - seccomp.c (source / functions) Hit Total Coverage
Test: gcov_data_raspi2_real_modules_combined.info Lines: 147 461 31.9 %
Date: 2020-09-30 20:25:40 Functions: 22 44 50.0 %
Branches: 71 349 20.3 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0
       2                 :            : /*
       3                 :            :  * linux/kernel/seccomp.c
       4                 :            :  *
       5                 :            :  * Copyright 2004-2005  Andrea Arcangeli <andrea@cpushare.com>
       6                 :            :  *
       7                 :            :  * Copyright (C) 2012 Google, Inc.
       8                 :            :  * Will Drewry <wad@chromium.org>
       9                 :            :  *
      10                 :            :  * This defines a simple but solid secure-computing facility.
      11                 :            :  *
      12                 :            :  * Mode 1 uses a fixed list of allowed system calls.
      13                 :            :  * Mode 2 allows user-defined system call filters in the form
      14                 :            :  *        of Berkeley Packet Filters/Linux Socket Filters.
      15                 :            :  */
      16                 :            : 
      17                 :            : #include <linux/refcount.h>
      18                 :            : #include <linux/audit.h>
      19                 :            : #include <linux/compat.h>
      20                 :            : #include <linux/coredump.h>
      21                 :            : #include <linux/kmemleak.h>
      22                 :            : #include <linux/nospec.h>
      23                 :            : #include <linux/prctl.h>
      24                 :            : #include <linux/sched.h>
      25                 :            : #include <linux/sched/task_stack.h>
      26                 :            : #include <linux/seccomp.h>
      27                 :            : #include <linux/slab.h>
      28                 :            : #include <linux/syscalls.h>
      29                 :            : #include <linux/sysctl.h>
      30                 :            : 
      31                 :            : #ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER
      32                 :            : #include <asm/syscall.h>
      33                 :            : #endif
      34                 :            : 
      35                 :            : #ifdef CONFIG_SECCOMP_FILTER
      36                 :            : #include <linux/file.h>
      37                 :            : #include <linux/filter.h>
      38                 :            : #include <linux/pid.h>
      39                 :            : #include <linux/ptrace.h>
      40                 :            : #include <linux/security.h>
      41                 :            : #include <linux/tracehook.h>
      42                 :            : #include <linux/uaccess.h>
      43                 :            : #include <linux/anon_inodes.h>
      44                 :            : 
      45                 :            : /*
      46                 :            :  * When SECCOMP_IOCTL_NOTIF_ID_VALID was first introduced, it had the
      47                 :            :  * wrong direction flag in the ioctl number. This is the broken one,
      48                 :            :  * which the kernel needs to keep supporting until all userspaces stop
      49                 :            :  * using the wrong command number.
      50                 :            :  */
      51                 :            : #define SECCOMP_IOCTL_NOTIF_ID_VALID_WRONG_DIR  SECCOMP_IOR(2, __u64)
      52                 :            : 
      53                 :            : enum notify_state {
      54                 :            :         SECCOMP_NOTIFY_INIT,
      55                 :            :         SECCOMP_NOTIFY_SENT,
      56                 :            :         SECCOMP_NOTIFY_REPLIED,
      57                 :            : };
      58                 :            : 
      59                 :            : struct seccomp_knotif {
      60                 :            :         /* The struct pid of the task whose filter triggered the notification */
      61                 :            :         struct task_struct *task;
      62                 :            : 
      63                 :            :         /* The "cookie" for this request; this is unique for this filter. */
      64                 :            :         u64 id;
      65                 :            : 
      66                 :            :         /*
      67                 :            :          * The seccomp data. This pointer is valid the entire time this
      68                 :            :          * notification is active, since it comes from __seccomp_filter which
      69                 :            :          * eclipses the entire lifecycle here.
      70                 :            :          */
      71                 :            :         const struct seccomp_data *data;
      72                 :            : 
      73                 :            :         /*
      74                 :            :          * Notification states. When SECCOMP_RET_USER_NOTIF is returned, a
      75                 :            :          * struct seccomp_knotif is created and starts out in INIT. Once the
      76                 :            :          * handler reads the notification off of an FD, it transitions to SENT.
      77                 :            :          * If a signal is received the state transitions back to INIT and
      78                 :            :          * another message is sent. When the userspace handler replies, state
      79                 :            :          * transitions to REPLIED.
      80                 :            :          */
      81                 :            :         enum notify_state state;
      82                 :            : 
      83                 :            :         /* The return values, only valid when in SECCOMP_NOTIFY_REPLIED */
      84                 :            :         int error;
      85                 :            :         long val;
      86                 :            : 
      87                 :            :         /* Signals when this has entered SECCOMP_NOTIFY_REPLIED */
      88                 :            :         struct completion ready;
      89                 :            : 
      90                 :            :         struct list_head list;
      91                 :            : };
      92                 :            : 
      93                 :            : /**
      94                 :            :  * struct notification - container for seccomp userspace notifications. Since
      95                 :            :  * most seccomp filters will not have notification listeners attached and this
      96                 :            :  * structure is fairly large, we store the notification-specific stuff in a
      97                 :            :  * separate structure.
      98                 :            :  *
      99                 :            :  * @request: A semaphore that users of this notification can wait on for
     100                 :            :  *           changes. Actual reads and writes are still controlled with
     101                 :            :  *           filter->notify_lock.
     102                 :            :  * @next_id: The id of the next request.
     103                 :            :  * @notifications: A list of struct seccomp_knotif elements.
     104                 :            :  * @wqh: A wait queue for poll.
     105                 :            :  */
     106                 :            : struct notification {
     107                 :            :         struct semaphore request;
     108                 :            :         u64 next_id;
     109                 :            :         struct list_head notifications;
     110                 :            :         wait_queue_head_t wqh;
     111                 :            : };
     112                 :            : 
     113                 :            : /**
     114                 :            :  * struct seccomp_filter - container for seccomp BPF programs
     115                 :            :  *
     116                 :            :  * @usage: reference count to manage the object lifetime.
     117                 :            :  *         get/put helpers should be used when accessing an instance
     118                 :            :  *         outside of a lifetime-guarded section.  In general, this
     119                 :            :  *         is only needed for handling filters shared across tasks.
     120                 :            :  * @log: true if all actions except for SECCOMP_RET_ALLOW should be logged
     121                 :            :  * @prev: points to a previously installed, or inherited, filter
     122                 :            :  * @prog: the BPF program to evaluate
     123                 :            :  * @notif: the struct that holds all notification related information
     124                 :            :  * @notify_lock: A lock for all notification-related accesses.
     125                 :            :  *
     126                 :            :  * seccomp_filter objects are organized in a tree linked via the @prev
     127                 :            :  * pointer.  For any task, it appears to be a singly-linked list starting
     128                 :            :  * with current->seccomp.filter, the most recently attached or inherited filter.
     129                 :            :  * However, multiple filters may share a @prev node, by way of fork(), which
     130                 :            :  * results in a unidirectional tree existing in memory.  This is similar to
     131                 :            :  * how namespaces work.
     132                 :            :  *
     133                 :            :  * seccomp_filter objects should never be modified after being attached
     134                 :            :  * to a task_struct (other than @usage).
     135                 :            :  */
     136                 :            : struct seccomp_filter {
     137                 :            :         refcount_t usage;
     138                 :            :         bool log;
     139                 :            :         struct seccomp_filter *prev;
     140                 :            :         struct bpf_prog *prog;
     141                 :            :         struct notification *notif;
     142                 :            :         struct mutex notify_lock;
     143                 :            : };
     144                 :            : 
     145                 :            : /* Limit any path through the tree to 256KB worth of instructions. */
     146                 :            : #define MAX_INSNS_PER_PATH ((1 << 18) / sizeof(struct sock_filter))
     147                 :            : 
     148                 :            : /*
     149                 :            :  * Endianness is explicitly ignored and left for BPF program authors to manage
     150                 :            :  * as per the specific architecture.
     151                 :            :  */
     152                 :   20021729 : static void populate_seccomp_data(struct seccomp_data *sd)
     153                 :            : {
     154                 :   20021729 :         struct task_struct *task = current;
     155                 :   20021729 :         struct pt_regs *regs = task_pt_regs(task);
     156                 :            :         unsigned long args[6];
     157                 :            : 
     158                 :   20021729 :         sd->nr = syscall_get_nr(task, regs);
     159                 :   20021729 :         sd->arch = syscall_get_arch(task);
     160                 :            :         syscall_get_arguments(task, regs, args);
     161                 :   20021729 :         sd->args[0] = args[0];
     162                 :   20021729 :         sd->args[1] = args[1];
     163                 :   20021729 :         sd->args[2] = args[2];
     164                 :   20021729 :         sd->args[3] = args[3];
     165                 :   20021729 :         sd->args[4] = args[4];
     166                 :   20021729 :         sd->args[5] = args[5];
     167                 :   20021729 :         sd->instruction_pointer = KSTK_EIP(task);
     168                 :   20021729 : }
     169                 :            : 
     170                 :            : /**
     171                 :            :  *      seccomp_check_filter - verify seccomp filter code
     172                 :            :  *      @filter: filter to verify
     173                 :            :  *      @flen: length of filter
     174                 :            :  *
     175                 :            :  * Takes a previously checked filter (by bpf_check_classic) and
     176                 :            :  * redirects all filter code that loads struct sk_buff data
     177                 :            :  * and related data through seccomp_bpf_load.  It also
     178                 :            :  * enforces length and alignment checking of those loads.
     179                 :            :  *
     180                 :            :  * Returns 0 if the rule set is legal or -EINVAL if not.
     181                 :            :  */
     182                 :       6009 : static int seccomp_check_filter(struct sock_filter *filter, unsigned int flen)
     183                 :            : {
     184                 :            :         int pc;
     185         [ +  + ]:     300417 :         for (pc = 0; pc < flen; pc++) {
     186                 :     294408 :                 struct sock_filter *ftest = &filter[pc];
     187                 :     294408 :                 u16 code = ftest->code;
     188                 :     294408 :                 u32 k = ftest->k;
     189                 :            : 
     190   [ +  -  -  +  :     294408 :                 switch (code) {
                      - ]
     191                 :            :                 case BPF_LD | BPF_W | BPF_ABS:
     192                 :      20507 :                         ftest->code = BPF_LDX | BPF_W | BPF_ABS;
     193                 :            :                         /* 32-bit aligned and not out of bounds. */
     194   [ +  -  +  - ]:      20507 :                         if (k >= sizeof(struct seccomp_data) || k & 3)
     195                 :            :                                 return -EINVAL;
     196                 :      20507 :                         continue;
     197                 :            :                 case BPF_LD | BPF_W | BPF_LEN:
     198                 :          0 :                         ftest->code = BPF_LD | BPF_IMM;
     199                 :          0 :                         ftest->k = sizeof(struct seccomp_data);
     200                 :          0 :                         continue;
     201                 :            :                 case BPF_LDX | BPF_W | BPF_LEN:
     202                 :          0 :                         ftest->code = BPF_LDX | BPF_IMM;
     203                 :          0 :                         ftest->k = sizeof(struct seccomp_data);
     204                 :          0 :                         continue;
     205                 :            :                 /* Explicitly include allowed calls. */
     206                 :            :                 case BPF_RET | BPF_K:
     207                 :            :                 case BPF_RET | BPF_A:
     208                 :            :                 case BPF_ALU | BPF_ADD | BPF_K:
     209                 :            :                 case BPF_ALU | BPF_ADD | BPF_X:
     210                 :            :                 case BPF_ALU | BPF_SUB | BPF_K:
     211                 :            :                 case BPF_ALU | BPF_SUB | BPF_X:
     212                 :            :                 case BPF_ALU | BPF_MUL | BPF_K:
     213                 :            :                 case BPF_ALU | BPF_MUL | BPF_X:
     214                 :            :                 case BPF_ALU | BPF_DIV | BPF_K:
     215                 :            :                 case BPF_ALU | BPF_DIV | BPF_X:
     216                 :            :                 case BPF_ALU | BPF_AND | BPF_K:
     217                 :            :                 case BPF_ALU | BPF_AND | BPF_X:
     218                 :            :                 case BPF_ALU | BPF_OR | BPF_K:
     219                 :            :                 case BPF_ALU | BPF_OR | BPF_X:
     220                 :            :                 case BPF_ALU | BPF_XOR | BPF_K:
     221                 :            :                 case BPF_ALU | BPF_XOR | BPF_X:
     222                 :            :                 case BPF_ALU | BPF_LSH | BPF_K:
     223                 :            :                 case BPF_ALU | BPF_LSH | BPF_X:
     224                 :            :                 case BPF_ALU | BPF_RSH | BPF_K:
     225                 :            :                 case BPF_ALU | BPF_RSH | BPF_X:
     226                 :            :                 case BPF_ALU | BPF_NEG:
     227                 :            :                 case BPF_LD | BPF_IMM:
     228                 :            :                 case BPF_LDX | BPF_IMM:
     229                 :            :                 case BPF_MISC | BPF_TAX:
     230                 :            :                 case BPF_MISC | BPF_TXA:
     231                 :            :                 case BPF_LD | BPF_MEM:
     232                 :            :                 case BPF_LDX | BPF_MEM:
     233                 :            :                 case BPF_ST:
     234                 :            :                 case BPF_STX:
     235                 :            :                 case BPF_JMP | BPF_JA:
     236                 :            :                 case BPF_JMP | BPF_JEQ | BPF_K:
     237                 :            :                 case BPF_JMP | BPF_JEQ | BPF_X:
     238                 :            :                 case BPF_JMP | BPF_JGE | BPF_K:
     239                 :            :                 case BPF_JMP | BPF_JGE | BPF_X:
     240                 :            :                 case BPF_JMP | BPF_JGT | BPF_K:
     241                 :            :                 case BPF_JMP | BPF_JGT | BPF_X:
     242                 :            :                 case BPF_JMP | BPF_JSET | BPF_K:
     243                 :            :                 case BPF_JMP | BPF_JSET | BPF_X:
     244                 :     273901 :                         continue;
     245                 :            :                 default:
     246                 :            :                         return -EINVAL;
     247                 :            :                 }
     248                 :            :         }
     249                 :            :         return 0;
     250                 :            : }
     251                 :            : 
     252                 :            : /**
     253                 :            :  * seccomp_run_filters - evaluates all seccomp filters against @sd
     254                 :            :  * @sd: optional seccomp data to be passed to filters
     255                 :            :  * @match: stores struct seccomp_filter that resulted in the return value,
     256                 :            :  *         unless filter returned SECCOMP_RET_ALLOW, in which case it will
     257                 :            :  *         be unchanged.
     258                 :            :  *
     259                 :            :  * Returns valid seccomp BPF response codes.
     260                 :            :  */
     261                 :            : #define ACTION_ONLY(ret) ((s32)((ret) & (SECCOMP_RET_ACTION_FULL)))
     262                 :   20064958 : static u32 seccomp_run_filters(const struct seccomp_data *sd,
     263                 :            :                                struct seccomp_filter **match)
     264                 :            : {
     265                 :            :         u32 ret = SECCOMP_RET_ALLOW;
     266                 :            :         /* Make sure cross-thread synced filter points somewhere sane. */
     267                 :            :         struct seccomp_filter *f =
     268                 :   40129916 :                         READ_ONCE(current->seccomp.filter);
     269                 :            : 
     270                 :            :         /* Ensure unexpected behavior doesn't result in failing open. */
     271   [ -  +  +  - ]:   20064958 :         if (WARN_ON(f == NULL))
     272                 :            :                 return SECCOMP_RET_KILL_PROCESS;
     273                 :            : 
     274                 :            :         /*
     275                 :            :          * All filters in the list are evaluated and the lowest BPF return
     276                 :            :          * value always takes priority (ignoring the DATA).
     277                 :            :          */
     278                 :   20063029 :         preempt_disable();
     279         [ +  + ]:  129688618 :         for (; f; f = f->prev) {
     280         [ -  + ]:  219252376 :                 u32 cur_ret = BPF_PROG_RUN(f->prog, sd);
     281                 :            : 
     282         [ +  + ]:  109606215 :                 if (ACTION_ONLY(cur_ret) < ACTION_ONLY(ret)) {
     283                 :            :                         ret = cur_ret;
     284                 :       2277 :                         *match = f;
     285                 :            :                 }
     286                 :            :         }
     287                 :   20078062 :         preempt_enable();
     288                 :   20073750 :         return ret;
     289                 :            : }
     290                 :            : #endif /* CONFIG_SECCOMP_FILTER */
     291                 :            : 
     292                 :       6009 : static inline bool seccomp_may_assign_mode(unsigned long seccomp_mode)
     293                 :            : {
     294         [ -  + ]:      12018 :         assert_spin_locked(&current->sighand->siglock);
     295                 :            : 
     296   [ +  +  +  - ]:       6009 :         if (current->seccomp.mode && current->seccomp.mode != seccomp_mode)
     297                 :            :                 return false;
     298                 :            : 
     299                 :       6009 :         return true;
     300                 :            : }
     301                 :            : 
     302                 :       6009 : void __weak arch_seccomp_spec_mitigate(struct task_struct *task) { }
     303                 :            : 
     304                 :       6009 : static inline void seccomp_assign_mode(struct task_struct *task,
     305                 :            :                                        unsigned long seccomp_mode,
     306                 :            :                                        unsigned long flags)
     307                 :            : {
     308         [ -  + ]:      12018 :         assert_spin_locked(&task->sighand->siglock);
     309                 :            : 
     310                 :       6009 :         task->seccomp.mode = seccomp_mode;
     311                 :            :         /*
     312                 :            :          * Make sure TIF_SECCOMP cannot be set before the mode (and
     313                 :            :          * filter) is set.
     314                 :            :          */
     315                 :       6009 :         smp_mb__before_atomic();
     316                 :            :         /* Assume default seccomp processes want spec flaw mitigation. */
     317         [ +  - ]:       6009 :         if ((flags & SECCOMP_FILTER_FLAG_SPEC_ALLOW) == 0)
     318                 :       6009 :                 arch_seccomp_spec_mitigate(task);
     319                 :            :         set_tsk_thread_flag(task, TIF_SECCOMP);
     320                 :       6009 : }
     321                 :            : 
     322                 :            : #ifdef CONFIG_SECCOMP_FILTER
     323                 :            : /* Returns 1 if the parent is an ancestor of the child. */
     324                 :            : static int is_ancestor(struct seccomp_filter *parent,
     325                 :            :                        struct seccomp_filter *child)
     326                 :            : {
     327                 :            :         /* NULL is the root ancestor. */
     328         [ #  # ]:          0 :         if (parent == NULL)
     329                 :            :                 return 1;
     330         [ #  # ]:          0 :         for (; child; child = child->prev)
     331         [ #  # ]:          0 :                 if (child == parent)
     332                 :            :                         return 1;
     333                 :            :         return 0;
     334                 :            : }
     335                 :            : 
     336                 :            : /**
     337                 :            :  * seccomp_can_sync_threads: checks if all threads can be synchronized
     338                 :            :  *
     339                 :            :  * Expects sighand and cred_guard_mutex locks to be held.
     340                 :            :  *
     341                 :            :  * Returns 0 on success, -ve on error, or the pid of a thread which was
     342                 :            :  * either not in the correct seccomp mode or did not have an ancestral
     343                 :            :  * seccomp filter.
     344                 :            :  */
     345                 :          0 : static inline pid_t seccomp_can_sync_threads(void)
     346                 :            : {
     347                 :            :         struct task_struct *thread, *caller;
     348                 :            : 
     349         [ #  # ]:          0 :         BUG_ON(!mutex_is_locked(&current->signal->cred_guard_mutex));
     350         [ #  # ]:          0 :         assert_spin_locked(&current->sighand->siglock);
     351                 :            : 
     352                 :            :         /* Validate all threads being eligible for synchronization. */
     353                 :            :         caller = current;
     354         [ #  # ]:          0 :         for_each_thread(caller, thread) {
     355                 :            :                 pid_t failed;
     356                 :            : 
     357                 :            :                 /* Skip current, since it is initiating the sync. */
     358         [ #  # ]:          0 :                 if (thread == caller)
     359                 :          0 :                         continue;
     360                 :            : 
     361   [ #  #  #  # ]:          0 :                 if (thread->seccomp.mode == SECCOMP_MODE_DISABLED ||
     362         [ #  # ]:          0 :                     (thread->seccomp.mode == SECCOMP_MODE_FILTER &&
     363                 :          0 :                      is_ancestor(thread->seccomp.filter,
     364                 :            :                                  caller->seccomp.filter)))
     365                 :          0 :                         continue;
     366                 :            : 
     367                 :            :                 /* Return the first thread that cannot be synchronized. */
     368                 :            :                 failed = task_pid_vnr(thread);
     369                 :            :                 /* If the pid cannot be resolved, then return -ESRCH */
     370   [ #  #  #  # ]:          0 :                 if (WARN_ON(failed == 0))
     371                 :            :                         failed = -ESRCH;
     372                 :          0 :                 return failed;
     373                 :            :         }
     374                 :            : 
     375                 :            :         return 0;
     376                 :            : }
     377                 :            : 
     378                 :            : /**
     379                 :            :  * seccomp_sync_threads: sets all threads to use current's filter
     380                 :            :  *
     381                 :            :  * Expects sighand and cred_guard_mutex locks to be held, and for
     382                 :            :  * seccomp_can_sync_threads() to have returned success already
     383                 :            :  * without dropping the locks.
     384                 :            :  *
     385                 :            :  */
     386                 :          0 : static inline void seccomp_sync_threads(unsigned long flags)
     387                 :            : {
     388                 :            :         struct task_struct *thread, *caller;
     389                 :            : 
     390         [ #  # ]:          0 :         BUG_ON(!mutex_is_locked(&current->signal->cred_guard_mutex));
     391         [ #  # ]:          0 :         assert_spin_locked(&current->sighand->siglock);
     392                 :            : 
     393                 :            :         /* Synchronize all threads. */
     394                 :            :         caller = current;
     395         [ #  # ]:          0 :         for_each_thread(caller, thread) {
     396                 :            :                 /* Skip current, since it needs no changes. */
     397         [ #  # ]:          0 :                 if (thread == caller)
     398                 :          0 :                         continue;
     399                 :            : 
     400                 :            :                 /* Get a task reference for the new leaf node. */
     401                 :            :                 get_seccomp_filter(caller);
     402                 :            :                 /*
     403                 :            :                  * Drop the task reference to the shared ancestor since
     404                 :            :                  * current's path will hold a reference.  (This also
     405                 :            :                  * allows a put before the assignment.)
     406                 :            :                  */
     407                 :            :                 put_seccomp_filter(thread);
     408                 :          0 :                 smp_store_release(&thread->seccomp.filter,
     409                 :            :                                   caller->seccomp.filter);
     410                 :            : 
     411                 :            :                 /*
     412                 :            :                  * Don't let an unprivileged task work around
     413                 :            :                  * the no_new_privs restriction by creating
     414                 :            :                  * a thread that sets it up, enters seccomp,
     415                 :            :                  * then dies.
     416                 :            :                  */
     417         [ #  # ]:          0 :                 if (task_no_new_privs(caller))
     418                 :            :                         task_set_no_new_privs(thread);
     419                 :            : 
     420                 :            :                 /*
     421                 :            :                  * Opt the other thread into seccomp if needed.
     422                 :            :                  * As threads are considered to be trust-realm
     423                 :            :                  * equivalent (see ptrace_may_access), it is safe to
     424                 :            :                  * allow one thread to transition the other.
     425                 :            :                  */
     426         [ #  # ]:          0 :                 if (thread->seccomp.mode == SECCOMP_MODE_DISABLED)
     427                 :          0 :                         seccomp_assign_mode(thread, SECCOMP_MODE_FILTER,
     428                 :            :                                             flags);
     429                 :            :         }
     430                 :          0 : }
     431                 :            : 
     432                 :            : /**
     433                 :            :  * seccomp_prepare_filter: Prepares a seccomp filter for use.
     434                 :            :  * @fprog: BPF program to install
     435                 :            :  *
     436                 :            :  * Returns filter on success or an ERR_PTR on failure.
     437                 :            :  */
     438                 :       6009 : static struct seccomp_filter *seccomp_prepare_filter(struct sock_fprog *fprog)
     439                 :            : {
     440                 :            :         struct seccomp_filter *sfilter;
     441                 :            :         int ret;
     442                 :            :         const bool save_orig = IS_ENABLED(CONFIG_CHECKPOINT_RESTORE);
     443                 :            : 
     444         [ +  - ]:       6009 :         if (fprog->len == 0 || fprog->len > BPF_MAXINSNS)
     445                 :            :                 return ERR_PTR(-EINVAL);
     446                 :            : 
     447         [ -  + ]:       6009 :         BUG_ON(INT_MAX / fprog->len < sizeof(struct sock_filter));
     448                 :            : 
     449                 :            :         /*
     450                 :            :          * Installing a seccomp filter requires that the task has
     451                 :            :          * CAP_SYS_ADMIN in its namespace or be running with no_new_privs.
     452                 :            :          * This avoids scenarios where unprivileged tasks can affect the
     453                 :            :          * behavior of privileged children.
     454                 :            :          */
     455   [ +  +  +  - ]:      13059 :         if (!task_no_new_privs(current) &&
     456                 :       1041 :             security_capable(current_cred(), current_user_ns(),
     457                 :            :                                      CAP_SYS_ADMIN, CAP_OPT_NOAUDIT) != 0)
     458                 :            :                 return ERR_PTR(-EACCES);
     459                 :            : 
     460                 :            :         /* Allocate a new seccomp_filter */
     461                 :       6009 :         sfilter = kzalloc(sizeof(*sfilter), GFP_KERNEL | __GFP_NOWARN);
     462         [ +  - ]:       6009 :         if (!sfilter)
     463                 :            :                 return ERR_PTR(-ENOMEM);
     464                 :            : 
     465                 :       6009 :         mutex_init(&sfilter->notify_lock);
     466                 :       6009 :         ret = bpf_prog_create_from_user(&sfilter->prog, fprog,
     467                 :            :                                         seccomp_check_filter, save_orig);
     468         [ -  + ]:       6009 :         if (ret < 0) {
     469                 :          0 :                 kfree(sfilter);
     470                 :          0 :                 return ERR_PTR(ret);
     471                 :            :         }
     472                 :            : 
     473                 :            :         refcount_set(&sfilter->usage, 1);
     474                 :            : 
     475                 :       6009 :         return sfilter;
     476                 :            : }
     477                 :            : 
     478                 :            : /**
     479                 :            :  * seccomp_prepare_user_filter - prepares a user-supplied sock_fprog
     480                 :            :  * @user_filter: pointer to the user data containing a sock_fprog.
     481                 :            :  *
     482                 :            :  * Returns 0 on success and non-zero otherwise.
     483                 :            :  */
     484                 :            : static struct seccomp_filter *
     485                 :       6839 : seccomp_prepare_user_filter(const char __user *user_filter)
     486                 :            : {
     487                 :            :         struct sock_fprog fprog;
     488                 :            :         struct seccomp_filter *filter = ERR_PTR(-EFAULT);
     489                 :            : 
     490                 :            : #ifdef CONFIG_COMPAT
     491                 :            :         if (in_compat_syscall()) {
     492                 :            :                 struct compat_sock_fprog fprog32;
     493                 :            :                 if (copy_from_user(&fprog32, user_filter, sizeof(fprog32)))
     494                 :            :                         goto out;
     495                 :            :                 fprog.len = fprog32.len;
     496                 :            :                 fprog.filter = compat_ptr(fprog32.filter);
     497                 :            :         } else /* falls through to the if below. */
     498                 :            : #endif
     499         [ +  + ]:       6839 :         if (copy_from_user(&fprog, user_filter, sizeof(fprog)))
     500                 :            :                 goto out;
     501                 :       6009 :         filter = seccomp_prepare_filter(&fprog);
     502                 :            : out:
     503                 :       6839 :         return filter;
     504                 :            : }
     505                 :            : 
     506                 :            : /**
     507                 :            :  * seccomp_attach_filter: validate and attach filter
     508                 :            :  * @flags:  flags to change filter behavior
     509                 :            :  * @filter: seccomp filter to add to the current process
     510                 :            :  *
     511                 :            :  * Caller must be holding current->sighand->siglock lock.
     512                 :            :  *
     513                 :            :  * Returns 0 on success, -ve on error, or
     514                 :            :  *   - in TSYNC mode: the pid of a thread which was either not in the correct
     515                 :            :  *     seccomp mode or did not have an ancestral seccomp filter
     516                 :            :  *   - in NEW_LISTENER mode: the fd of the new listener
     517                 :            :  */
     518                 :       6009 : static long seccomp_attach_filter(unsigned int flags,
     519                 :            :                                   struct seccomp_filter *filter)
     520                 :            : {
     521                 :            :         unsigned long total_insns;
     522                 :            :         struct seccomp_filter *walker;
     523                 :            : 
     524         [ -  + ]:      12018 :         assert_spin_locked(&current->sighand->siglock);
     525                 :            : 
     526                 :            :         /* Validate resulting filter length. */
     527                 :       6009 :         total_insns = filter->prog->len;
     528         [ +  + ]:      26094 :         for (walker = current->seccomp.filter; walker; walker = walker->prev)
     529                 :      20085 :                 total_insns += walker->prog->len + 4;  /* 4 instr penalty */
     530         [ +  - ]:       6009 :         if (total_insns > MAX_INSNS_PER_PATH)
     531                 :            :                 return -ENOMEM;
     532                 :            : 
     533                 :            :         /* If thread sync has been requested, check that it is possible. */
     534         [ -  + ]:       6009 :         if (flags & SECCOMP_FILTER_FLAG_TSYNC) {
     535                 :            :                 int ret;
     536                 :            : 
     537                 :          0 :                 ret = seccomp_can_sync_threads();
     538         [ #  # ]:          0 :                 if (ret)
     539                 :            :                         return ret;
     540                 :            :         }
     541                 :            : 
     542                 :            :         /* Set log flag, if present. */
     543         [ -  + ]:       6009 :         if (flags & SECCOMP_FILTER_FLAG_LOG)
     544                 :          0 :                 filter->log = true;
     545                 :            : 
     546                 :            :         /*
     547                 :            :          * If there is an existing filter, make it the prev and don't drop its
     548                 :            :          * task reference.
     549                 :            :          */
     550                 :       6009 :         filter->prev = current->seccomp.filter;
     551                 :       6009 :         current->seccomp.filter = filter;
     552                 :            : 
     553                 :            :         /* Now that the new filter is in place, synchronize to all threads. */
     554         [ -  + ]:       6009 :         if (flags & SECCOMP_FILTER_FLAG_TSYNC)
     555                 :          0 :                 seccomp_sync_threads(flags);
     556                 :            : 
     557                 :            :         return 0;
     558                 :            : }
     559                 :            : 
     560                 :            : static void __get_seccomp_filter(struct seccomp_filter *filter)
     561                 :            : {
     562                 :      15818 :         refcount_inc(&filter->usage);
     563                 :            : }
     564                 :            : 
     565                 :            : /* get_seccomp_filter - increments the reference count of the filter on @tsk */
     566                 :     268173 : void get_seccomp_filter(struct task_struct *tsk)
     567                 :            : {
     568                 :     268173 :         struct seccomp_filter *orig = tsk->seccomp.filter;
     569   [ +  +  #  # ]:     268173 :         if (!orig)
     570                 :     268173 :                 return;
     571                 :            :         __get_seccomp_filter(orig);
     572                 :            : }
     573                 :            : 
     574                 :       6015 : static inline void seccomp_filter_free(struct seccomp_filter *filter)
     575                 :            : {
     576         [ +  + ]:       6015 :         if (filter) {
     577                 :          6 :                 bpf_prog_destroy(filter->prog);
     578                 :          6 :                 kfree(filter);
     579                 :            :         }
     580                 :       6015 : }
     581                 :            : 
     582                 :     228474 : static void __put_seccomp_filter(struct seccomp_filter *orig)
     583                 :            : {
     584                 :            :         /* Clean up single-reference branches iteratively. */
     585   [ +  +  +  + ]:     456934 :         while (orig && refcount_dec_and_test(&orig->usage)) {
     586                 :            :                 struct seccomp_filter *freeme = orig;
     587                 :          6 :                 orig = orig->prev;
     588                 :          6 :                 seccomp_filter_free(freeme);
     589                 :            :         }
     590                 :     228454 : }
     591                 :            : 
     592                 :            : /* put_seccomp_filter - decrements the ref count of tsk->seccomp.filter */
     593                 :     227749 : void put_seccomp_filter(struct task_struct *tsk)
     594                 :            : {
     595                 :     227749 :         __put_seccomp_filter(tsk->seccomp.filter);
     596                 :     227840 : }
     597                 :            : 
     598                 :          0 : static void seccomp_init_siginfo(kernel_siginfo_t *info, int syscall, int reason)
     599                 :            : {
     600                 :            :         clear_siginfo(info);
     601                 :          0 :         info->si_signo = SIGSYS;
     602                 :          0 :         info->si_code = SYS_SECCOMP;
     603                 :          0 :         info->si_call_addr = (void __user *)KSTK_EIP(current);
     604                 :          0 :         info->si_errno = reason;
     605                 :          0 :         info->si_arch = syscall_get_arch(current);
     606                 :          0 :         info->si_syscall = syscall;
     607                 :          0 : }
     608                 :            : 
     609                 :            : /**
     610                 :            :  * seccomp_send_sigsys - signals the task to allow in-process syscall emulation
     611                 :            :  * @syscall: syscall number to send to userland
     612                 :            :  * @reason: filter-supplied reason code to send to userland (via si_errno)
     613                 :            :  *
     614                 :            :  * Forces a SIGSYS with a code of SYS_SECCOMP and related sigsys info.
     615                 :            :  */
     616                 :            : static void seccomp_send_sigsys(int syscall, int reason)
     617                 :            : {
     618                 :            :         struct kernel_siginfo info;
     619                 :          0 :         seccomp_init_siginfo(&info, syscall, reason);
     620                 :          0 :         force_sig_info(&info);
     621                 :            : }
     622                 :            : #endif  /* CONFIG_SECCOMP_FILTER */
     623                 :            : 
     624                 :            : /* For use with seccomp_actions_logged */
     625                 :            : #define SECCOMP_LOG_KILL_PROCESS        (1 << 0)
     626                 :            : #define SECCOMP_LOG_KILL_THREAD         (1 << 1)
     627                 :            : #define SECCOMP_LOG_TRAP                (1 << 2)
     628                 :            : #define SECCOMP_LOG_ERRNO               (1 << 3)
     629                 :            : #define SECCOMP_LOG_TRACE               (1 << 4)
     630                 :            : #define SECCOMP_LOG_LOG                 (1 << 5)
     631                 :            : #define SECCOMP_LOG_ALLOW               (1 << 6)
     632                 :            : #define SECCOMP_LOG_USER_NOTIF          (1 << 7)
     633                 :            : 
     634                 :            : static u32 seccomp_actions_logged = SECCOMP_LOG_KILL_PROCESS |
     635                 :            :                                     SECCOMP_LOG_KILL_THREAD  |
     636                 :            :                                     SECCOMP_LOG_TRAP  |
     637                 :            :                                     SECCOMP_LOG_ERRNO |
     638                 :            :                                     SECCOMP_LOG_USER_NOTIF |
     639                 :            :                                     SECCOMP_LOG_TRACE |
     640                 :            :                                     SECCOMP_LOG_LOG;
     641                 :            : 
     642                 :       2277 : static inline void seccomp_log(unsigned long syscall, long signr, u32 action,
     643                 :            :                                bool requested)
     644                 :            : {
     645                 :            :         bool log = false;
     646                 :            : 
     647   [ -  +  -  -  :       2277 :         switch (action) {
             -  -  -  - ]
     648                 :            :         case SECCOMP_RET_ALLOW:
     649                 :            :                 break;
     650                 :            :         case SECCOMP_RET_TRAP:
     651   [ #  #  #  # ]:          0 :                 log = requested && seccomp_actions_logged & SECCOMP_LOG_TRAP;
     652                 :          0 :                 break;
     653                 :            :         case SECCOMP_RET_ERRNO:
     654   [ -  +  #  # ]:       2277 :                 log = requested && seccomp_actions_logged & SECCOMP_LOG_ERRNO;
     655                 :       2277 :                 break;
     656                 :            :         case SECCOMP_RET_TRACE:
     657   [ #  #  #  # ]:          0 :                 log = requested && seccomp_actions_logged & SECCOMP_LOG_TRACE;
     658                 :          0 :                 break;
     659                 :            :         case SECCOMP_RET_USER_NOTIF:
     660   [ #  #  #  # ]:          0 :                 log = requested && seccomp_actions_logged & SECCOMP_LOG_USER_NOTIF;
     661                 :          0 :                 break;
     662                 :            :         case SECCOMP_RET_LOG:
     663                 :          0 :                 log = seccomp_actions_logged & SECCOMP_LOG_LOG;
     664                 :          0 :                 break;
     665                 :            :         case SECCOMP_RET_KILL_THREAD:
     666                 :          0 :                 log = seccomp_actions_logged & SECCOMP_LOG_KILL_THREAD;
     667                 :          0 :                 break;
     668                 :            :         case SECCOMP_RET_KILL_PROCESS:
     669                 :            :         default:
     670                 :          0 :                 log = seccomp_actions_logged & SECCOMP_LOG_KILL_PROCESS;
     671                 :            :         }
     672                 :            : 
     673                 :            :         /*
     674                 :            :          * Emit an audit message when the action is RET_KILL_*, RET_LOG, or the
     675                 :            :          * FILTER_FLAG_LOG bit was set. The admin has the ability to silence
     676                 :            :          * any action from being logged by removing the action name from the
     677                 :            :          * seccomp_actions_logged sysctl.
     678                 :            :          */
     679         [ -  + ]:       2277 :         if (!log)
     680                 :       2277 :                 return;
     681                 :            : 
     682                 :          0 :         audit_seccomp(syscall, signr, action);
     683                 :            : }
     684                 :            : 
     685                 :            : /*
     686                 :            :  * Secure computing mode 1 allows only read/write/exit/sigreturn.
     687                 :            :  * To be fully secure this must be combined with rlimit
     688                 :            :  * to limit the stack allocations too.
     689                 :            :  */
     690                 :            : static const int mode1_syscalls[] = {
     691                 :            :         __NR_seccomp_read, __NR_seccomp_write, __NR_seccomp_exit, __NR_seccomp_sigreturn,
     692                 :            :         0, /* null terminated */
     693                 :            : };
     694                 :            : 
     695                 :          0 : static void __secure_computing_strict(int this_syscall)
     696                 :            : {
     697                 :            :         const int *syscall_whitelist = mode1_syscalls;
     698                 :            : #ifdef CONFIG_COMPAT
     699                 :            :         if (in_compat_syscall())
     700                 :            :                 syscall_whitelist = get_compat_mode1_syscalls();
     701                 :            : #endif
     702                 :            :         do {
     703         [ #  # ]:          0 :                 if (*syscall_whitelist == this_syscall)
     704                 :          0 :                         return;
     705         [ #  # ]:          0 :         } while (*++syscall_whitelist);
     706                 :            : 
     707                 :            : #ifdef SECCOMP_DEBUG
     708                 :            :         dump_stack();
     709                 :            : #endif
     710                 :          0 :         seccomp_log(this_syscall, SIGKILL, SECCOMP_RET_KILL_THREAD, true);
     711                 :          0 :         do_exit(SIGKILL);
     712                 :            : }
     713                 :            : 
     714                 :            : #ifndef CONFIG_HAVE_ARCH_SECCOMP_FILTER
     715                 :            : void secure_computing_strict(int this_syscall)
     716                 :            : {
     717                 :            :         int mode = current->seccomp.mode;
     718                 :            : 
     719                 :            :         if (IS_ENABLED(CONFIG_CHECKPOINT_RESTORE) &&
     720                 :            :             unlikely(current->ptrace & PT_SUSPEND_SECCOMP))
     721                 :            :                 return;
     722                 :            : 
     723                 :            :         if (mode == SECCOMP_MODE_DISABLED)
     724                 :            :                 return;
     725                 :            :         else if (mode == SECCOMP_MODE_STRICT)
     726                 :            :                 __secure_computing_strict(this_syscall);
     727                 :            :         else
     728                 :            :                 BUG();
     729                 :            : }
     730                 :            : #else
     731                 :            : 
     732                 :            : #ifdef CONFIG_SECCOMP_FILTER
     733                 :            : static u64 seccomp_next_notify_id(struct seccomp_filter *filter)
     734                 :            : {
     735                 :            :         /*
     736                 :            :          * Note: overflow is ok here, the id just needs to be unique per
     737                 :            :          * filter.
     738                 :            :          */
     739                 :            :         lockdep_assert_held(&filter->notify_lock);
     740                 :          0 :         return filter->notif->next_id++;
     741                 :            : }
     742                 :            : 
     743                 :          0 : static void seccomp_do_user_notification(int this_syscall,
     744                 :            :                                          struct seccomp_filter *match,
     745                 :            :                                          const struct seccomp_data *sd)
     746                 :            : {
     747                 :            :         int err;
     748                 :            :         long ret = 0;
     749                 :          0 :         struct seccomp_knotif n = {};
     750                 :            : 
     751                 :          0 :         mutex_lock(&match->notify_lock);
     752                 :            :         err = -ENOSYS;
     753         [ #  # ]:          0 :         if (!match->notif)
     754                 :            :                 goto out;
     755                 :            : 
     756                 :          0 :         n.task = current;
     757                 :          0 :         n.state = SECCOMP_NOTIFY_INIT;
     758                 :          0 :         n.data = sd;
     759                 :          0 :         n.id = seccomp_next_notify_id(match);
     760                 :            :         init_completion(&n.ready);
     761                 :          0 :         list_add(&n.list, &match->notif->notifications);
     762                 :            : 
     763                 :          0 :         up(&match->notif->request);
     764                 :          0 :         wake_up_poll(&match->notif->wqh, EPOLLIN | EPOLLRDNORM);
     765                 :          0 :         mutex_unlock(&match->notify_lock);
     766                 :            : 
     767                 :            :         /*
     768                 :            :          * This is where we wait for a reply from userspace.
     769                 :            :          */
     770                 :          0 :         err = wait_for_completion_interruptible(&n.ready);
     771                 :          0 :         mutex_lock(&match->notify_lock);
     772         [ #  # ]:          0 :         if (err == 0) {
     773                 :          0 :                 ret = n.val;
     774                 :          0 :                 err = n.error;
     775                 :            :         }
     776                 :            : 
     777                 :            :         /*
     778                 :            :          * Note that it's possible the listener died in between the time when
     779                 :            :          * we were notified of a respons (or a signal) and when we were able to
     780                 :            :          * re-acquire the lock, so only delete from the list if the
     781                 :            :          * notification actually exists.
     782                 :            :          *
     783                 :            :          * Also note that this test is only valid because there's no way to
     784                 :            :          * *reattach* to a notifier right now. If one is added, we'll need to
     785                 :            :          * keep track of the notif itself and make sure they match here.
     786                 :            :          */
     787         [ #  # ]:          0 :         if (match->notif)
     788                 :            :                 list_del(&n.list);
     789                 :            : out:
     790                 :          0 :         mutex_unlock(&match->notify_lock);
     791                 :          0 :         syscall_set_return_value(current, task_pt_regs(current),
     792                 :            :                                  err, ret);
     793                 :          0 : }
     794                 :            : 
     795                 :   20058663 : static int __seccomp_filter(int this_syscall, const struct seccomp_data *sd,
     796                 :            :                             const bool recheck_after_trace)
     797                 :            : {
     798                 :            :         u32 filter_ret, action;
     799                 :   20058663 :         struct seccomp_filter *match = NULL;
     800                 :            :         int data;
     801                 :            :         struct seccomp_data sd_local;
     802                 :            : 
     803                 :            :         /*
     804                 :            :          * Make sure that any changes to mode from another thread have
     805                 :            :          * been seen after TIF_SECCOMP was seen.
     806                 :            :          */
     807                 :   20058663 :         rmb();
     808                 :            : 
     809         [ +  + ]:   20050990 :         if (!sd) {
     810                 :   20055942 :                 populate_seccomp_data(&sd_local);
     811                 :            :                 sd = &sd_local;
     812                 :            :         }
     813                 :            : 
     814                 :   20042843 :         filter_ret = seccomp_run_filters(sd, &match);
     815                 :   20072624 :         data = filter_ret & SECCOMP_RET_DATA;
     816                 :   20072624 :         action = filter_ret & SECCOMP_RET_ACTION_FULL;
     817                 :            : 
     818   [ +  -  -  -  :   20072624 :         switch (action) {
                -  -  + ]
     819                 :            :         case SECCOMP_RET_ERRNO:
     820                 :            :                 /* Set low-order bits as an errno, capped at MAX_ERRNO. */
     821         [ -  + ]:       2277 :                 if (data > MAX_ERRNO)
     822                 :            :                         data = MAX_ERRNO;
     823                 :       2277 :                 syscall_set_return_value(current, task_pt_regs(current),
     824                 :            :                                          -data, 0);
     825                 :            :                 goto skip;
     826                 :            : 
     827                 :            :         case SECCOMP_RET_TRAP:
     828                 :            :                 /* Show the handler the original registers. */
     829                 :          0 :                 syscall_rollback(current, task_pt_regs(current));
     830                 :            :                 /* Let the filter pass back 16 bits of data. */
     831                 :            :                 seccomp_send_sigsys(this_syscall, data);
     832                 :            :                 goto skip;
     833                 :            : 
     834                 :            :         case SECCOMP_RET_TRACE:
     835                 :            :                 /* We've been put in this state by the ptracer already. */
     836         [ #  # ]:          0 :                 if (recheck_after_trace)
     837                 :            :                         return 0;
     838                 :            : 
     839                 :            :                 /* ENOSYS these calls if there is no tracer attached. */
     840         [ #  # ]:          0 :                 if (!ptrace_event_enabled(current, PTRACE_EVENT_SECCOMP)) {
     841                 :            :                         syscall_set_return_value(current,
     842                 :          0 :                                                  task_pt_regs(current),
     843                 :            :                                                  -ENOSYS, 0);
     844                 :            :                         goto skip;
     845                 :            :                 }
     846                 :            : 
     847                 :            :                 /* Allow the BPF to provide the event message */
     848                 :          0 :                 ptrace_event(PTRACE_EVENT_SECCOMP, data);
     849                 :            :                 /*
     850                 :            :                  * The delivery of a fatal signal during event
     851                 :            :                  * notification may silently skip tracer notification,
     852                 :            :                  * which could leave us with a potentially unmodified
     853                 :            :                  * syscall that the tracer would have liked to have
     854                 :            :                  * changed. Since the process is about to die, we just
     855                 :            :                  * force the syscall to be skipped and let the signal
     856                 :            :                  * kill the process and correctly handle any tracer exit
     857                 :            :                  * notifications.
     858                 :            :                  */
     859         [ #  # ]:          0 :                 if (fatal_signal_pending(current))
     860                 :            :                         goto skip;
     861                 :            :                 /* Check if the tracer forced the syscall to be skipped. */
     862                 :            :                 this_syscall = syscall_get_nr(current, task_pt_regs(current));
     863         [ #  # ]:          0 :                 if (this_syscall < 0)
     864                 :            :                         goto skip;
     865                 :            : 
     866                 :            :                 /*
     867                 :            :                  * Recheck the syscall, since it may have changed. This
     868                 :            :                  * intentionally uses a NULL struct seccomp_data to force
     869                 :            :                  * a reload of all registers. This does not goto skip since
     870                 :            :                  * a skip would have already been reported.
     871                 :            :                  */
     872         [ #  # ]:          0 :                 if (__seccomp_filter(this_syscall, NULL, true))
     873                 :            :                         return -1;
     874                 :            : 
     875                 :          0 :                 return 0;
     876                 :            : 
     877                 :            :         case SECCOMP_RET_USER_NOTIF:
     878                 :          0 :                 seccomp_do_user_notification(this_syscall, match, sd);
     879                 :          0 :                 goto skip;
     880                 :            : 
     881                 :            :         case SECCOMP_RET_LOG:
     882                 :          0 :                 seccomp_log(this_syscall, 0, action, true);
     883                 :          0 :                 return 0;
     884                 :            : 
     885                 :            :         case SECCOMP_RET_ALLOW:
     886                 :            :                 /*
     887                 :            :                  * Note that the "match" filter will always be NULL for
     888                 :            :                  * this action since SECCOMP_RET_ALLOW is the starting
     889                 :            :                  * state in seccomp_run_filters().
     890                 :            :                  */
     891                 :            :                 return 0;
     892                 :            : 
     893                 :            :         case SECCOMP_RET_KILL_THREAD:
     894                 :            :         case SECCOMP_RET_KILL_PROCESS:
     895                 :            :         default:
     896                 :          0 :                 seccomp_log(this_syscall, SIGSYS, action, true);
     897                 :            :                 /* Dump core only if this is the last remaining thread. */
     898   [ #  #  #  # ]:          0 :                 if (action == SECCOMP_RET_KILL_PROCESS ||
     899                 :          0 :                     get_nr_threads(current) == 1) {
     900                 :            :                         kernel_siginfo_t info;
     901                 :            : 
     902                 :            :                         /* Show the original registers in the dump. */
     903                 :          0 :                         syscall_rollback(current, task_pt_regs(current));
     904                 :            :                         /* Trigger a manual coredump since do_exit skips it. */
     905                 :          0 :                         seccomp_init_siginfo(&info, this_syscall, data);
     906                 :          0 :                         do_coredump(&info);
     907                 :            :                 }
     908         [ #  # ]:          0 :                 if (action == SECCOMP_RET_KILL_PROCESS)
     909                 :          0 :                         do_group_exit(SIGSYS);
     910                 :            :                 else
     911                 :          0 :                         do_exit(SIGSYS);
     912                 :            :         }
     913                 :            : 
     914                 :          0 :         unreachable();
     915                 :            : 
     916                 :            : skip:
     917   [ +  -  +  - ]:       2277 :         seccomp_log(this_syscall, 0, action, match ? match->log : false);
     918                 :       2277 :         return -1;
     919                 :            : }
     920                 :            : #else
     921                 :            : static int __seccomp_filter(int this_syscall, const struct seccomp_data *sd,
     922                 :            :                             const bool recheck_after_trace)
     923                 :            : {
     924                 :            :         BUG();
     925                 :            : }
     926                 :            : #endif
     927                 :            : 
     928                 :   20058555 : int __secure_computing(const struct seccomp_data *sd)
     929                 :            : {
     930                 :   20058555 :         int mode = current->seccomp.mode;
     931                 :            :         int this_syscall;
     932                 :            : 
     933                 :            :         if (IS_ENABLED(CONFIG_CHECKPOINT_RESTORE) &&
     934                 :            :             unlikely(current->ptrace & PT_SUSPEND_SECCOMP))
     935                 :            :                 return 0;
     936                 :            : 
     937         [ +  + ]:   20058555 :         this_syscall = sd ? sd->nr :
     938                 :            :                 syscall_get_nr(current, task_pt_regs(current));
     939                 :            : 
     940      [ -  +  - ]:   20058555 :         switch (mode) {
     941                 :            :         case SECCOMP_MODE_STRICT:
     942                 :          0 :                 __secure_computing_strict(this_syscall);  /* may call do_exit */
     943                 :          0 :                 return 0;
     944                 :            :         case SECCOMP_MODE_FILTER:
     945                 :   20058555 :                 return __seccomp_filter(this_syscall, sd, false);
     946                 :            :         default:
     947                 :          0 :                 BUG();
     948                 :            :         }
     949                 :            : }
     950                 :            : #endif /* CONFIG_HAVE_ARCH_SECCOMP_FILTER */
     951                 :            : 
     952                 :        830 : long prctl_get_seccomp(void)
     953                 :            : {
     954                 :        830 :         return current->seccomp.mode;
     955                 :            : }
     956                 :            : 
     957                 :            : /**
     958                 :            :  * seccomp_set_mode_strict: internal function for setting strict seccomp
     959                 :            :  *
     960                 :            :  * Once current->seccomp.mode is non-zero, it may not be changed.
     961                 :            :  *
     962                 :            :  * Returns 0 on success or -EINVAL on failure.
     963                 :            :  */
     964                 :          0 : static long seccomp_set_mode_strict(void)
     965                 :            : {
     966                 :            :         const unsigned long seccomp_mode = SECCOMP_MODE_STRICT;
     967                 :            :         long ret = -EINVAL;
     968                 :            : 
     969                 :          0 :         spin_lock_irq(&current->sighand->siglock);
     970                 :            : 
     971         [ #  # ]:          0 :         if (!seccomp_may_assign_mode(seccomp_mode))
     972                 :            :                 goto out;
     973                 :            : 
     974                 :            : #ifdef TIF_NOTSC
     975                 :            :         disable_TSC();
     976                 :            : #endif
     977                 :          0 :         seccomp_assign_mode(current, seccomp_mode, 0);
     978                 :            :         ret = 0;
     979                 :            : 
     980                 :            : out:
     981                 :          0 :         spin_unlock_irq(&current->sighand->siglock);
     982                 :            : 
     983                 :          0 :         return ret;
     984                 :            : }
     985                 :            : 
     986                 :            : #ifdef CONFIG_SECCOMP_FILTER
     987                 :          0 : static int seccomp_notify_release(struct inode *inode, struct file *file)
     988                 :            : {
     989                 :          0 :         struct seccomp_filter *filter = file->private_data;
     990                 :            :         struct seccomp_knotif *knotif;
     991                 :            : 
     992         [ #  # ]:          0 :         if (!filter)
     993                 :            :                 return 0;
     994                 :            : 
     995                 :          0 :         mutex_lock(&filter->notify_lock);
     996                 :            : 
     997                 :            :         /*
     998                 :            :          * If this file is being closed because e.g. the task who owned it
     999                 :            :          * died, let's wake everyone up who was waiting on us.
    1000                 :            :          */
    1001         [ #  # ]:          0 :         list_for_each_entry(knotif, &filter->notif->notifications, list) {
    1002         [ #  # ]:          0 :                 if (knotif->state == SECCOMP_NOTIFY_REPLIED)
    1003                 :          0 :                         continue;
    1004                 :            : 
    1005                 :          0 :                 knotif->state = SECCOMP_NOTIFY_REPLIED;
    1006                 :          0 :                 knotif->error = -ENOSYS;
    1007                 :          0 :                 knotif->val = 0;
    1008                 :            : 
    1009                 :          0 :                 complete(&knotif->ready);
    1010                 :            :         }
    1011                 :            : 
    1012                 :          0 :         kfree(filter->notif);
    1013                 :          0 :         filter->notif = NULL;
    1014                 :          0 :         mutex_unlock(&filter->notify_lock);
    1015                 :          0 :         __put_seccomp_filter(filter);
    1016                 :          0 :         return 0;
    1017                 :            : }
    1018                 :            : 
    1019                 :          0 : static long seccomp_notify_recv(struct seccomp_filter *filter,
    1020                 :            :                                 void __user *buf)
    1021                 :            : {
    1022                 :            :         struct seccomp_knotif *knotif = NULL, *cur;
    1023                 :            :         struct seccomp_notif unotif;
    1024                 :            :         ssize_t ret;
    1025                 :            : 
    1026                 :            :         /* Verify that we're not given garbage to keep struct extensible. */
    1027                 :          0 :         ret = check_zeroed_user(buf, sizeof(unotif));
    1028         [ #  # ]:          0 :         if (ret < 0)
    1029                 :            :                 return ret;
    1030         [ #  # ]:          0 :         if (!ret)
    1031                 :            :                 return -EINVAL;
    1032                 :            : 
    1033                 :          0 :         memset(&unotif, 0, sizeof(unotif));
    1034                 :            : 
    1035                 :          0 :         ret = down_interruptible(&filter->notif->request);
    1036         [ #  # ]:          0 :         if (ret < 0)
    1037                 :            :                 return ret;
    1038                 :            : 
    1039                 :          0 :         mutex_lock(&filter->notify_lock);
    1040         [ #  # ]:          0 :         list_for_each_entry(cur, &filter->notif->notifications, list) {
    1041         [ #  # ]:          0 :                 if (cur->state == SECCOMP_NOTIFY_INIT) {
    1042                 :          0 :                         knotif = cur;
    1043                 :          0 :                         break;
    1044                 :            :                 }
    1045                 :            :         }
    1046                 :            : 
    1047                 :            :         /*
    1048                 :            :          * If we didn't find a notification, it could be that the task was
    1049                 :            :          * interrupted by a fatal signal between the time we were woken and
    1050                 :            :          * when we were able to acquire the rw lock.
    1051                 :            :          */
    1052         [ #  # ]:          0 :         if (!knotif) {
    1053                 :            :                 ret = -ENOENT;
    1054                 :            :                 goto out;
    1055                 :            :         }
    1056                 :            : 
    1057                 :          0 :         unotif.id = knotif->id;
    1058                 :          0 :         unotif.pid = task_pid_vnr(knotif->task);
    1059                 :          0 :         unotif.data = *(knotif->data);
    1060                 :            : 
    1061                 :          0 :         knotif->state = SECCOMP_NOTIFY_SENT;
    1062                 :          0 :         wake_up_poll(&filter->notif->wqh, EPOLLOUT | EPOLLWRNORM);
    1063                 :            :         ret = 0;
    1064                 :            : out:
    1065                 :          0 :         mutex_unlock(&filter->notify_lock);
    1066                 :            : 
    1067   [ #  #  #  # ]:          0 :         if (ret == 0 && copy_to_user(buf, &unotif, sizeof(unotif))) {
    1068                 :            :                 ret = -EFAULT;
    1069                 :            : 
    1070                 :            :                 /*
    1071                 :            :                  * Userspace screwed up. To make sure that we keep this
    1072                 :            :                  * notification alive, let's reset it back to INIT. It
    1073                 :            :                  * may have died when we released the lock, so we need to make
    1074                 :            :                  * sure it's still around.
    1075                 :            :                  */
    1076                 :            :                 knotif = NULL;
    1077                 :          0 :                 mutex_lock(&filter->notify_lock);
    1078         [ #  # ]:          0 :                 list_for_each_entry(cur, &filter->notif->notifications, list) {
    1079         [ #  # ]:          0 :                         if (cur->id == unotif.id) {
    1080                 :          0 :                                 knotif = cur;
    1081                 :          0 :                                 break;
    1082                 :            :                         }
    1083                 :            :                 }
    1084                 :            : 
    1085         [ #  # ]:          0 :                 if (knotif) {
    1086                 :          0 :                         knotif->state = SECCOMP_NOTIFY_INIT;
    1087                 :          0 :                         up(&filter->notif->request);
    1088                 :            :                 }
    1089                 :          0 :                 mutex_unlock(&filter->notify_lock);
    1090                 :            :         }
    1091                 :            : 
    1092                 :          0 :         return ret;
    1093                 :            : }
    1094                 :            : 
    1095                 :          0 : static long seccomp_notify_send(struct seccomp_filter *filter,
    1096                 :            :                                 void __user *buf)
    1097                 :            : {
    1098                 :          0 :         struct seccomp_notif_resp resp = {};
    1099                 :            :         struct seccomp_knotif *knotif = NULL, *cur;
    1100                 :            :         long ret;
    1101                 :            : 
    1102         [ #  # ]:          0 :         if (copy_from_user(&resp, buf, sizeof(resp)))
    1103                 :            :                 return -EFAULT;
    1104                 :            : 
    1105         [ #  # ]:          0 :         if (resp.flags)
    1106                 :            :                 return -EINVAL;
    1107                 :            : 
    1108                 :          0 :         ret = mutex_lock_interruptible(&filter->notify_lock);
    1109         [ #  # ]:          0 :         if (ret < 0)
    1110                 :            :                 return ret;
    1111                 :            : 
    1112         [ #  # ]:          0 :         list_for_each_entry(cur, &filter->notif->notifications, list) {
    1113         [ #  # ]:          0 :                 if (cur->id == resp.id) {
    1114                 :          0 :                         knotif = cur;
    1115                 :          0 :                         break;
    1116                 :            :                 }
    1117                 :            :         }
    1118                 :            : 
    1119         [ #  # ]:          0 :         if (!knotif) {
    1120                 :            :                 ret = -ENOENT;
    1121                 :            :                 goto out;
    1122                 :            :         }
    1123                 :            : 
    1124                 :            :         /* Allow exactly one reply. */
    1125         [ #  # ]:          0 :         if (knotif->state != SECCOMP_NOTIFY_SENT) {
    1126                 :            :                 ret = -EINPROGRESS;
    1127                 :            :                 goto out;
    1128                 :            :         }
    1129                 :            : 
    1130                 :            :         ret = 0;
    1131                 :          0 :         knotif->state = SECCOMP_NOTIFY_REPLIED;
    1132                 :          0 :         knotif->error = resp.error;
    1133                 :          0 :         knotif->val = resp.val;
    1134                 :          0 :         complete(&knotif->ready);
    1135                 :            : out:
    1136                 :          0 :         mutex_unlock(&filter->notify_lock);
    1137                 :          0 :         return ret;
    1138                 :            : }
    1139                 :            : 
    1140                 :          0 : static long seccomp_notify_id_valid(struct seccomp_filter *filter,
    1141                 :            :                                     void __user *buf)
    1142                 :            : {
    1143                 :            :         struct seccomp_knotif *knotif = NULL;
    1144                 :            :         u64 id;
    1145                 :            :         long ret;
    1146                 :            : 
    1147         [ #  # ]:          0 :         if (copy_from_user(&id, buf, sizeof(id)))
    1148                 :            :                 return -EFAULT;
    1149                 :            : 
    1150                 :          0 :         ret = mutex_lock_interruptible(&filter->notify_lock);
    1151         [ #  # ]:          0 :         if (ret < 0)
    1152                 :            :                 return ret;
    1153                 :            : 
    1154                 :            :         ret = -ENOENT;
    1155         [ #  # ]:          0 :         list_for_each_entry(knotif, &filter->notif->notifications, list) {
    1156         [ #  # ]:          0 :                 if (knotif->id == id) {
    1157         [ #  # ]:          0 :                         if (knotif->state == SECCOMP_NOTIFY_SENT)
    1158                 :            :                                 ret = 0;
    1159                 :            :                         goto out;
    1160                 :            :                 }
    1161                 :            :         }
    1162                 :            : 
    1163                 :            : out:
    1164                 :          0 :         mutex_unlock(&filter->notify_lock);
    1165                 :          0 :         return ret;
    1166                 :            : }
    1167                 :            : 
    1168                 :          0 : static long seccomp_notify_ioctl(struct file *file, unsigned int cmd,
    1169                 :            :                                  unsigned long arg)
    1170                 :            : {
    1171                 :          0 :         struct seccomp_filter *filter = file->private_data;
    1172                 :          0 :         void __user *buf = (void __user *)arg;
    1173                 :            : 
    1174   [ #  #  #  # ]:          0 :         switch (cmd) {
    1175                 :            :         case SECCOMP_IOCTL_NOTIF_RECV:
    1176                 :          0 :                 return seccomp_notify_recv(filter, buf);
    1177                 :            :         case SECCOMP_IOCTL_NOTIF_SEND:
    1178                 :          0 :                 return seccomp_notify_send(filter, buf);
    1179                 :            :         case SECCOMP_IOCTL_NOTIF_ID_VALID_WRONG_DIR:
    1180                 :            :         case SECCOMP_IOCTL_NOTIF_ID_VALID:
    1181                 :          0 :                 return seccomp_notify_id_valid(filter, buf);
    1182                 :            :         default:
    1183                 :            :                 return -EINVAL;
    1184                 :            :         }
    1185                 :            : }
    1186                 :            : 
    1187                 :          0 : static __poll_t seccomp_notify_poll(struct file *file,
    1188                 :            :                                     struct poll_table_struct *poll_tab)
    1189                 :            : {
    1190                 :          0 :         struct seccomp_filter *filter = file->private_data;
    1191                 :            :         __poll_t ret = 0;
    1192                 :            :         struct seccomp_knotif *cur;
    1193                 :            : 
    1194                 :          0 :         poll_wait(file, &filter->notif->wqh, poll_tab);
    1195                 :            : 
    1196         [ #  # ]:          0 :         if (mutex_lock_interruptible(&filter->notify_lock) < 0)
    1197                 :            :                 return EPOLLERR;
    1198                 :            : 
    1199         [ #  # ]:          0 :         list_for_each_entry(cur, &filter->notif->notifications, list) {
    1200         [ #  # ]:          0 :                 if (cur->state == SECCOMP_NOTIFY_INIT)
    1201                 :          0 :                         ret |= EPOLLIN | EPOLLRDNORM;
    1202         [ #  # ]:          0 :                 if (cur->state == SECCOMP_NOTIFY_SENT)
    1203                 :          0 :                         ret |= EPOLLOUT | EPOLLWRNORM;
    1204         [ #  # ]:          0 :                 if ((ret & EPOLLIN) && (ret & EPOLLOUT))
    1205                 :            :                         break;
    1206                 :            :         }
    1207                 :            : 
    1208                 :          0 :         mutex_unlock(&filter->notify_lock);
    1209                 :            : 
    1210                 :          0 :         return ret;
    1211                 :            : }
    1212                 :            : 
    1213                 :            : static const struct file_operations seccomp_notify_ops = {
    1214                 :            :         .poll = seccomp_notify_poll,
    1215                 :            :         .release = seccomp_notify_release,
    1216                 :            :         .unlocked_ioctl = seccomp_notify_ioctl,
    1217                 :            :         .compat_ioctl = seccomp_notify_ioctl,
    1218                 :            : };
    1219                 :            : 
    1220                 :          0 : static struct file *init_listener(struct seccomp_filter *filter)
    1221                 :            : {
    1222                 :            :         struct file *ret = ERR_PTR(-EBUSY);
    1223                 :            :         struct seccomp_filter *cur;
    1224                 :            : 
    1225         [ #  # ]:          0 :         for (cur = current->seccomp.filter; cur; cur = cur->prev) {
    1226         [ #  # ]:          0 :                 if (cur->notif)
    1227                 :            :                         goto out;
    1228                 :            :         }
    1229                 :            : 
    1230                 :            :         ret = ERR_PTR(-ENOMEM);
    1231                 :          0 :         filter->notif = kzalloc(sizeof(*(filter->notif)), GFP_KERNEL);
    1232         [ #  # ]:          0 :         if (!filter->notif)
    1233                 :            :                 goto out;
    1234                 :            : 
    1235                 :            :         sema_init(&filter->notif->request, 0);
    1236                 :          0 :         filter->notif->next_id = get_random_u64();
    1237                 :          0 :         INIT_LIST_HEAD(&filter->notif->notifications);
    1238                 :          0 :         init_waitqueue_head(&filter->notif->wqh);
    1239                 :            : 
    1240                 :          0 :         ret = anon_inode_getfile("seccomp notify", &seccomp_notify_ops,
    1241                 :            :                                  filter, O_RDWR);
    1242         [ #  # ]:          0 :         if (IS_ERR(ret))
    1243                 :            :                 goto out_notif;
    1244                 :            : 
    1245                 :            :         /* The file has a reference to it now */
    1246                 :            :         __get_seccomp_filter(filter);
    1247                 :            : 
    1248                 :            : out_notif:
    1249         [ #  # ]:          0 :         if (IS_ERR(ret))
    1250                 :          0 :                 kfree(filter->notif);
    1251                 :            : out:
    1252                 :          0 :         return ret;
    1253                 :            : }
    1254                 :            : 
    1255                 :            : /**
    1256                 :            :  * seccomp_set_mode_filter: internal function for setting seccomp filter
    1257                 :            :  * @flags:  flags to change filter behavior
    1258                 :            :  * @filter: struct sock_fprog containing filter
    1259                 :            :  *
    1260                 :            :  * This function may be called repeatedly to install additional filters.
    1261                 :            :  * Every filter successfully installed will be evaluated (in reverse order)
    1262                 :            :  * for each system call the task makes.
    1263                 :            :  *
    1264                 :            :  * Once current->seccomp.mode is non-zero, it may not be changed.
    1265                 :            :  *
    1266                 :            :  * Returns 0 on success or -EINVAL on failure.
    1267                 :            :  */
    1268                 :       6839 : static long seccomp_set_mode_filter(unsigned int flags,
    1269                 :            :                                     const char __user *filter)
    1270                 :            : {
    1271                 :            :         const unsigned long seccomp_mode = SECCOMP_MODE_FILTER;
    1272                 :            :         struct seccomp_filter *prepared = NULL;
    1273                 :            :         long ret = -EINVAL;
    1274                 :            :         int listener = -1;
    1275                 :            :         struct file *listener_f = NULL;
    1276                 :            : 
    1277                 :            :         /* Validate flags. */
    1278         [ +  - ]:       6839 :         if (flags & ~SECCOMP_FILTER_FLAG_MASK)
    1279                 :            :                 return -EINVAL;
    1280                 :            : 
    1281                 :            :         /*
    1282                 :            :          * In the successful case, NEW_LISTENER returns the new listener fd.
    1283                 :            :          * But in the failure case, TSYNC returns the thread that died. If you
    1284                 :            :          * combine these two flags, there's no way to tell whether something
    1285                 :            :          * succeeded or failed. So, let's disallow this combination.
    1286                 :            :          */
    1287         [ +  - ]:       6839 :         if ((flags & SECCOMP_FILTER_FLAG_TSYNC) &&
    1288                 :            :             (flags & SECCOMP_FILTER_FLAG_NEW_LISTENER))
    1289                 :            :                 return -EINVAL;
    1290                 :            : 
    1291                 :            :         /* Prepare the new filter before holding any locks. */
    1292                 :       6839 :         prepared = seccomp_prepare_user_filter(filter);
    1293         [ +  + ]:       6839 :         if (IS_ERR(prepared))
    1294                 :        830 :                 return PTR_ERR(prepared);
    1295                 :            : 
    1296         [ -  + ]:       6009 :         if (flags & SECCOMP_FILTER_FLAG_NEW_LISTENER) {
    1297                 :          0 :                 listener = get_unused_fd_flags(O_CLOEXEC);
    1298         [ #  # ]:          0 :                 if (listener < 0) {
    1299                 :            :                         ret = listener;
    1300                 :            :                         goto out_free;
    1301                 :            :                 }
    1302                 :            : 
    1303                 :          0 :                 listener_f = init_listener(prepared);
    1304         [ #  # ]:          0 :                 if (IS_ERR(listener_f)) {
    1305                 :          0 :                         put_unused_fd(listener);
    1306                 :            :                         ret = PTR_ERR(listener_f);
    1307                 :          0 :                         goto out_free;
    1308                 :            :                 }
    1309                 :            :         }
    1310                 :            : 
    1311                 :            :         /*
    1312                 :            :          * Make sure we cannot change seccomp or nnp state via TSYNC
    1313                 :            :          * while another thread is in the middle of calling exec.
    1314                 :            :          */
    1315   [ -  +  #  # ]:       6009 :         if (flags & SECCOMP_FILTER_FLAG_TSYNC &&
    1316                 :          0 :             mutex_lock_killable(&current->signal->cred_guard_mutex))
    1317                 :            :                 goto out_put_fd;
    1318                 :            : 
    1319                 :       6009 :         spin_lock_irq(&current->sighand->siglock);
    1320                 :            : 
    1321         [ +  - ]:       6009 :         if (!seccomp_may_assign_mode(seccomp_mode))
    1322                 :            :                 goto out;
    1323                 :            : 
    1324                 :       6009 :         ret = seccomp_attach_filter(flags, prepared);
    1325         [ +  - ]:       6009 :         if (ret)
    1326                 :            :                 goto out;
    1327                 :            :         /* Do not free the successfully attached filter. */
    1328                 :            :         prepared = NULL;
    1329                 :            : 
    1330                 :       6009 :         seccomp_assign_mode(current, seccomp_mode, flags);
    1331                 :            : out:
    1332                 :       6009 :         spin_unlock_irq(&current->sighand->siglock);
    1333         [ -  + ]:       6009 :         if (flags & SECCOMP_FILTER_FLAG_TSYNC)
    1334                 :          0 :                 mutex_unlock(&current->signal->cred_guard_mutex);
    1335                 :            : out_put_fd:
    1336         [ -  + ]:       6009 :         if (flags & SECCOMP_FILTER_FLAG_NEW_LISTENER) {
    1337         [ #  # ]:          0 :                 if (ret) {
    1338                 :          0 :                         listener_f->private_data = NULL;
    1339                 :          0 :                         fput(listener_f);
    1340                 :          0 :                         put_unused_fd(listener);
    1341                 :            :                 } else {
    1342                 :          0 :                         fd_install(listener, listener_f);
    1343                 :            :                         ret = listener;
    1344                 :            :                 }
    1345                 :            :         }
    1346                 :            : out_free:
    1347                 :       6009 :         seccomp_filter_free(prepared);
    1348                 :       6009 :         return ret;
    1349                 :            : }
    1350                 :            : #else
    1351                 :            : static inline long seccomp_set_mode_filter(unsigned int flags,
    1352                 :            :                                            const char __user *filter)
    1353                 :            : {
    1354                 :            :         return -EINVAL;
    1355                 :            : }
    1356                 :            : #endif
    1357                 :            : 
    1358                 :          0 : static long seccomp_get_action_avail(const char __user *uaction)
    1359                 :            : {
    1360                 :            :         u32 action;
    1361                 :            : 
    1362         [ #  # ]:          0 :         if (copy_from_user(&action, uaction, sizeof(action)))
    1363                 :            :                 return -EFAULT;
    1364                 :            : 
    1365         [ #  # ]:          0 :         switch (action) {
    1366                 :            :         case SECCOMP_RET_KILL_PROCESS:
    1367                 :            :         case SECCOMP_RET_KILL_THREAD:
    1368                 :            :         case SECCOMP_RET_TRAP:
    1369                 :            :         case SECCOMP_RET_ERRNO:
    1370                 :            :         case SECCOMP_RET_USER_NOTIF:
    1371                 :            :         case SECCOMP_RET_TRACE:
    1372                 :            :         case SECCOMP_RET_LOG:
    1373                 :            :         case SECCOMP_RET_ALLOW:
    1374                 :            :                 break;
    1375                 :            :         default:
    1376                 :            :                 return -EOPNOTSUPP;
    1377                 :            :         }
    1378                 :            : 
    1379                 :          0 :         return 0;
    1380                 :            : }
    1381                 :            : 
    1382                 :          0 : static long seccomp_get_notif_sizes(void __user *usizes)
    1383                 :            : {
    1384                 :          0 :         struct seccomp_notif_sizes sizes = {
    1385                 :            :                 .seccomp_notif = sizeof(struct seccomp_notif),
    1386                 :            :                 .seccomp_notif_resp = sizeof(struct seccomp_notif_resp),
    1387                 :            :                 .seccomp_data = sizeof(struct seccomp_data),
    1388                 :            :         };
    1389                 :            : 
    1390         [ #  # ]:          0 :         if (copy_to_user(usizes, &sizes, sizeof(sizes)))
    1391                 :            :                 return -EFAULT;
    1392                 :            : 
    1393                 :          0 :         return 0;
    1394                 :            : }
    1395                 :            : 
    1396                 :            : /* Common entry point for both prctl and syscall. */
    1397                 :       7669 : static long do_seccomp(unsigned int op, unsigned int flags,
    1398                 :            :                        void __user *uargs)
    1399                 :            : {
    1400   [ +  +  -  -  :       7669 :         switch (op) {
                      - ]
    1401                 :            :         case SECCOMP_SET_MODE_STRICT:
    1402         [ -  + ]:        830 :                 if (flags != 0 || uargs != NULL)
    1403                 :            :                         return -EINVAL;
    1404                 :          0 :                 return seccomp_set_mode_strict();
    1405                 :            :         case SECCOMP_SET_MODE_FILTER:
    1406                 :       6839 :                 return seccomp_set_mode_filter(flags, uargs);
    1407                 :            :         case SECCOMP_GET_ACTION_AVAIL:
    1408         [ #  # ]:          0 :                 if (flags != 0)
    1409                 :            :                         return -EINVAL;
    1410                 :            : 
    1411                 :          0 :                 return seccomp_get_action_avail(uargs);
    1412                 :            :         case SECCOMP_GET_NOTIF_SIZES:
    1413         [ #  # ]:          0 :                 if (flags != 0)
    1414                 :            :                         return -EINVAL;
    1415                 :            : 
    1416                 :          0 :                 return seccomp_get_notif_sizes(uargs);
    1417                 :            :         default:
    1418                 :            :                 return -EINVAL;
    1419                 :            :         }
    1420                 :            : }
    1421                 :            : 
    1422                 :      13678 : SYSCALL_DEFINE3(seccomp, unsigned int, op, unsigned int, flags,
    1423                 :            :                          void __user *, uargs)
    1424                 :            : {
    1425                 :       6839 :         return do_seccomp(op, flags, uargs);
    1426                 :            : }
    1427                 :            : 
    1428                 :            : /**
    1429                 :            :  * prctl_set_seccomp: configures current->seccomp.mode
    1430                 :            :  * @seccomp_mode: requested mode to use
    1431                 :            :  * @filter: optional struct sock_fprog for use with SECCOMP_MODE_FILTER
    1432                 :            :  *
    1433                 :            :  * Returns 0 on success or -EINVAL on failure.
    1434                 :            :  */
    1435                 :        830 : long prctl_set_seccomp(unsigned long seccomp_mode, void __user *filter)
    1436                 :            : {
    1437                 :            :         unsigned int op;
    1438                 :            :         void __user *uargs;
    1439                 :            : 
    1440      [ +  -  - ]:        830 :         switch (seccomp_mode) {
    1441                 :            :         case SECCOMP_MODE_STRICT:
    1442                 :            :                 op = SECCOMP_SET_MODE_STRICT;
    1443                 :            :                 /*
    1444                 :            :                  * Setting strict mode through prctl always ignored filter,
    1445                 :            :                  * so make sure it is always NULL here to pass the internal
    1446                 :            :                  * check in do_seccomp().
    1447                 :            :                  */
    1448                 :            :                 uargs = NULL;
    1449                 :            :                 break;
    1450                 :            :         case SECCOMP_MODE_FILTER:
    1451                 :            :                 op = SECCOMP_SET_MODE_FILTER;
    1452                 :            :                 uargs = filter;
    1453                 :        830 :                 break;
    1454                 :            :         default:
    1455                 :            :                 return -EINVAL;
    1456                 :            :         }
    1457                 :            : 
    1458                 :            :         /* prctl interface doesn't have flags, so they are always zero. */
    1459                 :        830 :         return do_seccomp(op, 0, uargs);
    1460                 :            : }
    1461                 :            : 
    1462                 :            : #if defined(CONFIG_SECCOMP_FILTER) && defined(CONFIG_CHECKPOINT_RESTORE)
    1463                 :            : static struct seccomp_filter *get_nth_filter(struct task_struct *task,
    1464                 :            :                                              unsigned long filter_off)
    1465                 :            : {
    1466                 :            :         struct seccomp_filter *orig, *filter;
    1467                 :            :         unsigned long count;
    1468                 :            : 
    1469                 :            :         /*
    1470                 :            :          * Note: this is only correct because the caller should be the (ptrace)
    1471                 :            :          * tracer of the task, otherwise lock_task_sighand is needed.
    1472                 :            :          */
    1473                 :            :         spin_lock_irq(&task->sighand->siglock);
    1474                 :            : 
    1475                 :            :         if (task->seccomp.mode != SECCOMP_MODE_FILTER) {
    1476                 :            :                 spin_unlock_irq(&task->sighand->siglock);
    1477                 :            :                 return ERR_PTR(-EINVAL);
    1478                 :            :         }
    1479                 :            : 
    1480                 :            :         orig = task->seccomp.filter;
    1481                 :            :         __get_seccomp_filter(orig);
    1482                 :            :         spin_unlock_irq(&task->sighand->siglock);
    1483                 :            : 
    1484                 :            :         count = 0;
    1485                 :            :         for (filter = orig; filter; filter = filter->prev)
    1486                 :            :                 count++;
    1487                 :            : 
    1488                 :            :         if (filter_off >= count) {
    1489                 :            :                 filter = ERR_PTR(-ENOENT);
    1490                 :            :                 goto out;
    1491                 :            :         }
    1492                 :            : 
    1493                 :            :         count -= filter_off;
    1494                 :            :         for (filter = orig; filter && count > 1; filter = filter->prev)
    1495                 :            :                 count--;
    1496                 :            : 
    1497                 :            :         if (WARN_ON(count != 1 || !filter)) {
    1498                 :            :                 filter = ERR_PTR(-ENOENT);
    1499                 :            :                 goto out;
    1500                 :            :         }
    1501                 :            : 
    1502                 :            :         __get_seccomp_filter(filter);
    1503                 :            : 
    1504                 :            : out:
    1505                 :            :         __put_seccomp_filter(orig);
    1506                 :            :         return filter;
    1507                 :            : }
    1508                 :            : 
    1509                 :            : long seccomp_get_filter(struct task_struct *task, unsigned long filter_off,
    1510                 :            :                         void __user *data)
    1511                 :            : {
    1512                 :            :         struct seccomp_filter *filter;
    1513                 :            :         struct sock_fprog_kern *fprog;
    1514                 :            :         long ret;
    1515                 :            : 
    1516                 :            :         if (!capable(CAP_SYS_ADMIN) ||
    1517                 :            :             current->seccomp.mode != SECCOMP_MODE_DISABLED) {
    1518                 :            :                 return -EACCES;
    1519                 :            :         }
    1520                 :            : 
    1521                 :            :         filter = get_nth_filter(task, filter_off);
    1522                 :            :         if (IS_ERR(filter))
    1523                 :            :                 return PTR_ERR(filter);
    1524                 :            : 
    1525                 :            :         fprog = filter->prog->orig_prog;
    1526                 :            :         if (!fprog) {
    1527                 :            :                 /* This must be a new non-cBPF filter, since we save
    1528                 :            :                  * every cBPF filter's orig_prog above when
    1529                 :            :                  * CONFIG_CHECKPOINT_RESTORE is enabled.
    1530                 :            :                  */
    1531                 :            :                 ret = -EMEDIUMTYPE;
    1532                 :            :                 goto out;
    1533                 :            :         }
    1534                 :            : 
    1535                 :            :         ret = fprog->len;
    1536                 :            :         if (!data)
    1537                 :            :                 goto out;
    1538                 :            : 
    1539                 :            :         if (copy_to_user(data, fprog->filter, bpf_classic_proglen(fprog)))
    1540                 :            :                 ret = -EFAULT;
    1541                 :            : 
    1542                 :            : out:
    1543                 :            :         __put_seccomp_filter(filter);
    1544                 :            :         return ret;
    1545                 :            : }
    1546                 :            : 
    1547                 :            : long seccomp_get_metadata(struct task_struct *task,
    1548                 :            :                           unsigned long size, void __user *data)
    1549                 :            : {
    1550                 :            :         long ret;
    1551                 :            :         struct seccomp_filter *filter;
    1552                 :            :         struct seccomp_metadata kmd = {};
    1553                 :            : 
    1554                 :            :         if (!capable(CAP_SYS_ADMIN) ||
    1555                 :            :             current->seccomp.mode != SECCOMP_MODE_DISABLED) {
    1556                 :            :                 return -EACCES;
    1557                 :            :         }
    1558                 :            : 
    1559                 :            :         size = min_t(unsigned long, size, sizeof(kmd));
    1560                 :            : 
    1561                 :            :         if (size < sizeof(kmd.filter_off))
    1562                 :            :                 return -EINVAL;
    1563                 :            : 
    1564                 :            :         if (copy_from_user(&kmd.filter_off, data, sizeof(kmd.filter_off)))
    1565                 :            :                 return -EFAULT;
    1566                 :            : 
    1567                 :            :         filter = get_nth_filter(task, kmd.filter_off);
    1568                 :            :         if (IS_ERR(filter))
    1569                 :            :                 return PTR_ERR(filter);
    1570                 :            : 
    1571                 :            :         if (filter->log)
    1572                 :            :                 kmd.flags |= SECCOMP_FILTER_FLAG_LOG;
    1573                 :            : 
    1574                 :            :         ret = size;
    1575                 :            :         if (copy_to_user(data, &kmd, size))
    1576                 :            :                 ret = -EFAULT;
    1577                 :            : 
    1578                 :            :         __put_seccomp_filter(filter);
    1579                 :            :         return ret;
    1580                 :            : }
    1581                 :            : #endif
    1582                 :            : 
    1583                 :            : #ifdef CONFIG_SYSCTL
    1584                 :            : 
    1585                 :            : /* Human readable action names for friendly sysctl interaction */
    1586                 :            : #define SECCOMP_RET_KILL_PROCESS_NAME   "kill_process"
    1587                 :            : #define SECCOMP_RET_KILL_THREAD_NAME    "kill_thread"
    1588                 :            : #define SECCOMP_RET_TRAP_NAME           "trap"
    1589                 :            : #define SECCOMP_RET_ERRNO_NAME          "errno"
    1590                 :            : #define SECCOMP_RET_USER_NOTIF_NAME     "user_notif"
    1591                 :            : #define SECCOMP_RET_TRACE_NAME          "trace"
    1592                 :            : #define SECCOMP_RET_LOG_NAME            "log"
    1593                 :            : #define SECCOMP_RET_ALLOW_NAME          "allow"
    1594                 :            : 
    1595                 :            : static const char seccomp_actions_avail[] =
    1596                 :            :                                 SECCOMP_RET_KILL_PROCESS_NAME   " "
    1597                 :            :                                 SECCOMP_RET_KILL_THREAD_NAME    " "
    1598                 :            :                                 SECCOMP_RET_TRAP_NAME           " "
    1599                 :            :                                 SECCOMP_RET_ERRNO_NAME          " "
    1600                 :            :                                 SECCOMP_RET_USER_NOTIF_NAME     " "
    1601                 :            :                                 SECCOMP_RET_TRACE_NAME          " "
    1602                 :            :                                 SECCOMP_RET_LOG_NAME            " "
    1603                 :            :                                 SECCOMP_RET_ALLOW_NAME;
    1604                 :            : 
    1605                 :            : struct seccomp_log_name {
    1606                 :            :         u32             log;
    1607                 :            :         const char      *name;
    1608                 :            : };
    1609                 :            : 
    1610                 :            : static const struct seccomp_log_name seccomp_log_names[] = {
    1611                 :            :         { SECCOMP_LOG_KILL_PROCESS, SECCOMP_RET_KILL_PROCESS_NAME },
    1612                 :            :         { SECCOMP_LOG_KILL_THREAD, SECCOMP_RET_KILL_THREAD_NAME },
    1613                 :            :         { SECCOMP_LOG_TRAP, SECCOMP_RET_TRAP_NAME },
    1614                 :            :         { SECCOMP_LOG_ERRNO, SECCOMP_RET_ERRNO_NAME },
    1615                 :            :         { SECCOMP_LOG_USER_NOTIF, SECCOMP_RET_USER_NOTIF_NAME },
    1616                 :            :         { SECCOMP_LOG_TRACE, SECCOMP_RET_TRACE_NAME },
    1617                 :            :         { SECCOMP_LOG_LOG, SECCOMP_RET_LOG_NAME },
    1618                 :            :         { SECCOMP_LOG_ALLOW, SECCOMP_RET_ALLOW_NAME },
    1619                 :            :         { }
    1620                 :            : };
    1621                 :            : 
    1622                 :          0 : static bool seccomp_names_from_actions_logged(char *names, size_t size,
    1623                 :            :                                               u32 actions_logged,
    1624                 :            :                                               const char *sep)
    1625                 :            : {
    1626                 :            :         const struct seccomp_log_name *cur;
    1627                 :            :         bool append_sep = false;
    1628                 :            : 
    1629   [ #  #  #  # ]:          0 :         for (cur = seccomp_log_names; cur->name && size; cur++) {
    1630                 :            :                 ssize_t ret;
    1631                 :            : 
    1632         [ #  # ]:          0 :                 if (!(actions_logged & cur->log))
    1633                 :          0 :                         continue;
    1634                 :            : 
    1635         [ #  # ]:          0 :                 if (append_sep) {
    1636                 :          0 :                         ret = strscpy(names, sep, size);
    1637         [ #  # ]:          0 :                         if (ret < 0)
    1638                 :            :                                 return false;
    1639                 :            : 
    1640                 :          0 :                         names += ret;
    1641                 :          0 :                         size -= ret;
    1642                 :            :                 } else
    1643                 :            :                         append_sep = true;
    1644                 :            : 
    1645                 :          0 :                 ret = strscpy(names, cur->name, size);
    1646         [ #  # ]:          0 :                 if (ret < 0)
    1647                 :            :                         return false;
    1648                 :            : 
    1649                 :          0 :                 names += ret;
    1650                 :          0 :                 size -= ret;
    1651                 :            :         }
    1652                 :            : 
    1653                 :            :         return true;
    1654                 :            : }
    1655                 :            : 
    1656                 :          0 : static bool seccomp_action_logged_from_name(u32 *action_logged,
    1657                 :            :                                             const char *name)
    1658                 :            : {
    1659                 :            :         const struct seccomp_log_name *cur;
    1660                 :            : 
    1661         [ #  # ]:          0 :         for (cur = seccomp_log_names; cur->name; cur++) {
    1662         [ #  # ]:          0 :                 if (!strcmp(cur->name, name)) {
    1663                 :          0 :                         *action_logged = cur->log;
    1664                 :          0 :                         return true;
    1665                 :            :                 }
    1666                 :            :         }
    1667                 :            : 
    1668                 :            :         return false;
    1669                 :            : }
    1670                 :            : 
    1671                 :          0 : static bool seccomp_actions_logged_from_names(u32 *actions_logged, char *names)
    1672                 :            : {
    1673                 :            :         char *name;
    1674                 :            : 
    1675                 :          0 :         *actions_logged = 0;
    1676   [ #  #  #  # ]:          0 :         while ((name = strsep(&names, " ")) && *name) {
    1677                 :          0 :                 u32 action_logged = 0;
    1678                 :            : 
    1679         [ #  # ]:          0 :                 if (!seccomp_action_logged_from_name(&action_logged, name))
    1680                 :          0 :                         return false;
    1681                 :            : 
    1682                 :          0 :                 *actions_logged |= action_logged;
    1683                 :            :         }
    1684                 :            : 
    1685                 :            :         return true;
    1686                 :            : }
    1687                 :            : 
    1688                 :          0 : static int read_actions_logged(struct ctl_table *ro_table, void __user *buffer,
    1689                 :            :                                size_t *lenp, loff_t *ppos)
    1690                 :            : {
    1691                 :            :         char names[sizeof(seccomp_actions_avail)];
    1692                 :            :         struct ctl_table table;
    1693                 :            : 
    1694                 :          0 :         memset(names, 0, sizeof(names));
    1695                 :            : 
    1696         [ #  # ]:          0 :         if (!seccomp_names_from_actions_logged(names, sizeof(names),
    1697                 :            :                                                seccomp_actions_logged, " "))
    1698                 :            :                 return -EINVAL;
    1699                 :            : 
    1700                 :          0 :         table = *ro_table;
    1701                 :          0 :         table.data = names;
    1702                 :          0 :         table.maxlen = sizeof(names);
    1703                 :          0 :         return proc_dostring(&table, 0, buffer, lenp, ppos);
    1704                 :            : }
    1705                 :            : 
    1706                 :          0 : static int write_actions_logged(struct ctl_table *ro_table, void __user *buffer,
    1707                 :            :                                 size_t *lenp, loff_t *ppos, u32 *actions_logged)
    1708                 :            : {
    1709                 :            :         char names[sizeof(seccomp_actions_avail)];
    1710                 :            :         struct ctl_table table;
    1711                 :            :         int ret;
    1712                 :            : 
    1713         [ #  # ]:          0 :         if (!capable(CAP_SYS_ADMIN))
    1714                 :            :                 return -EPERM;
    1715                 :            : 
    1716                 :          0 :         memset(names, 0, sizeof(names));
    1717                 :            : 
    1718                 :          0 :         table = *ro_table;
    1719                 :          0 :         table.data = names;
    1720                 :          0 :         table.maxlen = sizeof(names);
    1721                 :          0 :         ret = proc_dostring(&table, 1, buffer, lenp, ppos);
    1722         [ #  # ]:          0 :         if (ret)
    1723                 :            :                 return ret;
    1724                 :            : 
    1725         [ #  # ]:          0 :         if (!seccomp_actions_logged_from_names(actions_logged, table.data))
    1726                 :            :                 return -EINVAL;
    1727                 :            : 
    1728         [ #  # ]:          0 :         if (*actions_logged & SECCOMP_LOG_ALLOW)
    1729                 :            :                 return -EINVAL;
    1730                 :            : 
    1731                 :          0 :         seccomp_actions_logged = *actions_logged;
    1732                 :          0 :         return 0;
    1733                 :            : }
    1734                 :            : 
    1735                 :          0 : static void audit_actions_logged(u32 actions_logged, u32 old_actions_logged,
    1736                 :            :                                  int ret)
    1737                 :            : {
    1738                 :            :         char names[sizeof(seccomp_actions_avail)];
    1739                 :            :         char old_names[sizeof(seccomp_actions_avail)];
    1740                 :            :         const char *new = names;
    1741                 :            :         const char *old = old_names;
    1742                 :            : 
    1743         [ #  # ]:          0 :         if (!audit_enabled)
    1744                 :            :                 return;
    1745                 :            : 
    1746                 :          0 :         memset(names, 0, sizeof(names));
    1747                 :          0 :         memset(old_names, 0, sizeof(old_names));
    1748                 :            : 
    1749         [ #  # ]:          0 :         if (ret)
    1750                 :            :                 new = "?";
    1751         [ #  # ]:          0 :         else if (!actions_logged)
    1752                 :            :                 new = "(none)";
    1753         [ #  # ]:          0 :         else if (!seccomp_names_from_actions_logged(names, sizeof(names),
    1754                 :            :                                                     actions_logged, ","))
    1755                 :            :                 new = "?";
    1756                 :            : 
    1757         [ #  # ]:          0 :         if (!old_actions_logged)
    1758                 :            :                 old = "(none)";
    1759         [ #  # ]:          0 :         else if (!seccomp_names_from_actions_logged(old_names,
    1760                 :            :                                                     sizeof(old_names),
    1761                 :            :                                                     old_actions_logged, ","))
    1762                 :            :                 old = "?";
    1763                 :            : 
    1764                 :          0 :         return audit_seccomp_actions_logged(new, old, !ret);
    1765                 :            : }
    1766                 :            : 
    1767                 :          0 : static int seccomp_actions_logged_handler(struct ctl_table *ro_table, int write,
    1768                 :            :                                           void __user *buffer, size_t *lenp,
    1769                 :            :                                           loff_t *ppos)
    1770                 :            : {
    1771                 :            :         int ret;
    1772                 :            : 
    1773         [ #  # ]:          0 :         if (write) {
    1774                 :          0 :                 u32 actions_logged = 0;
    1775                 :          0 :                 u32 old_actions_logged = seccomp_actions_logged;
    1776                 :            : 
    1777                 :          0 :                 ret = write_actions_logged(ro_table, buffer, lenp, ppos,
    1778                 :            :                                            &actions_logged);
    1779                 :          0 :                 audit_actions_logged(actions_logged, old_actions_logged, ret);
    1780                 :            :         } else
    1781                 :          0 :                 ret = read_actions_logged(ro_table, buffer, lenp, ppos);
    1782                 :            : 
    1783                 :          0 :         return ret;
    1784                 :            : }
    1785                 :            : 
    1786                 :            : static struct ctl_path seccomp_sysctl_path[] = {
    1787                 :            :         { .procname = "kernel", },
    1788                 :            :         { .procname = "seccomp", },
    1789                 :            :         { }
    1790                 :            : };
    1791                 :            : 
    1792                 :            : static struct ctl_table seccomp_sysctl_table[] = {
    1793                 :            :         {
    1794                 :            :                 .procname       = "actions_avail",
    1795                 :            :                 .data           = (void *) &seccomp_actions_avail,
    1796                 :            :                 .maxlen         = sizeof(seccomp_actions_avail),
    1797                 :            :                 .mode           = 0444,
    1798                 :            :                 .proc_handler   = proc_dostring,
    1799                 :            :         },
    1800                 :            :         {
    1801                 :            :                 .procname       = "actions_logged",
    1802                 :            :                 .mode           = 0644,
    1803                 :            :                 .proc_handler   = seccomp_actions_logged_handler,
    1804                 :            :         },
    1805                 :            :         { }
    1806                 :            : };
    1807                 :            : 
    1808                 :        207 : static int __init seccomp_sysctl_init(void)
    1809                 :            : {
    1810                 :            :         struct ctl_table_header *hdr;
    1811                 :            : 
    1812                 :        207 :         hdr = register_sysctl_paths(seccomp_sysctl_path, seccomp_sysctl_table);
    1813         [ -  + ]:        207 :         if (!hdr)
    1814                 :          0 :                 pr_warn("seccomp: sysctl registration failed\n");
    1815                 :            :         else
    1816                 :            :                 kmemleak_not_leak(hdr);
    1817                 :            : 
    1818                 :        207 :         return 0;
    1819                 :            : }
    1820                 :            : 
    1821                 :            : device_initcall(seccomp_sysctl_init)
    1822                 :            : 
    1823                 :            : #endif /* CONFIG_SYSCTL */

Generated by: LCOV version 1.14