linux/security/selinux/hooks.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *  NSA Security-Enhanced Linux (SELinux) security module
   4 *
   5 *  This file contains the SELinux hook function implementations.
   6 *
   7 *  Authors:  Stephen Smalley, <sds@tycho.nsa.gov>
   8 *            Chris Vance, <cvance@nai.com>
   9 *            Wayne Salamon, <wsalamon@nai.com>
  10 *            James Morris <jmorris@redhat.com>
  11 *
  12 *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
  13 *  Copyright (C) 2003-2008 Red Hat, Inc., James Morris <jmorris@redhat.com>
  14 *                                         Eric Paris <eparis@redhat.com>
  15 *  Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
  16 *                          <dgoeddel@trustedcs.com>
  17 *  Copyright (C) 2006, 2007, 2009 Hewlett-Packard Development Company, L.P.
  18 *      Paul Moore <paul@paul-moore.com>
  19 *  Copyright (C) 2007 Hitachi Software Engineering Co., Ltd.
  20 *                     Yuichi Nakamura <ynakam@hitachisoft.jp>
  21 *  Copyright (C) 2016 Mellanox Technologies
  22 */
  23
  24#include <linux/init.h>
  25#include <linux/kd.h>
  26#include <linux/kernel.h>
  27#include <linux/kernel_read_file.h>
  28#include <linux/tracehook.h>
  29#include <linux/errno.h>
  30#include <linux/sched/signal.h>
  31#include <linux/sched/task.h>
  32#include <linux/lsm_hooks.h>
  33#include <linux/xattr.h>
  34#include <linux/capability.h>
  35#include <linux/unistd.h>
  36#include <linux/mm.h>
  37#include <linux/mman.h>
  38#include <linux/slab.h>
  39#include <linux/pagemap.h>
  40#include <linux/proc_fs.h>
  41#include <linux/swap.h>
  42#include <linux/spinlock.h>
  43#include <linux/syscalls.h>
  44#include <linux/dcache.h>
  45#include <linux/file.h>
  46#include <linux/fdtable.h>
  47#include <linux/namei.h>
  48#include <linux/mount.h>
  49#include <linux/fs_context.h>
  50#include <linux/fs_parser.h>
  51#include <linux/netfilter_ipv4.h>
  52#include <linux/netfilter_ipv6.h>
  53#include <linux/tty.h>
  54#include <net/icmp.h>
  55#include <net/ip.h>             /* for local_port_range[] */
  56#include <net/tcp.h>            /* struct or_callable used in sock_rcv_skb */
  57#include <net/inet_connection_sock.h>
  58#include <net/net_namespace.h>
  59#include <net/netlabel.h>
  60#include <linux/uaccess.h>
  61#include <asm/ioctls.h>
  62#include <linux/atomic.h>
  63#include <linux/bitops.h>
  64#include <linux/interrupt.h>
  65#include <linux/netdevice.h>    /* for network interface checks */
  66#include <net/netlink.h>
  67#include <linux/tcp.h>
  68#include <linux/udp.h>
  69#include <linux/dccp.h>
  70#include <linux/sctp.h>
  71#include <net/sctp/structs.h>
  72#include <linux/quota.h>
  73#include <linux/un.h>           /* for Unix socket types */
  74#include <net/af_unix.h>        /* for Unix socket types */
  75#include <linux/parser.h>
  76#include <linux/nfs_mount.h>
  77#include <net/ipv6.h>
  78#include <linux/hugetlb.h>
  79#include <linux/personality.h>
  80#include <linux/audit.h>
  81#include <linux/string.h>
  82#include <linux/mutex.h>
  83#include <linux/posix-timers.h>
  84#include <linux/syslog.h>
  85#include <linux/user_namespace.h>
  86#include <linux/export.h>
  87#include <linux/msg.h>
  88#include <linux/shm.h>
  89#include <linux/bpf.h>
  90#include <linux/kernfs.h>
  91#include <linux/stringhash.h>   /* for hashlen_string() */
  92#include <uapi/linux/mount.h>
  93#include <linux/fsnotify.h>
  94#include <linux/fanotify.h>
  95
  96#include "avc.h"
  97#include "objsec.h"
  98#include "netif.h"
  99#include "netnode.h"
 100#include "netport.h"
 101#include "ibpkey.h"
 102#include "xfrm.h"
 103#include "netlabel.h"
 104#include "audit.h"
 105#include "avc_ss.h"
 106
 107struct selinux_state selinux_state;
 108
 109/* SECMARK reference count */
 110static atomic_t selinux_secmark_refcount = ATOMIC_INIT(0);
 111
 112#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
 113static int selinux_enforcing_boot __initdata;
 114
 115static int __init enforcing_setup(char *str)
 116{
 117        unsigned long enforcing;
 118        if (!kstrtoul(str, 0, &enforcing))
 119                selinux_enforcing_boot = enforcing ? 1 : 0;
 120        return 1;
 121}
 122__setup("enforcing=", enforcing_setup);
 123#else
 124#define selinux_enforcing_boot 1
 125#endif
 126
 127int selinux_enabled_boot __initdata = 1;
 128#ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
 129static int __init selinux_enabled_setup(char *str)
 130{
 131        unsigned long enabled;
 132        if (!kstrtoul(str, 0, &enabled))
 133                selinux_enabled_boot = enabled ? 1 : 0;
 134        return 1;
 135}
 136__setup("selinux=", selinux_enabled_setup);
 137#endif
 138
 139static unsigned int selinux_checkreqprot_boot =
 140        CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE;
 141
 142static int __init checkreqprot_setup(char *str)
 143{
 144        unsigned long checkreqprot;
 145
 146        if (!kstrtoul(str, 0, &checkreqprot)) {
 147                selinux_checkreqprot_boot = checkreqprot ? 1 : 0;
 148                if (checkreqprot)
 149                        pr_warn("SELinux: checkreqprot set to 1 via kernel parameter.  This is deprecated and will be rejected in a future kernel release.\n");
 150        }
 151        return 1;
 152}
 153__setup("checkreqprot=", checkreqprot_setup);
 154
 155/**
 156 * selinux_secmark_enabled - Check to see if SECMARK is currently enabled
 157 *
 158 * Description:
 159 * This function checks the SECMARK reference counter to see if any SECMARK
 160 * targets are currently configured, if the reference counter is greater than
 161 * zero SECMARK is considered to be enabled.  Returns true (1) if SECMARK is
 162 * enabled, false (0) if SECMARK is disabled.  If the always_check_network
 163 * policy capability is enabled, SECMARK is always considered enabled.
 164 *
 165 */
 166static int selinux_secmark_enabled(void)
 167{
 168        return (selinux_policycap_alwaysnetwork() ||
 169                atomic_read(&selinux_secmark_refcount));
 170}
 171
 172/**
 173 * selinux_peerlbl_enabled - Check to see if peer labeling is currently enabled
 174 *
 175 * Description:
 176 * This function checks if NetLabel or labeled IPSEC is enabled.  Returns true
 177 * (1) if any are enabled or false (0) if neither are enabled.  If the
 178 * always_check_network policy capability is enabled, peer labeling
 179 * is always considered enabled.
 180 *
 181 */
 182static int selinux_peerlbl_enabled(void)
 183{
 184        return (selinux_policycap_alwaysnetwork() ||
 185                netlbl_enabled() || selinux_xfrm_enabled());
 186}
 187
 188static int selinux_netcache_avc_callback(u32 event)
 189{
 190        if (event == AVC_CALLBACK_RESET) {
 191                sel_netif_flush();
 192                sel_netnode_flush();
 193                sel_netport_flush();
 194                synchronize_net();
 195        }
 196        return 0;
 197}
 198
 199static int selinux_lsm_notifier_avc_callback(u32 event)
 200{
 201        if (event == AVC_CALLBACK_RESET) {
 202                sel_ib_pkey_flush();
 203                call_blocking_lsm_notifier(LSM_POLICY_CHANGE, NULL);
 204        }
 205
 206        return 0;
 207}
 208
 209/*
 210 * initialise the security for the init task
 211 */
 212static void cred_init_security(void)
 213{
 214        struct cred *cred = (struct cred *) current->real_cred;
 215        struct task_security_struct *tsec;
 216
 217        tsec = selinux_cred(cred);
 218        tsec->osid = tsec->sid = SECINITSID_KERNEL;
 219}
 220
 221/*
 222 * get the security ID of a set of credentials
 223 */
 224static inline u32 cred_sid(const struct cred *cred)
 225{
 226        const struct task_security_struct *tsec;
 227
 228        tsec = selinux_cred(cred);
 229        return tsec->sid;
 230}
 231
 232/*
 233 * get the subjective security ID of a task
 234 */
 235static inline u32 task_sid_subj(const struct task_struct *task)
 236{
 237        u32 sid;
 238
 239        rcu_read_lock();
 240        sid = cred_sid(rcu_dereference(task->cred));
 241        rcu_read_unlock();
 242        return sid;
 243}
 244
 245/*
 246 * get the objective security ID of a task
 247 */
 248static inline u32 task_sid_obj(const struct task_struct *task)
 249{
 250        u32 sid;
 251
 252        rcu_read_lock();
 253        sid = cred_sid(__task_cred(task));
 254        rcu_read_unlock();
 255        return sid;
 256}
 257
 258/*
 259 * get the security ID of a task for use with binder
 260 */
 261static inline u32 task_sid_binder(const struct task_struct *task)
 262{
 263        /*
 264         * In many case where this function is used we should be using the
 265         * task's subjective SID, but we can't reliably access the subjective
 266         * creds of a task other than our own so we must use the objective
 267         * creds/SID, which are safe to access.  The downside is that if a task
 268         * is temporarily overriding it's creds it will not be reflected here;
 269         * however, it isn't clear that binder would handle that case well
 270         * anyway.
 271         *
 272         * If this ever changes and we can safely reference the subjective
 273         * creds/SID of another task, this function will make it easier to
 274         * identify the various places where we make use of the task SIDs in
 275         * the binder code.  It is also likely that we will need to adjust
 276         * the main drivers/android binder code as well.
 277         */
 278        return task_sid_obj(task);
 279}
 280
 281static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
 282
 283/*
 284 * Try reloading inode security labels that have been marked as invalid.  The
 285 * @may_sleep parameter indicates when sleeping and thus reloading labels is
 286 * allowed; when set to false, returns -ECHILD when the label is
 287 * invalid.  The @dentry parameter should be set to a dentry of the inode.
 288 */
 289static int __inode_security_revalidate(struct inode *inode,
 290                                       struct dentry *dentry,
 291                                       bool may_sleep)
 292{
 293        struct inode_security_struct *isec = selinux_inode(inode);
 294
 295        might_sleep_if(may_sleep);
 296
 297        if (selinux_initialized(&selinux_state) &&
 298            isec->initialized != LABEL_INITIALIZED) {
 299                if (!may_sleep)
 300                        return -ECHILD;
 301
 302                /*
 303                 * Try reloading the inode security label.  This will fail if
 304                 * @opt_dentry is NULL and no dentry for this inode can be
 305                 * found; in that case, continue using the old label.
 306                 */
 307                inode_doinit_with_dentry(inode, dentry);
 308        }
 309        return 0;
 310}
 311
 312static struct inode_security_struct *inode_security_novalidate(struct inode *inode)
 313{
 314        return selinux_inode(inode);
 315}
 316
 317static struct inode_security_struct *inode_security_rcu(struct inode *inode, bool rcu)
 318{
 319        int error;
 320
 321        error = __inode_security_revalidate(inode, NULL, !rcu);
 322        if (error)
 323                return ERR_PTR(error);
 324        return selinux_inode(inode);
 325}
 326
 327/*
 328 * Get the security label of an inode.
 329 */
 330static struct inode_security_struct *inode_security(struct inode *inode)
 331{
 332        __inode_security_revalidate(inode, NULL, true);
 333        return selinux_inode(inode);
 334}
 335
 336static struct inode_security_struct *backing_inode_security_novalidate(struct dentry *dentry)
 337{
 338        struct inode *inode = d_backing_inode(dentry);
 339
 340        return selinux_inode(inode);
 341}
 342
 343/*
 344 * Get the security label of a dentry's backing inode.
 345 */
 346static struct inode_security_struct *backing_inode_security(struct dentry *dentry)
 347{
 348        struct inode *inode = d_backing_inode(dentry);
 349
 350        __inode_security_revalidate(inode, dentry, true);
 351        return selinux_inode(inode);
 352}
 353
 354static void inode_free_security(struct inode *inode)
 355{
 356        struct inode_security_struct *isec = selinux_inode(inode);
 357        struct superblock_security_struct *sbsec;
 358
 359        if (!isec)
 360                return;
 361        sbsec = selinux_superblock(inode->i_sb);
 362        /*
 363         * As not all inode security structures are in a list, we check for
 364         * empty list outside of the lock to make sure that we won't waste
 365         * time taking a lock doing nothing.
 366         *
 367         * The list_del_init() function can be safely called more than once.
 368         * It should not be possible for this function to be called with
 369         * concurrent list_add(), but for better safety against future changes
 370         * in the code, we use list_empty_careful() here.
 371         */
 372        if (!list_empty_careful(&isec->list)) {
 373                spin_lock(&sbsec->isec_lock);
 374                list_del_init(&isec->list);
 375                spin_unlock(&sbsec->isec_lock);
 376        }
 377}
 378
 379struct selinux_mnt_opts {
 380        const char *fscontext, *context, *rootcontext, *defcontext;
 381};
 382
 383static void selinux_free_mnt_opts(void *mnt_opts)
 384{
 385        struct selinux_mnt_opts *opts = mnt_opts;
 386        kfree(opts->fscontext);
 387        kfree(opts->context);
 388        kfree(opts->rootcontext);
 389        kfree(opts->defcontext);
 390        kfree(opts);
 391}
 392
 393enum {
 394        Opt_error = -1,
 395        Opt_context = 0,
 396        Opt_defcontext = 1,
 397        Opt_fscontext = 2,
 398        Opt_rootcontext = 3,
 399        Opt_seclabel = 4,
 400};
 401
 402#define A(s, has_arg) {#s, sizeof(#s) - 1, Opt_##s, has_arg}
 403static struct {
 404        const char *name;
 405        int len;
 406        int opt;
 407        bool has_arg;
 408} tokens[] = {
 409        A(context, true),
 410        A(fscontext, true),
 411        A(defcontext, true),
 412        A(rootcontext, true),
 413        A(seclabel, false),
 414};
 415#undef A
 416
 417static int match_opt_prefix(char *s, int l, char **arg)
 418{
 419        int i;
 420
 421        for (i = 0; i < ARRAY_SIZE(tokens); i++) {
 422                size_t len = tokens[i].len;
 423                if (len > l || memcmp(s, tokens[i].name, len))
 424                        continue;
 425                if (tokens[i].has_arg) {
 426                        if (len == l || s[len] != '=')
 427                                continue;
 428                        *arg = s + len + 1;
 429                } else if (len != l)
 430                        continue;
 431                return tokens[i].opt;
 432        }
 433        return Opt_error;
 434}
 435
 436#define SEL_MOUNT_FAIL_MSG "SELinux:  duplicate or incompatible mount options\n"
 437
 438static int may_context_mount_sb_relabel(u32 sid,
 439                        struct superblock_security_struct *sbsec,
 440                        const struct cred *cred)
 441{
 442        const struct task_security_struct *tsec = selinux_cred(cred);
 443        int rc;
 444
 445        rc = avc_has_perm(&selinux_state,
 446                          tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
 447                          FILESYSTEM__RELABELFROM, NULL);
 448        if (rc)
 449                return rc;
 450
 451        rc = avc_has_perm(&selinux_state,
 452                          tsec->sid, sid, SECCLASS_FILESYSTEM,
 453                          FILESYSTEM__RELABELTO, NULL);
 454        return rc;
 455}
 456
 457static int may_context_mount_inode_relabel(u32 sid,
 458                        struct superblock_security_struct *sbsec,
 459                        const struct cred *cred)
 460{
 461        const struct task_security_struct *tsec = selinux_cred(cred);
 462        int rc;
 463        rc = avc_has_perm(&selinux_state,
 464                          tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
 465                          FILESYSTEM__RELABELFROM, NULL);
 466        if (rc)
 467                return rc;
 468
 469        rc = avc_has_perm(&selinux_state,
 470                          sid, sbsec->sid, SECCLASS_FILESYSTEM,
 471                          FILESYSTEM__ASSOCIATE, NULL);
 472        return rc;
 473}
 474
 475static int selinux_is_genfs_special_handling(struct super_block *sb)
 476{
 477        /* Special handling. Genfs but also in-core setxattr handler */
 478        return  !strcmp(sb->s_type->name, "sysfs") ||
 479                !strcmp(sb->s_type->name, "pstore") ||
 480                !strcmp(sb->s_type->name, "debugfs") ||
 481                !strcmp(sb->s_type->name, "tracefs") ||
 482                !strcmp(sb->s_type->name, "rootfs") ||
 483                (selinux_policycap_cgroupseclabel() &&
 484                 (!strcmp(sb->s_type->name, "cgroup") ||
 485                  !strcmp(sb->s_type->name, "cgroup2")));
 486}
 487
 488static int selinux_is_sblabel_mnt(struct super_block *sb)
 489{
 490        struct superblock_security_struct *sbsec = selinux_superblock(sb);
 491
 492        /*
 493         * IMPORTANT: Double-check logic in this function when adding a new
 494         * SECURITY_FS_USE_* definition!
 495         */
 496        BUILD_BUG_ON(SECURITY_FS_USE_MAX != 7);
 497
 498        switch (sbsec->behavior) {
 499        case SECURITY_FS_USE_XATTR:
 500        case SECURITY_FS_USE_TRANS:
 501        case SECURITY_FS_USE_TASK:
 502        case SECURITY_FS_USE_NATIVE:
 503                return 1;
 504
 505        case SECURITY_FS_USE_GENFS:
 506                return selinux_is_genfs_special_handling(sb);
 507
 508        /* Never allow relabeling on context mounts */
 509        case SECURITY_FS_USE_MNTPOINT:
 510        case SECURITY_FS_USE_NONE:
 511        default:
 512                return 0;
 513        }
 514}
 515
 516static int sb_check_xattr_support(struct super_block *sb)
 517{
 518        struct superblock_security_struct *sbsec = sb->s_security;
 519        struct dentry *root = sb->s_root;
 520        struct inode *root_inode = d_backing_inode(root);
 521        u32 sid;
 522        int rc;
 523
 524        /*
 525         * Make sure that the xattr handler exists and that no
 526         * error other than -ENODATA is returned by getxattr on
 527         * the root directory.  -ENODATA is ok, as this may be
 528         * the first boot of the SELinux kernel before we have
 529         * assigned xattr values to the filesystem.
 530         */
 531        if (!(root_inode->i_opflags & IOP_XATTR)) {
 532                pr_warn("SELinux: (dev %s, type %s) has no xattr support\n",
 533                        sb->s_id, sb->s_type->name);
 534                goto fallback;
 535        }
 536
 537        rc = __vfs_getxattr(root, root_inode, XATTR_NAME_SELINUX, NULL, 0);
 538        if (rc < 0 && rc != -ENODATA) {
 539                if (rc == -EOPNOTSUPP) {
 540                        pr_warn("SELinux: (dev %s, type %s) has no security xattr handler\n",
 541                                sb->s_id, sb->s_type->name);
 542                        goto fallback;
 543                } else {
 544                        pr_warn("SELinux: (dev %s, type %s) getxattr errno %d\n",
 545                                sb->s_id, sb->s_type->name, -rc);
 546                        return rc;
 547                }
 548        }
 549        return 0;
 550
 551fallback:
 552        /* No xattr support - try to fallback to genfs if possible. */
 553        rc = security_genfs_sid(&selinux_state, sb->s_type->name, "/",
 554                                SECCLASS_DIR, &sid);
 555        if (rc)
 556                return -EOPNOTSUPP;
 557
 558        pr_warn("SELinux: (dev %s, type %s) falling back to genfs\n",
 559                sb->s_id, sb->s_type->name);
 560        sbsec->behavior = SECURITY_FS_USE_GENFS;
 561        sbsec->sid = sid;
 562        return 0;
 563}
 564
 565static int sb_finish_set_opts(struct super_block *sb)
 566{
 567        struct superblock_security_struct *sbsec = selinux_superblock(sb);
 568        struct dentry *root = sb->s_root;
 569        struct inode *root_inode = d_backing_inode(root);
 570        int rc = 0;
 571
 572        if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
 573                rc = sb_check_xattr_support(sb);
 574                if (rc)
 575                        return rc;
 576        }
 577
 578        sbsec->flags |= SE_SBINITIALIZED;
 579
 580        /*
 581         * Explicitly set or clear SBLABEL_MNT.  It's not sufficient to simply
 582         * leave the flag untouched because sb_clone_mnt_opts might be handing
 583         * us a superblock that needs the flag to be cleared.
 584         */
 585        if (selinux_is_sblabel_mnt(sb))
 586                sbsec->flags |= SBLABEL_MNT;
 587        else
 588                sbsec->flags &= ~SBLABEL_MNT;
 589
 590        /* Initialize the root inode. */
 591        rc = inode_doinit_with_dentry(root_inode, root);
 592
 593        /* Initialize any other inodes associated with the superblock, e.g.
 594           inodes created prior to initial policy load or inodes created
 595           during get_sb by a pseudo filesystem that directly
 596           populates itself. */
 597        spin_lock(&sbsec->isec_lock);
 598        while (!list_empty(&sbsec->isec_head)) {
 599                struct inode_security_struct *isec =
 600                                list_first_entry(&sbsec->isec_head,
 601                                           struct inode_security_struct, list);
 602                struct inode *inode = isec->inode;
 603                list_del_init(&isec->list);
 604                spin_unlock(&sbsec->isec_lock);
 605                inode = igrab(inode);
 606                if (inode) {
 607                        if (!IS_PRIVATE(inode))
 608                                inode_doinit_with_dentry(inode, NULL);
 609                        iput(inode);
 610                }
 611                spin_lock(&sbsec->isec_lock);
 612        }
 613        spin_unlock(&sbsec->isec_lock);
 614        return rc;
 615}
 616
 617static int bad_option(struct superblock_security_struct *sbsec, char flag,
 618                      u32 old_sid, u32 new_sid)
 619{
 620        char mnt_flags = sbsec->flags & SE_MNTMASK;
 621
 622        /* check if the old mount command had the same options */
 623        if (sbsec->flags & SE_SBINITIALIZED)
 624                if (!(sbsec->flags & flag) ||
 625                    (old_sid != new_sid))
 626                        return 1;
 627
 628        /* check if we were passed the same options twice,
 629         * aka someone passed context=a,context=b
 630         */
 631        if (!(sbsec->flags & SE_SBINITIALIZED))
 632                if (mnt_flags & flag)
 633                        return 1;
 634        return 0;
 635}
 636
 637static int parse_sid(struct super_block *sb, const char *s, u32 *sid)
 638{
 639        int rc = security_context_str_to_sid(&selinux_state, s,
 640                                             sid, GFP_KERNEL);
 641        if (rc)
 642                pr_warn("SELinux: security_context_str_to_sid"
 643                       "(%s) failed for (dev %s, type %s) errno=%d\n",
 644                       s, sb->s_id, sb->s_type->name, rc);
 645        return rc;
 646}
 647
 648/*
 649 * Allow filesystems with binary mount data to explicitly set mount point
 650 * labeling information.
 651 */
 652static int selinux_set_mnt_opts(struct super_block *sb,
 653                                void *mnt_opts,
 654                                unsigned long kern_flags,
 655                                unsigned long *set_kern_flags)
 656{
 657        const struct cred *cred = current_cred();
 658        struct superblock_security_struct *sbsec = selinux_superblock(sb);
 659        struct dentry *root = sb->s_root;
 660        struct selinux_mnt_opts *opts = mnt_opts;
 661        struct inode_security_struct *root_isec;
 662        u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0;
 663        u32 defcontext_sid = 0;
 664        int rc = 0;
 665
 666        mutex_lock(&sbsec->lock);
 667
 668        if (!selinux_initialized(&selinux_state)) {
 669                if (!opts) {
 670                        /* Defer initialization until selinux_complete_init,
 671                           after the initial policy is loaded and the security
 672                           server is ready to handle calls. */
 673                        goto out;
 674                }
 675                rc = -EINVAL;
 676                pr_warn("SELinux: Unable to set superblock options "
 677                        "before the security server is initialized\n");
 678                goto out;
 679        }
 680        if (kern_flags && !set_kern_flags) {
 681                /* Specifying internal flags without providing a place to
 682                 * place the results is not allowed */
 683                rc = -EINVAL;
 684                goto out;
 685        }
 686
 687        /*
 688         * Binary mount data FS will come through this function twice.  Once
 689         * from an explicit call and once from the generic calls from the vfs.
 690         * Since the generic VFS calls will not contain any security mount data
 691         * we need to skip the double mount verification.
 692         *
 693         * This does open a hole in which we will not notice if the first
 694         * mount using this sb set explict options and a second mount using
 695         * this sb does not set any security options.  (The first options
 696         * will be used for both mounts)
 697         */
 698        if ((sbsec->flags & SE_SBINITIALIZED) && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
 699            && !opts)
 700                goto out;
 701
 702        root_isec = backing_inode_security_novalidate(root);
 703
 704        /*
 705         * parse the mount options, check if they are valid sids.
 706         * also check if someone is trying to mount the same sb more
 707         * than once with different security options.
 708         */
 709        if (opts) {
 710                if (opts->fscontext) {
 711                        rc = parse_sid(sb, opts->fscontext, &fscontext_sid);
 712                        if (rc)
 713                                goto out;
 714                        if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
 715                                        fscontext_sid))
 716                                goto out_double_mount;
 717                        sbsec->flags |= FSCONTEXT_MNT;
 718                }
 719                if (opts->context) {
 720                        rc = parse_sid(sb, opts->context, &context_sid);
 721                        if (rc)
 722                                goto out;
 723                        if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
 724                                        context_sid))
 725                                goto out_double_mount;
 726                        sbsec->flags |= CONTEXT_MNT;
 727                }
 728                if (opts->rootcontext) {
 729                        rc = parse_sid(sb, opts->rootcontext, &rootcontext_sid);
 730                        if (rc)
 731                                goto out;
 732                        if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
 733                                        rootcontext_sid))
 734                                goto out_double_mount;
 735                        sbsec->flags |= ROOTCONTEXT_MNT;
 736                }
 737                if (opts->defcontext) {
 738                        rc = parse_sid(sb, opts->defcontext, &defcontext_sid);
 739                        if (rc)
 740                                goto out;
 741                        if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
 742                                        defcontext_sid))
 743                                goto out_double_mount;
 744                        sbsec->flags |= DEFCONTEXT_MNT;
 745                }
 746        }
 747
 748        if (sbsec->flags & SE_SBINITIALIZED) {
 749                /* previously mounted with options, but not on this attempt? */
 750                if ((sbsec->flags & SE_MNTMASK) && !opts)
 751                        goto out_double_mount;
 752                rc = 0;
 753                goto out;
 754        }
 755
 756        if (strcmp(sb->s_type->name, "proc") == 0)
 757                sbsec->flags |= SE_SBPROC | SE_SBGENFS;
 758
 759        if (!strcmp(sb->s_type->name, "debugfs") ||
 760            !strcmp(sb->s_type->name, "tracefs") ||
 761            !strcmp(sb->s_type->name, "binder") ||
 762            !strcmp(sb->s_type->name, "bpf") ||
 763            !strcmp(sb->s_type->name, "pstore"))
 764                sbsec->flags |= SE_SBGENFS;
 765
 766        if (!strcmp(sb->s_type->name, "sysfs") ||
 767            !strcmp(sb->s_type->name, "cgroup") ||
 768            !strcmp(sb->s_type->name, "cgroup2"))
 769                sbsec->flags |= SE_SBGENFS | SE_SBGENFS_XATTR;
 770
 771        if (!sbsec->behavior) {
 772                /*
 773                 * Determine the labeling behavior to use for this
 774                 * filesystem type.
 775                 */
 776                rc = security_fs_use(&selinux_state, sb);
 777                if (rc) {
 778                        pr_warn("%s: security_fs_use(%s) returned %d\n",
 779                                        __func__, sb->s_type->name, rc);
 780                        goto out;
 781                }
 782        }
 783
 784        /*
 785         * If this is a user namespace mount and the filesystem type is not
 786         * explicitly whitelisted, then no contexts are allowed on the command
 787         * line and security labels must be ignored.
 788         */
 789        if (sb->s_user_ns != &init_user_ns &&
 790            strcmp(sb->s_type->name, "tmpfs") &&
 791            strcmp(sb->s_type->name, "ramfs") &&
 792            strcmp(sb->s_type->name, "devpts") &&
 793            strcmp(sb->s_type->name, "overlay")) {
 794                if (context_sid || fscontext_sid || rootcontext_sid ||
 795                    defcontext_sid) {
 796                        rc = -EACCES;
 797                        goto out;
 798                }
 799                if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
 800                        sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
 801                        rc = security_transition_sid(&selinux_state,
 802                                                     current_sid(),
 803                                                     current_sid(),
 804                                                     SECCLASS_FILE, NULL,
 805                                                     &sbsec->mntpoint_sid);
 806                        if (rc)
 807                                goto out;
 808                }
 809                goto out_set_opts;
 810        }
 811
 812        /* sets the context of the superblock for the fs being mounted. */
 813        if (fscontext_sid) {
 814                rc = may_context_mount_sb_relabel(fscontext_sid, sbsec, cred);
 815                if (rc)
 816                        goto out;
 817
 818                sbsec->sid = fscontext_sid;
 819        }
 820
 821        /*
 822         * Switch to using mount point labeling behavior.
 823         * sets the label used on all file below the mountpoint, and will set
 824         * the superblock context if not already set.
 825         */
 826        if (kern_flags & SECURITY_LSM_NATIVE_LABELS && !context_sid) {
 827                sbsec->behavior = SECURITY_FS_USE_NATIVE;
 828                *set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
 829        }
 830
 831        if (context_sid) {
 832                if (!fscontext_sid) {
 833                        rc = may_context_mount_sb_relabel(context_sid, sbsec,
 834                                                          cred);
 835                        if (rc)
 836                                goto out;
 837                        sbsec->sid = context_sid;
 838                } else {
 839                        rc = may_context_mount_inode_relabel(context_sid, sbsec,
 840                                                             cred);
 841                        if (rc)
 842                                goto out;
 843                }
 844                if (!rootcontext_sid)
 845                        rootcontext_sid = context_sid;
 846
 847                sbsec->mntpoint_sid = context_sid;
 848                sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
 849        }
 850
 851        if (rootcontext_sid) {
 852                rc = may_context_mount_inode_relabel(rootcontext_sid, sbsec,
 853                                                     cred);
 854                if (rc)
 855                        goto out;
 856
 857                root_isec->sid = rootcontext_sid;
 858                root_isec->initialized = LABEL_INITIALIZED;
 859        }
 860
 861        if (defcontext_sid) {
 862                if (sbsec->behavior != SECURITY_FS_USE_XATTR &&
 863                        sbsec->behavior != SECURITY_FS_USE_NATIVE) {
 864                        rc = -EINVAL;
 865                        pr_warn("SELinux: defcontext option is "
 866                               "invalid for this filesystem type\n");
 867                        goto out;
 868                }
 869
 870                if (defcontext_sid != sbsec->def_sid) {
 871                        rc = may_context_mount_inode_relabel(defcontext_sid,
 872                                                             sbsec, cred);
 873                        if (rc)
 874                                goto out;
 875                }
 876
 877                sbsec->def_sid = defcontext_sid;
 878        }
 879
 880out_set_opts:
 881        rc = sb_finish_set_opts(sb);
 882out:
 883        mutex_unlock(&sbsec->lock);
 884        return rc;
 885out_double_mount:
 886        rc = -EINVAL;
 887        pr_warn("SELinux: mount invalid.  Same superblock, different "
 888               "security settings for (dev %s, type %s)\n", sb->s_id,
 889               sb->s_type->name);
 890        goto out;
 891}
 892
 893static int selinux_cmp_sb_context(const struct super_block *oldsb,
 894                                    const struct super_block *newsb)
 895{
 896        struct superblock_security_struct *old = selinux_superblock(oldsb);
 897        struct superblock_security_struct *new = selinux_superblock(newsb);
 898        char oldflags = old->flags & SE_MNTMASK;
 899        char newflags = new->flags & SE_MNTMASK;
 900
 901        if (oldflags != newflags)
 902                goto mismatch;
 903        if ((oldflags & FSCONTEXT_MNT) && old->sid != new->sid)
 904                goto mismatch;
 905        if ((oldflags & CONTEXT_MNT) && old->mntpoint_sid != new->mntpoint_sid)
 906                goto mismatch;
 907        if ((oldflags & DEFCONTEXT_MNT) && old->def_sid != new->def_sid)
 908                goto mismatch;
 909        if (oldflags & ROOTCONTEXT_MNT) {
 910                struct inode_security_struct *oldroot = backing_inode_security(oldsb->s_root);
 911                struct inode_security_struct *newroot = backing_inode_security(newsb->s_root);
 912                if (oldroot->sid != newroot->sid)
 913                        goto mismatch;
 914        }
 915        return 0;
 916mismatch:
 917        pr_warn("SELinux: mount invalid.  Same superblock, "
 918                            "different security settings for (dev %s, "
 919                            "type %s)\n", newsb->s_id, newsb->s_type->name);
 920        return -EBUSY;
 921}
 922
 923static int selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
 924                                        struct super_block *newsb,
 925                                        unsigned long kern_flags,
 926                                        unsigned long *set_kern_flags)
 927{
 928        int rc = 0;
 929        const struct superblock_security_struct *oldsbsec =
 930                                                selinux_superblock(oldsb);
 931        struct superblock_security_struct *newsbsec = selinux_superblock(newsb);
 932
 933        int set_fscontext =     (oldsbsec->flags & FSCONTEXT_MNT);
 934        int set_context =       (oldsbsec->flags & CONTEXT_MNT);
 935        int set_rootcontext =   (oldsbsec->flags & ROOTCONTEXT_MNT);
 936
 937        /*
 938         * if the parent was able to be mounted it clearly had no special lsm
 939         * mount options.  thus we can safely deal with this superblock later
 940         */
 941        if (!selinux_initialized(&selinux_state))
 942                return 0;
 943
 944        /*
 945         * Specifying internal flags without providing a place to
 946         * place the results is not allowed.
 947         */
 948        if (kern_flags && !set_kern_flags)
 949                return -EINVAL;
 950
 951        /* how can we clone if the old one wasn't set up?? */
 952        BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED));
 953
 954        /* if fs is reusing a sb, make sure that the contexts match */
 955        if (newsbsec->flags & SE_SBINITIALIZED) {
 956                if ((kern_flags & SECURITY_LSM_NATIVE_LABELS) && !set_context)
 957                        *set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
 958                return selinux_cmp_sb_context(oldsb, newsb);
 959        }
 960
 961        mutex_lock(&newsbsec->lock);
 962
 963        newsbsec->flags = oldsbsec->flags;
 964
 965        newsbsec->sid = oldsbsec->sid;
 966        newsbsec->def_sid = oldsbsec->def_sid;
 967        newsbsec->behavior = oldsbsec->behavior;
 968
 969        if (newsbsec->behavior == SECURITY_FS_USE_NATIVE &&
 970                !(kern_flags & SECURITY_LSM_NATIVE_LABELS) && !set_context) {
 971                rc = security_fs_use(&selinux_state, newsb);
 972                if (rc)
 973                        goto out;
 974        }
 975
 976        if (kern_flags & SECURITY_LSM_NATIVE_LABELS && !set_context) {
 977                newsbsec->behavior = SECURITY_FS_USE_NATIVE;
 978                *set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
 979        }
 980
 981        if (set_context) {
 982                u32 sid = oldsbsec->mntpoint_sid;
 983
 984                if (!set_fscontext)
 985                        newsbsec->sid = sid;
 986                if (!set_rootcontext) {
 987                        struct inode_security_struct *newisec = backing_inode_security(newsb->s_root);
 988                        newisec->sid = sid;
 989                }
 990                newsbsec->mntpoint_sid = sid;
 991        }
 992        if (set_rootcontext) {
 993                const struct inode_security_struct *oldisec = backing_inode_security(oldsb->s_root);
 994                struct inode_security_struct *newisec = backing_inode_security(newsb->s_root);
 995
 996                newisec->sid = oldisec->sid;
 997        }
 998
 999        sb_finish_set_opts(newsb);
1000out:
1001        mutex_unlock(&newsbsec->lock);
1002        return rc;
1003}
1004
1005static int selinux_add_opt(int token, const char *s, void **mnt_opts)
1006{
1007        struct selinux_mnt_opts *opts = *mnt_opts;
1008
1009        if (token == Opt_seclabel)      /* eaten and completely ignored */
1010                return 0;
1011
1012        if (!opts) {
1013                opts = kzalloc(sizeof(struct selinux_mnt_opts), GFP_KERNEL);
1014                if (!opts)
1015                        return -ENOMEM;
1016                *mnt_opts = opts;
1017        }
1018        if (!s)
1019                return -ENOMEM;
1020        switch (token) {
1021        case Opt_context:
1022                if (opts->context || opts->defcontext)
1023                        goto Einval;
1024                opts->context = s;
1025                break;
1026        case Opt_fscontext:
1027                if (opts->fscontext)
1028                        goto Einval;
1029                opts->fscontext = s;
1030                break;
1031        case Opt_rootcontext:
1032                if (opts->rootcontext)
1033                        goto Einval;
1034                opts->rootcontext = s;
1035                break;
1036        case Opt_defcontext:
1037                if (opts->context || opts->defcontext)
1038                        goto Einval;
1039                opts->defcontext = s;
1040                break;
1041        }
1042        return 0;
1043Einval:
1044        pr_warn(SEL_MOUNT_FAIL_MSG);
1045        return -EINVAL;
1046}
1047
1048static int selinux_add_mnt_opt(const char *option, const char *val, int len,
1049                               void **mnt_opts)
1050{
1051        int token = Opt_error;
1052        int rc, i;
1053
1054        for (i = 0; i < ARRAY_SIZE(tokens); i++) {
1055                if (strcmp(option, tokens[i].name) == 0) {
1056                        token = tokens[i].opt;
1057                        break;
1058                }
1059        }
1060
1061        if (token == Opt_error)
1062                return -EINVAL;
1063
1064        if (token != Opt_seclabel) {
1065                val = kmemdup_nul(val, len, GFP_KERNEL);
1066                if (!val) {
1067                        rc = -ENOMEM;
1068                        goto free_opt;
1069                }
1070        }
1071        rc = selinux_add_opt(token, val, mnt_opts);
1072        if (unlikely(rc)) {
1073                kfree(val);
1074                goto free_opt;
1075        }
1076        return rc;
1077
1078free_opt:
1079        if (*mnt_opts) {
1080                selinux_free_mnt_opts(*mnt_opts);
1081                *mnt_opts = NULL;
1082        }
1083        return rc;
1084}
1085
1086static int show_sid(struct seq_file *m, u32 sid)
1087{
1088        char *context = NULL;
1089        u32 len;
1090        int rc;
1091
1092        rc = security_sid_to_context(&selinux_state, sid,
1093                                             &context, &len);
1094        if (!rc) {
1095                bool has_comma = context && strchr(context, ',');
1096
1097                seq_putc(m, '=');
1098                if (has_comma)
1099                        seq_putc(m, '\"');
1100                seq_escape(m, context, "\"\n\\");
1101                if (has_comma)
1102                        seq_putc(m, '\"');
1103        }
1104        kfree(context);
1105        return rc;
1106}
1107
1108static int selinux_sb_show_options(struct seq_file *m, struct super_block *sb)
1109{
1110        struct superblock_security_struct *sbsec = selinux_superblock(sb);
1111        int rc;
1112
1113        if (!(sbsec->flags & SE_SBINITIALIZED))
1114                return 0;
1115
1116        if (!selinux_initialized(&selinux_state))
1117                return 0;
1118
1119        if (sbsec->flags & FSCONTEXT_MNT) {
1120                seq_putc(m, ',');
1121                seq_puts(m, FSCONTEXT_STR);
1122                rc = show_sid(m, sbsec->sid);
1123                if (rc)
1124                        return rc;
1125        }
1126        if (sbsec->flags & CONTEXT_MNT) {
1127                seq_putc(m, ',');
1128                seq_puts(m, CONTEXT_STR);
1129                rc = show_sid(m, sbsec->mntpoint_sid);
1130                if (rc)
1131                        return rc;
1132        }
1133        if (sbsec->flags & DEFCONTEXT_MNT) {
1134                seq_putc(m, ',');
1135                seq_puts(m, DEFCONTEXT_STR);
1136                rc = show_sid(m, sbsec->def_sid);
1137                if (rc)
1138                        return rc;
1139        }
1140        if (sbsec->flags & ROOTCONTEXT_MNT) {
1141                struct dentry *root = sb->s_root;
1142                struct inode_security_struct *isec = backing_inode_security(root);
1143                seq_putc(m, ',');
1144                seq_puts(m, ROOTCONTEXT_STR);
1145                rc = show_sid(m, isec->sid);
1146                if (rc)
1147                        return rc;
1148        }
1149        if (sbsec->flags & SBLABEL_MNT) {
1150                seq_putc(m, ',');
1151                seq_puts(m, SECLABEL_STR);
1152        }
1153        return 0;
1154}
1155
1156static inline u16 inode_mode_to_security_class(umode_t mode)
1157{
1158        switch (mode & S_IFMT) {
1159        case S_IFSOCK:
1160                return SECCLASS_SOCK_FILE;
1161        case S_IFLNK:
1162                return SECCLASS_LNK_FILE;
1163        case S_IFREG:
1164                return SECCLASS_FILE;
1165        case S_IFBLK:
1166                return SECCLASS_BLK_FILE;
1167        case S_IFDIR:
1168                return SECCLASS_DIR;
1169        case S_IFCHR:
1170                return SECCLASS_CHR_FILE;
1171        case S_IFIFO:
1172                return SECCLASS_FIFO_FILE;
1173
1174        }
1175
1176        return SECCLASS_FILE;
1177}
1178
1179static inline int default_protocol_stream(int protocol)
1180{
1181        return (protocol == IPPROTO_IP || protocol == IPPROTO_TCP ||
1182                protocol == IPPROTO_MPTCP);
1183}
1184
1185static inline int default_protocol_dgram(int protocol)
1186{
1187        return (protocol == IPPROTO_IP || protocol == IPPROTO_UDP);
1188}
1189
1190static inline u16 socket_type_to_security_class(int family, int type, int protocol)
1191{
1192        int extsockclass = selinux_policycap_extsockclass();
1193
1194        switch (family) {
1195        case PF_UNIX:
1196                switch (type) {
1197                case SOCK_STREAM:
1198                case SOCK_SEQPACKET:
1199                        return SECCLASS_UNIX_STREAM_SOCKET;
1200                case SOCK_DGRAM:
1201                case SOCK_RAW:
1202                        return SECCLASS_UNIX_DGRAM_SOCKET;
1203                }
1204                break;
1205        case PF_INET:
1206        case PF_INET6:
1207                switch (type) {
1208                case SOCK_STREAM:
1209                case SOCK_SEQPACKET:
1210                        if (default_protocol_stream(protocol))
1211                                return SECCLASS_TCP_SOCKET;
1212                        else if (extsockclass && protocol == IPPROTO_SCTP)
1213                                return SECCLASS_SCTP_SOCKET;
1214                        else
1215                                return SECCLASS_RAWIP_SOCKET;
1216                case SOCK_DGRAM:
1217                        if (default_protocol_dgram(protocol))
1218                                return SECCLASS_UDP_SOCKET;
1219                        else if (extsockclass && (protocol == IPPROTO_ICMP ||
1220                                                  protocol == IPPROTO_ICMPV6))
1221                                return SECCLASS_ICMP_SOCKET;
1222                        else
1223                                return SECCLASS_RAWIP_SOCKET;
1224                case SOCK_DCCP:
1225                        return SECCLASS_DCCP_SOCKET;
1226                default:
1227                        return SECCLASS_RAWIP_SOCKET;
1228                }
1229                break;
1230        case PF_NETLINK:
1231                switch (protocol) {
1232                case NETLINK_ROUTE:
1233                        return SECCLASS_NETLINK_ROUTE_SOCKET;
1234                case NETLINK_SOCK_DIAG:
1235                        return SECCLASS_NETLINK_TCPDIAG_SOCKET;
1236                case NETLINK_NFLOG:
1237                        return SECCLASS_NETLINK_NFLOG_SOCKET;
1238                case NETLINK_XFRM:
1239                        return SECCLASS_NETLINK_XFRM_SOCKET;
1240                case NETLINK_SELINUX:
1241                        return SECCLASS_NETLINK_SELINUX_SOCKET;
1242                case NETLINK_ISCSI:
1243                        return SECCLASS_NETLINK_ISCSI_SOCKET;
1244                case NETLINK_AUDIT:
1245                        return SECCLASS_NETLINK_AUDIT_SOCKET;
1246                case NETLINK_FIB_LOOKUP:
1247                        return SECCLASS_NETLINK_FIB_LOOKUP_SOCKET;
1248                case NETLINK_CONNECTOR:
1249                        return SECCLASS_NETLINK_CONNECTOR_SOCKET;
1250                case NETLINK_NETFILTER:
1251                        return SECCLASS_NETLINK_NETFILTER_SOCKET;
1252                case NETLINK_DNRTMSG:
1253                        return SECCLASS_NETLINK_DNRT_SOCKET;
1254                case NETLINK_KOBJECT_UEVENT:
1255                        return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET;
1256                case NETLINK_GENERIC:
1257                        return SECCLASS_NETLINK_GENERIC_SOCKET;
1258                case NETLINK_SCSITRANSPORT:
1259                        return SECCLASS_NETLINK_SCSITRANSPORT_SOCKET;
1260                case NETLINK_RDMA:
1261                        return SECCLASS_NETLINK_RDMA_SOCKET;
1262                case NETLINK_CRYPTO:
1263                        return SECCLASS_NETLINK_CRYPTO_SOCKET;
1264                default:
1265                        return SECCLASS_NETLINK_SOCKET;
1266                }
1267        case PF_PACKET:
1268                return SECCLASS_PACKET_SOCKET;
1269        case PF_KEY:
1270                return SECCLASS_KEY_SOCKET;
1271        case PF_APPLETALK:
1272                return SECCLASS_APPLETALK_SOCKET;
1273        }
1274
1275        if (extsockclass) {
1276                switch (family) {
1277                case PF_AX25:
1278                        return SECCLASS_AX25_SOCKET;
1279                case PF_IPX:
1280                        return SECCLASS_IPX_SOCKET;
1281                case PF_NETROM:
1282                        return SECCLASS_NETROM_SOCKET;
1283                case PF_ATMPVC:
1284                        return SECCLASS_ATMPVC_SOCKET;
1285                case PF_X25:
1286                        return SECCLASS_X25_SOCKET;
1287                case PF_ROSE:
1288                        return SECCLASS_ROSE_SOCKET;
1289                case PF_DECnet:
1290                        return SECCLASS_DECNET_SOCKET;
1291                case PF_ATMSVC:
1292                        return SECCLASS_ATMSVC_SOCKET;
1293                case PF_RDS:
1294                        return SECCLASS_RDS_SOCKET;
1295                case PF_IRDA:
1296                        return SECCLASS_IRDA_SOCKET;
1297                case PF_PPPOX:
1298                        return SECCLASS_PPPOX_SOCKET;
1299                case PF_LLC:
1300                        return SECCLASS_LLC_SOCKET;
1301                case PF_CAN:
1302                        return SECCLASS_CAN_SOCKET;
1303                case PF_TIPC:
1304                        return SECCLASS_TIPC_SOCKET;
1305                case PF_BLUETOOTH:
1306                        return SECCLASS_BLUETOOTH_SOCKET;
1307                case PF_IUCV:
1308                        return SECCLASS_IUCV_SOCKET;
1309                case PF_RXRPC:
1310                        return SECCLASS_RXRPC_SOCKET;
1311                case PF_ISDN:
1312                        return SECCLASS_ISDN_SOCKET;
1313                case PF_PHONET:
1314                        return SECCLASS_PHONET_SOCKET;
1315                case PF_IEEE802154:
1316                        return SECCLASS_IEEE802154_SOCKET;
1317                case PF_CAIF:
1318                        return SECCLASS_CAIF_SOCKET;
1319                case PF_ALG:
1320                        return SECCLASS_ALG_SOCKET;
1321                case PF_NFC:
1322                        return SECCLASS_NFC_SOCKET;
1323                case PF_VSOCK:
1324                        return SECCLASS_VSOCK_SOCKET;
1325                case PF_KCM:
1326                        return SECCLASS_KCM_SOCKET;
1327                case PF_QIPCRTR:
1328                        return SECCLASS_QIPCRTR_SOCKET;
1329                case PF_SMC:
1330                        return SECCLASS_SMC_SOCKET;
1331                case PF_XDP:
1332                        return SECCLASS_XDP_SOCKET;
1333                case PF_MCTP:
1334                        return SECCLASS_MCTP_SOCKET;
1335#if PF_MAX > 46
1336#error New address family defined, please update this function.
1337#endif
1338                }
1339        }
1340
1341        return SECCLASS_SOCKET;
1342}
1343
1344static int selinux_genfs_get_sid(struct dentry *dentry,
1345                                 u16 tclass,
1346                                 u16 flags,
1347                                 u32 *sid)
1348{
1349        int rc;
1350        struct super_block *sb = dentry->d_sb;
1351        char *buffer, *path;
1352
1353        buffer = (char *)__get_free_page(GFP_KERNEL);
1354        if (!buffer)
1355                return -ENOMEM;
1356
1357        path = dentry_path_raw(dentry, buffer, PAGE_SIZE);
1358        if (IS_ERR(path))
1359                rc = PTR_ERR(path);
1360        else {
1361                if (flags & SE_SBPROC) {
1362                        /* each process gets a /proc/PID/ entry. Strip off the
1363                         * PID part to get a valid selinux labeling.
1364                         * e.g. /proc/1/net/rpc/nfs -> /net/rpc/nfs */
1365                        while (path[1] >= '0' && path[1] <= '9') {
1366                                path[1] = '/';
1367                                path++;
1368                        }
1369                }
1370                rc = security_genfs_sid(&selinux_state, sb->s_type->name,
1371                                        path, tclass, sid);
1372                if (rc == -ENOENT) {
1373                        /* No match in policy, mark as unlabeled. */
1374                        *sid = SECINITSID_UNLABELED;
1375                        rc = 0;
1376                }
1377        }
1378        free_page((unsigned long)buffer);
1379        return rc;
1380}
1381
1382static int inode_doinit_use_xattr(struct inode *inode, struct dentry *dentry,
1383                                  u32 def_sid, u32 *sid)
1384{
1385#define INITCONTEXTLEN 255
1386        char *context;
1387        unsigned int len;
1388        int rc;
1389
1390        len = INITCONTEXTLEN;
1391        context = kmalloc(len + 1, GFP_NOFS);
1392        if (!context)
1393                return -ENOMEM;
1394
1395        context[len] = '\0';
1396        rc = __vfs_getxattr(dentry, inode, XATTR_NAME_SELINUX, context, len);
1397        if (rc == -ERANGE) {
1398                kfree(context);
1399
1400                /* Need a larger buffer.  Query for the right size. */
1401                rc = __vfs_getxattr(dentry, inode, XATTR_NAME_SELINUX, NULL, 0);
1402                if (rc < 0)
1403                        return rc;
1404
1405                len = rc;
1406                context = kmalloc(len + 1, GFP_NOFS);
1407                if (!context)
1408                        return -ENOMEM;
1409
1410                context[len] = '\0';
1411                rc = __vfs_getxattr(dentry, inode, XATTR_NAME_SELINUX,
1412                                    context, len);
1413        }
1414        if (rc < 0) {
1415                kfree(context);
1416                if (rc != -ENODATA) {
1417                        pr_warn("SELinux: %s:  getxattr returned %d for dev=%s ino=%ld\n",
1418                                __func__, -rc, inode->i_sb->s_id, inode->i_ino);
1419                        return rc;
1420                }
1421                *sid = def_sid;
1422                return 0;
1423        }
1424
1425        rc = security_context_to_sid_default(&selinux_state, context, rc, sid,
1426                                             def_sid, GFP_NOFS);
1427        if (rc) {
1428                char *dev = inode->i_sb->s_id;
1429                unsigned long ino = inode->i_ino;
1430
1431                if (rc == -EINVAL) {
1432                        pr_notice_ratelimited("SELinux: inode=%lu on dev=%s was found to have an invalid context=%s.  This indicates you may need to relabel the inode or the filesystem in question.\n",
1433                                              ino, dev, context);
1434                } else {
1435                        pr_warn("SELinux: %s:  context_to_sid(%s) returned %d for dev=%s ino=%ld\n",
1436                                __func__, context, -rc, dev, ino);
1437                }
1438        }
1439        kfree(context);
1440        return 0;
1441}
1442
1443/* The inode's security attributes must be initialized before first use. */
1444static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
1445{
1446        struct superblock_security_struct *sbsec = NULL;
1447        struct inode_security_struct *isec = selinux_inode(inode);
1448        u32 task_sid, sid = 0;
1449        u16 sclass;
1450        struct dentry *dentry;
1451        int rc = 0;
1452
1453        if (isec->initialized == LABEL_INITIALIZED)
1454                return 0;
1455
1456        spin_lock(&isec->lock);
1457        if (isec->initialized == LABEL_INITIALIZED)
1458                goto out_unlock;
1459
1460        if (isec->sclass == SECCLASS_FILE)
1461                isec->sclass = inode_mode_to_security_class(inode->i_mode);
1462
1463        sbsec = selinux_superblock(inode->i_sb);
1464        if (!(sbsec->flags & SE_SBINITIALIZED)) {
1465                /* Defer initialization until selinux_complete_init,
1466                   after the initial policy is loaded and the security
1467                   server is ready to handle calls. */
1468                spin_lock(&sbsec->isec_lock);
1469                if (list_empty(&isec->list))
1470                        list_add(&isec->list, &sbsec->isec_head);
1471                spin_unlock(&sbsec->isec_lock);
1472                goto out_unlock;
1473        }
1474
1475        sclass = isec->sclass;
1476        task_sid = isec->task_sid;
1477        sid = isec->sid;
1478        isec->initialized = LABEL_PENDING;
1479        spin_unlock(&isec->lock);
1480
1481        switch (sbsec->behavior) {
1482        case SECURITY_FS_USE_NATIVE:
1483                break;
1484        case SECURITY_FS_USE_XATTR:
1485                if (!(inode->i_opflags & IOP_XATTR)) {
1486                        sid = sbsec->def_sid;
1487                        break;
1488                }
1489                /* Need a dentry, since the xattr API requires one.
1490                   Life would be simpler if we could just pass the inode. */
1491                if (opt_dentry) {
1492                        /* Called from d_instantiate or d_splice_alias. */
1493                        dentry = dget(opt_dentry);
1494                } else {
1495                        /*
1496                         * Called from selinux_complete_init, try to find a dentry.
1497                         * Some filesystems really want a connected one, so try
1498                         * that first.  We could split SECURITY_FS_USE_XATTR in
1499                         * two, depending upon that...
1500                         */
1501                        dentry = d_find_alias(inode);
1502                        if (!dentry)
1503                                dentry = d_find_any_alias(inode);
1504                }
1505                if (!dentry) {
1506                        /*
1507                         * this is can be hit on boot when a file is accessed
1508                         * before the policy is loaded.  When we load policy we
1509                         * may find inodes that have no dentry on the
1510                         * sbsec->isec_head list.  No reason to complain as these
1511                         * will get fixed up the next time we go through
1512                         * inode_doinit with a dentry, before these inodes could
1513                         * be used again by userspace.
1514                         */
1515                        goto out_invalid;
1516                }
1517
1518                rc = inode_doinit_use_xattr(inode, dentry, sbsec->def_sid,
1519                                            &sid);
1520                dput(dentry);
1521                if (rc)
1522                        goto out;
1523                break;
1524        case SECURITY_FS_USE_TASK:
1525                sid = task_sid;
1526                break;
1527        case SECURITY_FS_USE_TRANS:
1528                /* Default to the fs SID. */
1529                sid = sbsec->sid;
1530
1531                /* Try to obtain a transition SID. */
1532                rc = security_transition_sid(&selinux_state, task_sid, sid,
1533                                             sclass, NULL, &sid);
1534                if (rc)
1535                        goto out;
1536                break;
1537        case SECURITY_FS_USE_MNTPOINT:
1538                sid = sbsec->mntpoint_sid;
1539                break;
1540        default:
1541                /* Default to the fs superblock SID. */
1542                sid = sbsec->sid;
1543
1544                if ((sbsec->flags & SE_SBGENFS) &&
1545                     (!S_ISLNK(inode->i_mode) ||
1546                      selinux_policycap_genfs_seclabel_symlinks())) {
1547                        /* We must have a dentry to determine the label on
1548                         * procfs inodes */
1549                        if (opt_dentry) {
1550                                /* Called from d_instantiate or
1551                                 * d_splice_alias. */
1552                                dentry = dget(opt_dentry);
1553                        } else {
1554                                /* Called from selinux_complete_init, try to
1555                                 * find a dentry.  Some filesystems really want
1556                                 * a connected one, so try that first.
1557                                 */
1558                                dentry = d_find_alias(inode);
1559                                if (!dentry)
1560                                        dentry = d_find_any_alias(inode);
1561                        }
1562                        /*
1563                         * This can be hit on boot when a file is accessed
1564                         * before the policy is loaded.  When we load policy we
1565                         * may find inodes that have no dentry on the
1566                         * sbsec->isec_head list.  No reason to complain as
1567                         * these will get fixed up the next time we go through
1568                         * inode_doinit() with a dentry, before these inodes
1569                         * could be used again by userspace.
1570                         */
1571                        if (!dentry)
1572                                goto out_invalid;
1573                        rc = selinux_genfs_get_sid(dentry, sclass,
1574                                                   sbsec->flags, &sid);
1575                        if (rc) {
1576                                dput(dentry);
1577                                goto out;
1578                        }
1579
1580                        if ((sbsec->flags & SE_SBGENFS_XATTR) &&
1581                            (inode->i_opflags & IOP_XATTR)) {
1582                                rc = inode_doinit_use_xattr(inode, dentry,
1583                                                            sid, &sid);
1584                                if (rc) {
1585                                        dput(dentry);
1586                                        goto out;
1587                                }
1588                        }
1589                        dput(dentry);
1590                }
1591                break;
1592        }
1593
1594out:
1595        spin_lock(&isec->lock);
1596        if (isec->initialized == LABEL_PENDING) {
1597                if (rc) {
1598                        isec->initialized = LABEL_INVALID;
1599                        goto out_unlock;
1600                }
1601                isec->initialized = LABEL_INITIALIZED;
1602                isec->sid = sid;
1603        }
1604
1605out_unlock:
1606        spin_unlock(&isec->lock);
1607        return rc;
1608
1609out_invalid:
1610        spin_lock(&isec->lock);
1611        if (isec->initialized == LABEL_PENDING) {
1612                isec->initialized = LABEL_INVALID;
1613                isec->sid = sid;
1614        }
1615        spin_unlock(&isec->lock);
1616        return 0;
1617}
1618
1619/* Convert a Linux signal to an access vector. */
1620static inline u32 signal_to_av(int sig)
1621{
1622        u32 perm = 0;
1623
1624        switch (sig) {
1625        case SIGCHLD:
1626                /* Commonly granted from child to parent. */
1627                perm = PROCESS__SIGCHLD;
1628                break;
1629        case SIGKILL:
1630                /* Cannot be caught or ignored */
1631                perm = PROCESS__SIGKILL;
1632                break;
1633        case SIGSTOP:
1634                /* Cannot be caught or ignored */
1635                perm = PROCESS__SIGSTOP;
1636                break;
1637        default:
1638                /* All other signals. */
1639                perm = PROCESS__SIGNAL;
1640                break;
1641        }
1642
1643        return perm;
1644}
1645
1646#if CAP_LAST_CAP > 63
1647#error Fix SELinux to handle capabilities > 63.
1648#endif
1649
1650/* Check whether a task is allowed to use a capability. */
1651static int cred_has_capability(const struct cred *cred,
1652                               int cap, unsigned int opts, bool initns)
1653{
1654        struct common_audit_data ad;
1655        struct av_decision avd;
1656        u16 sclass;
1657        u32 sid = cred_sid(cred);
1658        u32 av = CAP_TO_MASK(cap);
1659        int rc;
1660
1661        ad.type = LSM_AUDIT_DATA_CAP;
1662        ad.u.cap = cap;
1663
1664        switch (CAP_TO_INDEX(cap)) {
1665        case 0:
1666                sclass = initns ? SECCLASS_CAPABILITY : SECCLASS_CAP_USERNS;
1667                break;
1668        case 1:
1669                sclass = initns ? SECCLASS_CAPABILITY2 : SECCLASS_CAP2_USERNS;
1670                break;
1671        default:
1672                pr_err("SELinux:  out of range capability %d\n", cap);
1673                BUG();
1674                return -EINVAL;
1675        }
1676
1677        rc = avc_has_perm_noaudit(&selinux_state,
1678                                  sid, sid, sclass, av, 0, &avd);
1679        if (!(opts & CAP_OPT_NOAUDIT)) {
1680                int rc2 = avc_audit(&selinux_state,
1681                                    sid, sid, sclass, av, &avd, rc, &ad);
1682                if (rc2)
1683                        return rc2;
1684        }
1685        return rc;
1686}
1687
1688/* Check whether a task has a particular permission to an inode.
1689   The 'adp' parameter is optional and allows other audit
1690   data to be passed (e.g. the dentry). */
1691static int inode_has_perm(const struct cred *cred,
1692                          struct inode *inode,
1693                          u32 perms,
1694                          struct common_audit_data *adp)
1695{
1696        struct inode_security_struct *isec;
1697        u32 sid;
1698
1699        validate_creds(cred);
1700
1701        if (unlikely(IS_PRIVATE(inode)))
1702                return 0;
1703
1704        sid = cred_sid(cred);
1705        isec = selinux_inode(inode);
1706
1707        return avc_has_perm(&selinux_state,
1708                            sid, isec->sid, isec->sclass, perms, adp);
1709}
1710
1711/* Same as inode_has_perm, but pass explicit audit data containing
1712   the dentry to help the auditing code to more easily generate the
1713   pathname if needed. */
1714static inline int dentry_has_perm(const struct cred *cred,
1715                                  struct dentry *dentry,
1716                                  u32 av)
1717{
1718        struct inode *inode = d_backing_inode(dentry);
1719        struct common_audit_data ad;
1720
1721        ad.type = LSM_AUDIT_DATA_DENTRY;
1722        ad.u.dentry = dentry;
1723        __inode_security_revalidate(inode, dentry, true);
1724        return inode_has_perm(cred, inode, av, &ad);
1725}
1726
1727/* Same as inode_has_perm, but pass explicit audit data containing
1728   the path to help the auditing code to more easily generate the
1729   pathname if needed. */
1730static inline int path_has_perm(const struct cred *cred,
1731                                const struct path *path,
1732                                u32 av)
1733{
1734        struct inode *inode = d_backing_inode(path->dentry);
1735        struct common_audit_data ad;
1736
1737        ad.type = LSM_AUDIT_DATA_PATH;
1738        ad.u.path = *path;
1739        __inode_security_revalidate(inode, path->dentry, true);
1740        return inode_has_perm(cred, inode, av, &ad);
1741}
1742
1743/* Same as path_has_perm, but uses the inode from the file struct. */
1744static inline int file_path_has_perm(const struct cred *cred,
1745                                     struct file *file,
1746                                     u32 av)
1747{
1748        struct common_audit_data ad;
1749
1750        ad.type = LSM_AUDIT_DATA_FILE;
1751        ad.u.file = file;
1752        return inode_has_perm(cred, file_inode(file), av, &ad);
1753}
1754
1755#ifdef CONFIG_BPF_SYSCALL
1756static int bpf_fd_pass(struct file *file, u32 sid);
1757#endif
1758
1759/* Check whether a task can use an open file descriptor to
1760   access an inode in a given way.  Check access to the
1761   descriptor itself, and then use dentry_has_perm to
1762   check a particular permission to the file.
1763   Access to the descriptor is implicitly granted if it
1764   has the same SID as the process.  If av is zero, then
1765   access to the file is not checked, e.g. for cases
1766   where only the descriptor is affected like seek. */
1767static int file_has_perm(const struct cred *cred,
1768                         struct file *file,
1769                         u32 av)
1770{
1771        struct file_security_struct *fsec = selinux_file(file);
1772        struct inode *inode = file_inode(file);
1773        struct common_audit_data ad;
1774        u32 sid = cred_sid(cred);
1775        int rc;
1776
1777        ad.type = LSM_AUDIT_DATA_FILE;
1778        ad.u.file = file;
1779
1780        if (sid != fsec->sid) {
1781                rc = avc_has_perm(&selinux_state,
1782                                  sid, fsec->sid,
1783                                  SECCLASS_FD,
1784                                  FD__USE,
1785                                  &ad);
1786                if (rc)
1787                        goto out;
1788        }
1789
1790#ifdef CONFIG_BPF_SYSCALL
1791        rc = bpf_fd_pass(file, cred_sid(cred));
1792        if (rc)
1793                return rc;
1794#endif
1795
1796        /* av is zero if only checking access to the descriptor. */
1797        rc = 0;
1798        if (av)
1799                rc = inode_has_perm(cred, inode, av, &ad);
1800
1801out:
1802        return rc;
1803}
1804
1805/*
1806 * Determine the label for an inode that might be unioned.
1807 */
1808static int
1809selinux_determine_inode_label(const struct task_security_struct *tsec,
1810                                 struct inode *dir,
1811                                 const struct qstr *name, u16 tclass,
1812                                 u32 *_new_isid)
1813{
1814        const struct superblock_security_struct *sbsec =
1815                                                selinux_superblock(dir->i_sb);
1816
1817        if ((sbsec->flags & SE_SBINITIALIZED) &&
1818            (sbsec->behavior == SECURITY_FS_USE_MNTPOINT)) {
1819                *_new_isid = sbsec->mntpoint_sid;
1820        } else if ((sbsec->flags & SBLABEL_MNT) &&
1821                   tsec->create_sid) {
1822                *_new_isid = tsec->create_sid;
1823        } else {
1824                const struct inode_security_struct *dsec = inode_security(dir);
1825                return security_transition_sid(&selinux_state, tsec->sid,
1826                                               dsec->sid, tclass,
1827                                               name, _new_isid);
1828        }
1829
1830        return 0;
1831}
1832
1833/* Check whether a task can create a file. */
1834static int may_create(struct inode *dir,
1835                      struct dentry *dentry,
1836                      u16 tclass)
1837{
1838        const struct task_security_struct *tsec = selinux_cred(current_cred());
1839        struct inode_security_struct *dsec;
1840        struct superblock_security_struct *sbsec;
1841        u32 sid, newsid;
1842        struct common_audit_data ad;
1843        int rc;
1844
1845        dsec = inode_security(dir);
1846        sbsec = selinux_superblock(dir->i_sb);
1847
1848        sid = tsec->sid;
1849
1850        ad.type = LSM_AUDIT_DATA_DENTRY;
1851        ad.u.dentry = dentry;
1852
1853        rc = avc_has_perm(&selinux_state,
1854                          sid, dsec->sid, SECCLASS_DIR,
1855                          DIR__ADD_NAME | DIR__SEARCH,
1856                          &ad);
1857        if (rc)
1858                return rc;
1859
1860        rc = selinux_determine_inode_label(tsec, dir, &dentry->d_name, tclass,
1861                                           &newsid);
1862        if (rc)
1863                return rc;
1864
1865        rc = avc_has_perm(&selinux_state,
1866                          sid, newsid, tclass, FILE__CREATE, &ad);
1867        if (rc)
1868                return rc;
1869
1870        return avc_has_perm(&selinux_state,
1871                            newsid, sbsec->sid,
1872                            SECCLASS_FILESYSTEM,
1873                            FILESYSTEM__ASSOCIATE, &ad);
1874}
1875
1876#define MAY_LINK        0
1877#define MAY_UNLINK      1
1878#define MAY_RMDIR       2
1879
1880/* Check whether a task can link, unlink, or rmdir a file/directory. */
1881static int may_link(struct inode *dir,
1882                    struct dentry *dentry,
1883                    int kind)
1884
1885{
1886        struct inode_security_struct *dsec, *isec;
1887        struct common_audit_data ad;
1888        u32 sid = current_sid();
1889        u32 av;
1890        int rc;
1891
1892        dsec = inode_security(dir);
1893        isec = backing_inode_security(dentry);
1894
1895        ad.type = LSM_AUDIT_DATA_DENTRY;
1896        ad.u.dentry = dentry;
1897
1898        av = DIR__SEARCH;
1899        av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
1900        rc = avc_has_perm(&selinux_state,
1901                          sid, dsec->sid, SECCLASS_DIR, av, &ad);
1902        if (rc)
1903                return rc;
1904
1905        switch (kind) {
1906        case MAY_LINK:
1907                av = FILE__LINK;
1908                break;
1909        case MAY_UNLINK:
1910                av = FILE__UNLINK;
1911                break;
1912        case MAY_RMDIR:
1913                av = DIR__RMDIR;
1914                break;
1915        default:
1916                pr_warn("SELinux: %s:  unrecognized kind %d\n",
1917                        __func__, kind);
1918                return 0;
1919        }
1920
1921        rc = avc_has_perm(&selinux_state,
1922                          sid, isec->sid, isec->sclass, av, &ad);
1923        return rc;
1924}
1925
1926static inline int may_rename(struct inode *old_dir,
1927                             struct dentry *old_dentry,
1928                             struct inode *new_dir,
1929                             struct dentry *new_dentry)
1930{
1931        struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
1932        struct common_audit_data ad;
1933        u32 sid = current_sid();
1934        u32 av;
1935        int old_is_dir, new_is_dir;
1936        int rc;
1937
1938        old_dsec = inode_security(old_dir);
1939        old_isec = backing_inode_security(old_dentry);
1940        old_is_dir = d_is_dir(old_dentry);
1941        new_dsec = inode_security(new_dir);
1942
1943        ad.type = LSM_AUDIT_DATA_DENTRY;
1944
1945        ad.u.dentry = old_dentry;
1946        rc = avc_has_perm(&selinux_state,
1947                          sid, old_dsec->sid, SECCLASS_DIR,
1948                          DIR__REMOVE_NAME | DIR__SEARCH, &ad);
1949        if (rc)
1950                return rc;
1951        rc = avc_has_perm(&selinux_state,
1952                          sid, old_isec->sid,
1953                          old_isec->sclass, FILE__RENAME, &ad);
1954        if (rc)
1955                return rc;
1956        if (old_is_dir && new_dir != old_dir) {
1957                rc = avc_has_perm(&selinux_state,
1958                                  sid, old_isec->sid,
1959                                  old_isec->sclass, DIR__REPARENT, &ad);
1960                if (rc)
1961                        return rc;
1962        }
1963
1964        ad.u.dentry = new_dentry;
1965        av = DIR__ADD_NAME | DIR__SEARCH;
1966        if (d_is_positive(new_dentry))
1967                av |= DIR__REMOVE_NAME;
1968        rc = avc_has_perm(&selinux_state,
1969                          sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
1970        if (rc)
1971                return rc;
1972        if (d_is_positive(new_dentry)) {
1973                new_isec = backing_inode_security(new_dentry);
1974                new_is_dir = d_is_dir(new_dentry);
1975                rc = avc_has_perm(&selinux_state,
1976                                  sid, new_isec->sid,
1977                                  new_isec->sclass,
1978                                  (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
1979                if (rc)
1980                        return rc;
1981        }
1982
1983        return 0;
1984}
1985
1986/* Check whether a task can perform a filesystem operation. */
1987static int superblock_has_perm(const struct cred *cred,
1988                               struct super_block *sb,
1989                               u32 perms,
1990                               struct common_audit_data *ad)
1991{
1992        struct superblock_security_struct *sbsec;
1993        u32 sid = cred_sid(cred);
1994
1995        sbsec = selinux_superblock(sb);
1996        return avc_has_perm(&selinux_state,
1997                            sid, sbsec->sid, SECCLASS_FILESYSTEM, perms, ad);
1998}
1999
2000/* Convert a Linux mode and permission mask to an access vector. */
2001static inline u32 file_mask_to_av(int mode, int mask)
2002{
2003        u32 av = 0;
2004
2005        if (!S_ISDIR(mode)) {
2006                if (mask & MAY_EXEC)
2007                        av |= FILE__EXECUTE;
2008                if (mask & MAY_READ)
2009                        av |= FILE__READ;
2010
2011                if (mask & MAY_APPEND)
2012                        av |= FILE__APPEND;
2013                else if (mask & MAY_WRITE)
2014                        av |= FILE__WRITE;
2015
2016        } else {
2017                if (mask & MAY_EXEC)
2018                        av |= DIR__SEARCH;
2019                if (mask & MAY_WRITE)
2020                        av |= DIR__WRITE;
2021                if (mask & MAY_READ)
2022                        av |= DIR__READ;
2023        }
2024
2025        return av;
2026}
2027
2028/* Convert a Linux file to an access vector. */
2029static inline u32 file_to_av(struct file *file)
2030{
2031        u32 av = 0;
2032
2033        if (file->f_mode & FMODE_READ)
2034                av |= FILE__READ;
2035        if (file->f_mode & FMODE_WRITE) {
2036                if (file->f_flags & O_APPEND)
2037                        av |= FILE__APPEND;
2038                else
2039                        av |= FILE__WRITE;
2040        }
2041        if (!av) {
2042                /*
2043                 * Special file opened with flags 3 for ioctl-only use.
2044                 */
2045                av = FILE__IOCTL;
2046        }
2047
2048        return av;
2049}
2050
2051/*
2052 * Convert a file to an access vector and include the correct
2053 * open permission.
2054 */
2055static inline u32 open_file_to_av(struct file *file)
2056{
2057        u32 av = file_to_av(file);
2058        struct inode *inode = file_inode(file);
2059
2060        if (selinux_policycap_openperm() &&
2061            inode->i_sb->s_magic != SOCKFS_MAGIC)
2062                av |= FILE__OPEN;
2063
2064        return av;
2065}
2066
2067/* Hook functions begin here. */
2068
2069static int selinux_binder_set_context_mgr(struct task_struct *mgr)
2070{
2071        return avc_has_perm(&selinux_state,
2072                            current_sid(), task_sid_binder(mgr), SECCLASS_BINDER,
2073                            BINDER__SET_CONTEXT_MGR, NULL);
2074}
2075
2076static int selinux_binder_transaction(struct task_struct *from,
2077                                      struct task_struct *to)
2078{
2079        u32 mysid = current_sid();
2080        u32 fromsid = task_sid_binder(from);
2081        int rc;
2082
2083        if (mysid != fromsid) {
2084                rc = avc_has_perm(&selinux_state,
2085                                  mysid, fromsid, SECCLASS_BINDER,
2086                                  BINDER__IMPERSONATE, NULL);
2087                if (rc)
2088                        return rc;
2089        }
2090
2091        return avc_has_perm(&selinux_state, fromsid, task_sid_binder(to),
2092                            SECCLASS_BINDER, BINDER__CALL, NULL);
2093}
2094
2095static int selinux_binder_transfer_binder(struct task_struct *from,
2096                                          struct task_struct *to)
2097{
2098        return avc_has_perm(&selinux_state,
2099                            task_sid_binder(from), task_sid_binder(to),
2100                            SECCLASS_BINDER, BINDER__TRANSFER,
2101                            NULL);
2102}
2103
2104static int selinux_binder_transfer_file(struct task_struct *from,
2105                                        struct task_struct *to,
2106                                        struct file *file)
2107{
2108        u32 sid = task_sid_binder(to);
2109        struct file_security_struct *fsec = selinux_file(file);
2110        struct dentry *dentry = file->f_path.dentry;
2111        struct inode_security_struct *isec;
2112        struct common_audit_data ad;
2113        int rc;
2114
2115        ad.type = LSM_AUDIT_DATA_PATH;
2116        ad.u.path = file->f_path;
2117
2118        if (sid != fsec->sid) {
2119                rc = avc_has_perm(&selinux_state,
2120                                  sid, fsec->sid,
2121                                  SECCLASS_FD,
2122                                  FD__USE,
2123                                  &ad);
2124                if (rc)
2125                        return rc;
2126        }
2127
2128#ifdef CONFIG_BPF_SYSCALL
2129        rc = bpf_fd_pass(file, sid);
2130        if (rc)
2131                return rc;
2132#endif
2133
2134        if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
2135                return 0;
2136
2137        isec = backing_inode_security(dentry);
2138        return avc_has_perm(&selinux_state,
2139                            sid, isec->sid, isec->sclass, file_to_av(file),
2140                            &ad);
2141}
2142
2143static int selinux_ptrace_access_check(struct task_struct *child,
2144                                       unsigned int mode)
2145{
2146        u32 sid = current_sid();
2147        u32 csid = task_sid_obj(child);
2148
2149        if (mode & PTRACE_MODE_READ)
2150                return avc_has_perm(&selinux_state,
2151                                    sid, csid, SECCLASS_FILE, FILE__READ, NULL);
2152
2153        return avc_has_perm(&selinux_state,
2154                            sid, csid, SECCLASS_PROCESS, PROCESS__PTRACE, NULL);
2155}
2156
2157static int selinux_ptrace_traceme(struct task_struct *parent)
2158{
2159        return avc_has_perm(&selinux_state,
2160                            task_sid_obj(parent), task_sid_obj(current),
2161                            SECCLASS_PROCESS, PROCESS__PTRACE, NULL);
2162}
2163
2164static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
2165                          kernel_cap_t *inheritable, kernel_cap_t *permitted)
2166{
2167        return avc_has_perm(&selinux_state,
2168                            current_sid(), task_sid_obj(target), SECCLASS_PROCESS,
2169                            PROCESS__GETCAP, NULL);
2170}
2171
2172static int selinux_capset(struct cred *new, const struct cred *old,
2173                          const kernel_cap_t *effective,
2174                          const kernel_cap_t *inheritable,
2175                          const kernel_cap_t *permitted)
2176{
2177        return avc_has_perm(&selinux_state,
2178                            cred_sid(old), cred_sid(new), SECCLASS_PROCESS,
2179                            PROCESS__SETCAP, NULL);
2180}
2181
2182/*
2183 * (This comment used to live with the selinux_task_setuid hook,
2184 * which was removed).
2185 *
2186 * Since setuid only affects the current process, and since the SELinux
2187 * controls are not based on the Linux identity attributes, SELinux does not
2188 * need to control this operation.  However, SELinux does control the use of
2189 * the CAP_SETUID and CAP_SETGID capabilities using the capable hook.
2190 */
2191
2192static int selinux_capable(const struct cred *cred, struct user_namespace *ns,
2193                           int cap, unsigned int opts)
2194{
2195        return cred_has_capability(cred, cap, opts, ns == &init_user_ns);
2196}
2197
2198static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
2199{
2200        const struct cred *cred = current_cred();
2201        int rc = 0;
2202
2203        if (!sb)
2204                return 0;
2205
2206        switch (cmds) {
2207        case Q_SYNC:
2208        case Q_QUOTAON:
2209        case Q_QUOTAOFF:
2210        case Q_SETINFO:
2211        case Q_SETQUOTA:
2212        case Q_XQUOTAOFF:
2213        case Q_XQUOTAON:
2214        case Q_XSETQLIM:
2215                rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAMOD, NULL);
2216                break;
2217        case Q_GETFMT:
2218        case Q_GETINFO:
2219        case Q_GETQUOTA:
2220        case Q_XGETQUOTA:
2221        case Q_XGETQSTAT:
2222        case Q_XGETQSTATV:
2223        case Q_XGETNEXTQUOTA:
2224                rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAGET, NULL);
2225                break;
2226        default:
2227                rc = 0;  /* let the kernel handle invalid cmds */
2228                break;
2229        }
2230        return rc;
2231}
2232
2233static int selinux_quota_on(struct dentry *dentry)
2234{
2235        const struct cred *cred = current_cred();
2236
2237        return dentry_has_perm(cred, dentry, FILE__QUOTAON);
2238}
2239
2240static int selinux_syslog(int type)
2241{
2242        switch (type) {
2243        case SYSLOG_ACTION_READ_ALL:    /* Read last kernel messages */
2244        case SYSLOG_ACTION_SIZE_BUFFER: /* Return size of the log buffer */
2245                return avc_has_perm(&selinux_state,
2246                                    current_sid(), SECINITSID_KERNEL,
2247                                    SECCLASS_SYSTEM, SYSTEM__SYSLOG_READ, NULL);
2248        case SYSLOG_ACTION_CONSOLE_OFF: /* Disable logging to console */
2249        case SYSLOG_ACTION_CONSOLE_ON:  /* Enable logging to console */
2250        /* Set level of messages printed to console */
2251        case SYSLOG_ACTION_CONSOLE_LEVEL:
2252                return avc_has_perm(&selinux_state,
2253                                    current_sid(), SECINITSID_KERNEL,
2254                                    SECCLASS_SYSTEM, SYSTEM__SYSLOG_CONSOLE,
2255                                    NULL);
2256        }
2257        /* All other syslog types */
2258        return avc_has_perm(&selinux_state,
2259                            current_sid(), SECINITSID_KERNEL,
2260                            SECCLASS_SYSTEM, SYSTEM__SYSLOG_MOD, NULL);
2261}
2262
2263/*
2264 * Check that a process has enough memory to allocate a new virtual
2265 * mapping. 0 means there is enough memory for the allocation to
2266 * succeed and -ENOMEM implies there is not.
2267 *
2268 * Do not audit the selinux permission check, as this is applied to all
2269 * processes that allocate mappings.
2270 */
2271static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
2272{
2273        int rc, cap_sys_admin = 0;
2274
2275        rc = cred_has_capability(current_cred(), CAP_SYS_ADMIN,
2276                                 CAP_OPT_NOAUDIT, true);
2277        if (rc == 0)
2278                cap_sys_admin = 1;
2279
2280        return cap_sys_admin;
2281}
2282
2283/* binprm security operations */
2284
2285static u32 ptrace_parent_sid(void)
2286{
2287        u32 sid = 0;
2288        struct task_struct *tracer;
2289
2290        rcu_read_lock();
2291        tracer = ptrace_parent(current);
2292        if (tracer)
2293                sid = task_sid_obj(tracer);
2294        rcu_read_unlock();
2295
2296        return sid;
2297}
2298
2299static int check_nnp_nosuid(const struct linux_binprm *bprm,
2300                            const struct task_security_struct *old_tsec,
2301                            const struct task_security_struct *new_tsec)
2302{
2303        int nnp = (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS);
2304        int nosuid = !mnt_may_suid(bprm->file->f_path.mnt);
2305        int rc;
2306        u32 av;
2307
2308        if (!nnp && !nosuid)
2309                return 0; /* neither NNP nor nosuid */
2310
2311        if (new_tsec->sid == old_tsec->sid)
2312                return 0; /* No change in credentials */
2313
2314        /*
2315         * If the policy enables the nnp_nosuid_transition policy capability,
2316         * then we permit transitions under NNP or nosuid if the
2317         * policy allows the corresponding permission between
2318         * the old and new contexts.
2319         */
2320        if (selinux_policycap_nnp_nosuid_transition()) {
2321                av = 0;
2322                if (nnp)
2323                        av |= PROCESS2__NNP_TRANSITION;
2324                if (nosuid)
2325                        av |= PROCESS2__NOSUID_TRANSITION;
2326                rc = avc_has_perm(&selinux_state,
2327                                  old_tsec->sid, new_tsec->sid,
2328                                  SECCLASS_PROCESS2, av, NULL);
2329                if (!rc)
2330                        return 0;
2331        }
2332
2333        /*
2334         * We also permit NNP or nosuid transitions to bounded SIDs,
2335         * i.e. SIDs that are guaranteed to only be allowed a subset
2336         * of the permissions of the current SID.
2337         */
2338        rc = security_bounded_transition(&selinux_state, old_tsec->sid,
2339                                         new_tsec->sid);
2340        if (!rc)
2341                return 0;
2342
2343        /*
2344         * On failure, preserve the errno values for NNP vs nosuid.
2345         * NNP:  Operation not permitted for caller.
2346         * nosuid:  Permission denied to file.
2347         */
2348        if (nnp)
2349                return -EPERM;
2350        return -EACCES;
2351}
2352
2353static int selinux_bprm_creds_for_exec(struct linux_binprm *bprm)
2354{
2355        const struct task_security_struct *old_tsec;
2356        struct task_security_struct *new_tsec;
2357        struct inode_security_struct *isec;
2358        struct common_audit_data ad;
2359        struct inode *inode = file_inode(bprm->file);
2360        int rc;
2361
2362        /* SELinux context only depends on initial program or script and not
2363         * the script interpreter */
2364
2365        old_tsec = selinux_cred(current_cred());
2366        new_tsec = selinux_cred(bprm->cred);
2367        isec = inode_security(inode);
2368
2369        /* Default to the current task SID. */
2370        new_tsec->sid = old_tsec->sid;
2371        new_tsec->osid = old_tsec->sid;
2372
2373        /* Reset fs, key, and sock SIDs on execve. */
2374        new_tsec->create_sid = 0;
2375        new_tsec->keycreate_sid = 0;
2376        new_tsec->sockcreate_sid = 0;
2377
2378        if (old_tsec->exec_sid) {
2379                new_tsec->sid = old_tsec->exec_sid;
2380                /* Reset exec SID on execve. */
2381                new_tsec->exec_sid = 0;
2382
2383                /* Fail on NNP or nosuid if not an allowed transition. */
2384                rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
2385                if (rc)
2386                        return rc;
2387        } else {
2388                /* Check for a default transition on this program. */
2389                rc = security_transition_sid(&selinux_state, old_tsec->sid,
2390                                             isec->sid, SECCLASS_PROCESS, NULL,
2391                                             &new_tsec->sid);
2392                if (rc)
2393                        return rc;
2394
2395                /*
2396                 * Fallback to old SID on NNP or nosuid if not an allowed
2397                 * transition.
2398                 */
2399                rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
2400                if (rc)
2401                        new_tsec->sid = old_tsec->sid;
2402        }
2403
2404        ad.type = LSM_AUDIT_DATA_FILE;
2405        ad.u.file = bprm->file;
2406
2407        if (new_tsec->sid == old_tsec->sid) {
2408                rc = avc_has_perm(&selinux_state,
2409                                  old_tsec->sid, isec->sid,
2410                                  SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
2411                if (rc)
2412                        return rc;
2413        } else {
2414                /* Check permissions for the transition. */
2415                rc = avc_has_perm(&selinux_state,
2416                                  old_tsec->sid, new_tsec->sid,
2417                                  SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
2418                if (rc)
2419                        return rc;
2420
2421                rc = avc_has_perm(&selinux_state,
2422                                  new_tsec->sid, isec->sid,
2423                                  SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
2424                if (rc)
2425                        return rc;
2426
2427                /* Check for shared state */
2428                if (bprm->unsafe & LSM_UNSAFE_SHARE) {
2429                        rc = avc_has_perm(&selinux_state,
2430                                          old_tsec->sid, new_tsec->sid,
2431                                          SECCLASS_PROCESS, PROCESS__SHARE,
2432                                          NULL);
2433                        if (rc)
2434                                return -EPERM;
2435                }
2436
2437                /* Make sure that anyone attempting to ptrace over a task that
2438                 * changes its SID has the appropriate permit */
2439                if (bprm->unsafe & LSM_UNSAFE_PTRACE) {
2440                        u32 ptsid = ptrace_parent_sid();
2441                        if (ptsid != 0) {
2442                                rc = avc_has_perm(&selinux_state,
2443                                                  ptsid, new_tsec->sid,
2444                                                  SECCLASS_PROCESS,
2445                                                  PROCESS__PTRACE, NULL);
2446                                if (rc)
2447                                        return -EPERM;
2448                        }
2449                }
2450
2451                /* Clear any possibly unsafe personality bits on exec: */
2452                bprm->per_clear |= PER_CLEAR_ON_SETID;
2453
2454                /* Enable secure mode for SIDs transitions unless
2455                   the noatsecure permission is granted between
2456                   the two SIDs, i.e. ahp returns 0. */
2457                rc = avc_has_perm(&selinux_state,
2458                                  old_tsec->sid, new_tsec->sid,
2459                                  SECCLASS_PROCESS, PROCESS__NOATSECURE,
2460                                  NULL);
2461                bprm->secureexec |= !!rc;
2462        }
2463
2464        return 0;
2465}
2466
2467static int match_file(const void *p, struct file *file, unsigned fd)
2468{
2469        return file_has_perm(p, file, file_to_av(file)) ? fd + 1 : 0;
2470}
2471
2472/* Derived from fs/exec.c:flush_old_files. */
2473static inline void flush_unauthorized_files(const struct cred *cred,
2474                                            struct files_struct *files)
2475{
2476        struct file *file, *devnull = NULL;
2477        struct tty_struct *tty;
2478        int drop_tty = 0;
2479        unsigned n;
2480
2481        tty = get_current_tty();
2482        if (tty) {
2483                spin_lock(&tty->files_lock);
2484                if (!list_empty(&tty->tty_files)) {
2485                        struct tty_file_private *file_priv;
2486
2487                        /* Revalidate access to controlling tty.
2488                           Use file_path_has_perm on the tty path directly
2489                           rather than using file_has_perm, as this particular
2490                           open file may belong to another process and we are
2491                           only interested in the inode-based check here. */
2492                        file_priv = list_first_entry(&tty->tty_files,
2493                                                struct tty_file_private, list);
2494                        file = file_priv->file;
2495                        if (file_path_has_perm(cred, file, FILE__READ | FILE__WRITE))
2496                                drop_tty = 1;
2497                }
2498                spin_unlock(&tty->files_lock);
2499                tty_kref_put(tty);
2500        }
2501        /* Reset controlling tty. */
2502        if (drop_tty)
2503                no_tty();
2504
2505        /* Revalidate access to inherited open files. */
2506        n = iterate_fd(files, 0, match_file, cred);
2507        if (!n) /* none found? */
2508                return;
2509
2510        devnull = dentry_open(&selinux_null, O_RDWR, cred);
2511        if (IS_ERR(devnull))
2512                devnull = NULL;
2513        /* replace all the matching ones with this */
2514        do {
2515                replace_fd(n - 1, devnull, 0);
2516        } while ((n = iterate_fd(files, n, match_file, cred)) != 0);
2517        if (devnull)
2518                fput(devnull);
2519}
2520
2521/*
2522 * Prepare a process for imminent new credential changes due to exec
2523 */
2524static void selinux_bprm_committing_creds(struct linux_binprm *bprm)
2525{
2526        struct task_security_struct *new_tsec;
2527        struct rlimit *rlim, *initrlim;
2528        int rc, i;
2529
2530        new_tsec = selinux_cred(bprm->cred);
2531        if (new_tsec->sid == new_tsec->osid)
2532                return;
2533
2534        /* Close files for which the new task SID is not authorized. */
2535        flush_unauthorized_files(bprm->cred, current->files);
2536
2537        /* Always clear parent death signal on SID transitions. */
2538        current->pdeath_signal = 0;
2539
2540        /* Check whether the new SID can inherit resource limits from the old
2541         * SID.  If not, reset all soft limits to the lower of the current
2542         * task's hard limit and the init task's soft limit.
2543         *
2544         * Note that the setting of hard limits (even to lower them) can be
2545         * controlled by the setrlimit check.  The inclusion of the init task's
2546         * soft limit into the computation is to avoid resetting soft limits
2547         * higher than the default soft limit for cases where the default is
2548         * lower than the hard limit, e.g. RLIMIT_CORE or RLIMIT_STACK.
2549         */
2550        rc = avc_has_perm(&selinux_state,
2551                          new_tsec->osid, new_tsec->sid, SECCLASS_PROCESS,
2552                          PROCESS__RLIMITINH, NULL);
2553        if (rc) {
2554                /* protect against do_prlimit() */
2555                task_lock(current);
2556                for (i = 0; i < RLIM_NLIMITS; i++) {
2557                        rlim = current->signal->rlim + i;
2558                        initrlim = init_task.signal->rlim + i;
2559                        rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
2560                }
2561                task_unlock(current);
2562                if (IS_ENABLED(CONFIG_POSIX_TIMERS))
2563                        update_rlimit_cpu(current, rlimit(RLIMIT_CPU));
2564        }
2565}
2566
2567/*
2568 * Clean up the process immediately after the installation of new credentials
2569 * due to exec
2570 */
2571static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
2572{
2573        const struct task_security_struct *tsec = selinux_cred(current_cred());
2574        u32 osid, sid;
2575        int rc;
2576
2577        osid = tsec->osid;
2578        sid = tsec->sid;
2579
2580        if (sid == osid)
2581                return;
2582
2583        /* Check whether the new SID can inherit signal state from the old SID.
2584         * If not, clear itimers to avoid subsequent signal generation and
2585         * flush and unblock signals.
2586         *
2587         * This must occur _after_ the task SID has been updated so that any
2588         * kill done after the flush will be checked against the new SID.
2589         */
2590        rc = avc_has_perm(&selinux_state,
2591                          osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL);
2592        if (rc) {
2593                clear_itimer();
2594
2595                spin_lock_irq(&current->sighand->siglock);
2596                if (!fatal_signal_pending(current)) {
2597                        flush_sigqueue(&current->pending);
2598                        flush_sigqueue(&current->signal->shared_pending);
2599                        flush_signal_handlers(current, 1);
2600                        sigemptyset(&current->blocked);
2601                        recalc_sigpending();
2602                }
2603                spin_unlock_irq(&current->sighand->siglock);
2604        }
2605
2606        /* Wake up the parent if it is waiting so that it can recheck
2607         * wait permission to the new task SID. */
2608        read_lock(&tasklist_lock);
2609        __wake_up_parent(current, current->real_parent);
2610        read_unlock(&tasklist_lock);
2611}
2612
2613/* superblock security operations */
2614
2615static int selinux_sb_alloc_security(struct super_block *sb)
2616{
2617        struct superblock_security_struct *sbsec = selinux_superblock(sb);
2618
2619        mutex_init(&sbsec->lock);
2620        INIT_LIST_HEAD(&sbsec->isec_head);
2621        spin_lock_init(&sbsec->isec_lock);
2622        sbsec->sid = SECINITSID_UNLABELED;
2623        sbsec->def_sid = SECINITSID_FILE;
2624        sbsec->mntpoint_sid = SECINITSID_UNLABELED;
2625
2626        return 0;
2627}
2628
2629static inline int opt_len(const char *s)
2630{
2631        bool open_quote = false;
2632        int len;
2633        char c;
2634
2635        for (len = 0; (c = s[len]) != '\0'; len++) {
2636                if (c == '"')
2637                        open_quote = !open_quote;
2638                if (c == ',' && !open_quote)
2639                        break;
2640        }
2641        return len;
2642}
2643
2644static int selinux_sb_eat_lsm_opts(char *options, void **mnt_opts)
2645{
2646        char *from = options;
2647        char *to = options;
2648        bool first = true;
2649        int rc;
2650
2651        while (1) {
2652                int len = opt_len(from);
2653                int token;
2654                char *arg = NULL;
2655
2656                token = match_opt_prefix(from, len, &arg);
2657
2658                if (token != Opt_error) {
2659                        char *p, *q;
2660
2661                        /* strip quotes */
2662                        if (arg) {
2663                                for (p = q = arg; p < from + len; p++) {
2664                                        char c = *p;
2665                                        if (c != '"')
2666                                                *q++ = c;
2667                                }
2668                                arg = kmemdup_nul(arg, q - arg, GFP_KERNEL);
2669                                if (!arg) {
2670                                        rc = -ENOMEM;
2671                                        goto free_opt;
2672                                }
2673                        }
2674                        rc = selinux_add_opt(token, arg, mnt_opts);
2675                        if (unlikely(rc)) {
2676                                kfree(arg);
2677                                goto free_opt;
2678                        }
2679                } else {
2680                        if (!first) {   // copy with preceding comma
2681                                from--;
2682                                len++;
2683                        }
2684                        if (to != from)
2685                                memmove(to, from, len);
2686                        to += len;
2687                        first = false;
2688                }
2689                if (!from[len])
2690                        break;
2691                from += len + 1;
2692        }
2693        *to = '\0';
2694        return 0;
2695
2696free_opt:
2697        if (*mnt_opts) {
2698                selinux_free_mnt_opts(*mnt_opts);
2699                *mnt_opts = NULL;
2700        }
2701        return rc;
2702}
2703
2704static int selinux_sb_mnt_opts_compat(struct super_block *sb, void *mnt_opts)
2705{
2706        struct selinux_mnt_opts *opts = mnt_opts;
2707        struct superblock_security_struct *sbsec = sb->s_security;
2708        u32 sid;
2709        int rc;
2710
2711        /*
2712         * Superblock not initialized (i.e. no options) - reject if any
2713         * options specified, otherwise accept.
2714         */
2715        if (!(sbsec->flags & SE_SBINITIALIZED))
2716                return opts ? 1 : 0;
2717
2718        /*
2719         * Superblock initialized and no options specified - reject if
2720         * superblock has any options set, otherwise accept.
2721         */
2722        if (!opts)
2723                return (sbsec->flags & SE_MNTMASK) ? 1 : 0;
2724
2725        if (opts->fscontext) {
2726                rc = parse_sid(sb, opts->fscontext, &sid);
2727                if (rc)
2728                        return 1;
2729                if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid, sid))
2730                        return 1;
2731        }
2732        if (opts->context) {
2733                rc = parse_sid(sb, opts->context, &sid);
2734                if (rc)
2735                        return 1;
2736                if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid, sid))
2737                        return 1;
2738        }
2739        if (opts->rootcontext) {
2740                struct inode_security_struct *root_isec;
2741
2742                root_isec = backing_inode_security(sb->s_root);
2743                rc = parse_sid(sb, opts->rootcontext, &sid);
2744                if (rc)
2745                        return 1;
2746                if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid, sid))
2747                        return 1;
2748        }
2749        if (opts->defcontext) {
2750                rc = parse_sid(sb, opts->defcontext, &sid);
2751                if (rc)
2752                        return 1;
2753                if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid, sid))
2754                        return 1;
2755        }
2756        return 0;
2757}
2758
2759static int selinux_sb_remount(struct super_block *sb, void *mnt_opts)
2760{
2761        struct selinux_mnt_opts *opts = mnt_opts;
2762        struct superblock_security_struct *sbsec = selinux_superblock(sb);
2763        u32 sid;
2764        int rc;
2765
2766        if (!(sbsec->flags & SE_SBINITIALIZED))
2767                return 0;
2768
2769        if (!opts)
2770                return 0;
2771
2772        if (opts->fscontext) {
2773                rc = parse_sid(sb, opts->fscontext, &sid);
2774                if (rc)
2775                        return rc;
2776                if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid, sid))
2777                        goto out_bad_option;
2778        }
2779        if (opts->context) {
2780                rc = parse_sid(sb, opts->context, &sid);
2781                if (rc)
2782                        return rc;
2783                if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid, sid))
2784                        goto out_bad_option;
2785        }
2786        if (opts->rootcontext) {
2787                struct inode_security_struct *root_isec;
2788                root_isec = backing_inode_security(sb->s_root);
2789                rc = parse_sid(sb, opts->rootcontext, &sid);
2790                if (rc)
2791                        return rc;
2792                if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid, sid))
2793                        goto out_bad_option;
2794        }
2795        if (opts->defcontext) {
2796                rc = parse_sid(sb, opts->defcontext, &sid);
2797                if (rc)
2798                        return rc;
2799                if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid, sid))
2800                        goto out_bad_option;
2801        }
2802        return 0;
2803
2804out_bad_option:
2805        pr_warn("SELinux: unable to change security options "
2806               "during remount (dev %s, type=%s)\n", sb->s_id,
2807               sb->s_type->name);
2808        return -EINVAL;
2809}
2810
2811static int selinux_sb_kern_mount(struct super_block *sb)
2812{
2813        const struct cred *cred = current_cred();
2814        struct common_audit_data ad;
2815
2816        ad.type = LSM_AUDIT_DATA_DENTRY;
2817        ad.u.dentry = sb->s_root;
2818        return superblock_has_perm(cred, sb, FILESYSTEM__MOUNT, &ad);
2819}
2820
2821static int selinux_sb_statfs(struct dentry *dentry)
2822{
2823        const struct cred *cred = current_cred();
2824        struct common_audit_data ad;
2825
2826        ad.type = LSM_AUDIT_DATA_DENTRY;
2827        ad.u.dentry = dentry->d_sb->s_root;
2828        return superblock_has_perm(cred, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
2829}
2830
2831static int selinux_mount(const char *dev_name,
2832                         const struct path *path,
2833                         const char *type,
2834                         unsigned long flags,
2835                         void *data)
2836{
2837        const struct cred *cred = current_cred();
2838
2839        if (flags & MS_REMOUNT)
2840                return superblock_has_perm(cred, path->dentry->d_sb,
2841                                           FILESYSTEM__REMOUNT, NULL);
2842        else
2843                return path_has_perm(cred, path, FILE__MOUNTON);
2844}
2845
2846static int selinux_move_mount(const struct path *from_path,
2847                              const struct path *to_path)
2848{
2849        const struct cred *cred = current_cred();
2850
2851        return path_has_perm(cred, to_path, FILE__MOUNTON);
2852}
2853
2854static int selinux_umount(struct vfsmount *mnt, int flags)
2855{
2856        const struct cred *cred = current_cred();
2857
2858        return superblock_has_perm(cred, mnt->mnt_sb,
2859                                   FILESYSTEM__UNMOUNT, NULL);
2860}
2861
2862static int selinux_fs_context_dup(struct fs_context *fc,
2863                                  struct fs_context *src_fc)
2864{
2865        const struct selinux_mnt_opts *src = src_fc->security;
2866        struct selinux_mnt_opts *opts;
2867
2868        if (!src)
2869                return 0;
2870
2871        fc->security = kzalloc(sizeof(struct selinux_mnt_opts), GFP_KERNEL);
2872        if (!fc->security)
2873                return -ENOMEM;
2874
2875        opts = fc->security;
2876
2877        if (src->fscontext) {
2878                opts->fscontext = kstrdup(src->fscontext, GFP_KERNEL);
2879                if (!opts->fscontext)
2880                        return -ENOMEM;
2881        }
2882        if (src->context) {
2883                opts->context = kstrdup(src->context, GFP_KERNEL);
2884                if (!opts->context)
2885                        return -ENOMEM;
2886        }
2887        if (src->rootcontext) {
2888                opts->rootcontext = kstrdup(src->rootcontext, GFP_KERNEL);
2889                if (!opts->rootcontext)
2890                        return -ENOMEM;
2891        }
2892        if (src->defcontext) {
2893                opts->defcontext = kstrdup(src->defcontext, GFP_KERNEL);
2894                if (!opts->defcontext)
2895                        return -ENOMEM;
2896        }
2897        return 0;
2898}
2899
2900static const struct fs_parameter_spec selinux_fs_parameters[] = {
2901        fsparam_string(CONTEXT_STR,     Opt_context),
2902        fsparam_string(DEFCONTEXT_STR,  Opt_defcontext),
2903        fsparam_string(FSCONTEXT_STR,   Opt_fscontext),
2904        fsparam_string(ROOTCONTEXT_STR, Opt_rootcontext),
2905        fsparam_flag  (SECLABEL_STR,    Opt_seclabel),
2906        {}
2907};
2908
2909static int selinux_fs_context_parse_param(struct fs_context *fc,
2910                                          struct fs_parameter *param)
2911{
2912        struct fs_parse_result result;
2913        int opt, rc;
2914
2915        opt = fs_parse(fc, selinux_fs_parameters, param, &result);
2916        if (opt < 0)
2917                return opt;
2918
2919        rc = selinux_add_opt(opt, param->string, &fc->security);
2920        if (!rc) {
2921                param->string = NULL;
2922                rc = 1;
2923        }
2924        return rc;
2925}
2926
2927/* inode security operations */
2928
2929static int selinux_inode_alloc_security(struct inode *inode)
2930{
2931        struct inode_security_struct *isec = selinux_inode(inode);
2932        u32 sid = current_sid();
2933
2934        spin_lock_init(&isec->lock);
2935        INIT_LIST_HEAD(&isec->list);
2936        isec->inode = inode;
2937        isec->sid = SECINITSID_UNLABELED;
2938        isec->sclass = SECCLASS_FILE;
2939        isec->task_sid = sid;
2940        isec->initialized = LABEL_INVALID;
2941
2942        return 0;
2943}
2944
2945static void selinux_inode_free_security(struct inode *inode)
2946{
2947        inode_free_security(inode);
2948}
2949
2950static int selinux_dentry_init_security(struct dentry *dentry, int mode,
2951                                        const struct qstr *name, void **ctx,
2952                                        u32 *ctxlen)
2953{
2954        u32 newsid;
2955        int rc;
2956
2957        rc = selinux_determine_inode_label(selinux_cred(current_cred()),
2958                                           d_inode(dentry->d_parent), name,
2959                                           inode_mode_to_security_class(mode),
2960                                           &newsid);
2961        if (rc)
2962                return rc;
2963
2964        return security_sid_to_context(&selinux_state, newsid, (char **)ctx,
2965                                       ctxlen);
2966}
2967
2968static int selinux_dentry_create_files_as(struct dentry *dentry, int mode,
2969                                          struct qstr *name,
2970                                          const struct cred *old,
2971                                          struct cred *new)
2972{
2973        u32 newsid;
2974        int rc;
2975        struct task_security_struct *tsec;
2976
2977        rc = selinux_determine_inode_label(selinux_cred(old),
2978                                           d_inode(dentry->d_parent), name,
2979                                           inode_mode_to_security_class(mode),
2980                                           &newsid);
2981        if (rc)
2982                return rc;
2983
2984        tsec = selinux_cred(new);
2985        tsec->create_sid = newsid;
2986        return 0;
2987}
2988
2989static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
2990                                       const struct qstr *qstr,
2991                                       const char **name,
2992                                       void **value, size_t *len)
2993{
2994        const struct task_security_struct *tsec = selinux_cred(current_cred());
2995        struct superblock_security_struct *sbsec;
2996        u32 newsid, clen;
2997        int rc;
2998        char *context;
2999
3000        sbsec = selinux_superblock(dir->i_sb);
3001
3002        newsid = tsec->create_sid;
3003
3004        rc = selinux_determine_inode_label(tsec, dir, qstr,
3005                inode_mode_to_security_class(inode->i_mode),
3006                &newsid);
3007        if (rc)
3008                return rc;
3009
3010        /* Possibly defer initialization to selinux_complete_init. */
3011        if (sbsec->flags & SE_SBINITIALIZED) {
3012                struct inode_security_struct *isec = selinux_inode(inode);
3013                isec->sclass = inode_mode_to_security_class(inode->i_mode);
3014                isec->sid = newsid;
3015                isec->initialized = LABEL_INITIALIZED;
3016        }
3017
3018        if (!selinux_initialized(&selinux_state) ||
3019            !(sbsec->flags & SBLABEL_MNT))
3020                return -EOPNOTSUPP;
3021
3022        if (name)
3023                *name = XATTR_SELINUX_SUFFIX;
3024
3025        if (value && len) {
3026                rc = security_sid_to_context_force(&selinux_state, newsid,
3027                                                   &context, &clen);
3028                if (rc)
3029                        return rc;
3030                *value = context;
3031                *len = clen;
3032        }
3033
3034        return 0;
3035}
3036
3037static int selinux_inode_init_security_anon(struct inode *inode,
3038                                            const struct qstr *name,
3039                                            const struct inode *context_inode)
3040{
3041        const struct task_security_struct *tsec = selinux_cred(current_cred());
3042        struct common_audit_data ad;
3043        struct inode_security_struct *isec;
3044        int rc;
3045
3046        if (unlikely(!selinux_initialized(&selinux_state)))
3047                return 0;
3048
3049        isec = selinux_inode(inode);
3050
3051        /*
3052         * We only get here once per ephemeral inode.  The inode has
3053         * been initialized via inode_alloc_security but is otherwise
3054         * untouched.
3055         */
3056
3057        if (context_inode) {
3058                struct inode_security_struct *context_isec =
3059                        selinux_inode(context_inode);
3060                if (context_isec->initialized != LABEL_INITIALIZED) {
3061                        pr_err("SELinux:  context_inode is not initialized");
3062                        return -EACCES;
3063                }
3064
3065                isec->sclass = context_isec->sclass;
3066                isec->sid = context_isec->sid;
3067        } else {
3068                isec->sclass = SECCLASS_ANON_INODE;
3069                rc = security_transition_sid(
3070                        &selinux_state, tsec->sid, tsec->sid,
3071                        isec->sclass, name, &isec->sid);
3072                if (rc)
3073                        return rc;
3074        }
3075
3076        isec->initialized = LABEL_INITIALIZED;
3077        /*
3078         * Now that we've initialized security, check whether we're
3079         * allowed to actually create this type of anonymous inode.
3080         */
3081
3082        ad.type = LSM_AUDIT_DATA_INODE;
3083        ad.u.inode = inode;
3084
3085        return avc_has_perm(&selinux_state,
3086                            tsec->sid,
3087                            isec->sid,
3088                            isec->sclass,
3089                            FILE__CREATE,
3090                            &ad);
3091}
3092
3093static int selinux_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode)
3094{
3095        return may_create(dir, dentry, SECCLASS_FILE);
3096}
3097
3098static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
3099{
3100        return may_link(dir, old_dentry, MAY_LINK);
3101}
3102
3103static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
3104{
3105        return may_link(dir, dentry, MAY_UNLINK);
3106}
3107
3108static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
3109{
3110        return may_create(dir, dentry, SECCLASS_LNK_FILE);
3111}
3112
3113static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, umode_t mask)
3114{
3115        return may_create(dir, dentry, SECCLASS_DIR);
3116}
3117
3118static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
3119{
3120        return may_link(dir, dentry, MAY_RMDIR);
3121}
3122
3123static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
3124{
3125        return may_create(dir, dentry, inode_mode_to_security_class(mode));
3126}
3127
3128static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
3129                                struct inode *new_inode, struct dentry *new_dentry)
3130{
3131        return may_rename(old_inode, old_dentry, new_inode, new_dentry);
3132}
3133
3134static int selinux_inode_readlink(struct dentry *dentry)
3135{
3136        const struct cred *cred = current_cred();
3137
3138        return dentry_has_perm(cred, dentry, FILE__READ);
3139}
3140
3141static int selinux_inode_follow_link(struct dentry *dentry, struct inode *inode,
3142                                     bool rcu)
3143{
3144        const struct cred *cred = current_cred();
3145        struct common_audit_data ad;
3146        struct inode_security_struct *isec;
3147        u32 sid;
3148
3149        validate_creds(cred);
3150
3151        ad.type = LSM_AUDIT_DATA_DENTRY;
3152        ad.u.dentry = dentry;
3153        sid = cred_sid(cred);
3154        isec = inode_security_rcu(inode, rcu);
3155        if (IS_ERR(isec))
3156                return PTR_ERR(isec);
3157
3158        return avc_has_perm(&selinux_state,
3159                                  sid, isec->sid, isec->sclass, FILE__READ, &ad);
3160}
3161
3162static noinline int audit_inode_permission(struct inode *inode,
3163                                           u32 perms, u32 audited, u32 denied,
3164                                           int result)
3165{
3166        struct common_audit_data ad;
3167        struct inode_security_struct *isec = selinux_inode(inode);
3168
3169        ad.type = LSM_AUDIT_DATA_INODE;
3170        ad.u.inode = inode;
3171
3172        return slow_avc_audit(&selinux_state,
3173                            current_sid(), isec->sid, isec->sclass, perms,
3174                            audited, denied, result, &ad);
3175}
3176
3177static int selinux_inode_permission(struct inode *inode, int mask)
3178{
3179        const struct cred *cred = current_cred();
3180        u32 perms;
3181        bool from_access;
3182        bool no_block = mask & MAY_NOT_BLOCK;
3183        struct inode_security_struct *isec;
3184        u32 sid;
3185        struct av_decision avd;
3186        int rc, rc2;
3187        u32 audited, denied;
3188
3189        from_access = mask & MAY_ACCESS;
3190        mask &= (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND);
3191
3192        /* No permission to check.  Existence test. */
3193        if (!mask)
3194                return 0;
3195
3196        validate_creds(cred);
3197
3198        if (unlikely(IS_PRIVATE(inode)))
3199                return 0;
3200
3201        perms = file_mask_to_av(inode->i_mode, mask);
3202
3203        sid = cred_sid(cred);
3204        isec = inode_security_rcu(inode, no_block);
3205        if (IS_ERR(isec))
3206                return PTR_ERR(isec);
3207
3208        rc = avc_has_perm_noaudit(&selinux_state,
3209                                  sid, isec->sid, isec->sclass, perms, 0,
3210                                  &avd);
3211        audited = avc_audit_required(perms, &avd, rc,
3212                                     from_access ? FILE__AUDIT_ACCESS : 0,
3213                                     &denied);
3214        if (likely(!audited))
3215                return rc;
3216
3217        rc2 = audit_inode_permission(inode, perms, audited, denied, rc);
3218        if (rc2)
3219                return rc2;
3220        return rc;
3221}
3222
3223static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
3224{
3225        const struct cred *cred = current_cred();
3226        struct inode *inode = d_backing_inode(dentry);
3227        unsigned int ia_valid = iattr->ia_valid;
3228        __u32 av = FILE__WRITE;
3229
3230        /* ATTR_FORCE is just used for ATTR_KILL_S[UG]ID. */
3231        if (ia_valid & ATTR_FORCE) {
3232                ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_MODE |
3233                              ATTR_FORCE);
3234                if (!ia_valid)
3235                        return 0;
3236        }
3237
3238        if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
3239                        ATTR_ATIME_SET | ATTR_MTIME_SET | ATTR_TIMES_SET))
3240                return dentry_has_perm(cred, dentry, FILE__SETATTR);
3241
3242        if (selinux_policycap_openperm() &&
3243            inode->i_sb->s_magic != SOCKFS_MAGIC &&
3244            (ia_valid & ATTR_SIZE) &&
3245            !(ia_valid & ATTR_FILE))
3246                av |= FILE__OPEN;
3247
3248        return dentry_has_perm(cred, dentry, av);
3249}
3250
3251static int selinux_inode_getattr(const struct path *path)
3252{
3253        return path_has_perm(current_cred(), path, FILE__GETATTR);
3254}
3255
3256static bool has_cap_mac_admin(bool audit)
3257{
3258        const struct cred *cred = current_cred();
3259        unsigned int opts = audit ? CAP_OPT_NONE : CAP_OPT_NOAUDIT;
3260
3261        if (cap_capable(cred, &init_user_ns, CAP_MAC_ADMIN, opts))
3262                return false;
3263        if (cred_has_capability(cred, CAP_MAC_ADMIN, opts, true))
3264                return false;
3265        return true;
3266}
3267
3268static int selinux_inode_setxattr(struct user_namespace *mnt_userns,
3269                                  struct dentry *dentry, const char *name,
3270                                  const void *value, size_t size, int flags)
3271{
3272        struct inode *inode = d_backing_inode(dentry);
3273        struct inode_security_struct *isec;
3274        struct superblock_security_struct *sbsec;
3275        struct common_audit_data ad;
3276        u32 newsid, sid = current_sid();
3277        int rc = 0;
3278
3279        if (strcmp(name, XATTR_NAME_SELINUX)) {
3280                rc = cap_inode_setxattr(dentry, name, value, size, flags);
3281                if (rc)
3282                        return rc;
3283
3284                /* Not an attribute we recognize, so just check the
3285                   ordinary setattr permission. */
3286                return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
3287        }
3288
3289        if (!selinux_initialized(&selinux_state))
3290                return (inode_owner_or_capable(mnt_userns, inode) ? 0 : -EPERM);
3291
3292        sbsec = selinux_superblock(inode->i_sb);
3293        if (!(sbsec->flags & SBLABEL_MNT))
3294                return -EOPNOTSUPP;
3295
3296        if (!inode_owner_or_capable(mnt_userns, inode))
3297                return -EPERM;
3298
3299        ad.type = LSM_AUDIT_DATA_DENTRY;
3300        ad.u.dentry = dentry;
3301
3302        isec = backing_inode_security(dentry);
3303        rc = avc_has_perm(&selinux_state,
3304                          sid, isec->sid, isec->sclass,
3305                          FILE__RELABELFROM, &ad);
3306        if (rc)
3307                return rc;
3308
3309        rc = security_context_to_sid(&selinux_state, value, size, &newsid,
3310                                     GFP_KERNEL);
3311        if (rc == -EINVAL) {
3312                if (!has_cap_mac_admin(true)) {
3313                        struct audit_buffer *ab;
3314                        size_t audit_size;
3315
3316                        /* We strip a nul only if it is at the end, otherwise the
3317                         * context contains a nul and we should audit that */
3318                        if (value) {
3319                                const char *str = value;
3320
3321                                if (str[size - 1] == '\0')
3322                                        audit_size = size - 1;
3323                                else
3324                                        audit_size = size;
3325                        } else {
3326                                audit_size = 0;
3327                        }
3328                        ab = audit_log_start(audit_context(),
3329                                             GFP_ATOMIC, AUDIT_SELINUX_ERR);
3330                        if (!ab)
3331                                return rc;
3332                        audit_log_format(ab, "op=setxattr invalid_context=");
3333                        audit_log_n_untrustedstring(ab, value, audit_size);
3334                        audit_log_end(ab);
3335
3336                        return rc;
3337                }
3338                rc = security_context_to_sid_force(&selinux_state, value,
3339                                                   size, &newsid);
3340        }
3341        if (rc)
3342                return rc;
3343
3344        rc = avc_has_perm(&selinux_state,
3345                          sid, newsid, isec->sclass,
3346                          FILE__RELABELTO, &ad);
3347        if (rc)
3348                return rc;
3349
3350        rc = security_validate_transition(&selinux_state, isec->sid, newsid,
3351                                          sid, isec->sclass);
3352        if (rc)
3353                return rc;
3354
3355        return avc_has_perm(&selinux_state,
3356                            newsid,
3357                            sbsec->sid,
3358                            SECCLASS_FILESYSTEM,
3359                            FILESYSTEM__ASSOCIATE,
3360                            &ad);
3361}
3362
3363static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
3364                                        const void *value, size_t size,
3365                                        int flags)
3366{
3367        struct inode *inode = d_backing_inode(dentry);
3368        struct inode_security_struct *isec;
3369        u32 newsid;
3370        int rc;
3371
3372        if (strcmp(name, XATTR_NAME_SELINUX)) {
3373                /* Not an attribute we recognize, so nothing to do. */
3374                return;
3375        }
3376
3377        if (!selinux_initialized(&selinux_state)) {
3378                /* If we haven't even been initialized, then we can't validate
3379                 * against a policy, so leave the label as invalid. It may
3380                 * resolve to a valid label on the next revalidation try if
3381                 * we've since initialized.
3382                 */
3383                return;
3384        }
3385
3386        rc = security_context_to_sid_force(&selinux_state, value, size,
3387                                           &newsid);
3388        if (rc) {
3389                pr_err("SELinux:  unable to map context to SID"
3390                       "for (%s, %lu), rc=%d\n",
3391                       inode->i_sb->s_id, inode->i_ino, -rc);
3392                return;
3393        }
3394
3395        isec = backing_inode_security(dentry);
3396        spin_lock(&isec->lock);
3397        isec->sclass = inode_mode_to_security_class(inode->i_mode);
3398        isec->sid = newsid;
3399        isec->initialized = LABEL_INITIALIZED;
3400        spin_unlock(&isec->lock);
3401
3402        return;
3403}
3404
3405static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
3406{
3407        const struct cred *cred = current_cred();
3408
3409        return dentry_has_perm(cred, dentry, FILE__GETATTR);
3410}
3411
3412static int selinux_inode_listxattr(struct dentry *dentry)
3413{
3414        const struct cred *cred = current_cred();
3415
3416        return dentry_has_perm(cred, dentry, FILE__GETATTR);
3417}
3418
3419static int selinux_inode_removexattr(struct user_namespace *mnt_userns,
3420                                     struct dentry *dentry, const char *name)
3421{
3422        if (strcmp(name, XATTR_NAME_SELINUX)) {
3423                int rc = cap_inode_removexattr(mnt_userns, dentry, name);
3424                if (rc)
3425                        return rc;
3426
3427                /* Not an attribute we recognize, so just check the
3428                   ordinary setattr permission. */
3429                return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
3430        }
3431
3432        if (!selinux_initialized(&selinux_state))
3433                return 0;
3434
3435        /* No one is allowed to remove a SELinux security label.
3436           You can change the label, but all data must be labeled. */
3437        return -EACCES;
3438}
3439
3440static int selinux_path_notify(const struct path *path, u64 mask,
3441                                                unsigned int obj_type)
3442{
3443        int ret;
3444        u32 perm;
3445
3446        struct common_audit_data ad;
3447
3448        ad.type = LSM_AUDIT_DATA_PATH;
3449        ad.u.path = *path;
3450
3451        /*
3452         * Set permission needed based on the type of mark being set.
3453         * Performs an additional check for sb watches.
3454         */
3455        switch (obj_type) {
3456        case FSNOTIFY_OBJ_TYPE_VFSMOUNT:
3457                perm = FILE__WATCH_MOUNT;
3458                break;
3459        case FSNOTIFY_OBJ_TYPE_SB:
3460                perm = FILE__WATCH_SB;
3461                ret = superblock_has_perm(current_cred(), path->dentry->d_sb,
3462                                                FILESYSTEM__WATCH, &ad);
3463                if (ret)
3464                        return ret;
3465                break;
3466        case FSNOTIFY_OBJ_TYPE_INODE:
3467                perm = FILE__WATCH;
3468                break;
3469        default:
3470                return -EINVAL;
3471        }
3472
3473        /* blocking watches require the file:watch_with_perm permission */
3474        if (mask & (ALL_FSNOTIFY_PERM_EVENTS))
3475                perm |= FILE__WATCH_WITH_PERM;
3476
3477        /* watches on read-like events need the file:watch_reads permission */
3478        if (mask & (FS_ACCESS | FS_ACCESS_PERM | FS_CLOSE_NOWRITE))
3479                perm |= FILE__WATCH_READS;
3480
3481        return path_has_perm(current_cred(), path, perm);
3482}
3483
3484/*
3485 * Copy the inode security context value to the user.
3486 *
3487 * Permission check is handled by selinux_inode_getxattr hook.
3488 */
3489static int selinux_inode_getsecurity(struct user_namespace *mnt_userns,
3490                                     struct inode *inode, const char *name,
3491                                     void **buffer, bool alloc)
3492{
3493        u32 size;
3494        int error;
3495        char *context = NULL;
3496        struct inode_security_struct *isec;
3497
3498        /*
3499         * If we're not initialized yet, then we can't validate contexts, so
3500         * just let vfs_getxattr fall back to using the on-disk xattr.
3501         */
3502        if (!selinux_initialized(&selinux_state) ||
3503            strcmp(name, XATTR_SELINUX_SUFFIX))
3504                return -EOPNOTSUPP;
3505
3506        /*
3507         * If the caller has CAP_MAC_ADMIN, then get the raw context
3508         * value even if it is not defined by current policy; otherwise,
3509         * use the in-core value under current policy.
3510         * Use the non-auditing forms of the permission checks since
3511         * getxattr may be called by unprivileged processes commonly
3512         * and lack of permission just means that we fall back to the
3513         * in-core context value, not a denial.
3514         */
3515        isec = inode_security(inode);
3516        if (has_cap_mac_admin(false))
3517                error = security_sid_to_context_force(&selinux_state,
3518                                                      isec->sid, &context,
3519                                                      &size);
3520        else
3521                error = security_sid_to_context(&selinux_state, isec->sid,
3522                                                &context, &size);
3523        if (error)
3524                return error;
3525        error = size;
3526        if (alloc) {
3527                *buffer = context;
3528                goto out_nofree;
3529        }
3530        kfree(context);
3531out_nofree:
3532        return error;
3533}
3534
3535static int selinux_inode_setsecurity(struct inode *inode, const char *name,
3536                                     const void *value, size_t size, int flags)
3537{
3538        struct inode_security_struct *isec = inode_security_novalidate(inode);
3539        struct superblock_security_struct *sbsec;
3540        u32 newsid;
3541        int rc;
3542
3543        if (strcmp(name, XATTR_SELINUX_SUFFIX))
3544                return -EOPNOTSUPP;
3545
3546        sbsec = selinux_superblock(inode->i_sb);
3547        if (!(sbsec->flags & SBLABEL_MNT))
3548                return -EOPNOTSUPP;
3549
3550        if (!value || !size)
3551                return -EACCES;
3552
3553        rc = security_context_to_sid(&selinux_state, value, size, &newsid,
3554                                     GFP_KERNEL);
3555        if (rc)
3556                return rc;
3557
3558        spin_lock(&isec->lock);
3559        isec->sclass = inode_mode_to_security_class(inode->i_mode);
3560        isec->sid = newsid;
3561        isec->initialized = LABEL_INITIALIZED;
3562        spin_unlock(&isec->lock);
3563        return 0;
3564}
3565
3566static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
3567{
3568        const int len = sizeof(XATTR_NAME_SELINUX);
3569
3570        if (!selinux_initialized(&selinux_state))
3571                return 0;
3572
3573        if (buffer && len <= buffer_size)
3574                memcpy(buffer, XATTR_NAME_SELINUX, len);
3575        return len;
3576}
3577
3578static void selinux_inode_getsecid(struct inode *inode, u32 *secid)
3579{
3580        struct inode_security_struct *isec = inode_security_novalidate(inode);
3581        *secid = isec->sid;
3582}
3583
3584static int selinux_inode_copy_up(struct dentry *src, struct cred **new)
3585{
3586        u32 sid;
3587        struct task_security_struct *tsec;
3588        struct cred *new_creds = *new;
3589
3590        if (new_creds == NULL) {
3591                new_creds = prepare_creds();
3592                if (!new_creds)
3593                        return -ENOMEM;
3594        }
3595
3596        tsec = selinux_cred(new_creds);
3597        /* Get label from overlay inode and set it in create_sid */
3598        selinux_inode_getsecid(d_inode(src), &sid);
3599        tsec->create_sid = sid;
3600        *new = new_creds;
3601        return 0;
3602}
3603
3604static int selinux_inode_copy_up_xattr(const char *name)
3605{
3606        /* The copy_up hook above sets the initial context on an inode, but we
3607         * don't then want to overwrite it by blindly copying all the lower
3608         * xattrs up.  Instead, we have to filter out SELinux-related xattrs.
3609         */
3610        if (strcmp(name, XATTR_NAME_SELINUX) == 0)
3611                return 1; /* Discard */
3612        /*
3613         * Any other attribute apart from SELINUX is not claimed, supported
3614         * by selinux.
3615         */
3616        return -EOPNOTSUPP;
3617}
3618
3619/* kernfs node operations */
3620
3621static int selinux_kernfs_init_security(struct kernfs_node *kn_dir,
3622                                        struct kernfs_node *kn)
3623{
3624        const struct task_security_struct *tsec = selinux_cred(current_cred());
3625        u32 parent_sid, newsid, clen;
3626        int rc;
3627        char *context;
3628
3629        rc = kernfs_xattr_get(kn_dir, XATTR_NAME_SELINUX, NULL, 0);
3630        if (rc == -ENODATA)
3631                return 0;
3632        else if (rc < 0)
3633                return rc;
3634
3635        clen = (u32)rc;
3636        context = kmalloc(clen, GFP_KERNEL);
3637        if (!context)
3638                return -ENOMEM;
3639
3640        rc = kernfs_xattr_get(kn_dir, XATTR_NAME_SELINUX, context, clen);
3641        if (rc < 0) {
3642                kfree(context);
3643                return rc;
3644        }
3645
3646        rc = security_context_to_sid(&selinux_state, context, clen, &parent_sid,
3647                                     GFP_KERNEL);
3648        kfree(context);
3649        if (rc)
3650                return rc;
3651
3652        if (tsec->create_sid) {
3653                newsid = tsec->create_sid;
3654        } else {
3655                u16 secclass = inode_mode_to_security_class(kn->mode);
3656                struct qstr q;
3657
3658                q.name = kn->name;
3659                q.hash_len = hashlen_string(kn_dir, kn->name);
3660
3661                rc = security_transition_sid(&selinux_state, tsec->sid,
3662                                             parent_sid, secclass, &q,
3663                                             &newsid);
3664                if (rc)
3665                        return rc;
3666        }
3667
3668        rc = security_sid_to_context_force(&selinux_state, newsid,
3669                                           &context, &clen);
3670        if (rc)
3671                return rc;
3672
3673        rc = kernfs_xattr_set(kn, XATTR_NAME_SELINUX, context, clen,
3674                              XATTR_CREATE);
3675        kfree(context);
3676        return rc;
3677}
3678
3679
3680/* file security operations */
3681
3682static int selinux_revalidate_file_permission(struct file *file, int mask)
3683{
3684        const struct cred *cred = current_cred();
3685        struct inode *inode = file_inode(file);
3686
3687        /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
3688        if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
3689                mask |= MAY_APPEND;
3690
3691        return file_has_perm(cred, file,
3692                             file_mask_to_av(inode->i_mode, mask));
3693}
3694
3695static int selinux_file_permission(struct file *file, int mask)
3696{
3697        struct inode *inode = file_inode(file);
3698        struct file_security_struct *fsec = selinux_file(file);
3699        struct inode_security_struct *isec;
3700        u32 sid = current_sid();
3701
3702        if (!mask)
3703                /* No permission to check.  Existence test. */
3704                return 0;
3705
3706        isec = inode_security(inode);
3707        if (sid == fsec->sid && fsec->isid == isec->sid &&
3708            fsec->pseqno == avc_policy_seqno(&selinux_state))
3709                /* No change since file_open check. */
3710                return 0;
3711
3712        return selinux_revalidate_file_permission(file, mask);
3713}
3714
3715static int selinux_file_alloc_security(struct file *file)
3716{
3717        struct file_security_struct *fsec = selinux_file(file);
3718        u32 sid = current_sid();
3719
3720        fsec->sid = sid;
3721        fsec->fown_sid = sid;
3722
3723        return 0;
3724}
3725
3726/*
3727 * Check whether a task has the ioctl permission and cmd
3728 * operation to an inode.
3729 */
3730static int ioctl_has_perm(const struct cred *cred, struct file *file,
3731                u32 requested, u16 cmd)
3732{
3733        struct common_audit_data ad;
3734        struct file_security_struct *fsec = selinux_file(file);
3735        struct inode *inode = file_inode(file);
3736        struct inode_security_struct *isec;
3737        struct lsm_ioctlop_audit ioctl;
3738        u32 ssid = cred_sid(cred);
3739        int rc;
3740        u8 driver = cmd >> 8;
3741        u8 xperm = cmd & 0xff;
3742
3743        ad.type = LSM_AUDIT_DATA_IOCTL_OP;
3744        ad.u.op = &ioctl;
3745        ad.u.op->cmd = cmd;
3746        ad.u.op->path = file->f_path;
3747
3748        if (ssid != fsec->sid) {
3749                rc = avc_has_perm(&selinux_state,
3750                                  ssid, fsec->sid,
3751                                SECCLASS_FD,
3752                                FD__USE,
3753                                &ad);
3754                if (rc)
3755                        goto out;
3756        }
3757
3758        if (unlikely(IS_PRIVATE(inode)))
3759                return 0;
3760
3761        isec = inode_security(inode);
3762        rc = avc_has_extended_perms(&selinux_state,
3763                                    ssid, isec->sid, isec->sclass,
3764                                    requested, driver, xperm, &ad);
3765out:
3766        return rc;
3767}
3768
3769static int selinux_file_ioctl(struct file *file, unsigned int cmd,
3770                              unsigned long arg)
3771{
3772        const struct cred *cred = current_cred();
3773        int error = 0;
3774
3775        switch (cmd) {
3776        case FIONREAD:
3777        case FIBMAP:
3778        case FIGETBSZ:
3779        case FS_IOC_GETFLAGS:
3780        case FS_IOC_GETVERSION:
3781                error = file_has_perm(cred, file, FILE__GETATTR);
3782                break;
3783
3784        case FS_IOC_SETFLAGS:
3785        case FS_IOC_SETVERSION:
3786                error = file_has_perm(cred, file, FILE__SETATTR);
3787                break;
3788
3789        /* sys_ioctl() checks */
3790        case FIONBIO:
3791        case FIOASYNC:
3792                error = file_has_perm(cred, file, 0);
3793                break;
3794
3795        case KDSKBENT:
3796        case KDSKBSENT:
3797                error = cred_has_capability(cred, CAP_SYS_TTY_CONFIG,
3798                                            CAP_OPT_NONE, true);
3799                break;
3800
3801        /* default case assumes that the command will go
3802         * to the file's ioctl() function.
3803         */
3804        default:
3805                error = ioctl_has_perm(cred, file, FILE__IOCTL, (u16) cmd);
3806        }
3807        return error;
3808}
3809
3810static int default_noexec __ro_after_init;
3811
3812static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
3813{
3814        const struct cred *cred = current_cred();
3815        u32 sid = cred_sid(cred);
3816        int rc = 0;
3817
3818        if (default_noexec &&
3819            (prot & PROT_EXEC) && (!file || IS_PRIVATE(file_inode(file)) ||
3820                                   (!shared && (prot & PROT_WRITE)))) {
3821                /*
3822                 * We are making executable an anonymous mapping or a
3823                 * private file mapping that will also be writable.
3824                 * This has an additional check.
3825                 */
3826                rc = avc_has_perm(&selinux_state,
3827                                  sid, sid, SECCLASS_PROCESS,
3828                                  PROCESS__EXECMEM, NULL);
3829                if (rc)
3830                        goto error;
3831        }
3832
3833        if (file) {
3834                /* read access is always possible with a mapping */
3835                u32 av = FILE__READ;
3836
3837                /* write access only matters if the mapping is shared */
3838                if (shared && (prot & PROT_WRITE))
3839                        av |= FILE__WRITE;
3840
3841                if (prot & PROT_EXEC)
3842                        av |= FILE__EXECUTE;
3843
3844                return file_has_perm(cred, file, av);
3845        }
3846
3847error:
3848        return rc;
3849}
3850
3851static int selinux_mmap_addr(unsigned long addr)
3852{
3853        int rc = 0;
3854
3855        if (addr < CONFIG_LSM_MMAP_MIN_ADDR) {
3856                u32 sid = current_sid();
3857                rc = avc_has_perm(&selinux_state,
3858                                  sid, sid, SECCLASS_MEMPROTECT,
3859                                  MEMPROTECT__MMAP_ZERO, NULL);
3860        }
3861
3862        return rc;
3863}
3864
3865static int selinux_mmap_file(struct file *file, unsigned long reqprot,
3866                             unsigned long prot, unsigned long flags)
3867{
3868        struct common_audit_data ad;
3869        int rc;
3870
3871        if (file) {
3872                ad.type = LSM_AUDIT_DATA_FILE;
3873                ad.u.file = file;
3874                rc = inode_has_perm(current_cred(), file_inode(file),
3875                                    FILE__MAP, &ad);
3876                if (rc)
3877                        return rc;
3878        }
3879
3880        if (checkreqprot_get(&selinux_state))
3881                prot = reqprot;
3882
3883        return file_map_prot_check(file, prot,
3884                                   (flags & MAP_TYPE) == MAP_SHARED);
3885}
3886
3887static int selinux_file_mprotect(struct vm_area_struct *vma,
3888                                 unsigned long reqprot,
3889                                 unsigned long prot)
3890{
3891        const struct cred *cred = current_cred();
3892        u32 sid = cred_sid(cred);
3893
3894        if (checkreqprot_get(&selinux_state))
3895                prot = reqprot;
3896
3897        if (default_noexec &&
3898            (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
3899                int rc = 0;
3900                if (vma->vm_start >= vma->vm_mm->start_brk &&
3901                    vma->vm_end <= vma->vm_mm->brk) {
3902                        rc = avc_has_perm(&selinux_state,
3903                                          sid, sid, SECCLASS_PROCESS,
3904                                          PROCESS__EXECHEAP, NULL);
3905                } else if (!vma->vm_file &&
3906                           ((vma->vm_start <= vma->vm_mm->start_stack &&
3907                             vma->vm_end >= vma->vm_mm->start_stack) ||
3908                            vma_is_stack_for_current(vma))) {
3909                        rc = avc_has_perm(&selinux_state,
3910                                          sid, sid, SECCLASS_PROCESS,
3911                                          PROCESS__EXECSTACK, NULL);
3912                } else if (vma->vm_file && vma->anon_vma) {
3913                        /*
3914                         * We are making executable a file mapping that has
3915                         * had some COW done. Since pages might have been
3916                         * written, check ability to execute the possibly
3917                         * modified content.  This typically should only
3918                         * occur for text relocations.
3919                         */
3920                        rc = file_has_perm(cred, vma->vm_file, FILE__EXECMOD);
3921                }
3922                if (rc)
3923                        return rc;
3924        }
3925
3926        return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
3927}
3928
3929static int selinux_file_lock(struct file *file, unsigned int cmd)
3930{
3931        const struct cred *cred = current_cred();
3932
3933        return file_has_perm(cred, file, FILE__LOCK);
3934}
3935
3936static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3937                              unsigned long arg)
3938{
3939        const struct cred *cred = current_cred();
3940        int err = 0;
3941
3942        switch (cmd) {
3943        case F_SETFL:
3944                if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
3945                        err = file_has_perm(cred, file, FILE__WRITE);
3946                        break;
3947                }
3948                fallthrough;
3949        case F_SETOWN:
3950        case F_SETSIG:
3951        case F_GETFL:
3952        case F_GETOWN:
3953        case F_GETSIG:
3954        case F_GETOWNER_UIDS:
3955                /* Just check FD__USE permission */
3956                err = file_has_perm(cred, file, 0);
3957                break;
3958        case F_GETLK:
3959        case F_SETLK:
3960        case F_SETLKW:
3961        case F_OFD_GETLK:
3962        case F_OFD_SETLK:
3963        case F_OFD_SETLKW:
3964#if BITS_PER_LONG == 32
3965        case F_GETLK64:
3966        case F_SETLK64:
3967        case F_SETLKW64:
3968#endif
3969                err = file_has_perm(cred, file, FILE__LOCK);
3970                break;
3971        }
3972
3973        return err;
3974}
3975
3976static void selinux_file_set_fowner(struct file *file)
3977{
3978        struct file_security_struct *fsec;
3979
3980        fsec = selinux_file(file);
3981        fsec->fown_sid = current_sid();
3982}
3983
3984static int selinux_file_send_sigiotask(struct task_struct *tsk,
3985                                       struct fown_struct *fown, int signum)
3986{
3987        struct file *file;
3988        u32 sid = task_sid_obj(tsk);
3989        u32 perm;
3990        struct file_security_struct *fsec;
3991
3992        /* struct fown_struct is never outside the context of a struct file */
3993        file = container_of(fown, struct file, f_owner);
3994
3995        fsec = selinux_file(file);
3996
3997        if (!signum)
3998                perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
3999        else
4000                perm = signal_to_av(signum);
4001
4002        return avc_has_perm(&selinux_state,
4003                            fsec->fown_sid, sid,
4004                            SECCLASS_PROCESS, perm, NULL);
4005}
4006
4007static int selinux_file_receive(struct file *file)
4008{
4009        const struct cred *cred = current_cred();
4010
4011        return file_has_perm(cred, file, file_to_av(file));
4012}
4013
4014static int selinux_file_open(struct file *file)
4015{
4016        struct file_security_struct *fsec;
4017        struct inode_security_struct *isec;
4018
4019        fsec = selinux_file(file);
4020        isec = inode_security(file_inode(file));
4021        /*
4022         * Save inode label and policy sequence number
4023         * at open-time so that selinux_file_permission
4024         * can determine whether revalidation is necessary.
4025         * Task label is already saved in the file security
4026         * struct as its SID.
4027         */
4028        fsec->isid = isec->sid;
4029        fsec->pseqno = avc_policy_seqno(&selinux_state);
4030        /*
4031         * Since the inode label or policy seqno may have changed
4032         * between the selinux_inode_permission check and the saving
4033         * of state above, recheck that access is still permitted.
4034         * Otherwise, access might never be revalidated against the
4035         * new inode label or new policy.
4036         * This check is not redundant - do not remove.
4037         */
4038        return file_path_has_perm(file->f_cred, file, open_file_to_av(file));
4039}
4040
4041/* task security operations */
4042
4043static int selinux_task_alloc(struct task_struct *task,
4044                              unsigned long clone_flags)
4045{
4046        u32 sid = current_sid();
4047
4048        return avc_has_perm(&selinux_state,
4049                            sid, sid, SECCLASS_PROCESS, PROCESS__FORK, NULL);
4050}
4051
4052/*
4053 * prepare a new set of credentials for modification
4054 */
4055static int selinux_cred_prepare(struct cred *new, const struct cred *old,
4056                                gfp_t gfp)
4057{
4058        const struct task_security_struct *old_tsec = selinux_cred(old);
4059        struct task_security_struct *tsec = selinux_cred(new);
4060
4061        *tsec = *old_tsec;
4062        return 0;
4063}
4064
4065/*
4066 * transfer the SELinux data to a blank set of creds
4067 */
4068static void selinux_cred_transfer(struct cred *new, const struct cred *old)
4069{
4070        const struct task_security_struct *old_tsec = selinux_cred(old);
4071        struct task_security_struct *tsec = selinux_cred(new);
4072
4073        *tsec = *old_tsec;
4074}
4075
4076static void selinux_cred_getsecid(const struct cred *c, u32 *secid)
4077{
4078        *secid = cred_sid(c);
4079}
4080
4081/*
4082 * set the security data for a kernel service
4083 * - all the creation contexts are set to unlabelled
4084 */
4085static int selinux_kernel_act_as(struct cred *new, u32 secid)
4086{
4087        struct task_security_struct *tsec = selinux_cred(new);
4088        u32 sid = current_sid();
4089        int ret;
4090
4091        ret = avc_has_perm(&selinux_state,
4092                           sid, secid,
4093                           SECCLASS_KERNEL_SERVICE,
4094                           KERNEL_SERVICE__USE_AS_OVERRIDE,
4095                           NULL);
4096        if (ret == 0) {
4097                tsec->sid = secid;
4098                tsec->create_sid = 0;
4099                tsec->keycreate_sid = 0;
4100                tsec->sockcreate_sid = 0;
4101        }
4102        return ret;
4103}
4104
4105/*
4106 * set the file creation context in a security record to the same as the
4107 * objective context of the specified inode
4108 */
4109static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
4110{
4111        struct inode_security_struct *isec = inode_security(inode);
4112        struct task_security_struct *tsec = selinux_cred(new);
4113        u32 sid = current_sid();
4114        int ret;
4115
4116        ret = avc_has_perm(&selinux_state,
4117                           sid, isec->sid,
4118                           SECCLASS_KERNEL_SERVICE,
4119                           KERNEL_SERVICE__CREATE_FILES_AS,
4120                           NULL);
4121
4122        if (ret == 0)
4123                tsec->create_sid = isec->sid;
4124        return ret;
4125}
4126
4127static int selinux_kernel_module_request(char *kmod_name)
4128{
4129        struct common_audit_data ad;
4130
4131        ad.type = LSM_AUDIT_DATA_KMOD;
4132        ad.u.kmod_name = kmod_name;
4133
4134        return avc_has_perm(&selinux_state,
4135                            current_sid(), SECINITSID_KERNEL, SECCLASS_SYSTEM,
4136                            SYSTEM__MODULE_REQUEST, &ad);
4137}
4138
4139static int selinux_kernel_module_from_file(struct file *file)
4140{
4141        struct common_audit_data ad;
4142        struct inode_security_struct *isec;
4143        struct file_security_struct *fsec;
4144        u32 sid = current_sid();
4145        int rc;
4146
4147        /* init_module */
4148        if (file == NULL)
4149                return avc_has_perm(&selinux_state,
4150                                    sid, sid, SECCLASS_SYSTEM,
4151                                        SYSTEM__MODULE_LOAD, NULL);
4152
4153        /* finit_module */
4154
4155        ad.type = LSM_AUDIT_DATA_FILE;
4156        ad.u.file = file;
4157
4158        fsec = selinux_file(file);
4159        if (sid != fsec->sid) {
4160                rc = avc_has_perm(&selinux_state,
4161                                  sid, fsec->sid, SECCLASS_FD, FD__USE, &ad);
4162                if (rc)
4163                        return rc;
4164        }
4165
4166        isec = inode_security(file_inode(file));
4167        return avc_has_perm(&selinux_state,
4168                            sid, isec->sid, SECCLASS_SYSTEM,
4169                                SYSTEM__MODULE_LOAD, &ad);
4170}
4171
4172static int selinux_kernel_read_file(struct file *file,
4173                                    enum kernel_read_file_id id,
4174                                    bool contents)
4175{
4176        int rc = 0;
4177
4178        switch (id) {
4179        case READING_MODULE:
4180                rc = selinux_kernel_module_from_file(contents ? file : NULL);
4181                break;
4182        default:
4183                break;
4184        }
4185
4186        return rc;
4187}
4188
4189static int selinux_kernel_load_data(enum kernel_load_data_id id, bool contents)
4190{
4191        int rc = 0;
4192
4193        switch (id) {
4194        case LOADING_MODULE:
4195                rc = selinux_kernel_module_from_file(NULL);
4196                break;
4197        default:
4198                break;
4199        }
4200
4201        return rc;
4202}
4203
4204static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
4205{
4206        return avc_has_perm(&selinux_state,
4207                            current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4208                            PROCESS__SETPGID, NULL);
4209}
4210
4211static int selinux_task_getpgid(struct task_struct *p)
4212{
4213        return avc_has_perm(&selinux_state,
4214                            current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4215                            PROCESS__GETPGID, NULL);
4216}
4217
4218static int selinux_task_getsid(struct task_struct *p)
4219{
4220        return avc_has_perm(&selinux_state,
4221                            current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4222                            PROCESS__GETSESSION, NULL);
4223}
4224
4225static void selinux_task_getsecid_subj(struct task_struct *p, u32 *secid)
4226{
4227        *secid = task_sid_subj(p);
4228}
4229
4230static void selinux_task_getsecid_obj(struct task_struct *p, u32 *secid)
4231{
4232        *secid = task_sid_obj(p);
4233}
4234
4235static int selinux_task_setnice(struct task_struct *p, int nice)
4236{
4237        return avc_has_perm(&selinux_state,
4238                            current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4239                            PROCESS__SETSCHED, NULL);
4240}
4241
4242static int selinux_task_setioprio(struct task_struct *p, int ioprio)
4243{
4244        return avc_has_perm(&selinux_state,
4245                            current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4246                            PROCESS__SETSCHED, NULL);
4247}
4248
4249static int selinux_task_getioprio(struct task_struct *p)
4250{
4251        return avc_has_perm(&selinux_state,
4252                            current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4253                            PROCESS__GETSCHED, NULL);
4254}
4255
4256static int selinux_task_prlimit(const struct cred *cred, const struct cred *tcred,
4257                                unsigned int flags)
4258{
4259        u32 av = 0;
4260
4261        if (!flags)
4262                return 0;
4263        if (flags & LSM_PRLIMIT_WRITE)
4264                av |= PROCESS__SETRLIMIT;
4265        if (flags & LSM_PRLIMIT_READ)
4266                av |= PROCESS__GETRLIMIT;
4267        return avc_has_perm(&selinux_state,
4268                            cred_sid(cred), cred_sid(tcred),
4269                            SECCLASS_PROCESS, av, NULL);
4270}
4271
4272static int selinux_task_setrlimit(struct task_struct *p, unsigned int resource,
4273                struct rlimit *new_rlim)
4274{
4275        struct rlimit *old_rlim = p->signal->rlim + resource;
4276
4277        /* Control the ability to change the hard limit (whether
4278           lowering or raising it), so that the hard limit can
4279           later be used as a safe reset point for the soft limit
4280           upon context transitions.  See selinux_bprm_committing_creds. */
4281        if (old_rlim->rlim_max != new_rlim->rlim_max)
4282                return avc_has_perm(&selinux_state,
4283                                    current_sid(), task_sid_obj(p),
4284                                    SECCLASS_PROCESS, PROCESS__SETRLIMIT, NULL);
4285
4286        return 0;
4287}
4288
4289static int selinux_task_setscheduler(struct task_struct *p)
4290{
4291        return avc_has_perm(&selinux_state,
4292                            current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4293                            PROCESS__SETSCHED, NULL);
4294}
4295
4296static int selinux_task_getscheduler(struct task_struct *p)
4297{
4298        return avc_has_perm(&selinux_state,
4299                            current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4300                            PROCESS__GETSCHED, NULL);
4301}
4302
4303static int selinux_task_movememory(struct task_struct *p)
4304{
4305        return avc_has_perm(&selinux_state,
4306                            current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4307                            PROCESS__SETSCHED, NULL);
4308}
4309
4310static int selinux_task_kill(struct task_struct *p, struct kernel_siginfo *info,
4311                                int sig, const struct cred *cred)
4312{
4313        u32 secid;
4314        u32 perm;
4315
4316        if (!sig)
4317                perm = PROCESS__SIGNULL; /* null signal; existence test */
4318        else
4319                perm = signal_to_av(sig);
4320        if (!cred)
4321                secid = current_sid();
4322        else
4323                secid = cred_sid(cred);
4324        return avc_has_perm(&selinux_state,
4325                            secid, task_sid_obj(p), SECCLASS_PROCESS, perm, NULL);
4326}
4327
4328static void selinux_task_to_inode(struct task_struct *p,
4329                                  struct inode *inode)
4330{
4331        struct inode_security_struct *isec = selinux_inode(inode);
4332        u32 sid = task_sid_obj(p);
4333
4334        spin_lock(&isec->lock);
4335        isec->sclass = inode_mode_to_security_class(inode->i_mode);
4336        isec->sid = sid;
4337        isec->initialized = LABEL_INITIALIZED;
4338        spin_unlock(&isec->lock);
4339}
4340
4341/* Returns error only if unable to parse addresses */
4342static int selinux_parse_skb_ipv4(struct sk_buff *skb,
4343                        struct common_audit_data *ad, u8 *proto)
4344{
4345        int offset, ihlen, ret = -EINVAL;
4346        struct iphdr _iph, *ih;
4347
4348        offset = skb_network_offset(skb);
4349        ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
4350        if (ih == NULL)
4351                goto out;
4352
4353        ihlen = ih->ihl * 4;
4354        if (ihlen < sizeof(_iph))
4355                goto out;
4356
4357        ad->u.net->v4info.saddr = ih->saddr;
4358        ad->u.net->v4info.daddr = ih->daddr;
4359        ret = 0;
4360
4361        if (proto)
4362                *proto = ih->protocol;
4363
4364        switch (ih->protocol) {
4365        case IPPROTO_TCP: {
4366                struct tcphdr _tcph, *th;
4367
4368                if (ntohs(ih->frag_off) & IP_OFFSET)
4369                        break;
4370
4371                offset += ihlen;
4372                th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
4373                if (th == NULL)
4374                        break;
4375
4376                ad->u.net->sport = th->source;
4377                ad->u.net->dport = th->dest;
4378                break;
4379        }
4380
4381        case IPPROTO_UDP: {
4382                struct udphdr _udph, *uh;
4383
4384                if (ntohs(ih->frag_off) & IP_OFFSET)
4385                        break;
4386
4387                offset += ihlen;
4388                uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
4389                if (uh == NULL)
4390                        break;
4391
4392                ad->u.net->sport = uh->source;
4393                ad->u.net->dport = uh->dest;
4394                break;
4395        }
4396
4397        case IPPROTO_DCCP: {
4398                struct dccp_hdr _dccph, *dh;
4399
4400                if (ntohs(ih->frag_off) & IP_OFFSET)
4401                        break;
4402
4403                offset += ihlen;
4404                dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
4405                if (dh == NULL)
4406                        break;
4407
4408                ad->u.net->sport = dh->dccph_sport;
4409                ad->u.net->dport = dh->dccph_dport;
4410                break;
4411        }
4412
4413#if IS_ENABLED(CONFIG_IP_SCTP)
4414        case IPPROTO_SCTP: {
4415                struct sctphdr _sctph, *sh;
4416
4417                if (ntohs(ih->frag_off) & IP_OFFSET)
4418                        break;
4419
4420                offset += ihlen;
4421                sh = skb_header_pointer(skb, offset, sizeof(_sctph), &_sctph);
4422                if (sh == NULL)
4423                        break;
4424
4425                ad->u.net->sport = sh->source;
4426                ad->u.net->dport = sh->dest;
4427                break;
4428        }
4429#endif
4430        default:
4431                break;
4432        }
4433out:
4434        return ret;
4435}
4436
4437#if IS_ENABLED(CONFIG_IPV6)
4438
4439/* Returns error only if unable to parse addresses */
4440static int selinux_parse_skb_ipv6(struct sk_buff *skb,
4441                        struct common_audit_data *ad, u8 *proto)
4442{
4443        u8 nexthdr;
4444        int ret = -EINVAL, offset;
4445        struct ipv6hdr _ipv6h, *ip6;
4446        __be16 frag_off;
4447
4448        offset = skb_network_offset(skb);
4449        ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
4450        if (ip6 == NULL)
4451                goto out;
4452
4453        ad->u.net->v6info.saddr = ip6->saddr;
4454        ad->u.net->v6info.daddr = ip6->daddr;
4455        ret = 0;
4456
4457        nexthdr = ip6->nexthdr;
4458        offset += sizeof(_ipv6h);
4459        offset = ipv6_skip_exthdr(skb, offset, &nexthdr, &frag_off);
4460        if (offset < 0)
4461                goto out;
4462
4463        if (proto)
4464                *proto = nexthdr;
4465
4466        switch (nexthdr) {
4467        case IPPROTO_TCP: {
4468                struct tcphdr _tcph, *th;
4469
4470                th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
4471                if (th == NULL)
4472                        break;
4473
4474                ad->u.net->sport = th->source;
4475                ad->u.net->dport = th->dest;
4476                break;
4477        }
4478
4479        case IPPROTO_UDP: {
4480                struct udphdr _udph, *uh;
4481
4482                uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
4483                if (uh == NULL)
4484                        break;
4485
4486                ad->u.net->sport = uh->source;
4487                ad->u.net->dport = uh->dest;
4488                break;
4489        }
4490
4491        case IPPROTO_DCCP: {
4492                struct dccp_hdr _dccph, *dh;
4493
4494                dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
4495                if (dh == NULL)
4496                        break;
4497
4498                ad->u.net->sport = dh->dccph_sport;
4499                ad->u.net->dport = dh->dccph_dport;
4500                break;
4501        }
4502
4503#if IS_ENABLED(CONFIG_IP_SCTP)
4504        case IPPROTO_SCTP: {
4505                struct sctphdr _sctph, *sh;
4506
4507                sh = skb_header_pointer(skb, offset, sizeof(_sctph), &_sctph);
4508                if (sh == NULL)
4509                        break;
4510
4511                ad->u.net->sport = sh->source;
4512                ad->u.net->dport = sh->dest;
4513                break;
4514        }
4515#endif
4516        /* includes fragments */
4517        default:
4518                break;
4519        }
4520out:
4521        return ret;
4522}
4523
4524#endif /* IPV6 */
4525
4526static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
4527                             char **_addrp, int src, u8 *proto)
4528{
4529        char *addrp;
4530        int ret;
4531
4532        switch (ad->u.net->family) {
4533        case PF_INET:
4534                ret = selinux_parse_skb_ipv4(skb, ad, proto);
4535                if (ret)
4536                        goto parse_error;
4537                addrp = (char *)(src ? &ad->u.net->v4info.saddr :
4538                                       &ad->u.net->v4info.daddr);
4539                goto okay;
4540
4541#if IS_ENABLED(CONFIG_IPV6)
4542        case PF_INET6:
4543                ret = selinux_parse_skb_ipv6(skb, ad, proto);
4544                if (ret)
4545                        goto parse_error;
4546                addrp = (char *)(src ? &ad->u.net->v6info.saddr :
4547                                       &ad->u.net->v6info.daddr);
4548                goto okay;
4549#endif  /* IPV6 */
4550        default:
4551                addrp = NULL;
4552                goto okay;
4553        }
4554
4555parse_error:
4556        pr_warn(
4557               "SELinux: failure in selinux_parse_skb(),"
4558               " unable to parse packet\n");
4559        return ret;
4560
4561okay:
4562        if (_addrp)
4563                *_addrp = addrp;
4564        return 0;
4565}
4566
4567/**
4568 * selinux_skb_peerlbl_sid - Determine the peer label of a packet
4569 * @skb: the packet
4570 * @family: protocol family
4571 * @sid: the packet's peer label SID
4572 *
4573 * Description:
4574 * Check the various different forms of network peer labeling and determine
4575 * the peer label/SID for the packet; most of the magic actually occurs in
4576 * the security server function security_net_peersid_cmp().  The function
4577 * returns zero if the value in @sid is valid (although it may be SECSID_NULL)
4578 * or -EACCES if @sid is invalid due to inconsistencies with the different
4579 * peer labels.
4580 *
4581 */
4582static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
4583{
4584        int err;
4585        u32 xfrm_sid;
4586        u32 nlbl_sid;
4587        u32 nlbl_type;
4588
4589        err = selinux_xfrm_skb_sid(skb, &xfrm_sid);
4590        if (unlikely(err))
4591                return -EACCES;
4592        err = selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
4593        if (unlikely(err))
4594                return -EACCES;
4595
4596        err = security_net_peersid_resolve(&selinux_state, nlbl_sid,
4597                                           nlbl_type, xfrm_sid, sid);
4598        if (unlikely(err)) {
4599                pr_warn(
4600                       "SELinux: failure in selinux_skb_peerlbl_sid(),"
4601                       " unable to determine packet's peer label\n");
4602                return -EACCES;
4603        }
4604
4605        return 0;
4606}
4607
4608/**
4609 * selinux_conn_sid - Determine the child socket label for a connection
4610 * @sk_sid: the parent socket's SID
4611 * @skb_sid: the packet's SID
4612 * @conn_sid: the resulting connection SID
4613 *
4614 * If @skb_sid is valid then the user:role:type information from @sk_sid is
4615 * combined with the MLS information from @skb_sid in order to create
4616 * @conn_sid.  If @skb_sid is not valid then @conn_sid is simply a copy
4617 * of @sk_sid.  Returns zero on success, negative values on failure.
4618 *
4619 */
4620static int selinux_conn_sid(u32 sk_sid, u32 skb_sid, u32 *conn_sid)
4621{
4622        int err = 0;
4623
4624        if (skb_sid != SECSID_NULL)
4625                err = security_sid_mls_copy(&selinux_state, sk_sid, skb_sid,
4626                                            conn_sid);
4627        else
4628                *conn_sid = sk_sid;
4629
4630        return err;
4631}
4632
4633/* socket security operations */
4634
4635static int socket_sockcreate_sid(const struct task_security_struct *tsec,
4636                                 u16 secclass, u32 *socksid)
4637{
4638        if (tsec->sockcreate_sid > SECSID_NULL) {
4639                *socksid = tsec->sockcreate_sid;
4640                return 0;
4641        }
4642
4643        return security_transition_sid(&selinux_state, tsec->sid, tsec->sid,
4644                                       secclass, NULL, socksid);
4645}
4646
4647static int sock_has_perm(struct sock *sk, u32 perms)
4648{
4649        struct sk_security_struct *sksec = sk->sk_security;
4650        struct common_audit_data ad;
4651        struct lsm_network_audit net = {0,};
4652
4653        if (sksec->sid == SECINITSID_KERNEL)
4654                return 0;
4655
4656        ad.type = LSM_AUDIT_DATA_NET;
4657        ad.u.net = &net;
4658        ad.u.net->sk = sk;
4659
4660        return avc_has_perm(&selinux_state,
4661                            current_sid(), sksec->sid, sksec->sclass, perms,
4662                            &ad);
4663}
4664
4665static int selinux_socket_create(int family, int type,
4666                                 int protocol, int kern)
4667{
4668        const struct task_security_struct *tsec = selinux_cred(current_cred());
4669        u32 newsid;
4670        u16 secclass;
4671        int rc;
4672
4673        if (kern)
4674                return 0;
4675
4676        secclass = socket_type_to_security_class(family, type, protocol);
4677        rc = socket_sockcreate_sid(tsec, secclass, &newsid);
4678        if (rc)
4679                return rc;
4680
4681        return avc_has_perm(&selinux_state,
4682                            tsec->sid, newsid, secclass, SOCKET__CREATE, NULL);
4683}
4684
4685static int selinux_socket_post_create(struct socket *sock, int family,
4686                                      int type, int protocol, int kern)
4687{
4688        const struct task_security_struct *tsec = selinux_cred(current_cred());
4689        struct inode_security_struct *isec = inode_security_novalidate(SOCK_INODE(sock));
4690        struct sk_security_struct *sksec;
4691        u16 sclass = socket_type_to_security_class(family, type, protocol);
4692        u32 sid = SECINITSID_KERNEL;
4693        int err = 0;
4694
4695        if (!kern) {
4696                err = socket_sockcreate_sid(tsec, sclass, &sid);
4697                if (err)
4698                        return err;
4699        }
4700
4701        isec->sclass = sclass;
4702        isec->sid = sid;
4703        isec->initialized = LABEL_INITIALIZED;
4704
4705        if (sock->sk) {
4706                sksec = sock->sk->sk_security;
4707                sksec->sclass = sclass;
4708                sksec->sid = sid;
4709                /* Allows detection of the first association on this socket */
4710                if (sksec->sclass == SECCLASS_SCTP_SOCKET)
4711                        sksec->sctp_assoc_state = SCTP_ASSOC_UNSET;
4712
4713                err = selinux_netlbl_socket_post_create(sock->sk, family);
4714        }
4715
4716        return err;
4717}
4718
4719static int selinux_socket_socketpair(struct socket *socka,
4720                                     struct socket *sockb)
4721{
4722        struct sk_security_struct *sksec_a = socka->sk->sk_security;
4723        struct sk_security_struct *sksec_b = sockb->sk->sk_security;
4724
4725        sksec_a->peer_sid = sksec_b->sid;
4726        sksec_b->peer_sid = sksec_a->sid;
4727
4728        return 0;
4729}
4730
4731/* Range of port numbers used to automatically bind.
4732   Need to determine whether we should perform a name_bind
4733   permission check between the socket and the port number. */
4734
4735static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
4736{
4737        struct sock *sk = sock->sk;
4738        struct sk_security_struct *sksec = sk->sk_security;
4739        u16 family;
4740        int err;
4741
4742        err = sock_has_perm(sk, SOCKET__BIND);
4743        if (err)
4744                goto out;
4745
4746        /* If PF_INET or PF_INET6, check name_bind permission for the port. */
4747        family = sk->sk_family;
4748        if (family == PF_INET || family == PF_INET6) {
4749                char *addrp;
4750                struct common_audit_data ad;
4751                struct lsm_network_audit net = {0,};
4752                struct sockaddr_in *addr4 = NULL;
4753                struct sockaddr_in6 *addr6 = NULL;
4754                u16 family_sa;
4755                unsigned short snum;
4756                u32 sid, node_perm;
4757
4758                /*
4759                 * sctp_bindx(3) calls via selinux_sctp_bind_connect()
4760                 * that validates multiple binding addresses. Because of this
4761                 * need to check address->sa_family as it is possible to have
4762                 * sk->sk_family = PF_INET6 with addr->sa_family = AF_INET.
4763                 */
4764                if (addrlen < offsetofend(struct sockaddr, sa_family))
4765                        return -EINVAL;
4766                family_sa = address->sa_family;
4767                switch (family_sa) {
4768                case AF_UNSPEC:
4769                case AF_INET:
4770                        if (addrlen < sizeof(struct sockaddr_in))
4771                                return -EINVAL;
4772                        addr4 = (struct sockaddr_in *)address;
4773                        if (family_sa == AF_UNSPEC) {
4774                                /* see __inet_bind(), we only want to allow
4775                                 * AF_UNSPEC if the address is INADDR_ANY
4776                                 */
4777                                if (addr4->sin_addr.s_addr != htonl(INADDR_ANY))
4778                                        goto err_af;
4779                                family_sa = AF_INET;
4780                        }
4781                        snum = ntohs(addr4->sin_port);
4782                        addrp = (char *)&addr4->sin_addr.s_addr;
4783                        break;
4784                case AF_INET6:
4785                        if (addrlen < SIN6_LEN_RFC2133)
4786                                return -EINVAL;
4787                        addr6 = (struct sockaddr_in6 *)address;
4788                        snum = ntohs(addr6->sin6_port);
4789                        addrp = (char *)&addr6->sin6_addr.s6_addr;
4790                        break;
4791                default:
4792                        goto err_af;
4793                }
4794
4795                ad.type = LSM_AUDIT_DATA_NET;
4796                ad.u.net = &net;
4797                ad.u.net->sport = htons(snum);
4798                ad.u.net->family = family_sa;
4799
4800                if (snum) {
4801                        int low, high;
4802
4803                        inet_get_local_port_range(sock_net(sk), &low, &high);
4804
4805                        if (inet_port_requires_bind_service(sock_net(sk), snum) ||
4806                            snum < low || snum > high) {
4807                                err = sel_netport_sid(sk->sk_protocol,
4808                                                      snum, &sid);
4809                                if (err)
4810                                        goto out;
4811                                err = avc_has_perm(&selinux_state,
4812                                                   sksec->sid, sid,
4813                                                   sksec->sclass,
4814                                                   SOCKET__NAME_BIND, &ad);
4815                                if (err)
4816                                        goto out;
4817                        }
4818                }
4819
4820                switch (sksec->sclass) {
4821                case SECCLASS_TCP_SOCKET:
4822                        node_perm = TCP_SOCKET__NODE_BIND;
4823                        break;
4824
4825                case SECCLASS_UDP_SOCKET:
4826                        node_perm = UDP_SOCKET__NODE_BIND;
4827                        break;
4828
4829                case SECCLASS_DCCP_SOCKET:
4830                        node_perm = DCCP_SOCKET__NODE_BIND;
4831                        break;
4832
4833                case SECCLASS_SCTP_SOCKET:
4834                        node_perm = SCTP_SOCKET__NODE_BIND;
4835                        break;
4836
4837                default:
4838                        node_perm = RAWIP_SOCKET__NODE_BIND;
4839                        break;
4840                }
4841
4842                err = sel_netnode_sid(addrp, family_sa, &sid);
4843                if (err)
4844                        goto out;
4845
4846                if (family_sa == AF_INET)
4847                        ad.u.net->v4info.saddr = addr4->sin_addr.s_addr;
4848                else
4849                        ad.u.net->v6info.saddr = addr6->sin6_addr;
4850
4851                err = avc_has_perm(&selinux_state,
4852                                   sksec->sid, sid,
4853                                   sksec->sclass, node_perm, &ad);
4854                if (err)
4855                        goto out;
4856        }
4857out:
4858        return err;
4859err_af:
4860        /* Note that SCTP services expect -EINVAL, others -EAFNOSUPPORT. */
4861        if (sksec->sclass == SECCLASS_SCTP_SOCKET)
4862                return -EINVAL;
4863        return -EAFNOSUPPORT;
4864}
4865
4866/* This supports connect(2) and SCTP connect services such as sctp_connectx(3)
4867 * and sctp_sendmsg(3) as described in Documentation/security/SCTP.rst
4868 */
4869static int selinux_socket_connect_helper(struct socket *sock,
4870                                         struct sockaddr *address, int addrlen)
4871{
4872        struct sock *sk = sock->sk;
4873        struct sk_security_struct *sksec = sk->sk_security;
4874        int err;
4875
4876        err = sock_has_perm(sk, SOCKET__CONNECT);
4877        if (err)
4878                return err;
4879        if (addrlen < offsetofend(struct sockaddr, sa_family))
4880                return -EINVAL;
4881
4882        /* connect(AF_UNSPEC) has special handling, as it is a documented
4883         * way to disconnect the socket
4884         */
4885        if (address->sa_family == AF_UNSPEC)
4886                return 0;
4887
4888        /*
4889         * If a TCP, DCCP or SCTP socket, check name_connect permission
4890         * for the port.
4891         */
4892        if (sksec->sclass == SECCLASS_TCP_SOCKET ||
4893            sksec->sclass == SECCLASS_DCCP_SOCKET ||
4894            sksec->sclass == SECCLASS_SCTP_SOCKET) {
4895                struct common_audit_data ad;
4896                struct lsm_network_audit net = {0,};
4897                struct sockaddr_in *addr4 = NULL;
4898                struct sockaddr_in6 *addr6 = NULL;
4899                unsigned short snum;
4900                u32 sid, perm;
4901
4902                /* sctp_connectx(3) calls via selinux_sctp_bind_connect()
4903                 * that validates multiple connect addresses. Because of this
4904                 * need to check address->sa_family as it is possible to have
4905                 * sk->sk_family = PF_INET6 with addr->sa_family = AF_INET.
4906                 */
4907                switch (address->sa_family) {
4908                case AF_INET:
4909                        addr4 = (struct sockaddr_in *)address;
4910                        if (addrlen < sizeof(struct sockaddr_in))
4911                                return -EINVAL;
4912                        snum = ntohs(addr4->sin_port);
4913                        break;
4914                case AF_INET6:
4915                        addr6 = (struct sockaddr_in6 *)address;
4916                        if (addrlen < SIN6_LEN_RFC2133)
4917                                return -EINVAL;
4918                        snum = ntohs(addr6->sin6_port);
4919                        break;
4920                default:
4921                        /* Note that SCTP services expect -EINVAL, whereas
4922                         * others expect -EAFNOSUPPORT.
4923                         */
4924                        if (sksec->sclass == SECCLASS_SCTP_SOCKET)
4925                                return -EINVAL;
4926                        else
4927                                return -EAFNOSUPPORT;
4928                }
4929
4930                err = sel_netport_sid(sk->sk_protocol, snum, &sid);
4931                if (err)
4932                        return err;
4933
4934                switch (sksec->sclass) {
4935                case SECCLASS_TCP_SOCKET:
4936                        perm = TCP_SOCKET__NAME_CONNECT;
4937                        break;
4938                case SECCLASS_DCCP_SOCKET:
4939                        perm = DCCP_SOCKET__NAME_CONNECT;
4940                        break;
4941                case SECCLASS_SCTP_SOCKET:
4942                        perm = SCTP_SOCKET__NAME_CONNECT;
4943                        break;
4944                }
4945
4946                ad.type = LSM_AUDIT_DATA_NET;
4947                ad.u.net = &net;
4948                ad.u.net->dport = htons(snum);
4949                ad.u.net->family = address->sa_family;
4950                err = avc_has_perm(&selinux_state,
4951                                   sksec->sid, sid, sksec->sclass, perm, &ad);
4952                if (err)
4953                        return err;
4954        }
4955
4956        return 0;
4957}
4958
4959/* Supports connect(2), see comments in selinux_socket_connect_helper() */
4960static int selinux_socket_connect(struct socket *sock,
4961                                  struct sockaddr *address, int addrlen)
4962{
4963        int err;
4964        struct sock *sk = sock->sk;
4965
4966        err = selinux_socket_connect_helper(sock, address, addrlen);
4967        if (err)
4968                return err;
4969
4970        return selinux_netlbl_socket_connect(sk, address);
4971}
4972
4973static int selinux_socket_listen(struct socket *sock, int backlog)
4974{
4975        return sock_has_perm(sock->sk, SOCKET__LISTEN);
4976}
4977
4978static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
4979{
4980        int err;
4981        struct inode_security_struct *isec;
4982        struct inode_security_struct *newisec;
4983        u16 sclass;
4984        u32 sid;
4985
4986        err = sock_has_perm(sock->sk, SOCKET__ACCEPT);
4987        if (err)
4988                return err;
4989
4990        isec = inode_security_novalidate(SOCK_INODE(sock));
4991        spin_lock(&isec->lock);
4992        sclass = isec->sclass;
4993        sid = isec->sid;
4994        spin_unlock(&isec->lock);
4995
4996        newisec = inode_security_novalidate(SOCK_INODE(newsock));
4997        newisec->sclass = sclass;
4998        newisec->sid = sid;
4999        newisec->initialized = LABEL_INITIALIZED;
5000
5001        return 0;
5002}
5003
5004static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
5005                                  int size)
5006{
5007        return sock_has_perm(sock->sk, SOCKET__WRITE);
5008}
5009
5010static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
5011                                  int size, int flags)
5012{
5013        return sock_has_perm(sock->sk, SOCKET__READ);
5014}
5015
5016static int selinux_socket_getsockname(struct socket *sock)
5017{
5018        return sock_has_perm(sock->sk, SOCKET__GETATTR);
5019}
5020
5021static int selinux_socket_getpeername(struct socket *sock)
5022{
5023        return sock_has_perm(sock->sk, SOCKET__GETATTR);
5024}
5025
5026static int selinux_socket_setsockopt(struct socket *sock, int level, int optname)
5027{
5028        int err;
5029
5030        err = sock_has_perm(sock->sk, SOCKET__SETOPT);
5031        if (err)
5032                return err;
5033
5034        return selinux_netlbl_socket_setsockopt(sock, level, optname);
5035}
5036
5037static int selinux_socket_getsockopt(struct socket *sock, int level,
5038                                     int optname)
5039{
5040        return sock_has_perm(sock->sk, SOCKET__GETOPT);
5041}
5042
5043static int selinux_socket_shutdown(struct socket *sock, int how)
5044{
5045        return sock_has_perm(sock->sk, SOCKET__SHUTDOWN);
5046}
5047
5048static int selinux_socket_unix_stream_connect(struct sock *sock,
5049                                              struct sock *other,
5050                                              struct sock *newsk)
5051{
5052        struct sk_security_struct *sksec_sock = sock->sk_security;
5053        struct sk_security_struct *sksec_other = other->sk_security;
5054        struct sk_security_struct *sksec_new = newsk->sk_security;
5055        struct common_audit_data ad;
5056        struct lsm_network_audit net = {0,};
5057        int err;
5058
5059        ad.type = LSM_AUDIT_DATA_NET;
5060        ad.u.net = &net;
5061        ad.u.net->sk = other;
5062
5063        err = avc_has_perm(&selinux_state,
5064                           sksec_sock->sid, sksec_other->sid,
5065                           sksec_other->sclass,
5066                           UNIX_STREAM_SOCKET__CONNECTTO, &ad);
5067        if (err)
5068                return err;
5069
5070        /* server child socket */
5071        sksec_new->peer_sid = sksec_sock->sid;
5072        err = security_sid_mls_copy(&selinux_state, sksec_other->sid,
5073                                    sksec_sock->sid, &sksec_new->sid);
5074        if (err)
5075                return err;
5076
5077        /* connecting socket */
5078        sksec_sock->peer_sid = sksec_new->sid;
5079
5080        return 0;
5081}
5082
5083static int selinux_socket_unix_may_send(struct socket *sock,
5084                                        struct socket *other)
5085{
5086        struct sk_security_struct *ssec = sock->sk->sk_security;
5087        struct sk_security_struct *osec = other->sk->sk_security;
5088        struct common_audit_data ad;
5089        struct lsm_network_audit net = {0,};
5090
5091        ad.type = LSM_AUDIT_DATA_NET;
5092        ad.u.net = &net;
5093        ad.u.net->sk = other->sk;
5094
5095        return avc_has_perm(&selinux_state,
5096                            ssec->sid, osec->sid, osec->sclass, SOCKET__SENDTO,
5097                            &ad);
5098}
5099
5100static int selinux_inet_sys_rcv_skb(struct net *ns, int ifindex,
5101                                    char *addrp, u16 family, u32 peer_sid,
5102                                    struct common_audit_data *ad)
5103{
5104        int err;
5105        u32 if_sid;
5106        u32 node_sid;
5107
5108        err = sel_netif_sid(ns, ifindex, &if_sid);
5109        if (err)
5110                return err;
5111        err = avc_has_perm(&selinux_state,
5112                           peer_sid, if_sid,
5113                           SECCLASS_NETIF, NETIF__INGRESS, ad);
5114        if (err)
5115                return err;
5116
5117        err = sel_netnode_sid(addrp, family, &node_sid);
5118        if (err)
5119                return err;
5120        return avc_has_perm(&selinux_state,
5121                            peer_sid, node_sid,
5122                            SECCLASS_NODE, NODE__RECVFROM, ad);
5123}
5124
5125static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
5126                                       u16 family)
5127{
5128        int err = 0;
5129        struct sk_security_struct *sksec = sk->sk_security;
5130        u32 sk_sid = sksec->sid;
5131        struct common_audit_data ad;
5132        struct lsm_network_audit net = {0,};
5133        char *addrp;
5134
5135        ad.type = LSM_AUDIT_DATA_NET;
5136        ad.u.net = &net;
5137        ad.u.net->netif = skb->skb_iif;
5138        ad.u.net->family = family;
5139        err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
5140        if (err)
5141                return err;
5142
5143        if (selinux_secmark_enabled()) {
5144                err = avc_has_perm(&selinux_state,
5145                                   sk_sid, skb->secmark, SECCLASS_PACKET,
5146                                   PACKET__RECV, &ad);
5147                if (err)
5148                        return err;
5149        }
5150
5151        err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad);
5152        if (err)
5153                return err;
5154        err = selinux_xfrm_sock_rcv_skb(sksec->sid, skb, &ad);
5155
5156        return err;
5157}
5158
5159static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
5160{
5161        int err;
5162        struct sk_security_struct *sksec = sk->sk_security;
5163        u16 family = sk->sk_family;
5164        u32 sk_sid = sksec->sid;
5165        struct common_audit_data ad;
5166        struct lsm_network_audit net = {0,};
5167        char *addrp;
5168        u8 secmark_active;
5169        u8 peerlbl_active;
5170
5171        if (family != PF_INET && family != PF_INET6)
5172                return 0;
5173
5174        /* Handle mapped IPv4 packets arriving via IPv6 sockets */
5175        if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
5176                family = PF_INET;
5177
5178        /* If any sort of compatibility mode is enabled then handoff processing
5179         * to the selinux_sock_rcv_skb_compat() function to deal with the
5180         * special handling.  We do this in an attempt to keep this function
5181         * as fast and as clean as possible. */
5182        if (!selinux_policycap_netpeer())
5183                return selinux_sock_rcv_skb_compat(sk, skb, family);
5184
5185        secmark_active = selinux_secmark_enabled();
5186        peerlbl_active = selinux_peerlbl_enabled();
5187        if (!secmark_active && !peerlbl_active)
5188                return 0;
5189
5190        ad.type = LSM_AUDIT_DATA_NET;
5191        ad.u.net = &net;
5192        ad.u.net->netif = skb->skb_iif;
5193        ad.u.net->family = family;
5194        err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
5195        if (err)
5196                return err;
5197
5198        if (peerlbl_active) {
5199                u32 peer_sid;
5200
5201                err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
5202                if (err)
5203                        return err;
5204                err = selinux_inet_sys_rcv_skb(sock_net(sk), skb->skb_iif,
5205                                               addrp, family, peer_sid, &ad);
5206                if (err) {
5207                        selinux_netlbl_err(skb, family, err, 0);
5208                        return err;
5209                }
5210                err = avc_has_perm(&selinux_state,
5211                                   sk_sid, peer_sid, SECCLASS_PEER,
5212                                   PEER__RECV, &ad);
5213                if (err) {
5214                        selinux_netlbl_err(skb, family, err, 0);
5215                        return err;
5216                }
5217        }
5218
5219        if (secmark_active) {
5220                err = avc_has_perm(&selinux_state,
5221                                   sk_sid, skb->secmark, SECCLASS_PACKET,
5222                                   PACKET__RECV, &ad);
5223                if (err)
5224                        return err;
5225        }
5226
5227        return err;
5228}
5229
5230static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval,
5231                                            int __user *optlen, unsigned len)
5232{
5233        int err = 0;
5234        char *scontext;
5235        u32 scontext_len;
5236        struct sk_security_struct *sksec = sock->sk->sk_security;
5237        u32 peer_sid = SECSID_NULL;
5238
5239        if (sksec->sclass == SECCLASS_UNIX_STREAM_SOCKET ||
5240            sksec->sclass == SECCLASS_TCP_SOCKET ||
5241            sksec->sclass == SECCLASS_SCTP_SOCKET)
5242                peer_sid = sksec->peer_sid;
5243        if (peer_sid == SECSID_NULL)
5244                return -ENOPROTOOPT;
5245
5246        err = security_sid_to_context(&selinux_state, peer_sid, &scontext,
5247                                      &scontext_len);
5248        if (err)
5249                return err;
5250
5251        if (scontext_len > len) {
5252                err = -ERANGE;
5253                goto out_len;
5254        }
5255
5256        if (copy_to_user(optval, scontext, scontext_len))
5257                err = -EFAULT;
5258
5259out_len:
5260        if (put_user(scontext_len, optlen))
5261                err = -EFAULT;
5262        kfree(scontext);
5263        return err;
5264}
5265
5266static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
5267{
5268        u32 peer_secid = SECSID_NULL;
5269        u16 family;
5270        struct inode_security_struct *isec;
5271
5272        if (skb && skb->protocol == htons(ETH_P_IP))
5273                family = PF_INET;
5274        else if (skb && skb->protocol == htons(ETH_P_IPV6))
5275                family = PF_INET6;
5276        else if (sock)
5277                family = sock->sk->sk_family;
5278        else
5279                goto out;
5280
5281        if (sock && family == PF_UNIX) {
5282                isec = inode_security_novalidate(SOCK_INODE(sock));
5283                peer_secid = isec->sid;
5284        } else if (skb)
5285                selinux_skb_peerlbl_sid(skb, family, &peer_secid);
5286
5287out:
5288        *secid = peer_secid;
5289        if (peer_secid == SECSID_NULL)
5290                return -EINVAL;
5291        return 0;
5292}
5293
5294static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
5295{
5296        struct sk_security_struct *sksec;
5297
5298        sksec = kzalloc(sizeof(*sksec), priority);
5299        if (!sksec)
5300                return -ENOMEM;
5301
5302        sksec->peer_sid = SECINITSID_UNLABELED;
5303        sksec->sid = SECINITSID_UNLABELED;
5304        sksec->sclass = SECCLASS_SOCKET;
5305        selinux_netlbl_sk_security_reset(sksec);
5306        sk->sk_security = sksec;
5307
5308        return 0;
5309}
5310
5311static void selinux_sk_free_security(struct sock *sk)
5312{
5313        struct sk_security_struct *sksec = sk->sk_security;
5314
5315        sk->sk_security = NULL;
5316        selinux_netlbl_sk_security_free(sksec);
5317        kfree(sksec);
5318}
5319
5320static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk)
5321{
5322        struct sk_security_struct *sksec = sk->sk_security;
5323        struct sk_security_struct *newsksec = newsk->sk_security;
5324
5325        newsksec->sid = sksec->sid;
5326        newsksec->peer_sid = sksec->peer_sid;
5327        newsksec->sclass = sksec->sclass;
5328
5329        selinux_netlbl_sk_security_reset(newsksec);
5330}
5331
5332static void selinux_sk_getsecid(struct sock *sk, u32 *secid)
5333{
5334        if (!sk)
5335                *secid = SECINITSID_ANY_SOCKET;
5336        else {
5337                struct sk_security_struct *sksec = sk->sk_security;
5338
5339                *secid = sksec->sid;
5340        }
5341}
5342
5343static void selinux_sock_graft(struct sock *sk, struct socket *parent)
5344{
5345        struct inode_security_struct *isec =
5346                inode_security_novalidate(SOCK_INODE(parent));
5347        struct sk_security_struct *sksec = sk->sk_security;
5348
5349        if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
5350            sk->sk_family == PF_UNIX)
5351                isec->sid = sksec->sid;
5352        sksec->sclass = isec->sclass;
5353}
5354
5355/* Called whenever SCTP receives an INIT chunk. This happens when an incoming
5356 * connect(2), sctp_connectx(3) or sctp_sendmsg(3) (with no association
5357 * already present).
5358 */
5359static int selinux_sctp_assoc_request(struct sctp_endpoint *ep,
5360                                      struct sk_buff *skb)
5361{
5362        struct sk_security_struct *sksec = ep->base.sk->sk_security;
5363        struct common_audit_data ad;
5364        struct lsm_network_audit net = {0,};
5365        u8 peerlbl_active;
5366        u32 peer_sid = SECINITSID_UNLABELED;
5367        u32 conn_sid;
5368        int err = 0;
5369
5370        if (!selinux_policycap_extsockclass())
5371                return 0;
5372
5373        peerlbl_active = selinux_peerlbl_enabled();
5374
5375        if (peerlbl_active) {
5376                /* This will return peer_sid = SECSID_NULL if there are
5377                 * no peer labels, see security_net_peersid_resolve().
5378                 */
5379                err = selinux_skb_peerlbl_sid(skb, ep->base.sk->sk_family,
5380                                              &peer_sid);
5381                if (err)
5382                        return err;
5383
5384                if (peer_sid == SECSID_NULL)
5385                        peer_sid = SECINITSID_UNLABELED;
5386        }
5387
5388        if (sksec->sctp_assoc_state == SCTP_ASSOC_UNSET) {
5389                sksec->sctp_assoc_state = SCTP_ASSOC_SET;
5390
5391                /* Here as first association on socket. As the peer SID
5392                 * was allowed by peer recv (and the netif/node checks),
5393                 * then it is approved by policy and used as the primary
5394                 * peer SID for getpeercon(3).
5395                 */
5396                sksec->peer_sid = peer_sid;
5397        } else if  (sksec->peer_sid != peer_sid) {
5398                /* Other association peer SIDs are checked to enforce
5399                 * consistency among the peer SIDs.
5400                 */
5401                ad.type = LSM_AUDIT_DATA_NET;
5402                ad.u.net = &net;
5403                ad.u.net->sk = ep->base.sk;
5404                err = avc_has_perm(&selinux_state,
5405                                   sksec->peer_sid, peer_sid, sksec->sclass,
5406                                   SCTP_SOCKET__ASSOCIATION, &ad);
5407                if (err)
5408                        return err;
5409        }
5410
5411        /* Compute the MLS component for the connection and store
5412         * the information in ep. This will be used by SCTP TCP type
5413         * sockets and peeled off connections as they cause a new
5414         * socket to be generated. selinux_sctp_sk_clone() will then
5415         * plug this into the new socket.
5416         */
5417        err = selinux_conn_sid(sksec->sid, peer_sid, &conn_sid);
5418        if (err)
5419                return err;
5420
5421        ep->secid = conn_sid;
5422        ep->peer_secid = peer_sid;
5423
5424        /* Set any NetLabel labels including CIPSO/CALIPSO options. */
5425        return selinux_netlbl_sctp_assoc_request(ep, skb);
5426}
5427
5428/* Check if sctp IPv4/IPv6 addresses are valid for binding or connecting
5429 * based on their @optname.
5430 */
5431static int selinux_sctp_bind_connect(struct sock *sk, int optname,
5432                                     struct sockaddr *address,
5433                                     int addrlen)
5434{
5435        int len, err = 0, walk_size = 0;
5436        void *addr_buf;
5437        struct sockaddr *addr;
5438        struct socket *sock;
5439
5440        if (!selinux_policycap_extsockclass())
5441                return 0;
5442
5443        /* Process one or more addresses that may be IPv4 or IPv6 */
5444        sock = sk->sk_socket;
5445        addr_buf = address;
5446
5447        while (walk_size < addrlen) {
5448                if (walk_size + sizeof(sa_family_t) > addrlen)
5449                        return -EINVAL;
5450
5451                addr = addr_buf;
5452                switch (addr->sa_family) {
5453                case AF_UNSPEC:
5454                case AF_INET:
5455                        len = sizeof(struct sockaddr_in);
5456                        break;
5457                case AF_INET6:
5458                        len = sizeof(struct sockaddr_in6);
5459                        break;
5460                default:
5461                        return -EINVAL;
5462                }
5463
5464                if (walk_size + len > addrlen)
5465                        return -EINVAL;
5466
5467                err = -EINVAL;
5468                switch (optname) {
5469                /* Bind checks */
5470                case SCTP_PRIMARY_ADDR:
5471                case SCTP_SET_PEER_PRIMARY_ADDR:
5472                case SCTP_SOCKOPT_BINDX_ADD:
5473                        err = selinux_socket_bind(sock, addr, len);
5474                        break;
5475                /* Connect checks */
5476                case SCTP_SOCKOPT_CONNECTX:
5477                case SCTP_PARAM_SET_PRIMARY:
5478                case SCTP_PARAM_ADD_IP:
5479                case SCTP_SENDMSG_CONNECT:
5480                        err = selinux_socket_connect_helper(sock, addr, len);
5481                        if (err)
5482                                return err;
5483
5484                        /* As selinux_sctp_bind_connect() is called by the
5485                         * SCTP protocol layer, the socket is already locked,
5486                         * therefore selinux_netlbl_socket_connect_locked()
5487                         * is called here. The situations handled are:
5488                         * sctp_connectx(3), sctp_sendmsg(3), sendmsg(2),
5489                         * whenever a new IP address is added or when a new
5490                         * primary address is selected.
5491                         * Note that an SCTP connect(2) call happens before
5492                         * the SCTP protocol layer and is handled via
5493                         * selinux_socket_connect().
5494                         */
5495                        err = selinux_netlbl_socket_connect_locked(sk, addr);
5496                        break;
5497                }
5498
5499                if (err)
5500                        return err;
5501
5502                addr_buf += len;
5503                walk_size += len;
5504        }
5505
5506        return 0;
5507}
5508
5509/* Called whenever a new socket is created by accept(2) or sctp_peeloff(3). */
5510static void selinux_sctp_sk_clone(struct sctp_endpoint *ep, struct sock *sk,
5511                                  struct sock *newsk)
5512{
5513        struct sk_security_struct *sksec = sk->sk_security;
5514        struct sk_security_struct *newsksec = newsk->sk_security;
5515
5516        /* If policy does not support SECCLASS_SCTP_SOCKET then call
5517         * the non-sctp clone version.
5518         */
5519        if (!selinux_policycap_extsockclass())
5520                return selinux_sk_clone_security(sk, newsk);
5521
5522        newsksec->sid = ep->secid;
5523        newsksec->peer_sid = ep->peer_secid;
5524        newsksec->sclass = sksec->sclass;
5525        selinux_netlbl_sctp_sk_clone(sk, newsk);
5526}
5527
5528static int selinux_inet_conn_request(const struct sock *sk, struct sk_buff *skb,
5529                                     struct request_sock *req)
5530{
5531        struct sk_security_struct *sksec = sk->sk_security;
5532        int err;
5533        u16 family = req->rsk_ops->family;
5534        u32 connsid;
5535        u32 peersid;
5536
5537        err = selinux_skb_peerlbl_sid(skb, family, &peersid);
5538        if (err)
5539                return err;
5540        err = selinux_conn_sid(sksec->sid, peersid, &connsid);
5541        if (err)
5542                return err;
5543        req->secid = connsid;
5544        req->peer_secid = peersid;
5545
5546        return selinux_netlbl_inet_conn_request(req, family);
5547}
5548
5549static void selinux_inet_csk_clone(struct sock *newsk,
5550                                   const struct request_sock *req)
5551{
5552        struct sk_security_struct *newsksec = newsk->sk_security;
5553
5554        newsksec->sid = req->secid;
5555        newsksec->peer_sid = req->peer_secid;
5556        /* NOTE: Ideally, we should also get the isec->sid for the
5557           new socket in sync, but we don't have the isec available yet.
5558           So we will wait until sock_graft to do it, by which
5559           time it will have been created and available. */
5560
5561        /* We don't need to take any sort of lock here as we are the only
5562         * thread with access to newsksec */
5563        selinux_netlbl_inet_csk_clone(newsk, req->rsk_ops->family);
5564}
5565
5566static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
5567{
5568        u16 family = sk->sk_family;
5569        struct sk_security_struct *sksec = sk->sk_security;
5570
5571        /* handle mapped IPv4 packets arriving via IPv6 sockets */
5572        if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
5573                family = PF_INET;
5574
5575        selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
5576}
5577
5578static int selinux_secmark_relabel_packet(u32 sid)
5579{
5580        const struct task_security_struct *__tsec;
5581        u32 tsid;
5582
5583        __tsec = selinux_cred(current_cred());
5584        tsid = __tsec->sid;
5585
5586        return avc_has_perm(&selinux_state,
5587                            tsid, sid, SECCLASS_PACKET, PACKET__RELABELTO,
5588                            NULL);
5589}
5590
5591static void selinux_secmark_refcount_inc(void)
5592{
5593        atomic_inc(&selinux_secmark_refcount);
5594}
5595
5596static void selinux_secmark_refcount_dec(void)
5597{
5598        atomic_dec(&selinux_secmark_refcount);
5599}
5600
5601static void selinux_req_classify_flow(const struct request_sock *req,
5602                                      struct flowi_common *flic)
5603{
5604        flic->flowic_secid = req->secid;
5605}
5606
5607static int selinux_tun_dev_alloc_security(void **security)
5608{
5609        struct tun_security_struct *tunsec;
5610
5611        tunsec = kzalloc(sizeof(*tunsec), GFP_KERNEL);
5612        if (!tunsec)
5613                return -ENOMEM;
5614        tunsec->sid = current_sid();
5615
5616        *security = tunsec;
5617        return 0;
5618}
5619
5620static void selinux_tun_dev_free_security(void *security)
5621{
5622        kfree(security);
5623}
5624
5625static int selinux_tun_dev_create(void)
5626{
5627        u32 sid = current_sid();
5628
5629        /* we aren't taking into account the "sockcreate" SID since the socket
5630         * that is being created here is not a socket in the traditional sense,
5631         * instead it is a private sock, accessible only to the kernel, and
5632         * representing a wide range of network traffic spanning multiple
5633         * connections unlike traditional sockets - check the TUN driver to
5634         * get a better understanding of why this socket is special */
5635
5636        return avc_has_perm(&selinux_state,
5637                            sid, sid, SECCLASS_TUN_SOCKET, TUN_SOCKET__CREATE,
5638                            NULL);
5639}
5640
5641static int selinux_tun_dev_attach_queue(void *security)
5642{
5643        struct tun_security_struct *tunsec = security;
5644
5645        return avc_has_perm(&selinux_state,
5646                            current_sid(), tunsec->sid, SECCLASS_TUN_SOCKET,
5647                            TUN_SOCKET__ATTACH_QUEUE, NULL);
5648}
5649
5650static int selinux_tun_dev_attach(struct sock *sk, void *security)
5651{
5652        struct tun_security_struct *tunsec = security;
5653        struct sk_security_struct *sksec = sk->sk_security;
5654
5655        /* we don't currently perform any NetLabel based labeling here and it
5656         * isn't clear that we would want to do so anyway; while we could apply
5657         * labeling without the support of the TUN user the resulting labeled
5658         * traffic from the other end of the connection would almost certainly
5659         * cause confusion to the TUN user that had no idea network labeling
5660         * protocols were being used */
5661
5662        sksec->sid = tunsec->sid;
5663        sksec->sclass = SECCLASS_TUN_SOCKET;
5664
5665        return 0;
5666}
5667
5668static int selinux_tun_dev_open(void *security)
5669{
5670        struct tun_security_struct *tunsec = security;
5671        u32 sid = current_sid();
5672        int err;
5673
5674        err = avc_has_perm(&selinux_state,
5675                           sid, tunsec->sid, SECCLASS_TUN_SOCKET,
5676                           TUN_SOCKET__RELABELFROM, NULL);
5677        if (err)
5678                return err;
5679        err = avc_has_perm(&selinux_state,
5680                           sid, sid, SECCLASS_TUN_SOCKET,
5681                           TUN_SOCKET__RELABELTO, NULL);
5682        if (err)
5683                return err;
5684        tunsec->sid = sid;
5685
5686        return 0;
5687}
5688
5689#ifdef CONFIG_NETFILTER
5690
5691static unsigned int selinux_ip_forward(struct sk_buff *skb,
5692                                       const struct net_device *indev,
5693                                       u16 family)
5694{
5695        int err;
5696        char *addrp;
5697        u32 peer_sid;
5698        struct common_audit_data ad;
5699        struct lsm_network_audit net = {0,};
5700        u8 secmark_active;
5701        u8 netlbl_active;
5702        u8 peerlbl_active;
5703
5704        if (!selinux_policycap_netpeer())
5705                return NF_ACCEPT;
5706
5707        secmark_active = selinux_secmark_enabled();
5708        netlbl_active = netlbl_enabled();
5709        peerlbl_active = selinux_peerlbl_enabled();
5710        if (!secmark_active && !peerlbl_active)
5711                return NF_ACCEPT;
5712
5713        if (selinux_skb_peerlbl_sid(skb, family, &peer_sid) != 0)
5714                return NF_DROP;
5715
5716        ad.type = LSM_AUDIT_DATA_NET;
5717        ad.u.net = &net;
5718        ad.u.net->netif = indev->ifindex;
5719        ad.u.net->family = family;
5720        if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
5721                return NF_DROP;
5722
5723        if (peerlbl_active) {
5724                err = selinux_inet_sys_rcv_skb(dev_net(indev), indev->ifindex,
5725                                               addrp, family, peer_sid, &ad);
5726                if (err) {
5727                        selinux_netlbl_err(skb, family, err, 1);
5728                        return NF_DROP;
5729                }
5730        }
5731
5732        if (secmark_active)
5733                if (avc_has_perm(&selinux_state,
5734                                 peer_sid, skb->secmark,
5735                                 SECCLASS_PACKET, PACKET__FORWARD_IN, &ad))
5736                        return NF_DROP;
5737
5738        if (netlbl_active)
5739                /* we do this in the FORWARD path and not the POST_ROUTING
5740                 * path because we want to make sure we apply the necessary
5741                 * labeling before IPsec is applied so we can leverage AH
5742                 * protection */
5743                if (selinux_netlbl_skbuff_setsid(skb, family, peer_sid) != 0)
5744                        return NF_DROP;
5745
5746        return NF_ACCEPT;
5747}
5748
5749static unsigned int selinux_ipv4_forward(void *priv,
5750                                         struct sk_buff *skb,
5751                                         const struct nf_hook_state *state)
5752{
5753        return selinux_ip_forward(skb, state->in, PF_INET);
5754}
5755
5756#if IS_ENABLED(CONFIG_IPV6)
5757static unsigned int selinux_ipv6_forward(void *priv,
5758                                         struct sk_buff *skb,
5759                                         const struct nf_hook_state *state)
5760{
5761        return selinux_ip_forward(skb, state->in, PF_INET6);
5762}
5763#endif  /* IPV6 */
5764
5765static unsigned int selinux_ip_output(struct sk_buff *skb,
5766                                      u16 family)
5767{
5768        struct sock *sk;
5769        u32 sid;
5770
5771        if (!netlbl_enabled())
5772                return NF_ACCEPT;
5773
5774        /* we do this in the LOCAL_OUT path and not the POST_ROUTING path
5775         * because we want to make sure we apply the necessary labeling
5776         * before IPsec is applied so we can leverage AH protection */
5777        sk = skb->sk;
5778        if (sk) {
5779                struct sk_security_struct *sksec;
5780
5781                if (sk_listener(sk))
5782                        /* if the socket is the listening state then this
5783                         * packet is a SYN-ACK packet which means it needs to
5784                         * be labeled based on the connection/request_sock and
5785                         * not the parent socket.  unfortunately, we can't
5786                         * lookup the request_sock yet as it isn't queued on
5787                         * the parent socket until after the SYN-ACK is sent.
5788                         * the "solution" is to simply pass the packet as-is
5789                         * as any IP option based labeling should be copied
5790                         * from the initial connection request (in the IP
5791                         * layer).  it is far from ideal, but until we get a
5792                         * security label in the packet itself this is the
5793                         * best we can do. */
5794                        return NF_ACCEPT;
5795
5796                /* standard practice, label using the parent socket */
5797                sksec = sk->sk_security;
5798                sid = sksec->sid;
5799        } else
5800                sid = SECINITSID_KERNEL;
5801        if (selinux_netlbl_skbuff_setsid(skb, family, sid) != 0)
5802                return NF_DROP;
5803
5804        return NF_ACCEPT;
5805}
5806
5807static unsigned int selinux_ipv4_output(void *priv,
5808                                        struct sk_buff *skb,
5809                                        const struct nf_hook_state *state)
5810{
5811        return selinux_ip_output(skb, PF_INET);
5812}
5813
5814#if IS_ENABLED(CONFIG_IPV6)
5815static unsigned int selinux_ipv6_output(void *priv,
5816                                        struct sk_buff *skb,
5817                                        const struct nf_hook_state *state)
5818{
5819        return selinux_ip_output(skb, PF_INET6);
5820}
5821#endif  /* IPV6 */
5822
5823static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
5824                                                int ifindex,
5825                                                u16 family)
5826{
5827        struct sock *sk = skb_to_full_sk(skb);
5828        struct sk_security_struct *sksec;
5829        struct common_audit_data ad;
5830        struct lsm_network_audit net = {0,};
5831        char *addrp;
5832        u8 proto;
5833
5834        if (sk == NULL)
5835                return NF_ACCEPT;
5836        sksec = sk->sk_security;
5837
5838        ad.type = LSM_AUDIT_DATA_NET;
5839        ad.u.net = &net;
5840        ad.u.net->netif = ifindex;
5841        ad.u.net->family = family;
5842        if (selinux_parse_skb(skb, &ad, &addrp, 0, &proto))
5843                return NF_DROP;
5844
5845        if (selinux_secmark_enabled())
5846                if (avc_has_perm(&selinux_state,
5847                                 sksec->sid, skb->secmark,
5848                                 SECCLASS_PACKET, PACKET__SEND, &ad))
5849                        return NF_DROP_ERR(-ECONNREFUSED);
5850
5851        if (selinux_xfrm_postroute_last(sksec->sid, skb, &ad, proto))
5852                return NF_DROP_ERR(-ECONNREFUSED);
5853
5854        return NF_ACCEPT;
5855}
5856
5857static unsigned int selinux_ip_postroute(struct sk_buff *skb,
5858                                         const struct net_device *outdev,
5859                                         u16 family)
5860{
5861        u32 secmark_perm;
5862        u32 peer_sid;
5863        int ifindex = outdev->ifindex;
5864        struct sock *sk;
5865        struct common_audit_data ad;
5866        struct lsm_network_audit net = {0,};
5867        char *addrp;
5868        u8 secmark_active;
5869        u8 peerlbl_active;
5870
5871        /* If any sort of compatibility mode is enabled then handoff processing
5872         * to the selinux_ip_postroute_compat() function to deal with the
5873         * special handling.  We do this in an attempt to keep this function
5874         * as fast and as clean as possible. */
5875        if (!selinux_policycap_netpeer())
5876                return selinux_ip_postroute_compat(skb, ifindex, family);
5877
5878        secmark_active = selinux_secmark_enabled();
5879        peerlbl_active = selinux_peerlbl_enabled();
5880        if (!secmark_active && !peerlbl_active)
5881                return NF_ACCEPT;
5882
5883        sk = skb_to_full_sk(skb);
5884
5885#ifdef CONFIG_XFRM
5886        /* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
5887         * packet transformation so allow the packet to pass without any checks
5888         * since we'll have another chance to perform access control checks
5889         * when the packet is on it's final way out.
5890         * NOTE: there appear to be some IPv6 multicast cases where skb->dst
5891         *       is NULL, in this case go ahead and apply access control.
5892         * NOTE: if this is a local socket (skb->sk != NULL) that is in the
5893         *       TCP listening state we cannot wait until the XFRM processing
5894         *       is done as we will miss out on the SA label if we do;
5895         *       unfortunately, this means more work, but it is only once per
5896         *       connection. */
5897        if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL &&
5898            !(sk && sk_listener(sk)))
5899                return NF_ACCEPT;
5900#endif
5901
5902        if (sk == NULL) {
5903                /* Without an associated socket the packet is either coming
5904                 * from the kernel or it is being forwarded; check the packet
5905                 * to determine which and if the packet is being forwarded
5906                 * query the packet directly to determine the security label. */
5907                if (skb->skb_iif) {
5908                        secmark_perm = PACKET__FORWARD_OUT;
5909                        if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
5910                                return NF_DROP;
5911                } else {
5912                        secmark_perm = PACKET__SEND;
5913                        peer_sid = SECINITSID_KERNEL;
5914                }
5915        } else if (sk_listener(sk)) {
5916                /* Locally generated packet but the associated socket is in the
5917                 * listening state which means this is a SYN-ACK packet.  In
5918                 * this particular case the correct security label is assigned
5919                 * to the connection/request_sock but unfortunately we can't
5920                 * query the request_sock as it isn't queued on the parent
5921                 * socket until after the SYN-ACK packet is sent; the only
5922                 * viable choice is to regenerate the label like we do in
5923                 * selinux_inet_conn_request().  See also selinux_ip_output()
5924                 * for similar problems. */
5925                u32 skb_sid;
5926                struct sk_security_struct *sksec;
5927
5928                sksec = sk->sk_security;
5929                if (selinux_skb_peerlbl_sid(skb, family, &skb_sid))
5930                        return NF_DROP;
5931                /* At this point, if the returned skb peerlbl is SECSID_NULL
5932                 * and the packet has been through at least one XFRM
5933                 * transformation then we must be dealing with the "final"
5934                 * form of labeled IPsec packet; since we've already applied
5935                 * all of our access controls on this packet we can safely
5936                 * pass the packet. */
5937                if (skb_sid == SECSID_NULL) {
5938                        switch (family) {
5939                        case PF_INET:
5940                                if (IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED)
5941                                        return NF_ACCEPT;
5942                                break;
5943                        case PF_INET6:
5944                                if (IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED)
5945                                        return NF_ACCEPT;
5946                                break;
5947                        default:
5948                                return NF_DROP_ERR(-ECONNREFUSED);
5949                        }
5950                }
5951                if (selinux_conn_sid(sksec->sid, skb_sid, &peer_sid))
5952                        return NF_DROP;
5953                secmark_perm = PACKET__SEND;
5954        } else {
5955                /* Locally generated packet, fetch the security label from the
5956                 * associated socket. */
5957                struct sk_security_struct *sksec = sk->sk_security;
5958                peer_sid = sksec->sid;
5959                secmark_perm = PACKET__SEND;
5960        }
5961
5962        ad.type = LSM_AUDIT_DATA_NET;
5963        ad.u.net = &net;
5964        ad.u.net->netif = ifindex;
5965        ad.u.net->family = family;
5966        if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
5967                return NF_DROP;
5968
5969        if (secmark_active)
5970                if (avc_has_perm(&selinux_state,
5971                                 peer_sid, skb->secmark,
5972                                 SECCLASS_PACKET, secmark_perm, &ad))
5973                        return NF_DROP_ERR(-ECONNREFUSED);
5974
5975        if (peerlbl_active) {
5976                u32 if_sid;
5977                u32 node_sid;
5978
5979                if (sel_netif_sid(dev_net(outdev), ifindex, &if_sid))
5980                        return NF_DROP;
5981                if (avc_has_perm(&selinux_state,
5982                                 peer_sid, if_sid,
5983                                 SECCLASS_NETIF, NETIF__EGRESS, &ad))
5984                        return NF_DROP_ERR(-ECONNREFUSED);
5985
5986                if (sel_netnode_sid(addrp, family, &node_sid))
5987                        return NF_DROP;
5988                if (avc_has_perm(&selinux_state,
5989                                 peer_sid, node_sid,
5990                                 SECCLASS_NODE, NODE__SENDTO, &ad))
5991                        return NF_DROP_ERR(-ECONNREFUSED);
5992        }
5993
5994        return NF_ACCEPT;
5995}
5996
5997static unsigned int selinux_ipv4_postroute(void *priv,
5998                                           struct sk_buff *skb,
5999                                           const struct nf_hook_state *state)
6000{
6001        return selinux_ip_postroute(skb, state->out, PF_INET);
6002}
6003
6004#if IS_ENABLED(CONFIG_IPV6)
6005static unsigned int selinux_ipv6_postroute(void *priv,
6006                                           struct sk_buff *skb,
6007                                           const struct nf_hook_state *state)
6008{
6009        return selinux_ip_postroute(skb, state->out, PF_INET6);
6010}
6011#endif  /* IPV6 */
6012
6013#endif  /* CONFIG_NETFILTER */
6014
6015static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
6016{
6017        int rc = 0;
6018        unsigned int msg_len;
6019        unsigned int data_len = skb->len;
6020        unsigned char *data = skb->data;
6021        struct nlmsghdr *nlh;
6022        struct sk_security_struct *sksec = sk->sk_security;
6023        u16 sclass = sksec->sclass;
6024        u32 perm;
6025
6026        while (data_len >= nlmsg_total_size(0)) {
6027                nlh = (struct nlmsghdr *)data;
6028
6029                /* NOTE: the nlmsg_len field isn't reliably set by some netlink
6030                 *       users which means we can't reject skb's with bogus
6031                 *       length fields; our solution is to follow what
6032                 *       netlink_rcv_skb() does and simply skip processing at
6033                 *       messages with length fields that are clearly junk
6034                 */
6035                if (nlh->nlmsg_len < NLMSG_HDRLEN || nlh->nlmsg_len > data_len)
6036                        return 0;
6037
6038                rc = selinux_nlmsg_lookup(sclass, nlh->nlmsg_type, &perm);
6039                if (rc == 0) {
6040                        rc = sock_has_perm(sk, perm);
6041                        if (rc)
6042                                return rc;
6043                } else if (rc == -EINVAL) {
6044                        /* -EINVAL is a missing msg/perm mapping */
6045                        pr_warn_ratelimited("SELinux: unrecognized netlink"
6046                                " message: protocol=%hu nlmsg_type=%hu sclass=%s"
6047                                " pid=%d comm=%s\n",
6048                                sk->sk_protocol, nlh->nlmsg_type,
6049                                secclass_map[sclass - 1].name,
6050                                task_pid_nr(current), current->comm);
6051                        if (enforcing_enabled(&selinux_state) &&
6052                            !security_get_allow_unknown(&selinux_state))
6053                                return rc;
6054                        rc = 0;
6055                } else if (rc == -ENOENT) {
6056                        /* -ENOENT is a missing socket/class mapping, ignore */
6057                        rc = 0;
6058                } else {
6059                        return rc;
6060                }
6061
6062                /* move to the next message after applying netlink padding */
6063                msg_len = NLMSG_ALIGN(nlh->nlmsg_len);
6064                if (msg_len >= data_len)
6065                        return 0;
6066                data_len -= msg_len;
6067                data += msg_len;
6068        }
6069
6070        return rc;
6071}
6072
6073static void ipc_init_security(struct ipc_security_struct *isec, u16 sclass)
6074{
6075        isec->sclass = sclass;
6076        isec->sid = current_sid();
6077}
6078
6079static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
6080                        u32 perms)
6081{
6082        struct ipc_security_struct *isec;
6083        struct common_audit_data ad;
6084        u32 sid = current_sid();
6085
6086        isec = selinux_ipc(ipc_perms);
6087
6088        ad.type = LSM_AUDIT_DATA_IPC;
6089        ad.u.ipc_id = ipc_perms->key;
6090
6091        return avc_has_perm(&selinux_state,
6092                            sid, isec->sid, isec->sclass, perms, &ad);
6093}
6094
6095static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
6096{
6097        struct msg_security_struct *msec;
6098
6099        msec = selinux_msg_msg(msg);
6100        msec->sid = SECINITSID_UNLABELED;
6101
6102        return 0;
6103}
6104
6105/* message queue security operations */
6106static int selinux_msg_queue_alloc_security(struct kern_ipc_perm *msq)
6107{
6108        struct ipc_security_struct *isec;
6109        struct common_audit_data ad;
6110        u32 sid = current_sid();
6111        int rc;
6112
6113        isec = selinux_ipc(msq);
6114        ipc_init_security(isec, SECCLASS_MSGQ);
6115
6116        ad.type = LSM_AUDIT_DATA_IPC;
6117        ad.u.ipc_id = msq->key;
6118
6119        rc = avc_has_perm(&selinux_state,
6120                          sid, isec->sid, SECCLASS_MSGQ,
6121                          MSGQ__CREATE, &ad);
6122        return rc;
6123}
6124
6125static int selinux_msg_queue_associate(struct kern_ipc_perm *msq, int msqflg)
6126{
6127        struct ipc_security_struct *isec;
6128        struct common_audit_data ad;
6129        u32 sid = current_sid();
6130
6131        isec = selinux_ipc(msq);
6132
6133        ad.type = LSM_AUDIT_DATA_IPC;
6134        ad.u.ipc_id = msq->key;
6135
6136        return avc_has_perm(&selinux_state,
6137                            sid, isec->sid, SECCLASS_MSGQ,
6138                            MSGQ__ASSOCIATE, &ad);
6139}
6140
6141static int selinux_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)
6142{
6143        int err;
6144        int perms;
6145
6146        switch (cmd) {
6147        case IPC_INFO:
6148        case MSG_INFO:
6149                /* No specific object, just general system-wide information. */
6150                return avc_has_perm(&selinux_state,
6151                                    current_sid(), SECINITSID_KERNEL,
6152                                    SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
6153        case IPC_STAT:
6154        case MSG_STAT:
6155        case MSG_STAT_ANY:
6156                perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
6157                break;
6158        case IPC_SET:
6159                perms = MSGQ__SETATTR;
6160                break;
6161        case IPC_RMID:
6162                perms = MSGQ__DESTROY;
6163                break;
6164        default:
6165                return 0;
6166        }
6167
6168        err = ipc_has_perm(msq, perms);
6169        return err;
6170}
6171
6172static int selinux_msg_queue_msgsnd(struct kern_ipc_perm *msq, struct msg_msg *msg, int msqflg)
6173{
6174        struct ipc_security_struct *isec;
6175        struct msg_security_struct *msec;
6176        struct common_audit_data ad;
6177        u32 sid = current_sid();
6178        int rc;
6179
6180        isec = selinux_ipc(msq);
6181        msec = selinux_msg_msg(msg);
6182
6183        /*
6184         * First time through, need to assign label to the message
6185         */
6186        if (msec->sid == SECINITSID_UNLABELED) {
6187                /*
6188                 * Compute new sid based on current process and
6189                 * message queue this message will be stored in
6190                 */
6191                rc = security_transition_sid(&selinux_state, sid, isec->sid,
6192                                             SECCLASS_MSG, NULL, &msec->sid);
6193                if (rc)
6194                        return rc;
6195        }
6196
6197        ad.type = LSM_AUDIT_DATA_IPC;
6198        ad.u.ipc_id = msq->key;
6199
6200        /* Can this process write to the queue? */
6201        rc = avc_has_perm(&selinux_state,
6202                          sid, isec->sid, SECCLASS_MSGQ,
6203                          MSGQ__WRITE, &ad);
6204        if (!rc)
6205                /* Can this process send the message */
6206                rc = avc_has_perm(&selinux_state,
6207                                  sid, msec->sid, SECCLASS_MSG,
6208                                  MSG__SEND, &ad);
6209        if (!rc)
6210                /* Can the message be put in the queue? */
6211                rc = avc_has_perm(&selinux_state,
6212                                  msec->sid, isec->sid, SECCLASS_MSGQ,
6213                                  MSGQ__ENQUEUE, &ad);
6214
6215        return rc;
6216}
6217
6218static int selinux_msg_queue_msgrcv(struct kern_ipc_perm *msq, struct msg_msg *msg,
6219                                    struct task_struct *target,
6220                                    long type, int mode)
6221{
6222        struct ipc_security_struct *isec;
6223        struct msg_security_struct *msec;
6224        struct common_audit_data ad;
6225        u32 sid = task_sid_obj(target);
6226        int rc;
6227
6228        isec = selinux_ipc(msq);
6229        msec = selinux_msg_msg(msg);
6230
6231        ad.type = LSM_AUDIT_DATA_IPC;
6232        ad.u.ipc_id = msq->key;
6233
6234        rc = avc_has_perm(&selinux_state,
6235                          sid, isec->sid,
6236                          SECCLASS_MSGQ, MSGQ__READ, &ad);
6237        if (!rc)
6238                rc = avc_has_perm(&selinux_state,
6239                                  sid, msec->sid,
6240                                  SECCLASS_MSG, MSG__RECEIVE, &ad);
6241        return rc;
6242}
6243
6244/* Shared Memory security operations */
6245static int selinux_shm_alloc_security(struct kern_ipc_perm *shp)
6246{
6247        struct ipc_security_struct *isec;
6248        struct common_audit_data ad;
6249        u32 sid = current_sid();
6250        int rc;
6251
6252        isec = selinux_ipc(shp);
6253        ipc_init_security(isec, SECCLASS_SHM);
6254
6255        ad.type = LSM_AUDIT_DATA_IPC;
6256        ad.u.ipc_id = shp->key;
6257
6258        rc = avc_has_perm(&selinux_state,
6259                          sid, isec->sid, SECCLASS_SHM,
6260                          SHM__CREATE, &ad);
6261        return rc;
6262}
6263
6264static int selinux_shm_associate(struct kern_ipc_perm *shp, int shmflg)
6265{
6266        struct ipc_security_struct *isec;
6267        struct common_audit_data ad;
6268        u32 sid = current_sid();
6269
6270        isec = selinux_ipc(shp);
6271
6272        ad.type = LSM_AUDIT_DATA_IPC;
6273        ad.u.ipc_id = shp->key;
6274
6275        return avc_has_perm(&selinux_state,
6276                            sid, isec->sid, SECCLASS_SHM,
6277                            SHM__ASSOCIATE, &ad);
6278}
6279
6280/* Note, at this point, shp is locked down */
6281static int selinux_shm_shmctl(struct kern_ipc_perm *shp, int cmd)
6282{
6283        int perms;
6284        int err;
6285
6286        switch (cmd) {
6287        case IPC_INFO:
6288        case SHM_INFO:
6289                /* No specific object, just general system-wide information. */
6290                return avc_has_perm(&selinux_state,
6291                                    current_sid(), SECINITSID_KERNEL,
6292                                    SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
6293        case IPC_STAT:
6294        case SHM_STAT:
6295        case SHM_STAT_ANY:
6296                perms = SHM__GETATTR | SHM__ASSOCIATE;
6297                break;
6298        case IPC_SET:
6299                perms = SHM__SETATTR;
6300                break;
6301        case SHM_LOCK:
6302        case SHM_UNLOCK:
6303                perms = SHM__LOCK;
6304                break;
6305        case IPC_RMID:
6306                perms = SHM__DESTROY;
6307                break;
6308        default:
6309                return 0;
6310        }
6311
6312        err = ipc_has_perm(shp, perms);
6313        return err;
6314}
6315
6316static int selinux_shm_shmat(struct kern_ipc_perm *shp,
6317                             char __user *shmaddr, int shmflg)
6318{
6319        u32 perms;
6320
6321        if (shmflg & SHM_RDONLY)
6322                perms = SHM__READ;
6323        else
6324                perms = SHM__READ | SHM__WRITE;
6325
6326        return ipc_has_perm(shp, perms);
6327}
6328
6329/* Semaphore security operations */
6330static int selinux_sem_alloc_security(struct kern_ipc_perm *sma)
6331{
6332        struct ipc_security_struct *isec;
6333        struct common_audit_data ad;
6334        u32 sid = current_sid();
6335        int rc;
6336
6337        isec = selinux_ipc(sma);
6338        ipc_init_security(isec, SECCLASS_SEM);
6339
6340        ad.type = LSM_AUDIT_DATA_IPC;
6341        ad.u.ipc_id = sma->key;
6342
6343        rc = avc_has_perm(&selinux_state,
6344                          sid, isec->sid, SECCLASS_SEM,
6345                          SEM__CREATE, &ad);
6346        return rc;
6347}
6348
6349static int selinux_sem_associate(struct kern_ipc_perm *sma, int semflg)
6350{
6351        struct ipc_security_struct *isec;
6352        struct common_audit_data ad;
6353        u32 sid = current_sid();
6354
6355        isec = selinux_ipc(sma);
6356
6357        ad.type = LSM_AUDIT_DATA_IPC;
6358        ad.u.ipc_id = sma->key;
6359
6360        return avc_has_perm(&selinux_state,
6361                            sid, isec->sid, SECCLASS_SEM,
6362                            SEM__ASSOCIATE, &ad);
6363}
6364
6365/* Note, at this point, sma is locked down */
6366static int selinux_sem_semctl(struct kern_ipc_perm *sma, int cmd)
6367{
6368        int err;
6369        u32 perms;
6370
6371        switch (cmd) {
6372        case IPC_INFO:
6373        case SEM_INFO:
6374                /* No specific object, just general system-wide information. */
6375                return avc_has_perm(&selinux_state,
6376                                    current_sid(), SECINITSID_KERNEL,
6377                                    SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
6378        case GETPID:
6379        case GETNCNT:
6380        case GETZCNT:
6381                perms = SEM__GETATTR;
6382                break;
6383        case GETVAL:
6384        case GETALL:
6385                perms = SEM__READ;
6386                break;
6387        case SETVAL:
6388        case SETALL:
6389                perms = SEM__WRITE;
6390                break;
6391        case IPC_RMID:
6392                perms = SEM__DESTROY;
6393                break;
6394        case IPC_SET:
6395                perms = SEM__SETATTR;
6396                break;
6397        case IPC_STAT:
6398        case SEM_STAT:
6399        case SEM_STAT_ANY:
6400                perms = SEM__GETATTR | SEM__ASSOCIATE;
6401                break;
6402        default:
6403                return 0;
6404        }
6405
6406        err = ipc_has_perm(sma, perms);
6407        return err;
6408}
6409
6410static int selinux_sem_semop(struct kern_ipc_perm *sma,
6411                             struct sembuf *sops, unsigned nsops, int alter)
6412{
6413        u32 perms;
6414
6415        if (alter)
6416                perms = SEM__READ | SEM__WRITE;
6417        else
6418                perms = SEM__READ;
6419
6420        return ipc_has_perm(sma, perms);
6421}
6422
6423static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
6424{
6425        u32 av = 0;
6426
6427        av = 0;
6428        if (flag & S_IRUGO)
6429                av |= IPC__UNIX_READ;
6430        if (flag & S_IWUGO)
6431                av |= IPC__UNIX_WRITE;
6432
6433        if (av == 0)
6434                return 0;
6435
6436        return ipc_has_perm(ipcp, av);
6437}
6438
6439static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
6440{
6441        struct ipc_security_struct *isec = selinux_ipc(ipcp);
6442        *secid = isec->sid;
6443}
6444
6445static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
6446{
6447        if (inode)
6448                inode_doinit_with_dentry(inode, dentry);
6449}
6450
6451static int selinux_getprocattr(struct task_struct *p,
6452                               char *name, char **value)
6453{
6454        const struct task_security_struct *__tsec;
6455        u32 sid;
6456        int error;
6457        unsigned len;
6458
6459        rcu_read_lock();
6460        __tsec = selinux_cred(__task_cred(p));
6461
6462        if (current != p) {
6463                error = avc_has_perm(&selinux_state,
6464                                     current_sid(), __tsec->sid,
6465                                     SECCLASS_PROCESS, PROCESS__GETATTR, NULL);
6466                if (error)
6467                        goto bad;
6468        }
6469
6470        if (!strcmp(name, "current"))
6471                sid = __tsec->sid;
6472        else if (!strcmp(name, "prev"))
6473                sid = __tsec->osid;
6474        else if (!strcmp(name, "exec"))
6475                sid = __tsec->exec_sid;
6476        else if (!strcmp(name, "fscreate"))
6477                sid = __tsec->create_sid;
6478        else if (!strcmp(name, "keycreate"))
6479                sid = __tsec->keycreate_sid;
6480        else if (!strcmp(name, "sockcreate"))
6481                sid = __tsec->sockcreate_sid;
6482        else {
6483                error = -EINVAL;
6484                goto bad;
6485        }
6486        rcu_read_unlock();
6487
6488        if (!sid)
6489                return 0;
6490
6491        error = security_sid_to_context(&selinux_state, sid, value, &len);
6492        if (error)
6493                return error;
6494        return len;
6495
6496bad:
6497        rcu_read_unlock();
6498        return error;
6499}
6500
6501static int selinux_setprocattr(const char *name, void *value, size_t size)
6502{
6503        struct task_security_struct *tsec;
6504        struct cred *new;
6505        u32 mysid = current_sid(), sid = 0, ptsid;
6506        int error;
6507        char *str = value;
6508
6509        /*
6510         * Basic control over ability to set these attributes at all.
6511         */
6512        if (!strcmp(name, "exec"))
6513                error = avc_has_perm(&selinux_state,
6514                                     mysid, mysid, SECCLASS_PROCESS,
6515                                     PROCESS__SETEXEC, NULL);
6516        else if (!strcmp(name, "fscreate"))
6517                error = avc_has_perm(&selinux_state,
6518                                     mysid, mysid, SECCLASS_PROCESS,
6519                                     PROCESS__SETFSCREATE, NULL);
6520        else if (!strcmp(name, "keycreate"))
6521                error = avc_has_perm(&selinux_state,
6522                                     mysid, mysid, SECCLASS_PROCESS,
6523                                     PROCESS__SETKEYCREATE, NULL);
6524        else if (!strcmp(name, "sockcreate"))
6525                error = avc_has_perm(&selinux_state,
6526                                     mysid, mysid, SECCLASS_PROCESS,
6527                                     PROCESS__SETSOCKCREATE, NULL);
6528        else if (!strcmp(name, "current"))
6529                error = avc_has_perm(&selinux_state,
6530                                     mysid, mysid, SECCLASS_PROCESS,
6531                                     PROCESS__SETCURRENT, NULL);
6532        else
6533                error = -EINVAL;
6534        if (error)
6535                return error;
6536
6537        /* Obtain a SID for the context, if one was specified. */
6538        if (size && str[0] && str[0] != '\n') {
6539                if (str[size-1] == '\n') {
6540                        str[size-1] = 0;
6541                        size--;
6542                }
6543                error = security_context_to_sid(&selinux_state, value, size,
6544                                                &sid, GFP_KERNEL);
6545                if (error == -EINVAL && !strcmp(name, "fscreate")) {
6546                        if (!has_cap_mac_admin(true)) {
6547                                struct audit_buffer *ab;
6548                                size_t audit_size;
6549
6550                                /* We strip a nul only if it is at the end, otherwise the
6551                                 * context contains a nul and we should audit that */
6552                                if (str[size - 1] == '\0')
6553                                        audit_size = size - 1;
6554                                else
6555                                        audit_size = size;
6556                                ab = audit_log_start(audit_context(),
6557                                                     GFP_ATOMIC,
6558                                                     AUDIT_SELINUX_ERR);
6559                                if (!ab)
6560                                        return error;
6561                                audit_log_format(ab, "op=fscreate invalid_context=");
6562                                audit_log_n_untrustedstring(ab, value, audit_size);
6563                                audit_log_end(ab);
6564
6565                                return error;
6566                        }
6567                        error = security_context_to_sid_force(
6568                                                      &selinux_state,
6569                                                      value, size, &sid);
6570                }
6571                if (error)
6572                        return error;
6573        }
6574
6575        new = prepare_creds();
6576        if (!new)
6577                return -ENOMEM;
6578
6579        /* Permission checking based on the specified context is
6580           performed during the actual operation (execve,
6581           open/mkdir/...), when we know the full context of the
6582           operation.  See selinux_bprm_creds_for_exec for the execve
6583           checks and may_create for the file creation checks. The
6584           operation will then fail if the context is not permitted. */
6585        tsec = selinux_cred(new);
6586        if (!strcmp(name, "exec")) {
6587                tsec->exec_sid = sid;
6588        } else if (!strcmp(name, "fscreate")) {
6589                tsec->create_sid = sid;
6590        } else if (!strcmp(name, "keycreate")) {
6591                if (sid) {
6592                        error = avc_has_perm(&selinux_state, mysid, sid,
6593                                             SECCLASS_KEY, KEY__CREATE, NULL);
6594                        if (error)
6595                                goto abort_change;
6596                }
6597                tsec->keycreate_sid = sid;
6598        } else if (!strcmp(name, "sockcreate")) {
6599                tsec->sockcreate_sid = sid;
6600        } else if (!strcmp(name, "current")) {
6601                error = -EINVAL;
6602                if (sid == 0)
6603                        goto abort_change;
6604
6605                /* Only allow single threaded processes to change context */
6606                error = -EPERM;
6607                if (!current_is_single_threaded()) {
6608                        error = security_bounded_transition(&selinux_state,
6609                                                            tsec->sid, sid);
6610                        if (error)
6611                                goto abort_change;
6612                }
6613
6614                /* Check permissions for the transition. */
6615                error = avc_has_perm(&selinux_state,
6616                                     tsec->sid, sid, SECCLASS_PROCESS,
6617                                     PROCESS__DYNTRANSITION, NULL);
6618                if (error)
6619                        goto abort_change;
6620
6621                /* Check for ptracing, and update the task SID if ok.
6622                   Otherwise, leave SID unchanged and fail. */
6623                ptsid = ptrace_parent_sid();
6624                if (ptsid != 0) {
6625                        error = avc_has_perm(&selinux_state,
6626                                             ptsid, sid, SECCLASS_PROCESS,
6627                                             PROCESS__PTRACE, NULL);
6628                        if (error)
6629                                goto abort_change;
6630                }
6631
6632                tsec->sid = sid;
6633        } else {
6634                error = -EINVAL;
6635                goto abort_change;
6636        }
6637
6638        commit_creds(new);
6639        return size;
6640
6641abort_change:
6642        abort_creds(new);
6643        return error;
6644}
6645
6646static int selinux_ismaclabel(const char *name)
6647{
6648        return (strcmp(name, XATTR_SELINUX_SUFFIX) == 0);
6649}
6650
6651static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
6652{
6653        return security_sid_to_context(&selinux_state, secid,
6654                                       secdata, seclen);
6655}
6656
6657static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
6658{
6659        return security_context_to_sid(&selinux_state, secdata, seclen,
6660                                       secid, GFP_KERNEL);
6661}
6662
6663static void selinux_release_secctx(char *secdata, u32 seclen)
6664{
6665        kfree(secdata);
6666}
6667
6668static void selinux_inode_invalidate_secctx(struct inode *inode)
6669{
6670        struct inode_security_struct *isec = selinux_inode(inode);
6671
6672        spin_lock(&isec->lock);
6673        isec->initialized = LABEL_INVALID;
6674        spin_unlock(&isec->lock);
6675}
6676
6677/*
6678 *      called with inode->i_mutex locked
6679 */
6680static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
6681{
6682        int rc = selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX,
6683                                           ctx, ctxlen, 0);
6684        /* Do not return error when suppressing label (SBLABEL_MNT not set). */
6685        return rc == -EOPNOTSUPP ? 0 : rc;
6686}
6687
6688/*
6689 *      called with inode->i_mutex locked
6690 */
6691static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
6692{
6693        return __vfs_setxattr_noperm(&init_user_ns, dentry, XATTR_NAME_SELINUX,
6694                                     ctx, ctxlen, 0);
6695}
6696
6697static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
6698{
6699        int len = 0;
6700        len = selinux_inode_getsecurity(&init_user_ns, inode,
6701                                        XATTR_SELINUX_SUFFIX, ctx, true);
6702        if (len < 0)
6703                return len;
6704        *ctxlen = len;
6705        return 0;
6706}
6707#ifdef CONFIG_KEYS
6708
6709static int selinux_key_alloc(struct key *k, const struct cred *cred,
6710                             unsigned long flags)
6711{
6712        const struct task_security_struct *tsec;
6713        struct key_security_struct *ksec;
6714
6715        ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL);
6716        if (!ksec)
6717                return -ENOMEM;
6718
6719        tsec = selinux_cred(cred);
6720        if (tsec->keycreate_sid)
6721                ksec->sid = tsec->keycreate_sid;
6722        else
6723                ksec->sid = tsec->sid;
6724
6725        k->security = ksec;
6726        return 0;
6727}
6728
6729static void selinux_key_free(struct key *k)
6730{
6731        struct key_security_struct *ksec = k->security;
6732
6733        k->security = NULL;
6734        kfree(ksec);
6735}
6736
6737static int selinux_key_permission(key_ref_t key_ref,
6738                                  const struct cred *cred,
6739                                  enum key_need_perm need_perm)
6740{
6741        struct key *key;
6742        struct key_security_struct *ksec;
6743        u32 perm, sid;
6744
6745        switch (need_perm) {
6746        case KEY_NEED_VIEW:
6747                perm = KEY__VIEW;
6748                break;
6749        case KEY_NEED_READ:
6750                perm = KEY__READ;
6751                break;
6752        case KEY_NEED_WRITE:
6753                perm = KEY__WRITE;
6754                break;
6755        case KEY_NEED_SEARCH:
6756                perm = KEY__SEARCH;
6757                break;
6758        case KEY_NEED_LINK:
6759                perm = KEY__LINK;
6760                break;
6761        case KEY_NEED_SETATTR:
6762                perm = KEY__SETATTR;
6763                break;
6764        case KEY_NEED_UNLINK:
6765        case KEY_SYSADMIN_OVERRIDE:
6766        case KEY_AUTHTOKEN_OVERRIDE:
6767        case KEY_DEFER_PERM_CHECK:
6768                return 0;
6769        default:
6770                WARN_ON(1);
6771                return -EPERM;
6772
6773        }
6774
6775        sid = cred_sid(cred);
6776        key = key_ref_to_ptr(key_ref);
6777        ksec = key->security;
6778
6779        return avc_has_perm(&selinux_state,
6780                            sid, ksec->sid, SECCLASS_KEY, perm, NULL);
6781}
6782
6783static int selinux_key_getsecurity(struct key *key, char **_buffer)
6784{
6785        struct key_security_struct *ksec = key->security;
6786        char *context = NULL;
6787        unsigned len;
6788        int rc;
6789
6790        rc = security_sid_to_context(&selinux_state, ksec->sid,
6791                                     &context, &len);
6792        if (!rc)
6793                rc = len;
6794        *_buffer = context;
6795        return rc;
6796}
6797
6798#ifdef CONFIG_KEY_NOTIFICATIONS
6799static int selinux_watch_key(struct key *key)
6800{
6801        struct key_security_struct *ksec = key->security;
6802        u32 sid = current_sid();
6803
6804        return avc_has_perm(&selinux_state,
6805                            sid, ksec->sid, SECCLASS_KEY, KEY__VIEW, NULL);
6806}
6807#endif
6808#endif
6809
6810#ifdef CONFIG_SECURITY_INFINIBAND
6811static int selinux_ib_pkey_access(void *ib_sec, u64 subnet_prefix, u16 pkey_val)
6812{
6813        struct common_audit_data ad;
6814        int err;
6815        u32 sid = 0;
6816        struct ib_security_struct *sec = ib_sec;
6817        struct lsm_ibpkey_audit ibpkey;
6818
6819        err = sel_ib_pkey_sid(subnet_prefix, pkey_val, &sid);
6820        if (err)
6821                return err;
6822
6823        ad.type = LSM_AUDIT_DATA_IBPKEY;
6824        ibpkey.subnet_prefix = subnet_prefix;
6825        ibpkey.pkey = pkey_val;
6826        ad.u.ibpkey = &ibpkey;
6827        return avc_has_perm(&selinux_state,
6828                            sec->sid, sid,
6829                            SECCLASS_INFINIBAND_PKEY,
6830                            INFINIBAND_PKEY__ACCESS, &ad);
6831}
6832
6833static int selinux_ib_endport_manage_subnet(void *ib_sec, const char *dev_name,
6834                                            u8 port_num)
6835{
6836        struct common_audit_data ad;
6837        int err;
6838        u32 sid = 0;
6839        struct ib_security_struct *sec = ib_sec;
6840        struct lsm_ibendport_audit ibendport;
6841
6842        err = security_ib_endport_sid(&selinux_state, dev_name, port_num,
6843                                      &sid);
6844
6845        if (err)
6846                return err;
6847
6848        ad.type = LSM_AUDIT_DATA_IBENDPORT;
6849        ibendport.dev_name = dev_name;
6850        ibendport.port = port_num;
6851        ad.u.ibendport = &ibendport;
6852        return avc_has_perm(&selinux_state,
6853                            sec->sid, sid,
6854                            SECCLASS_INFINIBAND_ENDPORT,
6855                            INFINIBAND_ENDPORT__MANAGE_SUBNET, &ad);
6856}
6857
6858static int selinux_ib_alloc_security(void **ib_sec)
6859{
6860        struct ib_security_struct *sec;
6861
6862        sec = kzalloc(sizeof(*sec), GFP_KERNEL);
6863        if (!sec)
6864                return -ENOMEM;
6865        sec->sid = current_sid();
6866
6867        *ib_sec = sec;
6868        return 0;
6869}
6870
6871static void selinux_ib_free_security(void *ib_sec)
6872{
6873        kfree(ib_sec);
6874}
6875#endif
6876
6877#ifdef CONFIG_BPF_SYSCALL
6878static int selinux_bpf(int cmd, union bpf_attr *attr,
6879                                     unsigned int size)
6880{
6881        u32 sid = current_sid();
6882        int ret;
6883
6884        switch (cmd) {
6885        case BPF_MAP_CREATE:
6886                ret = avc_has_perm(&selinux_state,
6887                                   sid, sid, SECCLASS_BPF, BPF__MAP_CREATE,
6888                                   NULL);
6889                break;
6890        case BPF_PROG_LOAD:
6891                ret = avc_has_perm(&selinux_state,
6892                                   sid, sid, SECCLASS_BPF, BPF__PROG_LOAD,
6893                                   NULL);
6894                break;
6895        default:
6896                ret = 0;
6897                break;
6898        }
6899
6900        return ret;
6901}
6902
6903static u32 bpf_map_fmode_to_av(fmode_t fmode)
6904{
6905        u32 av = 0;
6906
6907        if (fmode & FMODE_READ)
6908                av |= BPF__MAP_READ;
6909        if (fmode & FMODE_WRITE)
6910                av |= BPF__MAP_WRITE;
6911        return av;
6912}
6913
6914/* This function will check the file pass through unix socket or binder to see
6915 * if it is a bpf related object. And apply correspinding checks on the bpf
6916 * object based on the type. The bpf maps and programs, not like other files and
6917 * socket, are using a shared anonymous inode inside the kernel as their inode.
6918 * So checking that inode cannot identify if the process have privilege to
6919 * access the bpf object and that's why we have to add this additional check in
6920 * selinux_file_receive and selinux_binder_transfer_files.
6921 */
6922static int bpf_fd_pass(struct file *file, u32 sid)
6923{
6924        struct bpf_security_struct *bpfsec;
6925        struct bpf_prog *prog;
6926        struct bpf_map *map;
6927        int ret;
6928
6929        if (file->f_op == &bpf_map_fops) {
6930                map = file->private_data;
6931                bpfsec = map->security;
6932                ret = avc_has_perm(&selinux_state,
6933                                   sid, bpfsec->sid, SECCLASS_BPF,
6934                                   bpf_map_fmode_to_av(file->f_mode), NULL);
6935                if (ret)
6936                        return ret;
6937        } else if (file->f_op == &bpf_prog_fops) {
6938                prog = file->private_data;
6939                bpfsec = prog->aux->security;
6940                ret = avc_has_perm(&selinux_state,
6941                                   sid, bpfsec->sid, SECCLASS_BPF,
6942                                   BPF__PROG_RUN, NULL);
6943                if (ret)
6944                        return ret;
6945        }
6946        return 0;
6947}
6948
6949static int selinux_bpf_map(struct bpf_map *map, fmode_t fmode)
6950{
6951        u32 sid = current_sid();
6952        struct bpf_security_struct *bpfsec;
6953
6954        bpfsec = map->security;
6955        return avc_has_perm(&selinux_state,
6956                            sid, bpfsec->sid, SECCLASS_BPF,
6957                            bpf_map_fmode_to_av(fmode), NULL);
6958}
6959
6960static int selinux_bpf_prog(struct bpf_prog *prog)
6961{
6962        u32 sid = current_sid();
6963        struct bpf_security_struct *bpfsec;
6964
6965        bpfsec = prog->aux->security;
6966        return avc_has_perm(&selinux_state,
6967                            sid, bpfsec->sid, SECCLASS_BPF,
6968                            BPF__PROG_RUN, NULL);
6969}
6970
6971static int selinux_bpf_map_alloc(struct bpf_map *map)
6972{
6973        struct bpf_security_struct *bpfsec;
6974
6975        bpfsec = kzalloc(sizeof(*bpfsec), GFP_KERNEL);
6976        if (!bpfsec)
6977                return -ENOMEM;
6978
6979        bpfsec->sid = current_sid();
6980        map->security = bpfsec;
6981
6982        return 0;
6983}
6984
6985static void selinux_bpf_map_free(struct bpf_map *map)
6986{
6987        struct bpf_security_struct *bpfsec = map->security;
6988
6989        map->security = NULL;
6990        kfree(bpfsec);
6991}
6992
6993static int selinux_bpf_prog_alloc(struct bpf_prog_aux *aux)
6994{
6995        struct bpf_security_struct *bpfsec;
6996
6997        bpfsec = kzalloc(sizeof(*bpfsec), GFP_KERNEL);
6998        if (!bpfsec)
6999                return -ENOMEM;
7000
7001        bpfsec->sid = current_sid();
7002        aux->security = bpfsec;
7003
7004        return 0;
7005}
7006
7007static void selinux_bpf_prog_free(struct bpf_prog_aux *aux)
7008{
7009        struct bpf_security_struct *bpfsec = aux->security;
7010
7011        aux->security = NULL;
7012        kfree(bpfsec);
7013}
7014#endif
7015
7016static int selinux_lockdown(enum lockdown_reason what)
7017{
7018        struct common_audit_data ad;
7019        u32 sid = current_sid();
7020        int invalid_reason = (what <= LOCKDOWN_NONE) ||
7021                             (what == LOCKDOWN_INTEGRITY_MAX) ||
7022                             (what >= LOCKDOWN_CONFIDENTIALITY_MAX);
7023
7024        if (WARN(invalid_reason, "Invalid lockdown reason")) {
7025                audit_log(audit_context(),
7026                          GFP_ATOMIC, AUDIT_SELINUX_ERR,
7027                          "lockdown_reason=invalid");
7028                return -EINVAL;
7029        }
7030
7031        ad.type = LSM_AUDIT_DATA_LOCKDOWN;
7032        ad.u.reason = what;
7033
7034        if (what <= LOCKDOWN_INTEGRITY_MAX)
7035                return avc_has_perm(&selinux_state,
7036                                    sid, sid, SECCLASS_LOCKDOWN,
7037                                    LOCKDOWN__INTEGRITY, &ad);
7038        else
7039                return avc_has_perm(&selinux_state,
7040                                    sid, sid, SECCLASS_LOCKDOWN,
7041                                    LOCKDOWN__CONFIDENTIALITY, &ad);
7042}
7043
7044struct lsm_blob_sizes selinux_blob_sizes __lsm_ro_after_init = {
7045        .lbs_cred = sizeof(struct task_security_struct),
7046        .lbs_file = sizeof(struct file_security_struct),
7047        .lbs_inode = sizeof(struct inode_security_struct),
7048        .lbs_ipc = sizeof(struct ipc_security_struct),
7049        .lbs_msg_msg = sizeof(struct msg_security_struct),
7050        .lbs_superblock = sizeof(struct superblock_security_struct),
7051};
7052
7053#ifdef CONFIG_PERF_EVENTS
7054static int selinux_perf_event_open(struct perf_event_attr *attr, int type)
7055{
7056        u32 requested, sid = current_sid();
7057
7058        if (type == PERF_SECURITY_OPEN)
7059                requested = PERF_EVENT__OPEN;
7060        else if (type == PERF_SECURITY_CPU)
7061                requested = PERF_EVENT__CPU;
7062        else if (type == PERF_SECURITY_KERNEL)
7063                requested = PERF_EVENT__KERNEL;
7064        else if (type == PERF_SECURITY_TRACEPOINT)
7065                requested = PERF_EVENT__TRACEPOINT;
7066        else
7067                return -EINVAL;
7068
7069        return avc_has_perm(&selinux_state, sid, sid, SECCLASS_PERF_EVENT,
7070                            requested, NULL);
7071}
7072
7073static int selinux_perf_event_alloc(struct perf_event *event)
7074{
7075        struct perf_event_security_struct *perfsec;
7076
7077        perfsec = kzalloc(sizeof(*perfsec), GFP_KERNEL);
7078        if (!perfsec)
7079                return -ENOMEM;
7080
7081        perfsec->sid = current_sid();
7082        event->security = perfsec;
7083
7084        return 0;
7085}
7086
7087static void selinux_perf_event_free(struct perf_event *event)
7088{
7089        struct perf_event_security_struct *perfsec = event->security;
7090
7091        event->security = NULL;
7092        kfree(perfsec);
7093}
7094
7095static int selinux_perf_event_read(struct perf_event *event)
7096{
7097        struct perf_event_security_struct *perfsec = event->security;
7098        u32 sid = current_sid();
7099
7100        return avc_has_perm(&selinux_state, sid, perfsec->sid,
7101                            SECCLASS_PERF_EVENT, PERF_EVENT__READ, NULL);
7102}
7103
7104static int selinux_perf_event_write(struct perf_event *event)
7105{
7106        struct perf_event_security_struct *perfsec = event->security;
7107        u32 sid = current_sid();
7108
7109        return avc_has_perm(&selinux_state, sid, perfsec->sid,
7110                            SECCLASS_PERF_EVENT, PERF_EVENT__WRITE, NULL);
7111}
7112#endif
7113
7114/*
7115 * IMPORTANT NOTE: When adding new hooks, please be careful to keep this order:
7116 * 1. any hooks that don't belong to (2.) or (3.) below,
7117 * 2. hooks that both access structures allocated by other hooks, and allocate
7118 *    structures that can be later accessed by other hooks (mostly "cloning"
7119 *    hooks),
7120 * 3. hooks that only allocate structures that can be later accessed by other
7121 *    hooks ("allocating" hooks).
7122 *
7123 * Please follow block comment delimiters in the list to keep this order.
7124 *
7125 * This ordering is needed for SELinux runtime disable to work at least somewhat
7126 * safely. Breaking the ordering rules above might lead to NULL pointer derefs
7127 * when disabling SELinux at runtime.
7128 */
7129static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = {
7130        LSM_HOOK_INIT(binder_set_context_mgr, selinux_binder_set_context_mgr),
7131        LSM_HOOK_INIT(binder_transaction, selinux_binder_transaction),
7132        LSM_HOOK_INIT(binder_transfer_binder, selinux_binder_transfer_binder),
7133        LSM_HOOK_INIT(binder_transfer_file, selinux_binder_transfer_file),
7134
7135        LSM_HOOK_INIT(ptrace_access_check, selinux_ptrace_access_check),
7136        LSM_HOOK_INIT(ptrace_traceme, selinux_ptrace_traceme),
7137        LSM_HOOK_INIT(capget, selinux_capget),
7138        LSM_HOOK_INIT(capset, selinux_capset),
7139        LSM_HOOK_INIT(capable, selinux_capable),
7140        LSM_HOOK_INIT(quotactl, selinux_quotactl),
7141        LSM_HOOK_INIT(quota_on, selinux_quota_on),
7142        LSM_HOOK_INIT(syslog, selinux_syslog),
7143        LSM_HOOK_INIT(vm_enough_memory, selinux_vm_enough_memory),
7144
7145        LSM_HOOK_INIT(netlink_send, selinux_netlink_send),
7146
7147        LSM_HOOK_INIT(bprm_creds_for_exec, selinux_bprm_creds_for_exec),
7148        LSM_HOOK_INIT(bprm_committing_creds, selinux_bprm_committing_creds),
7149        LSM_HOOK_INIT(bprm_committed_creds, selinux_bprm_committed_creds),
7150
7151        LSM_HOOK_INIT(sb_free_mnt_opts, selinux_free_mnt_opts),
7152        LSM_HOOK_INIT(sb_mnt_opts_compat, selinux_sb_mnt_opts_compat),
7153        LSM_HOOK_INIT(sb_remount, selinux_sb_remount),
7154        LSM_HOOK_INIT(sb_kern_mount, selinux_sb_kern_mount),
7155        LSM_HOOK_INIT(sb_show_options, selinux_sb_show_options),
7156        LSM_HOOK_INIT(sb_statfs, selinux_sb_statfs),
7157        LSM_HOOK_INIT(sb_mount, selinux_mount),
7158        LSM_HOOK_INIT(sb_umount, selinux_umount),
7159        LSM_HOOK_INIT(sb_set_mnt_opts, selinux_set_mnt_opts),
7160        LSM_HOOK_INIT(sb_clone_mnt_opts, selinux_sb_clone_mnt_opts),
7161
7162        LSM_HOOK_INIT(move_mount, selinux_move_mount),
7163
7164        LSM_HOOK_INIT(dentry_init_security, selinux_dentry_init_security),
7165        LSM_HOOK_INIT(dentry_create_files_as, selinux_dentry_create_files_as),
7166
7167        LSM_HOOK_INIT(inode_free_security, selinux_inode_free_security),
7168        LSM_HOOK_INIT(inode_init_security, selinux_inode_init_security),
7169        LSM_HOOK_INIT(inode_init_security_anon, selinux_inode_init_security_anon),
7170        LSM_HOOK_INIT(inode_create, selinux_inode_create),
7171        LSM_HOOK_INIT(inode_link, selinux_inode_link),
7172        LSM_HOOK_INIT(inode_unlink, selinux_inode_unlink),
7173        LSM_HOOK_INIT(inode_symlink, selinux_inode_symlink),
7174        LSM_HOOK_INIT(inode_mkdir, selinux_inode_mkdir),
7175        LSM_HOOK_INIT(inode_rmdir, selinux_inode_rmdir),
7176        LSM_HOOK_INIT(inode_mknod, selinux_inode_mknod),
7177        LSM_HOOK_INIT(inode_rename, selinux_inode_rename),
7178        LSM_HOOK_INIT(inode_readlink, selinux_inode_readlink),
7179        LSM_HOOK_INIT(inode_follow_link, selinux_inode_follow_link),
7180        LSM_HOOK_INIT(inode_permission, selinux_inode_permission),
7181        LSM_HOOK_INIT(inode_setattr, selinux_inode_setattr),
7182        LSM_HOOK_INIT(inode_getattr, selinux_inode_getattr),
7183        LSM_HOOK_INIT(inode_setxattr, selinux_inode_setxattr),
7184        LSM_HOOK_INIT(inode_post_setxattr, selinux_inode_post_setxattr),
7185        LSM_HOOK_INIT(inode_getxattr, selinux_inode_getxattr),
7186        LSM_HOOK_INIT(inode_listxattr, selinux_inode_listxattr),
7187        LSM_HOOK_INIT(inode_removexattr, selinux_inode_removexattr),
7188        LSM_HOOK_INIT(inode_getsecurity, selinux_inode_getsecurity),
7189        LSM_HOOK_INIT(inode_setsecurity, selinux_inode_setsecurity),
7190        LSM_HOOK_INIT(inode_listsecurity, selinux_inode_listsecurity),
7191        LSM_HOOK_INIT(inode_getsecid, selinux_inode_getsecid),
7192        LSM_HOOK_INIT(inode_copy_up, selinux_inode_copy_up),
7193        LSM_HOOK_INIT(inode_copy_up_xattr, selinux_inode_copy_up_xattr),
7194        LSM_HOOK_INIT(path_notify, selinux_path_notify),
7195
7196        LSM_HOOK_INIT(kernfs_init_security, selinux_kernfs_init_security),
7197
7198        LSM_HOOK_INIT(file_permission, selinux_file_permission),
7199        LSM_HOOK_INIT(file_alloc_security, selinux_file_alloc_security),
7200        LSM_HOOK_INIT(file_ioctl, selinux_file_ioctl),
7201        LSM_HOOK_INIT(mmap_file, selinux_mmap_file),
7202        LSM_HOOK_INIT(mmap_addr, selinux_mmap_addr),
7203        LSM_HOOK_INIT(file_mprotect, selinux_file_mprotect),
7204        LSM_HOOK_INIT(file_lock, selinux_file_lock),
7205        LSM_HOOK_INIT(file_fcntl, selinux_file_fcntl),
7206        LSM_HOOK_INIT(file_set_fowner, selinux_file_set_fowner),
7207        LSM_HOOK_INIT(file_send_sigiotask, selinux_file_send_sigiotask),
7208        LSM_HOOK_INIT(file_receive, selinux_file_receive),
7209
7210        LSM_HOOK_INIT(file_open, selinux_file_open),
7211
7212        LSM_HOOK_INIT(task_alloc, selinux_task_alloc),
7213        LSM_HOOK_INIT(cred_prepare, selinux_cred_prepare),
7214        LSM_HOOK_INIT(cred_transfer, selinux_cred_transfer),
7215        LSM_HOOK_INIT(cred_getsecid, selinux_cred_getsecid),
7216        LSM_HOOK_INIT(kernel_act_as, selinux_kernel_act_as),
7217        LSM_HOOK_INIT(kernel_create_files_as, selinux_kernel_create_files_as),
7218        LSM_HOOK_INIT(kernel_module_request, selinux_kernel_module_request),
7219        LSM_HOOK_INIT(kernel_load_data, selinux_kernel_load_data),
7220        LSM_HOOK_INIT(kernel_read_file, selinux_kernel_read_file),
7221        LSM_HOOK_INIT(task_setpgid, selinux_task_setpgid),
7222        LSM_HOOK_INIT(task_getpgid, selinux_task_getpgid),
7223        LSM_HOOK_INIT(task_getsid, selinux_task_getsid),
7224        LSM_HOOK_INIT(task_getsecid_subj, selinux_task_getsecid_subj),
7225        LSM_HOOK_INIT(task_getsecid_obj, selinux_task_getsecid_obj),
7226        LSM_HOOK_INIT(task_setnice, selinux_task_setnice),
7227        LSM_HOOK_INIT(task_setioprio, selinux_task_setioprio),
7228        LSM_HOOK_INIT(task_getioprio, selinux_task_getioprio),
7229        LSM_HOOK_INIT(task_prlimit, selinux_task_prlimit),
7230        LSM_HOOK_INIT(task_setrlimit, selinux_task_setrlimit),
7231        LSM_HOOK_INIT(task_setscheduler, selinux_task_setscheduler),
7232        LSM_HOOK_INIT(task_getscheduler, selinux_task_getscheduler),
7233        LSM_HOOK_INIT(task_movememory, selinux_task_movememory),
7234        LSM_HOOK_INIT(task_kill, selinux_task_kill),
7235        LSM_HOOK_INIT(task_to_inode, selinux_task_to_inode),
7236
7237        LSM_HOOK_INIT(ipc_permission, selinux_ipc_permission),
7238        LSM_HOOK_INIT(ipc_getsecid, selinux_ipc_getsecid),
7239
7240        LSM_HOOK_INIT(msg_queue_associate, selinux_msg_queue_associate),
7241        LSM_HOOK_INIT(msg_queue_msgctl, selinux_msg_queue_msgctl),
7242        LSM_HOOK_INIT(msg_queue_msgsnd, selinux_msg_queue_msgsnd),
7243        LSM_HOOK_INIT(msg_queue_msgrcv, selinux_msg_queue_msgrcv),
7244
7245        LSM_HOOK_INIT(shm_associate, selinux_shm_associate),
7246        LSM_HOOK_INIT(shm_shmctl, selinux_shm_shmctl),
7247        LSM_HOOK_INIT(shm_shmat, selinux_shm_shmat),
7248
7249        LSM_HOOK_INIT(sem_associate, selinux_sem_associate),
7250        LSM_HOOK_INIT(sem_semctl, selinux_sem_semctl),
7251        LSM_HOOK_INIT(sem_semop, selinux_sem_semop),
7252
7253        LSM_HOOK_INIT(d_instantiate, selinux_d_instantiate),
7254
7255        LSM_HOOK_INIT(getprocattr, selinux_getprocattr),
7256        LSM_HOOK_INIT(setprocattr, selinux_setprocattr),
7257
7258        LSM_HOOK_INIT(ismaclabel, selinux_ismaclabel),
7259        LSM_HOOK_INIT(secctx_to_secid, selinux_secctx_to_secid),
7260        LSM_HOOK_INIT(release_secctx, selinux_release_secctx),
7261        LSM_HOOK_INIT(inode_invalidate_secctx, selinux_inode_invalidate_secctx),
7262        LSM_HOOK_INIT(inode_notifysecctx, selinux_inode_notifysecctx),
7263        LSM_HOOK_INIT(inode_setsecctx, selinux_inode_setsecctx),
7264
7265        LSM_HOOK_INIT(unix_stream_connect, selinux_socket_unix_stream_connect),
7266        LSM_HOOK_INIT(unix_may_send, selinux_socket_unix_may_send),
7267
7268        LSM_HOOK_INIT(socket_create, selinux_socket_create),
7269        LSM_HOOK_INIT(socket_post_create, selinux_socket_post_create),
7270        LSM_HOOK_INIT(socket_socketpair, selinux_socket_socketpair),
7271        LSM_HOOK_INIT(socket_bind, selinux_socket_bind),
7272        LSM_HOOK_INIT(socket_connect, selinux_socket_connect),
7273        LSM_HOOK_INIT(socket_listen, selinux_socket_listen),
7274        LSM_HOOK_INIT(socket_accept, selinux_socket_accept),
7275        LSM_HOOK_INIT(socket_sendmsg, selinux_socket_sendmsg),
7276        LSM_HOOK_INIT(socket_recvmsg, selinux_socket_recvmsg),
7277        LSM_HOOK_INIT(socket_getsockname, selinux_socket_getsockname),
7278        LSM_HOOK_INIT(socket_getpeername, selinux_socket_getpeername),
7279        LSM_HOOK_INIT(socket_getsockopt, selinux_socket_getsockopt),
7280        LSM_HOOK_INIT(socket_setsockopt, selinux_socket_setsockopt),
7281        LSM_HOOK_INIT(socket_shutdown, selinux_socket_shutdown),
7282        LSM_HOOK_INIT(socket_sock_rcv_skb, selinux_socket_sock_rcv_skb),
7283        LSM_HOOK_INIT(socket_getpeersec_stream,
7284                        selinux_socket_getpeersec_stream),
7285        LSM_HOOK_INIT(socket_getpeersec_dgram, selinux_socket_getpeersec_dgram),
7286        LSM_HOOK_INIT(sk_free_security, selinux_sk_free_security),
7287        LSM_HOOK_INIT(sk_clone_security, selinux_sk_clone_security),
7288        LSM_HOOK_INIT(sk_getsecid, selinux_sk_getsecid),
7289        LSM_HOOK_INIT(sock_graft, selinux_sock_graft),
7290        LSM_HOOK_INIT(sctp_assoc_request, selinux_sctp_assoc_request),
7291        LSM_HOOK_INIT(sctp_sk_clone, selinux_sctp_sk_clone),
7292        LSM_HOOK_INIT(sctp_bind_connect, selinux_sctp_bind_connect),
7293        LSM_HOOK_INIT(inet_conn_request, selinux_inet_conn_request),
7294        LSM_HOOK_INIT(inet_csk_clone, selinux_inet_csk_clone),
7295        LSM_HOOK_INIT(inet_conn_established, selinux_inet_conn_established),
7296        LSM_HOOK_INIT(secmark_relabel_packet, selinux_secmark_relabel_packet),
7297        LSM_HOOK_INIT(secmark_refcount_inc, selinux_secmark_refcount_inc),
7298        LSM_HOOK_INIT(secmark_refcount_dec, selinux_secmark_refcount_dec),
7299        LSM_HOOK_INIT(req_classify_flow, selinux_req_classify_flow),
7300        LSM_HOOK_INIT(tun_dev_free_security, selinux_tun_dev_free_security),
7301        LSM_HOOK_INIT(tun_dev_create, selinux_tun_dev_create),
7302        LSM_HOOK_INIT(tun_dev_attach_queue, selinux_tun_dev_attach_queue),
7303        LSM_HOOK_INIT(tun_dev_attach, selinux_tun_dev_attach),
7304        LSM_HOOK_INIT(tun_dev_open, selinux_tun_dev_open),
7305#ifdef CONFIG_SECURITY_INFINIBAND
7306        LSM_HOOK_INIT(ib_pkey_access, selinux_ib_pkey_access),
7307        LSM_HOOK_INIT(ib_endport_manage_subnet,
7308                      selinux_ib_endport_manage_subnet),
7309        LSM_HOOK_INIT(ib_free_security, selinux_ib_free_security),
7310#endif
7311#ifdef CONFIG_SECURITY_NETWORK_XFRM
7312        LSM_HOOK_INIT(xfrm_policy_free_security, selinux_xfrm_policy_free),
7313        LSM_HOOK_INIT(xfrm_policy_delete_security, selinux_xfrm_policy_delete),
7314        LSM_HOOK_INIT(xfrm_state_free_security, selinux_xfrm_state_free),
7315        LSM_HOOK_INIT(xfrm_state_delete_security, selinux_xfrm_state_delete),
7316        LSM_HOOK_INIT(xfrm_policy_lookup, selinux_xfrm_policy_lookup),
7317        LSM_HOOK_INIT(xfrm_state_pol_flow_match,
7318                        selinux_xfrm_state_pol_flow_match),
7319        LSM_HOOK_INIT(xfrm_decode_session, selinux_xfrm_decode_session),
7320#endif
7321
7322#ifdef CONFIG_KEYS
7323        LSM_HOOK_INIT(key_free, selinux_key_free),
7324        LSM_HOOK_INIT(key_permission, selinux_key_permission),
7325        LSM_HOOK_INIT(key_getsecurity, selinux_key_getsecurity),
7326#ifdef CONFIG_KEY_NOTIFICATIONS
7327        LSM_HOOK_INIT(watch_key, selinux_watch_key),
7328#endif
7329#endif
7330
7331#ifdef CONFIG_AUDIT
7332        LSM_HOOK_INIT(audit_rule_known, selinux_audit_rule_known),
7333        LSM_HOOK_INIT(audit_rule_match, selinux_audit_rule_match),
7334        LSM_HOOK_INIT(audit_rule_free, selinux_audit_rule_free),
7335#endif
7336
7337#ifdef CONFIG_BPF_SYSCALL
7338        LSM_HOOK_INIT(bpf, selinux_bpf),
7339        LSM_HOOK_INIT(bpf_map, selinux_bpf_map),
7340        LSM_HOOK_INIT(bpf_prog, selinux_bpf_prog),
7341        LSM_HOOK_INIT(bpf_map_free_security, selinux_bpf_map_free),
7342        LSM_HOOK_INIT(bpf_prog_free_security, selinux_bpf_prog_free),
7343#endif
7344
7345#ifdef CONFIG_PERF_EVENTS
7346        LSM_HOOK_INIT(perf_event_open, selinux_perf_event_open),
7347        LSM_HOOK_INIT(perf_event_free, selinux_perf_event_free),
7348        LSM_HOOK_INIT(perf_event_read, selinux_perf_event_read),
7349        LSM_HOOK_INIT(perf_event_write, selinux_perf_event_write),
7350#endif
7351
7352        LSM_HOOK_INIT(locked_down, selinux_lockdown),
7353
7354        /*
7355         * PUT "CLONING" (ACCESSING + ALLOCATING) HOOKS HERE
7356         */
7357        LSM_HOOK_INIT(fs_context_dup, selinux_fs_context_dup),
7358        LSM_HOOK_INIT(fs_context_parse_param, selinux_fs_context_parse_param),
7359        LSM_HOOK_INIT(sb_eat_lsm_opts, selinux_sb_eat_lsm_opts),
7360        LSM_HOOK_INIT(sb_add_mnt_opt, selinux_add_mnt_opt),
7361#ifdef CONFIG_SECURITY_NETWORK_XFRM
7362        LSM_HOOK_INIT(xfrm_policy_clone_security, selinux_xfrm_policy_clone),
7363#endif
7364
7365        /*
7366         * PUT "ALLOCATING" HOOKS HERE
7367         */
7368        LSM_HOOK_INIT(msg_msg_alloc_security, selinux_msg_msg_alloc_security),
7369        LSM_HOOK_INIT(msg_queue_alloc_security,
7370                      selinux_msg_queue_alloc_security),
7371        LSM_HOOK_INIT(shm_alloc_security, selinux_shm_alloc_security),
7372        LSM_HOOK_INIT(sb_alloc_security, selinux_sb_alloc_security),
7373        LSM_HOOK_INIT(inode_alloc_security, selinux_inode_alloc_security),
7374        LSM_HOOK_INIT(sem_alloc_security, selinux_sem_alloc_security),
7375        LSM_HOOK_INIT(secid_to_secctx, selinux_secid_to_secctx),
7376        LSM_HOOK_INIT(inode_getsecctx, selinux_inode_getsecctx),
7377        LSM_HOOK_INIT(sk_alloc_security, selinux_sk_alloc_security),
7378        LSM_HOOK_INIT(tun_dev_alloc_security, selinux_tun_dev_alloc_security),
7379#ifdef CONFIG_SECURITY_INFINIBAND
7380        LSM_HOOK_INIT(ib_alloc_security, selinux_ib_alloc_security),
7381#endif
7382#ifdef CONFIG_SECURITY_NETWORK_XFRM
7383        LSM_HOOK_INIT(xfrm_policy_alloc_security, selinux_xfrm_policy_alloc),
7384        LSM_HOOK_INIT(xfrm_state_alloc, selinux_xfrm_state_alloc),
7385        LSM_HOOK_INIT(xfrm_state_alloc_acquire,
7386                      selinux_xfrm_state_alloc_acquire),
7387#endif
7388#ifdef CONFIG_KEYS
7389        LSM_HOOK_INIT(key_alloc, selinux_key_alloc),
7390#endif
7391#ifdef CONFIG_AUDIT
7392        LSM_HOOK_INIT(audit_rule_init, selinux_audit_rule_init),
7393#endif
7394#ifdef CONFIG_BPF_SYSCALL
7395        LSM_HOOK_INIT(bpf_map_alloc_security, selinux_bpf_map_alloc),
7396        LSM_HOOK_INIT(bpf_prog_alloc_security, selinux_bpf_prog_alloc),
7397#endif
7398#ifdef CONFIG_PERF_EVENTS
7399        LSM_HOOK_INIT(perf_event_alloc, selinux_perf_event_alloc),
7400#endif
7401};
7402
7403static __init int selinux_init(void)
7404{
7405        pr_info("SELinux:  Initializing.\n");
7406
7407        memset(&selinux_state, 0, sizeof(selinux_state));
7408        enforcing_set(&selinux_state, selinux_enforcing_boot);
7409        checkreqprot_set(&selinux_state, selinux_checkreqprot_boot);
7410        selinux_avc_init(&selinux_state.avc);
7411        mutex_init(&selinux_state.status_lock);
7412        mutex_init(&selinux_state.policy_mutex);
7413
7414        /* Set the security state for the initial task. */
7415        cred_init_security();
7416
7417        default_noexec = !(VM_DATA_DEFAULT_FLAGS & VM_EXEC);
7418
7419        avc_init();
7420
7421        avtab_cache_init();
7422
7423        ebitmap_cache_init();
7424
7425        hashtab_cache_init();
7426
7427        security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), "selinux");
7428
7429        if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET))
7430                panic("SELinux: Unable to register AVC netcache callback\n");
7431
7432        if (avc_add_callback(selinux_lsm_notifier_avc_callback, AVC_CALLBACK_RESET))
7433                panic("SELinux: Unable to register AVC LSM notifier callback\n");
7434
7435        if (selinux_enforcing_boot)
7436                pr_debug("SELinux:  Starting in enforcing mode\n");
7437        else
7438                pr_debug("SELinux:  Starting in permissive mode\n");
7439
7440        fs_validate_description("selinux", selinux_fs_parameters);
7441
7442        return 0;
7443}
7444
7445static void delayed_superblock_init(struct super_block *sb, void *unused)
7446{
7447        selinux_set_mnt_opts(sb, NULL, 0, NULL);
7448}
7449
7450void selinux_complete_init(void)
7451{
7452        pr_debug("SELinux:  Completing initialization.\n");
7453
7454        /* Set up any superblocks initialized prior to the policy load. */
7455        pr_debug("SELinux:  Setting up existing superblocks.\n");
7456        iterate_supers(delayed_superblock_init, NULL);
7457}
7458
7459/* SELinux requires early initialization in order to label
7460   all processes and objects when they are created. */
7461DEFINE_LSM(selinux) = {
7462        .name = "selinux",
7463        .flags = LSM_FLAG_LEGACY_MAJOR | LSM_FLAG_EXCLUSIVE,
7464        .enabled = &selinux_enabled_boot,
7465        .blobs = &selinux_blob_sizes,
7466        .init = selinux_init,
7467};
7468
7469#if defined(CONFIG_NETFILTER)
7470
7471static const struct nf_hook_ops selinux_nf_ops[] = {
7472        {
7473                .hook =         selinux_ipv4_postroute,
7474                .pf =           NFPROTO_IPV4,
7475                .hooknum =      NF_INET_POST_ROUTING,
7476                .priority =     NF_IP_PRI_SELINUX_LAST,
7477        },
7478        {
7479                .hook =         selinux_ipv4_forward,
7480                .pf =           NFPROTO_IPV4,
7481                .hooknum =      NF_INET_FORWARD,
7482                .priority =     NF_IP_PRI_SELINUX_FIRST,
7483        },
7484        {
7485                .hook =         selinux_ipv4_output,
7486                .pf =           NFPROTO_IPV4,
7487                .hooknum =      NF_INET_LOCAL_OUT,
7488                .priority =     NF_IP_PRI_SELINUX_FIRST,
7489        },
7490#if IS_ENABLED(CONFIG_IPV6)
7491        {
7492                .hook =         selinux_ipv6_postroute,
7493                .pf =           NFPROTO_IPV6,
7494                .hooknum =      NF_INET_POST_ROUTING,
7495                .priority =     NF_IP6_PRI_SELINUX_LAST,
7496        },
7497        {
7498                .hook =         selinux_ipv6_forward,
7499                .pf =           NFPROTO_IPV6,
7500                .hooknum =      NF_INET_FORWARD,
7501                .priority =     NF_IP6_PRI_SELINUX_FIRST,
7502        },
7503        {
7504                .hook =         selinux_ipv6_output,
7505                .pf =           NFPROTO_IPV6,
7506                .hooknum =      NF_INET_LOCAL_OUT,
7507                .priority =     NF_IP6_PRI_SELINUX_FIRST,
7508        },
7509#endif  /* IPV6 */
7510};
7511
7512static int __net_init selinux_nf_register(struct net *net)
7513{
7514        return nf_register_net_hooks(net, selinux_nf_ops,
7515                                     ARRAY_SIZE(selinux_nf_ops));
7516}
7517
7518static void __net_exit selinux_nf_unregister(struct net *net)
7519{
7520        nf_unregister_net_hooks(net, selinux_nf_ops,
7521                                ARRAY_SIZE(selinux_nf_ops));
7522}
7523
7524static struct pernet_operations selinux_net_ops = {
7525        .init = selinux_nf_register,
7526        .exit = selinux_nf_unregister,
7527};
7528
7529static int __init selinux_nf_ip_init(void)
7530{
7531        int err;
7532
7533        if (!selinux_enabled_boot)
7534                return 0;
7535
7536        pr_debug("SELinux:  Registering netfilter hooks\n");
7537
7538        err = register_pernet_subsys(&selinux_net_ops);
7539        if (err)
7540                panic("SELinux: register_pernet_subsys: error %d\n", err);
7541
7542        return 0;
7543}
7544__initcall(selinux_nf_ip_init);
7545
7546#ifdef CONFIG_SECURITY_SELINUX_DISABLE
7547static void selinux_nf_ip_exit(void)
7548{
7549        pr_debug("SELinux:  Unregistering netfilter hooks\n");
7550
7551        unregister_pernet_subsys(&selinux_net_ops);
7552}
7553#endif
7554
7555#else /* CONFIG_NETFILTER */
7556
7557#ifdef CONFIG_SECURITY_SELINUX_DISABLE
7558#define selinux_nf_ip_exit()
7559#endif
7560
7561#endif /* CONFIG_NETFILTER */
7562
7563#ifdef CONFIG_SECURITY_SELINUX_DISABLE
7564int selinux_disable(struct selinux_state *state)
7565{
7566        if (selinux_initialized(state)) {
7567                /* Not permitted after initial policy load. */
7568                return -EINVAL;
7569        }
7570
7571        if (selinux_disabled(state)) {
7572                /* Only do this once. */
7573                return -EINVAL;
7574        }
7575
7576        selinux_mark_disabled(state);
7577
7578        pr_info("SELinux:  Disabled at runtime.\n");
7579
7580        /*
7581         * Unregister netfilter hooks.
7582         * Must be done before security_delete_hooks() to avoid breaking
7583         * runtime disable.
7584         */
7585        selinux_nf_ip_exit();
7586
7587        security_delete_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks));
7588
7589        /* Try to destroy the avc node cache */
7590        avc_disable();
7591
7592        /* Unregister selinuxfs. */
7593        exit_sel_fs();
7594
7595        return 0;
7596}
7597#endif
7598