linux/security/selinux/hooks.c
<<
>>
Prefs
   1/*
   2 *  NSA Security-Enhanced Linux (SELinux) security module
   3 *
   4 *  This file contains the SELinux hook function implementations.
   5 *
   6 *  Authors:  Stephen Smalley, <sds@epoch.ncsc.mil>
   7 *            Chris Vance, <cvance@nai.com>
   8 *            Wayne Salamon, <wsalamon@nai.com>
   9 *            James Morris <jmorris@redhat.com>
  10 *
  11 *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
  12 *  Copyright (C) 2003-2008 Red Hat, Inc., James Morris <jmorris@redhat.com>
  13 *                                         Eric Paris <eparis@redhat.com>
  14 *  Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
  15 *                          <dgoeddel@trustedcs.com>
  16 *  Copyright (C) 2006, 2007, 2009 Hewlett-Packard Development Company, L.P.
  17 *      Paul Moore <paul@paul-moore.com>
  18 *  Copyright (C) 2007 Hitachi Software Engineering Co., Ltd.
  19 *                     Yuichi Nakamura <ynakam@hitachisoft.jp>
  20 *
  21 *      This program is free software; you can redistribute it and/or modify
  22 *      it under the terms of the GNU General Public License version 2,
  23 *      as published by the Free Software Foundation.
  24 */
  25
  26#include <linux/init.h>
  27#include <linux/kd.h>
  28#include <linux/kernel.h>
  29#include <linux/tracehook.h>
  30#include <linux/errno.h>
  31#include <linux/ext2_fs.h>
  32#include <linux/sched.h>
  33#include <linux/security.h>
  34#include <linux/xattr.h>
  35#include <linux/capability.h>
  36#include <linux/unistd.h>
  37#include <linux/mm.h>
  38#include <linux/mman.h>
  39#include <linux/slab.h>
  40#include <linux/pagemap.h>
  41#include <linux/proc_fs.h>
  42#include <linux/swap.h>
  43#include <linux/spinlock.h>
  44#include <linux/syscalls.h>
  45#include <linux/dcache.h>
  46#include <linux/file.h>
  47#include <linux/fdtable.h>
  48#include <linux/namei.h>
  49#include <linux/mount.h>
  50#include <linux/netfilter_ipv4.h>
  51#include <linux/netfilter_ipv6.h>
  52#include <linux/tty.h>
  53#include <net/icmp.h>
  54#include <net/ip.h>             /* for local_port_range[] */
  55#include <net/tcp.h>            /* struct or_callable used in sock_rcv_skb */
  56#include <net/net_namespace.h>
  57#include <net/netlabel.h>
  58#include <linux/uaccess.h>
  59#include <asm/ioctls.h>
  60#include <linux/atomic.h>
  61#include <linux/bitops.h>
  62#include <linux/interrupt.h>
  63#include <linux/netdevice.h>    /* for network interface checks */
  64#include <linux/netlink.h>
  65#include <linux/tcp.h>
  66#include <linux/udp.h>
  67#include <linux/dccp.h>
  68#include <linux/quota.h>
  69#include <linux/un.h>           /* for Unix socket types */
  70#include <net/af_unix.h>        /* for Unix socket types */
  71#include <linux/parser.h>
  72#include <linux/nfs_mount.h>
  73#include <net/ipv6.h>
  74#include <linux/hugetlb.h>
  75#include <linux/personality.h>
  76#include <linux/audit.h>
  77#include <linux/string.h>
  78#include <linux/selinux.h>
  79#include <linux/mutex.h>
  80#include <linux/posix-timers.h>
  81#include <linux/syslog.h>
  82#include <linux/user_namespace.h>
  83#include <linux/export.h>
  84
  85#include "avc.h"
  86#include "objsec.h"
  87#include "netif.h"
  88#include "netnode.h"
  89#include "netport.h"
  90#include "xfrm.h"
  91#include "netlabel.h"
  92#include "audit.h"
  93#include "avc_ss.h"
  94
  95#define NUM_SEL_MNT_OPTS 5
  96
  97extern struct security_operations *security_ops;
  98
  99/* SECMARK reference count */
 100static atomic_t selinux_secmark_refcount = ATOMIC_INIT(0);
 101
 102#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
 103int selinux_enforcing;
 104
 105static int __init enforcing_setup(char *str)
 106{
 107        unsigned long enforcing;
 108        if (!strict_strtoul(str, 0, &enforcing))
 109                selinux_enforcing = enforcing ? 1 : 0;
 110        return 1;
 111}
 112__setup("enforcing=", enforcing_setup);
 113#endif
 114
 115#ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
 116int selinux_enabled = CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE;
 117
 118static int __init selinux_enabled_setup(char *str)
 119{
 120        unsigned long enabled;
 121        if (!strict_strtoul(str, 0, &enabled))
 122                selinux_enabled = enabled ? 1 : 0;
 123        return 1;
 124}
 125__setup("selinux=", selinux_enabled_setup);
 126#else
 127int selinux_enabled = 1;
 128#endif
 129
 130static struct kmem_cache *sel_inode_cache;
 131
 132/**
 133 * selinux_secmark_enabled - Check to see if SECMARK is currently enabled
 134 *
 135 * Description:
 136 * This function checks the SECMARK reference counter to see if any SECMARK
 137 * targets are currently configured, if the reference counter is greater than
 138 * zero SECMARK is considered to be enabled.  Returns true (1) if SECMARK is
 139 * enabled, false (0) if SECMARK is disabled.
 140 *
 141 */
 142static int selinux_secmark_enabled(void)
 143{
 144        return (atomic_read(&selinux_secmark_refcount) > 0);
 145}
 146
 147/*
 148 * initialise the security for the init task
 149 */
 150static void cred_init_security(void)
 151{
 152        struct cred *cred = (struct cred *) current->real_cred;
 153        struct task_security_struct *tsec;
 154
 155        tsec = kzalloc(sizeof(struct task_security_struct), GFP_KERNEL);
 156        if (!tsec)
 157                panic("SELinux:  Failed to initialize initial task.\n");
 158
 159        tsec->osid = tsec->sid = SECINITSID_KERNEL;
 160        cred->security = tsec;
 161}
 162
 163/*
 164 * get the security ID of a set of credentials
 165 */
 166static inline u32 cred_sid(const struct cred *cred)
 167{
 168        const struct task_security_struct *tsec;
 169
 170        tsec = cred->security;
 171        return tsec->sid;
 172}
 173
 174/*
 175 * get the objective security ID of a task
 176 */
 177static inline u32 task_sid(const struct task_struct *task)
 178{
 179        u32 sid;
 180
 181        rcu_read_lock();
 182        sid = cred_sid(__task_cred(task));
 183        rcu_read_unlock();
 184        return sid;
 185}
 186
 187/*
 188 * get the subjective security ID of the current task
 189 */
 190static inline u32 current_sid(void)
 191{
 192        const struct task_security_struct *tsec = current_security();
 193
 194        return tsec->sid;
 195}
 196
 197/* Allocate and free functions for each kind of security blob. */
 198
 199static int inode_alloc_security(struct inode *inode)
 200{
 201        struct inode_security_struct *isec;
 202        u32 sid = current_sid();
 203
 204        isec = kmem_cache_zalloc(sel_inode_cache, GFP_NOFS);
 205        if (!isec)
 206                return -ENOMEM;
 207
 208        mutex_init(&isec->lock);
 209        INIT_LIST_HEAD(&isec->list);
 210        isec->inode = inode;
 211        isec->sid = SECINITSID_UNLABELED;
 212        isec->sclass = SECCLASS_FILE;
 213        isec->task_sid = sid;
 214        inode->i_security = isec;
 215
 216        return 0;
 217}
 218
 219static void inode_free_security(struct inode *inode)
 220{
 221        struct inode_security_struct *isec = inode->i_security;
 222        struct superblock_security_struct *sbsec = inode->i_sb->s_security;
 223
 224        spin_lock(&sbsec->isec_lock);
 225        if (!list_empty(&isec->list))
 226                list_del_init(&isec->list);
 227        spin_unlock(&sbsec->isec_lock);
 228
 229        inode->i_security = NULL;
 230        kmem_cache_free(sel_inode_cache, isec);
 231}
 232
 233static int file_alloc_security(struct file *file)
 234{
 235        struct file_security_struct *fsec;
 236        u32 sid = current_sid();
 237
 238        fsec = kzalloc(sizeof(struct file_security_struct), GFP_KERNEL);
 239        if (!fsec)
 240                return -ENOMEM;
 241
 242        fsec->sid = sid;
 243        fsec->fown_sid = sid;
 244        file->f_security = fsec;
 245
 246        return 0;
 247}
 248
 249static void file_free_security(struct file *file)
 250{
 251        struct file_security_struct *fsec = file->f_security;
 252        file->f_security = NULL;
 253        kfree(fsec);
 254}
 255
 256static int superblock_alloc_security(struct super_block *sb)
 257{
 258        struct superblock_security_struct *sbsec;
 259
 260        sbsec = kzalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
 261        if (!sbsec)
 262                return -ENOMEM;
 263
 264        mutex_init(&sbsec->lock);
 265        INIT_LIST_HEAD(&sbsec->isec_head);
 266        spin_lock_init(&sbsec->isec_lock);
 267        sbsec->sb = sb;
 268        sbsec->sid = SECINITSID_UNLABELED;
 269        sbsec->def_sid = SECINITSID_FILE;
 270        sbsec->mntpoint_sid = SECINITSID_UNLABELED;
 271        sb->s_security = sbsec;
 272
 273        return 0;
 274}
 275
 276static void superblock_free_security(struct super_block *sb)
 277{
 278        struct superblock_security_struct *sbsec = sb->s_security;
 279        sb->s_security = NULL;
 280        kfree(sbsec);
 281}
 282
 283/* The file system's label must be initialized prior to use. */
 284
 285static const char *labeling_behaviors[6] = {
 286        "uses xattr",
 287        "uses transition SIDs",
 288        "uses task SIDs",
 289        "uses genfs_contexts",
 290        "not configured for labeling",
 291        "uses mountpoint labeling",
 292};
 293
 294static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
 295
 296static inline int inode_doinit(struct inode *inode)
 297{
 298        return inode_doinit_with_dentry(inode, NULL);
 299}
 300
 301enum {
 302        Opt_error = -1,
 303        Opt_context = 1,
 304        Opt_fscontext = 2,
 305        Opt_defcontext = 3,
 306        Opt_rootcontext = 4,
 307        Opt_labelsupport = 5,
 308};
 309
 310static const match_table_t tokens = {
 311        {Opt_context, CONTEXT_STR "%s"},
 312        {Opt_fscontext, FSCONTEXT_STR "%s"},
 313        {Opt_defcontext, DEFCONTEXT_STR "%s"},
 314        {Opt_rootcontext, ROOTCONTEXT_STR "%s"},
 315        {Opt_labelsupport, LABELSUPP_STR},
 316        {Opt_error, NULL},
 317};
 318
 319#define SEL_MOUNT_FAIL_MSG "SELinux:  duplicate or incompatible mount options\n"
 320
 321static int may_context_mount_sb_relabel(u32 sid,
 322                        struct superblock_security_struct *sbsec,
 323                        const struct cred *cred)
 324{
 325        const struct task_security_struct *tsec = cred->security;
 326        int rc;
 327
 328        rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
 329                          FILESYSTEM__RELABELFROM, NULL);
 330        if (rc)
 331                return rc;
 332
 333        rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM,
 334                          FILESYSTEM__RELABELTO, NULL);
 335        return rc;
 336}
 337
 338static int may_context_mount_inode_relabel(u32 sid,
 339                        struct superblock_security_struct *sbsec,
 340                        const struct cred *cred)
 341{
 342        const struct task_security_struct *tsec = cred->security;
 343        int rc;
 344        rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
 345                          FILESYSTEM__RELABELFROM, NULL);
 346        if (rc)
 347                return rc;
 348
 349        rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM,
 350                          FILESYSTEM__ASSOCIATE, NULL);
 351        return rc;
 352}
 353
 354static int sb_finish_set_opts(struct super_block *sb)
 355{
 356        struct superblock_security_struct *sbsec = sb->s_security;
 357        struct dentry *root = sb->s_root;
 358        struct inode *root_inode = root->d_inode;
 359        int rc = 0;
 360
 361        if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
 362                /* Make sure that the xattr handler exists and that no
 363                   error other than -ENODATA is returned by getxattr on
 364                   the root directory.  -ENODATA is ok, as this may be
 365                   the first boot of the SELinux kernel before we have
 366                   assigned xattr values to the filesystem. */
 367                if (!root_inode->i_op->getxattr) {
 368                        printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
 369                               "xattr support\n", sb->s_id, sb->s_type->name);
 370                        rc = -EOPNOTSUPP;
 371                        goto out;
 372                }
 373                rc = root_inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0);
 374                if (rc < 0 && rc != -ENODATA) {
 375                        if (rc == -EOPNOTSUPP)
 376                                printk(KERN_WARNING "SELinux: (dev %s, type "
 377                                       "%s) has no security xattr handler\n",
 378                                       sb->s_id, sb->s_type->name);
 379                        else
 380                                printk(KERN_WARNING "SELinux: (dev %s, type "
 381                                       "%s) getxattr errno %d\n", sb->s_id,
 382                                       sb->s_type->name, -rc);
 383                        goto out;
 384                }
 385        }
 386
 387        sbsec->flags |= (SE_SBINITIALIZED | SE_SBLABELSUPP);
 388
 389        if (sbsec->behavior > ARRAY_SIZE(labeling_behaviors))
 390                printk(KERN_ERR "SELinux: initialized (dev %s, type %s), unknown behavior\n",
 391                       sb->s_id, sb->s_type->name);
 392        else
 393                printk(KERN_DEBUG "SELinux: initialized (dev %s, type %s), %s\n",
 394                       sb->s_id, sb->s_type->name,
 395                       labeling_behaviors[sbsec->behavior-1]);
 396
 397        if (sbsec->behavior == SECURITY_FS_USE_GENFS ||
 398            sbsec->behavior == SECURITY_FS_USE_MNTPOINT ||
 399            sbsec->behavior == SECURITY_FS_USE_NONE ||
 400            sbsec->behavior > ARRAY_SIZE(labeling_behaviors))
 401                sbsec->flags &= ~SE_SBLABELSUPP;
 402
 403        /* Special handling for sysfs. Is genfs but also has setxattr handler*/
 404        if (strncmp(sb->s_type->name, "sysfs", sizeof("sysfs")) == 0)
 405                sbsec->flags |= SE_SBLABELSUPP;
 406
 407        /* Initialize the root inode. */
 408        rc = inode_doinit_with_dentry(root_inode, root);
 409
 410        /* Initialize any other inodes associated with the superblock, e.g.
 411           inodes created prior to initial policy load or inodes created
 412           during get_sb by a pseudo filesystem that directly
 413           populates itself. */
 414        spin_lock(&sbsec->isec_lock);
 415next_inode:
 416        if (!list_empty(&sbsec->isec_head)) {
 417                struct inode_security_struct *isec =
 418                                list_entry(sbsec->isec_head.next,
 419                                           struct inode_security_struct, list);
 420                struct inode *inode = isec->inode;
 421                spin_unlock(&sbsec->isec_lock);
 422                inode = igrab(inode);
 423                if (inode) {
 424                        if (!IS_PRIVATE(inode))
 425                                inode_doinit(inode);
 426                        iput(inode);
 427                }
 428                spin_lock(&sbsec->isec_lock);
 429                list_del_init(&isec->list);
 430                goto next_inode;
 431        }
 432        spin_unlock(&sbsec->isec_lock);
 433out:
 434        return rc;
 435}
 436
 437/*
 438 * This function should allow an FS to ask what it's mount security
 439 * options were so it can use those later for submounts, displaying
 440 * mount options, or whatever.
 441 */
 442static int selinux_get_mnt_opts(const struct super_block *sb,
 443                                struct security_mnt_opts *opts)
 444{
 445        int rc = 0, i;
 446        struct superblock_security_struct *sbsec = sb->s_security;
 447        char *context = NULL;
 448        u32 len;
 449        char tmp;
 450
 451        security_init_mnt_opts(opts);
 452
 453        if (!(sbsec->flags & SE_SBINITIALIZED))
 454                return -EINVAL;
 455
 456        if (!ss_initialized)
 457                return -EINVAL;
 458
 459        tmp = sbsec->flags & SE_MNTMASK;
 460        /* count the number of mount options for this sb */
 461        for (i = 0; i < 8; i++) {
 462                if (tmp & 0x01)
 463                        opts->num_mnt_opts++;
 464                tmp >>= 1;
 465        }
 466        /* Check if the Label support flag is set */
 467        if (sbsec->flags & SE_SBLABELSUPP)
 468                opts->num_mnt_opts++;
 469
 470        opts->mnt_opts = kcalloc(opts->num_mnt_opts, sizeof(char *), GFP_ATOMIC);
 471        if (!opts->mnt_opts) {
 472                rc = -ENOMEM;
 473                goto out_free;
 474        }
 475
 476        opts->mnt_opts_flags = kcalloc(opts->num_mnt_opts, sizeof(int), GFP_ATOMIC);
 477        if (!opts->mnt_opts_flags) {
 478                rc = -ENOMEM;
 479                goto out_free;
 480        }
 481
 482        i = 0;
 483        if (sbsec->flags & FSCONTEXT_MNT) {
 484                rc = security_sid_to_context(sbsec->sid, &context, &len);
 485                if (rc)
 486                        goto out_free;
 487                opts->mnt_opts[i] = context;
 488                opts->mnt_opts_flags[i++] = FSCONTEXT_MNT;
 489        }
 490        if (sbsec->flags & CONTEXT_MNT) {
 491                rc = security_sid_to_context(sbsec->mntpoint_sid, &context, &len);
 492                if (rc)
 493                        goto out_free;
 494                opts->mnt_opts[i] = context;
 495                opts->mnt_opts_flags[i++] = CONTEXT_MNT;
 496        }
 497        if (sbsec->flags & DEFCONTEXT_MNT) {
 498                rc = security_sid_to_context(sbsec->def_sid, &context, &len);
 499                if (rc)
 500                        goto out_free;
 501                opts->mnt_opts[i] = context;
 502                opts->mnt_opts_flags[i++] = DEFCONTEXT_MNT;
 503        }
 504        if (sbsec->flags & ROOTCONTEXT_MNT) {
 505                struct inode *root = sbsec->sb->s_root->d_inode;
 506                struct inode_security_struct *isec = root->i_security;
 507
 508                rc = security_sid_to_context(isec->sid, &context, &len);
 509                if (rc)
 510                        goto out_free;
 511                opts->mnt_opts[i] = context;
 512                opts->mnt_opts_flags[i++] = ROOTCONTEXT_MNT;
 513        }
 514        if (sbsec->flags & SE_SBLABELSUPP) {
 515                opts->mnt_opts[i] = NULL;
 516                opts->mnt_opts_flags[i++] = SE_SBLABELSUPP;
 517        }
 518
 519        BUG_ON(i != opts->num_mnt_opts);
 520
 521        return 0;
 522
 523out_free:
 524        security_free_mnt_opts(opts);
 525        return rc;
 526}
 527
 528static int bad_option(struct superblock_security_struct *sbsec, char flag,
 529                      u32 old_sid, u32 new_sid)
 530{
 531        char mnt_flags = sbsec->flags & SE_MNTMASK;
 532
 533        /* check if the old mount command had the same options */
 534        if (sbsec->flags & SE_SBINITIALIZED)
 535                if (!(sbsec->flags & flag) ||
 536                    (old_sid != new_sid))
 537                        return 1;
 538
 539        /* check if we were passed the same options twice,
 540         * aka someone passed context=a,context=b
 541         */
 542        if (!(sbsec->flags & SE_SBINITIALIZED))
 543                if (mnt_flags & flag)
 544                        return 1;
 545        return 0;
 546}
 547
 548/*
 549 * Allow filesystems with binary mount data to explicitly set mount point
 550 * labeling information.
 551 */
 552static int selinux_set_mnt_opts(struct super_block *sb,
 553                                struct security_mnt_opts *opts)
 554{
 555        const struct cred *cred = current_cred();
 556        int rc = 0, i;
 557        struct superblock_security_struct *sbsec = sb->s_security;
 558        const char *name = sb->s_type->name;
 559        struct inode *inode = sbsec->sb->s_root->d_inode;
 560        struct inode_security_struct *root_isec = inode->i_security;
 561        u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0;
 562        u32 defcontext_sid = 0;
 563        char **mount_options = opts->mnt_opts;
 564        int *flags = opts->mnt_opts_flags;
 565        int num_opts = opts->num_mnt_opts;
 566
 567        mutex_lock(&sbsec->lock);
 568
 569        if (!ss_initialized) {
 570                if (!num_opts) {
 571                        /* Defer initialization until selinux_complete_init,
 572                           after the initial policy is loaded and the security
 573                           server is ready to handle calls. */
 574                        goto out;
 575                }
 576                rc = -EINVAL;
 577                printk(KERN_WARNING "SELinux: Unable to set superblock options "
 578                        "before the security server is initialized\n");
 579                goto out;
 580        }
 581
 582        /*
 583         * Binary mount data FS will come through this function twice.  Once
 584         * from an explicit call and once from the generic calls from the vfs.
 585         * Since the generic VFS calls will not contain any security mount data
 586         * we need to skip the double mount verification.
 587         *
 588         * This does open a hole in which we will not notice if the first
 589         * mount using this sb set explict options and a second mount using
 590         * this sb does not set any security options.  (The first options
 591         * will be used for both mounts)
 592         */
 593        if ((sbsec->flags & SE_SBINITIALIZED) && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
 594            && (num_opts == 0))
 595                goto out;
 596
 597        /*
 598         * parse the mount options, check if they are valid sids.
 599         * also check if someone is trying to mount the same sb more
 600         * than once with different security options.
 601         */
 602        for (i = 0; i < num_opts; i++) {
 603                u32 sid;
 604
 605                if (flags[i] == SE_SBLABELSUPP)
 606                        continue;
 607                rc = security_context_to_sid(mount_options[i],
 608                                             strlen(mount_options[i]), &sid);
 609                if (rc) {
 610                        printk(KERN_WARNING "SELinux: security_context_to_sid"
 611                               "(%s) failed for (dev %s, type %s) errno=%d\n",
 612                               mount_options[i], sb->s_id, name, rc);
 613                        goto out;
 614                }
 615                switch (flags[i]) {
 616                case FSCONTEXT_MNT:
 617                        fscontext_sid = sid;
 618
 619                        if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
 620                                        fscontext_sid))
 621                                goto out_double_mount;
 622
 623                        sbsec->flags |= FSCONTEXT_MNT;
 624                        break;
 625                case CONTEXT_MNT:
 626                        context_sid = sid;
 627
 628                        if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
 629                                        context_sid))
 630                                goto out_double_mount;
 631
 632                        sbsec->flags |= CONTEXT_MNT;
 633                        break;
 634                case ROOTCONTEXT_MNT:
 635                        rootcontext_sid = sid;
 636
 637                        if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
 638                                        rootcontext_sid))
 639                                goto out_double_mount;
 640
 641                        sbsec->flags |= ROOTCONTEXT_MNT;
 642
 643                        break;
 644                case DEFCONTEXT_MNT:
 645                        defcontext_sid = sid;
 646
 647                        if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
 648                                        defcontext_sid))
 649                                goto out_double_mount;
 650
 651                        sbsec->flags |= DEFCONTEXT_MNT;
 652
 653                        break;
 654                default:
 655                        rc = -EINVAL;
 656                        goto out;
 657                }
 658        }
 659
 660        if (sbsec->flags & SE_SBINITIALIZED) {
 661                /* previously mounted with options, but not on this attempt? */
 662                if ((sbsec->flags & SE_MNTMASK) && !num_opts)
 663                        goto out_double_mount;
 664                rc = 0;
 665                goto out;
 666        }
 667
 668        if (strcmp(sb->s_type->name, "proc") == 0)
 669                sbsec->flags |= SE_SBPROC;
 670
 671        /* Determine the labeling behavior to use for this filesystem type. */
 672        rc = security_fs_use((sbsec->flags & SE_SBPROC) ? "proc" : sb->s_type->name, &sbsec->behavior, &sbsec->sid);
 673        if (rc) {
 674                printk(KERN_WARNING "%s: security_fs_use(%s) returned %d\n",
 675                       __func__, sb->s_type->name, rc);
 676                goto out;
 677        }
 678
 679        /* sets the context of the superblock for the fs being mounted. */
 680        if (fscontext_sid) {
 681                rc = may_context_mount_sb_relabel(fscontext_sid, sbsec, cred);
 682                if (rc)
 683                        goto out;
 684
 685                sbsec->sid = fscontext_sid;
 686        }
 687
 688        /*
 689         * Switch to using mount point labeling behavior.
 690         * sets the label used on all file below the mountpoint, and will set
 691         * the superblock context if not already set.
 692         */
 693        if (context_sid) {
 694                if (!fscontext_sid) {
 695                        rc = may_context_mount_sb_relabel(context_sid, sbsec,
 696                                                          cred);
 697                        if (rc)
 698                                goto out;
 699                        sbsec->sid = context_sid;
 700                } else {
 701                        rc = may_context_mount_inode_relabel(context_sid, sbsec,
 702                                                             cred);
 703                        if (rc)
 704                                goto out;
 705                }
 706                if (!rootcontext_sid)
 707                        rootcontext_sid = context_sid;
 708
 709                sbsec->mntpoint_sid = context_sid;
 710                sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
 711        }
 712
 713        if (rootcontext_sid) {
 714                rc = may_context_mount_inode_relabel(rootcontext_sid, sbsec,
 715                                                     cred);
 716                if (rc)
 717                        goto out;
 718
 719                root_isec->sid = rootcontext_sid;
 720                root_isec->initialized = 1;
 721        }
 722
 723        if (defcontext_sid) {
 724                if (sbsec->behavior != SECURITY_FS_USE_XATTR) {
 725                        rc = -EINVAL;
 726                        printk(KERN_WARNING "SELinux: defcontext option is "
 727                               "invalid for this filesystem type\n");
 728                        goto out;
 729                }
 730
 731                if (defcontext_sid != sbsec->def_sid) {
 732                        rc = may_context_mount_inode_relabel(defcontext_sid,
 733                                                             sbsec, cred);
 734                        if (rc)
 735                                goto out;
 736                }
 737
 738                sbsec->def_sid = defcontext_sid;
 739        }
 740
 741        rc = sb_finish_set_opts(sb);
 742out:
 743        mutex_unlock(&sbsec->lock);
 744        return rc;
 745out_double_mount:
 746        rc = -EINVAL;
 747        printk(KERN_WARNING "SELinux: mount invalid.  Same superblock, different "
 748               "security settings for (dev %s, type %s)\n", sb->s_id, name);
 749        goto out;
 750}
 751
 752static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
 753                                        struct super_block *newsb)
 754{
 755        const struct superblock_security_struct *oldsbsec = oldsb->s_security;
 756        struct superblock_security_struct *newsbsec = newsb->s_security;
 757
 758        int set_fscontext =     (oldsbsec->flags & FSCONTEXT_MNT);
 759        int set_context =       (oldsbsec->flags & CONTEXT_MNT);
 760        int set_rootcontext =   (oldsbsec->flags & ROOTCONTEXT_MNT);
 761
 762        /*
 763         * if the parent was able to be mounted it clearly had no special lsm
 764         * mount options.  thus we can safely deal with this superblock later
 765         */
 766        if (!ss_initialized)
 767                return;
 768
 769        /* how can we clone if the old one wasn't set up?? */
 770        BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED));
 771
 772        /* if fs is reusing a sb, just let its options stand... */
 773        if (newsbsec->flags & SE_SBINITIALIZED)
 774                return;
 775
 776        mutex_lock(&newsbsec->lock);
 777
 778        newsbsec->flags = oldsbsec->flags;
 779
 780        newsbsec->sid = oldsbsec->sid;
 781        newsbsec->def_sid = oldsbsec->def_sid;
 782        newsbsec->behavior = oldsbsec->behavior;
 783
 784        if (set_context) {
 785                u32 sid = oldsbsec->mntpoint_sid;
 786
 787                if (!set_fscontext)
 788                        newsbsec->sid = sid;
 789                if (!set_rootcontext) {
 790                        struct inode *newinode = newsb->s_root->d_inode;
 791                        struct inode_security_struct *newisec = newinode->i_security;
 792                        newisec->sid = sid;
 793                }
 794                newsbsec->mntpoint_sid = sid;
 795        }
 796        if (set_rootcontext) {
 797                const struct inode *oldinode = oldsb->s_root->d_inode;
 798                const struct inode_security_struct *oldisec = oldinode->i_security;
 799                struct inode *newinode = newsb->s_root->d_inode;
 800                struct inode_security_struct *newisec = newinode->i_security;
 801
 802                newisec->sid = oldisec->sid;
 803        }
 804
 805        sb_finish_set_opts(newsb);
 806        mutex_unlock(&newsbsec->lock);
 807}
 808
 809static int selinux_parse_opts_str(char *options,
 810                                  struct security_mnt_opts *opts)
 811{
 812        char *p;
 813        char *context = NULL, *defcontext = NULL;
 814        char *fscontext = NULL, *rootcontext = NULL;
 815        int rc, num_mnt_opts = 0;
 816
 817        opts->num_mnt_opts = 0;
 818
 819        /* Standard string-based options. */
 820        while ((p = strsep(&options, "|")) != NULL) {
 821                int token;
 822                substring_t args[MAX_OPT_ARGS];
 823
 824                if (!*p)
 825                        continue;
 826
 827                token = match_token(p, tokens, args);
 828
 829                switch (token) {
 830                case Opt_context:
 831                        if (context || defcontext) {
 832                                rc = -EINVAL;
 833                                printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
 834                                goto out_err;
 835                        }
 836                        context = match_strdup(&args[0]);
 837                        if (!context) {
 838                                rc = -ENOMEM;
 839                                goto out_err;
 840                        }
 841                        break;
 842
 843                case Opt_fscontext:
 844                        if (fscontext) {
 845                                rc = -EINVAL;
 846                                printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
 847                                goto out_err;
 848                        }
 849                        fscontext = match_strdup(&args[0]);
 850                        if (!fscontext) {
 851                                rc = -ENOMEM;
 852                                goto out_err;
 853                        }
 854                        break;
 855
 856                case Opt_rootcontext:
 857                        if (rootcontext) {
 858                                rc = -EINVAL;
 859                                printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
 860                                goto out_err;
 861                        }
 862                        rootcontext = match_strdup(&args[0]);
 863                        if (!rootcontext) {
 864                                rc = -ENOMEM;
 865                                goto out_err;
 866                        }
 867                        break;
 868
 869                case Opt_defcontext:
 870                        if (context || defcontext) {
 871                                rc = -EINVAL;
 872                                printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
 873                                goto out_err;
 874                        }
 875                        defcontext = match_strdup(&args[0]);
 876                        if (!defcontext) {
 877                                rc = -ENOMEM;
 878                                goto out_err;
 879                        }
 880                        break;
 881                case Opt_labelsupport:
 882                        break;
 883                default:
 884                        rc = -EINVAL;
 885                        printk(KERN_WARNING "SELinux:  unknown mount option\n");
 886                        goto out_err;
 887
 888                }
 889        }
 890
 891        rc = -ENOMEM;
 892        opts->mnt_opts = kcalloc(NUM_SEL_MNT_OPTS, sizeof(char *), GFP_ATOMIC);
 893        if (!opts->mnt_opts)
 894                goto out_err;
 895
 896        opts->mnt_opts_flags = kcalloc(NUM_SEL_MNT_OPTS, sizeof(int), GFP_ATOMIC);
 897        if (!opts->mnt_opts_flags) {
 898                kfree(opts->mnt_opts);
 899                goto out_err;
 900        }
 901
 902        if (fscontext) {
 903                opts->mnt_opts[num_mnt_opts] = fscontext;
 904                opts->mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT;
 905        }
 906        if (context) {
 907                opts->mnt_opts[num_mnt_opts] = context;
 908                opts->mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT;
 909        }
 910        if (rootcontext) {
 911                opts->mnt_opts[num_mnt_opts] = rootcontext;
 912                opts->mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT;
 913        }
 914        if (defcontext) {
 915                opts->mnt_opts[num_mnt_opts] = defcontext;
 916                opts->mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT;
 917        }
 918
 919        opts->num_mnt_opts = num_mnt_opts;
 920        return 0;
 921
 922out_err:
 923        kfree(context);
 924        kfree(defcontext);
 925        kfree(fscontext);
 926        kfree(rootcontext);
 927        return rc;
 928}
 929/*
 930 * string mount options parsing and call set the sbsec
 931 */
 932static int superblock_doinit(struct super_block *sb, void *data)
 933{
 934        int rc = 0;
 935        char *options = data;
 936        struct security_mnt_opts opts;
 937
 938        security_init_mnt_opts(&opts);
 939
 940        if (!data)
 941                goto out;
 942
 943        BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA);
 944
 945        rc = selinux_parse_opts_str(options, &opts);
 946        if (rc)
 947                goto out_err;
 948
 949out:
 950        rc = selinux_set_mnt_opts(sb, &opts);
 951
 952out_err:
 953        security_free_mnt_opts(&opts);
 954        return rc;
 955}
 956
 957static void selinux_write_opts(struct seq_file *m,
 958                               struct security_mnt_opts *opts)
 959{
 960        int i;
 961        char *prefix;
 962
 963        for (i = 0; i < opts->num_mnt_opts; i++) {
 964                char *has_comma;
 965
 966                if (opts->mnt_opts[i])
 967                        has_comma = strchr(opts->mnt_opts[i], ',');
 968                else
 969                        has_comma = NULL;
 970
 971                switch (opts->mnt_opts_flags[i]) {
 972                case CONTEXT_MNT:
 973                        prefix = CONTEXT_STR;
 974                        break;
 975                case FSCONTEXT_MNT:
 976                        prefix = FSCONTEXT_STR;
 977                        break;
 978                case ROOTCONTEXT_MNT:
 979                        prefix = ROOTCONTEXT_STR;
 980                        break;
 981                case DEFCONTEXT_MNT:
 982                        prefix = DEFCONTEXT_STR;
 983                        break;
 984                case SE_SBLABELSUPP:
 985                        seq_putc(m, ',');
 986                        seq_puts(m, LABELSUPP_STR);
 987                        continue;
 988                default:
 989                        BUG();
 990                        return;
 991                };
 992                /* we need a comma before each option */
 993                seq_putc(m, ',');
 994                seq_puts(m, prefix);
 995                if (has_comma)
 996                        seq_putc(m, '\"');
 997                seq_puts(m, opts->mnt_opts[i]);
 998                if (has_comma)
 999                        seq_putc(m, '\"');
1000        }
1001}
1002
1003static int selinux_sb_show_options(struct seq_file *m, struct super_block *sb)
1004{
1005        struct security_mnt_opts opts;
1006        int rc;
1007
1008        rc = selinux_get_mnt_opts(sb, &opts);
1009        if (rc) {
1010                /* before policy load we may get EINVAL, don't show anything */
1011                if (rc == -EINVAL)
1012                        rc = 0;
1013                return rc;
1014        }
1015
1016        selinux_write_opts(m, &opts);
1017
1018        security_free_mnt_opts(&opts);
1019
1020        return rc;
1021}
1022
1023static inline u16 inode_mode_to_security_class(umode_t mode)
1024{
1025        switch (mode & S_IFMT) {
1026        case S_IFSOCK:
1027                return SECCLASS_SOCK_FILE;
1028        case S_IFLNK:
1029                return SECCLASS_LNK_FILE;
1030        case S_IFREG:
1031                return SECCLASS_FILE;
1032        case S_IFBLK:
1033                return SECCLASS_BLK_FILE;
1034        case S_IFDIR:
1035                return SECCLASS_DIR;
1036        case S_IFCHR:
1037                return SECCLASS_CHR_FILE;
1038        case S_IFIFO:
1039                return SECCLASS_FIFO_FILE;
1040
1041        }
1042
1043        return SECCLASS_FILE;
1044}
1045
1046static inline int default_protocol_stream(int protocol)
1047{
1048        return (protocol == IPPROTO_IP || protocol == IPPROTO_TCP);
1049}
1050
1051static inline int default_protocol_dgram(int protocol)
1052{
1053        return (protocol == IPPROTO_IP || protocol == IPPROTO_UDP);
1054}
1055
1056static inline u16 socket_type_to_security_class(int family, int type, int protocol)
1057{
1058        switch (family) {
1059        case PF_UNIX:
1060                switch (type) {
1061                case SOCK_STREAM:
1062                case SOCK_SEQPACKET:
1063                        return SECCLASS_UNIX_STREAM_SOCKET;
1064                case SOCK_DGRAM:
1065                        return SECCLASS_UNIX_DGRAM_SOCKET;
1066                }
1067                break;
1068        case PF_INET:
1069        case PF_INET6:
1070                switch (type) {
1071                case SOCK_STREAM:
1072                        if (default_protocol_stream(protocol))
1073                                return SECCLASS_TCP_SOCKET;
1074                        else
1075                                return SECCLASS_RAWIP_SOCKET;
1076                case SOCK_DGRAM:
1077                        if (default_protocol_dgram(protocol))
1078                                return SECCLASS_UDP_SOCKET;
1079                        else
1080                                return SECCLASS_RAWIP_SOCKET;
1081                case SOCK_DCCP:
1082                        return SECCLASS_DCCP_SOCKET;
1083                default:
1084                        return SECCLASS_RAWIP_SOCKET;
1085                }
1086                break;
1087        case PF_NETLINK:
1088                switch (protocol) {
1089                case NETLINK_ROUTE:
1090                        return SECCLASS_NETLINK_ROUTE_SOCKET;
1091                case NETLINK_FIREWALL:
1092                        return SECCLASS_NETLINK_FIREWALL_SOCKET;
1093                case NETLINK_INET_DIAG:
1094                        return SECCLASS_NETLINK_TCPDIAG_SOCKET;
1095                case NETLINK_NFLOG:
1096                        return SECCLASS_NETLINK_NFLOG_SOCKET;
1097                case NETLINK_XFRM:
1098                        return SECCLASS_NETLINK_XFRM_SOCKET;
1099                case NETLINK_SELINUX:
1100                        return SECCLASS_NETLINK_SELINUX_SOCKET;
1101                case NETLINK_AUDIT:
1102                        return SECCLASS_NETLINK_AUDIT_SOCKET;
1103                case NETLINK_IP6_FW:
1104                        return SECCLASS_NETLINK_IP6FW_SOCKET;
1105                case NETLINK_DNRTMSG:
1106                        return SECCLASS_NETLINK_DNRT_SOCKET;
1107                case NETLINK_KOBJECT_UEVENT:
1108                        return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET;
1109                default:
1110                        return SECCLASS_NETLINK_SOCKET;
1111                }
1112        case PF_PACKET:
1113                return SECCLASS_PACKET_SOCKET;
1114        case PF_KEY:
1115                return SECCLASS_KEY_SOCKET;
1116        case PF_APPLETALK:
1117                return SECCLASS_APPLETALK_SOCKET;
1118        }
1119
1120        return SECCLASS_SOCKET;
1121}
1122
1123#ifdef CONFIG_PROC_FS
1124static int selinux_proc_get_sid(struct dentry *dentry,
1125                                u16 tclass,
1126                                u32 *sid)
1127{
1128        int rc;
1129        char *buffer, *path;
1130
1131        buffer = (char *)__get_free_page(GFP_KERNEL);
1132        if (!buffer)
1133                return -ENOMEM;
1134
1135        path = dentry_path_raw(dentry, buffer, PAGE_SIZE);
1136        if (IS_ERR(path))
1137                rc = PTR_ERR(path);
1138        else {
1139                /* each process gets a /proc/PID/ entry. Strip off the
1140                 * PID part to get a valid selinux labeling.
1141                 * e.g. /proc/1/net/rpc/nfs -> /net/rpc/nfs */
1142                while (path[1] >= '0' && path[1] <= '9') {
1143                        path[1] = '/';
1144                        path++;
1145                }
1146                rc = security_genfs_sid("proc", path, tclass, sid);
1147        }
1148        free_page((unsigned long)buffer);
1149        return rc;
1150}
1151#else
1152static int selinux_proc_get_sid(struct dentry *dentry,
1153                                u16 tclass,
1154                                u32 *sid)
1155{
1156        return -EINVAL;
1157}
1158#endif
1159
1160/* The inode's security attributes must be initialized before first use. */
1161static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
1162{
1163        struct superblock_security_struct *sbsec = NULL;
1164        struct inode_security_struct *isec = inode->i_security;
1165        u32 sid;
1166        struct dentry *dentry;
1167#define INITCONTEXTLEN 255
1168        char *context = NULL;
1169        unsigned len = 0;
1170        int rc = 0;
1171
1172        if (isec->initialized)
1173                goto out;
1174
1175        mutex_lock(&isec->lock);
1176        if (isec->initialized)
1177                goto out_unlock;
1178
1179        sbsec = inode->i_sb->s_security;
1180        if (!(sbsec->flags & SE_SBINITIALIZED)) {
1181                /* Defer initialization until selinux_complete_init,
1182                   after the initial policy is loaded and the security
1183                   server is ready to handle calls. */
1184                spin_lock(&sbsec->isec_lock);
1185                if (list_empty(&isec->list))
1186                        list_add(&isec->list, &sbsec->isec_head);
1187                spin_unlock(&sbsec->isec_lock);
1188                goto out_unlock;
1189        }
1190
1191        switch (sbsec->behavior) {
1192        case SECURITY_FS_USE_XATTR:
1193                if (!inode->i_op->getxattr) {
1194                        isec->sid = sbsec->def_sid;
1195                        break;
1196                }
1197
1198                /* Need a dentry, since the xattr API requires one.
1199                   Life would be simpler if we could just pass the inode. */
1200                if (opt_dentry) {
1201                        /* Called from d_instantiate or d_splice_alias. */
1202                        dentry = dget(opt_dentry);
1203                } else {
1204                        /* Called from selinux_complete_init, try to find a dentry. */
1205                        dentry = d_find_alias(inode);
1206                }
1207                if (!dentry) {
1208                        /*
1209                         * this is can be hit on boot when a file is accessed
1210                         * before the policy is loaded.  When we load policy we
1211                         * may find inodes that have no dentry on the
1212                         * sbsec->isec_head list.  No reason to complain as these
1213                         * will get fixed up the next time we go through
1214                         * inode_doinit with a dentry, before these inodes could
1215                         * be used again by userspace.
1216                         */
1217                        goto out_unlock;
1218                }
1219
1220                len = INITCONTEXTLEN;
1221                context = kmalloc(len+1, GFP_NOFS);
1222                if (!context) {
1223                        rc = -ENOMEM;
1224                        dput(dentry);
1225                        goto out_unlock;
1226                }
1227                context[len] = '\0';
1228                rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
1229                                           context, len);
1230                if (rc == -ERANGE) {
1231                        kfree(context);
1232
1233                        /* Need a larger buffer.  Query for the right size. */
1234                        rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
1235                                                   NULL, 0);
1236                        if (rc < 0) {
1237                                dput(dentry);
1238                                goto out_unlock;
1239                        }
1240                        len = rc;
1241                        context = kmalloc(len+1, GFP_NOFS);
1242                        if (!context) {
1243                                rc = -ENOMEM;
1244                                dput(dentry);
1245                                goto out_unlock;
1246                        }
1247                        context[len] = '\0';
1248                        rc = inode->i_op->getxattr(dentry,
1249                                                   XATTR_NAME_SELINUX,
1250                                                   context, len);
1251                }
1252                dput(dentry);
1253                if (rc < 0) {
1254                        if (rc != -ENODATA) {
1255                                printk(KERN_WARNING "SELinux: %s:  getxattr returned "
1256                                       "%d for dev=%s ino=%ld\n", __func__,
1257                                       -rc, inode->i_sb->s_id, inode->i_ino);
1258                                kfree(context);
1259                                goto out_unlock;
1260                        }
1261                        /* Map ENODATA to the default file SID */
1262                        sid = sbsec->def_sid;
1263                        rc = 0;
1264                } else {
1265                        rc = security_context_to_sid_default(context, rc, &sid,
1266                                                             sbsec->def_sid,
1267                                                             GFP_NOFS);
1268                        if (rc) {
1269                                char *dev = inode->i_sb->s_id;
1270                                unsigned long ino = inode->i_ino;
1271
1272                                if (rc == -EINVAL) {
1273                                        if (printk_ratelimit())
1274                                                printk(KERN_NOTICE "SELinux: inode=%lu on dev=%s was found to have an invalid "
1275                                                        "context=%s.  This indicates you may need to relabel the inode or the "
1276                                                        "filesystem in question.\n", ino, dev, context);
1277                                } else {
1278                                        printk(KERN_WARNING "SELinux: %s:  context_to_sid(%s) "
1279                                               "returned %d for dev=%s ino=%ld\n",
1280                                               __func__, context, -rc, dev, ino);
1281                                }
1282                                kfree(context);
1283                                /* Leave with the unlabeled SID */
1284                                rc = 0;
1285                                break;
1286                        }
1287                }
1288                kfree(context);
1289                isec->sid = sid;
1290                break;
1291        case SECURITY_FS_USE_TASK:
1292                isec->sid = isec->task_sid;
1293                break;
1294        case SECURITY_FS_USE_TRANS:
1295                /* Default to the fs SID. */
1296                isec->sid = sbsec->sid;
1297
1298                /* Try to obtain a transition SID. */
1299                isec->sclass = inode_mode_to_security_class(inode->i_mode);
1300                rc = security_transition_sid(isec->task_sid, sbsec->sid,
1301                                             isec->sclass, NULL, &sid);
1302                if (rc)
1303                        goto out_unlock;
1304                isec->sid = sid;
1305                break;
1306        case SECURITY_FS_USE_MNTPOINT:
1307                isec->sid = sbsec->mntpoint_sid;
1308                break;
1309        default:
1310                /* Default to the fs superblock SID. */
1311                isec->sid = sbsec->sid;
1312
1313                if ((sbsec->flags & SE_SBPROC) && !S_ISLNK(inode->i_mode)) {
1314                        if (opt_dentry) {
1315                                isec->sclass = inode_mode_to_security_class(inode->i_mode);
1316                                rc = selinux_proc_get_sid(opt_dentry,
1317                                                          isec->sclass,
1318                                                          &sid);
1319                                if (rc)
1320                                        goto out_unlock;
1321                                isec->sid = sid;
1322                        }
1323                }
1324                break;
1325        }
1326
1327        isec->initialized = 1;
1328
1329out_unlock:
1330        mutex_unlock(&isec->lock);
1331out:
1332        if (isec->sclass == SECCLASS_FILE)
1333                isec->sclass = inode_mode_to_security_class(inode->i_mode);
1334        return rc;
1335}
1336
1337/* Convert a Linux signal to an access vector. */
1338static inline u32 signal_to_av(int sig)
1339{
1340        u32 perm = 0;
1341
1342        switch (sig) {
1343        case SIGCHLD:
1344                /* Commonly granted from child to parent. */
1345                perm = PROCESS__SIGCHLD;
1346                break;
1347        case SIGKILL:
1348                /* Cannot be caught or ignored */
1349                perm = PROCESS__SIGKILL;
1350                break;
1351        case SIGSTOP:
1352                /* Cannot be caught or ignored */
1353                perm = PROCESS__SIGSTOP;
1354                break;
1355        default:
1356                /* All other signals. */
1357                perm = PROCESS__SIGNAL;
1358                break;
1359        }
1360
1361        return perm;
1362}
1363
1364/*
1365 * Check permission between a pair of credentials
1366 * fork check, ptrace check, etc.
1367 */
1368static int cred_has_perm(const struct cred *actor,
1369                         const struct cred *target,
1370                         u32 perms)
1371{
1372        u32 asid = cred_sid(actor), tsid = cred_sid(target);
1373
1374        return avc_has_perm(asid, tsid, SECCLASS_PROCESS, perms, NULL);
1375}
1376
1377/*
1378 * Check permission between a pair of tasks, e.g. signal checks,
1379 * fork check, ptrace check, etc.
1380 * tsk1 is the actor and tsk2 is the target
1381 * - this uses the default subjective creds of tsk1
1382 */
1383static int task_has_perm(const struct task_struct *tsk1,
1384                         const struct task_struct *tsk2,
1385                         u32 perms)
1386{
1387        const struct task_security_struct *__tsec1, *__tsec2;
1388        u32 sid1, sid2;
1389
1390        rcu_read_lock();
1391        __tsec1 = __task_cred(tsk1)->security;  sid1 = __tsec1->sid;
1392        __tsec2 = __task_cred(tsk2)->security;  sid2 = __tsec2->sid;
1393        rcu_read_unlock();
1394        return avc_has_perm(sid1, sid2, SECCLASS_PROCESS, perms, NULL);
1395}
1396
1397/*
1398 * Check permission between current and another task, e.g. signal checks,
1399 * fork check, ptrace check, etc.
1400 * current is the actor and tsk2 is the target
1401 * - this uses current's subjective creds
1402 */
1403static int current_has_perm(const struct task_struct *tsk,
1404                            u32 perms)
1405{
1406        u32 sid, tsid;
1407
1408        sid = current_sid();
1409        tsid = task_sid(tsk);
1410        return avc_has_perm(sid, tsid, SECCLASS_PROCESS, perms, NULL);
1411}
1412
1413#if CAP_LAST_CAP > 63
1414#error Fix SELinux to handle capabilities > 63.
1415#endif
1416
1417/* Check whether a task is allowed to use a capability. */
1418static int task_has_capability(struct task_struct *tsk,
1419                               const struct cred *cred,
1420                               int cap, int audit)
1421{
1422        struct common_audit_data ad;
1423        struct av_decision avd;
1424        u16 sclass;
1425        u32 sid = cred_sid(cred);
1426        u32 av = CAP_TO_MASK(cap);
1427        int rc;
1428
1429        COMMON_AUDIT_DATA_INIT(&ad, CAP);
1430        ad.tsk = tsk;
1431        ad.u.cap = cap;
1432
1433        switch (CAP_TO_INDEX(cap)) {
1434        case 0:
1435                sclass = SECCLASS_CAPABILITY;
1436                break;
1437        case 1:
1438                sclass = SECCLASS_CAPABILITY2;
1439                break;
1440        default:
1441                printk(KERN_ERR
1442                       "SELinux:  out of range capability %d\n", cap);
1443                BUG();
1444                return -EINVAL;
1445        }
1446
1447        rc = avc_has_perm_noaudit(sid, sid, sclass, av, 0, &avd);
1448        if (audit == SECURITY_CAP_AUDIT) {
1449                int rc2 = avc_audit(sid, sid, sclass, av, &avd, rc, &ad, 0);
1450                if (rc2)
1451                        return rc2;
1452        }
1453        return rc;
1454}
1455
1456/* Check whether a task is allowed to use a system operation. */
1457static int task_has_system(struct task_struct *tsk,
1458                           u32 perms)
1459{
1460        u32 sid = task_sid(tsk);
1461
1462        return avc_has_perm(sid, SECINITSID_KERNEL,
1463                            SECCLASS_SYSTEM, perms, NULL);
1464}
1465
1466/* Check whether a task has a particular permission to an inode.
1467   The 'adp' parameter is optional and allows other audit
1468   data to be passed (e.g. the dentry). */
1469static int inode_has_perm(const struct cred *cred,
1470                          struct inode *inode,
1471                          u32 perms,
1472                          struct common_audit_data *adp,
1473                          unsigned flags)
1474{
1475        struct inode_security_struct *isec;
1476        u32 sid;
1477
1478        validate_creds(cred);
1479
1480        if (unlikely(IS_PRIVATE(inode)))
1481                return 0;
1482
1483        sid = cred_sid(cred);
1484        isec = inode->i_security;
1485
1486        return avc_has_perm_flags(sid, isec->sid, isec->sclass, perms, adp, flags);
1487}
1488
1489static int inode_has_perm_noadp(const struct cred *cred,
1490                                struct inode *inode,
1491                                u32 perms,
1492                                unsigned flags)
1493{
1494        struct common_audit_data ad;
1495
1496        COMMON_AUDIT_DATA_INIT(&ad, INODE);
1497        ad.u.inode = inode;
1498        return inode_has_perm(cred, inode, perms, &ad, flags);
1499}
1500
1501/* Same as inode_has_perm, but pass explicit audit data containing
1502   the dentry to help the auditing code to more easily generate the
1503   pathname if needed. */
1504static inline int dentry_has_perm(const struct cred *cred,
1505                                  struct dentry *dentry,
1506                                  u32 av)
1507{
1508        struct inode *inode = dentry->d_inode;
1509        struct common_audit_data ad;
1510
1511        COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
1512        ad.u.dentry = dentry;
1513        return inode_has_perm(cred, inode, av, &ad, 0);
1514}
1515
1516/* Same as inode_has_perm, but pass explicit audit data containing
1517   the path to help the auditing code to more easily generate the
1518   pathname if needed. */
1519static inline int path_has_perm(const struct cred *cred,
1520                                struct path *path,
1521                                u32 av)
1522{
1523        struct inode *inode = path->dentry->d_inode;
1524        struct common_audit_data ad;
1525
1526        COMMON_AUDIT_DATA_INIT(&ad, PATH);
1527        ad.u.path = *path;
1528        return inode_has_perm(cred, inode, av, &ad, 0);
1529}
1530
1531/* Check whether a task can use an open file descriptor to
1532   access an inode in a given way.  Check access to the
1533   descriptor itself, and then use dentry_has_perm to
1534   check a particular permission to the file.
1535   Access to the descriptor is implicitly granted if it
1536   has the same SID as the process.  If av is zero, then
1537   access to the file is not checked, e.g. for cases
1538   where only the descriptor is affected like seek. */
1539static int file_has_perm(const struct cred *cred,
1540                         struct file *file,
1541                         u32 av)
1542{
1543        struct file_security_struct *fsec = file->f_security;
1544        struct inode *inode = file->f_path.dentry->d_inode;
1545        struct common_audit_data ad;
1546        u32 sid = cred_sid(cred);
1547        int rc;
1548
1549        COMMON_AUDIT_DATA_INIT(&ad, PATH);
1550        ad.u.path = file->f_path;
1551
1552        if (sid != fsec->sid) {
1553                rc = avc_has_perm(sid, fsec->sid,
1554                                  SECCLASS_FD,
1555                                  FD__USE,
1556                                  &ad);
1557                if (rc)
1558                        goto out;
1559        }
1560
1561        /* av is zero if only checking access to the descriptor. */
1562        rc = 0;
1563        if (av)
1564                rc = inode_has_perm(cred, inode, av, &ad, 0);
1565
1566out:
1567        return rc;
1568}
1569
1570/* Check whether a task can create a file. */
1571static int may_create(struct inode *dir,
1572                      struct dentry *dentry,
1573                      u16 tclass)
1574{
1575        const struct task_security_struct *tsec = current_security();
1576        struct inode_security_struct *dsec;
1577        struct superblock_security_struct *sbsec;
1578        u32 sid, newsid;
1579        struct common_audit_data ad;
1580        int rc;
1581
1582        dsec = dir->i_security;
1583        sbsec = dir->i_sb->s_security;
1584
1585        sid = tsec->sid;
1586        newsid = tsec->create_sid;
1587
1588        COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
1589        ad.u.dentry = dentry;
1590
1591        rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR,
1592                          DIR__ADD_NAME | DIR__SEARCH,
1593                          &ad);
1594        if (rc)
1595                return rc;
1596
1597        if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) {
1598                rc = security_transition_sid(sid, dsec->sid, tclass,
1599                                             &dentry->d_name, &newsid);
1600                if (rc)
1601                        return rc;
1602        }
1603
1604        rc = avc_has_perm(sid, newsid, tclass, FILE__CREATE, &ad);
1605        if (rc)
1606                return rc;
1607
1608        return avc_has_perm(newsid, sbsec->sid,
1609                            SECCLASS_FILESYSTEM,
1610                            FILESYSTEM__ASSOCIATE, &ad);
1611}
1612
1613/* Check whether a task can create a key. */
1614static int may_create_key(u32 ksid,
1615                          struct task_struct *ctx)
1616{
1617        u32 sid = task_sid(ctx);
1618
1619        return avc_has_perm(sid, ksid, SECCLASS_KEY, KEY__CREATE, NULL);
1620}
1621
1622#define MAY_LINK        0
1623#define MAY_UNLINK      1
1624#define MAY_RMDIR       2
1625
1626/* Check whether a task can link, unlink, or rmdir a file/directory. */
1627static int may_link(struct inode *dir,
1628                    struct dentry *dentry,
1629                    int kind)
1630
1631{
1632        struct inode_security_struct *dsec, *isec;
1633        struct common_audit_data ad;
1634        u32 sid = current_sid();
1635        u32 av;
1636        int rc;
1637
1638        dsec = dir->i_security;
1639        isec = dentry->d_inode->i_security;
1640
1641        COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
1642        ad.u.dentry = dentry;
1643
1644        av = DIR__SEARCH;
1645        av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
1646        rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR, av, &ad);
1647        if (rc)
1648                return rc;
1649
1650        switch (kind) {
1651        case MAY_LINK:
1652                av = FILE__LINK;
1653                break;
1654        case MAY_UNLINK:
1655                av = FILE__UNLINK;
1656                break;
1657        case MAY_RMDIR:
1658                av = DIR__RMDIR;
1659                break;
1660        default:
1661                printk(KERN_WARNING "SELinux: %s:  unrecognized kind %d\n",
1662                        __func__, kind);
1663                return 0;
1664        }
1665
1666        rc = avc_has_perm(sid, isec->sid, isec->sclass, av, &ad);
1667        return rc;
1668}
1669
1670static inline int may_rename(struct inode *old_dir,
1671                             struct dentry *old_dentry,
1672                             struct inode *new_dir,
1673                             struct dentry *new_dentry)
1674{
1675        struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
1676        struct common_audit_data ad;
1677        u32 sid = current_sid();
1678        u32 av;
1679        int old_is_dir, new_is_dir;
1680        int rc;
1681
1682        old_dsec = old_dir->i_security;
1683        old_isec = old_dentry->d_inode->i_security;
1684        old_is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
1685        new_dsec = new_dir->i_security;
1686
1687        COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
1688
1689        ad.u.dentry = old_dentry;
1690        rc = avc_has_perm(sid, old_dsec->sid, SECCLASS_DIR,
1691                          DIR__REMOVE_NAME | DIR__SEARCH, &ad);
1692        if (rc)
1693                return rc;
1694        rc = avc_has_perm(sid, old_isec->sid,
1695                          old_isec->sclass, FILE__RENAME, &ad);
1696        if (rc)
1697                return rc;
1698        if (old_is_dir && new_dir != old_dir) {
1699                rc = avc_has_perm(sid, old_isec->sid,
1700                                  old_isec->sclass, DIR__REPARENT, &ad);
1701                if (rc)
1702                        return rc;
1703        }
1704
1705        ad.u.dentry = new_dentry;
1706        av = DIR__ADD_NAME | DIR__SEARCH;
1707        if (new_dentry->d_inode)
1708                av |= DIR__REMOVE_NAME;
1709        rc = avc_has_perm(sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
1710        if (rc)
1711                return rc;
1712        if (new_dentry->d_inode) {
1713                new_isec = new_dentry->d_inode->i_security;
1714                new_is_dir = S_ISDIR(new_dentry->d_inode->i_mode);
1715                rc = avc_has_perm(sid, new_isec->sid,
1716                                  new_isec->sclass,
1717                                  (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
1718                if (rc)
1719                        return rc;
1720        }
1721
1722        return 0;
1723}
1724
1725/* Check whether a task can perform a filesystem operation. */
1726static int superblock_has_perm(const struct cred *cred,
1727                               struct super_block *sb,
1728                               u32 perms,
1729                               struct common_audit_data *ad)
1730{
1731        struct superblock_security_struct *sbsec;
1732        u32 sid = cred_sid(cred);
1733
1734        sbsec = sb->s_security;
1735        return avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM, perms, ad);
1736}
1737
1738/* Convert a Linux mode and permission mask to an access vector. */
1739static inline u32 file_mask_to_av(int mode, int mask)
1740{
1741        u32 av = 0;
1742
1743        if ((mode & S_IFMT) != S_IFDIR) {
1744                if (mask & MAY_EXEC)
1745                        av |= FILE__EXECUTE;
1746                if (mask & MAY_READ)
1747                        av |= FILE__READ;
1748
1749                if (mask & MAY_APPEND)
1750                        av |= FILE__APPEND;
1751                else if (mask & MAY_WRITE)
1752                        av |= FILE__WRITE;
1753
1754        } else {
1755                if (mask & MAY_EXEC)
1756                        av |= DIR__SEARCH;
1757                if (mask & MAY_WRITE)
1758                        av |= DIR__WRITE;
1759                if (mask & MAY_READ)
1760                        av |= DIR__READ;
1761        }
1762
1763        return av;
1764}
1765
1766/* Convert a Linux file to an access vector. */
1767static inline u32 file_to_av(struct file *file)
1768{
1769        u32 av = 0;
1770
1771        if (file->f_mode & FMODE_READ)
1772                av |= FILE__READ;
1773        if (file->f_mode & FMODE_WRITE) {
1774                if (file->f_flags & O_APPEND)
1775                        av |= FILE__APPEND;
1776                else
1777                        av |= FILE__WRITE;
1778        }
1779        if (!av) {
1780                /*
1781                 * Special file opened with flags 3 for ioctl-only use.
1782                 */
1783                av = FILE__IOCTL;
1784        }
1785
1786        return av;
1787}
1788
1789/*
1790 * Convert a file to an access vector and include the correct open
1791 * open permission.
1792 */
1793static inline u32 open_file_to_av(struct file *file)
1794{
1795        u32 av = file_to_av(file);
1796
1797        if (selinux_policycap_openperm)
1798                av |= FILE__OPEN;
1799
1800        return av;
1801}
1802
1803/* Hook functions begin here. */
1804
1805static int selinux_ptrace_access_check(struct task_struct *child,
1806                                     unsigned int mode)
1807{
1808        int rc;
1809
1810        rc = cap_ptrace_access_check(child, mode);
1811        if (rc)
1812                return rc;
1813
1814        if (mode == PTRACE_MODE_READ) {
1815                u32 sid = current_sid();
1816                u32 csid = task_sid(child);
1817                return avc_has_perm(sid, csid, SECCLASS_FILE, FILE__READ, NULL);
1818        }
1819
1820        return current_has_perm(child, PROCESS__PTRACE);
1821}
1822
1823static int selinux_ptrace_traceme(struct task_struct *parent)
1824{
1825        int rc;
1826
1827        rc = cap_ptrace_traceme(parent);
1828        if (rc)
1829                return rc;
1830
1831        return task_has_perm(parent, current, PROCESS__PTRACE);
1832}
1833
1834static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
1835                          kernel_cap_t *inheritable, kernel_cap_t *permitted)
1836{
1837        int error;
1838
1839        error = current_has_perm(target, PROCESS__GETCAP);
1840        if (error)
1841                return error;
1842
1843        return cap_capget(target, effective, inheritable, permitted);
1844}
1845
1846static int selinux_capset(struct cred *new, const struct cred *old,
1847                          const kernel_cap_t *effective,
1848                          const kernel_cap_t *inheritable,
1849                          const kernel_cap_t *permitted)
1850{
1851        int error;
1852
1853        error = cap_capset(new, old,
1854                                      effective, inheritable, permitted);
1855        if (error)
1856                return error;
1857
1858        return cred_has_perm(old, new, PROCESS__SETCAP);
1859}
1860
1861/*
1862 * (This comment used to live with the selinux_task_setuid hook,
1863 * which was removed).
1864 *
1865 * Since setuid only affects the current process, and since the SELinux
1866 * controls are not based on the Linux identity attributes, SELinux does not
1867 * need to control this operation.  However, SELinux does control the use of
1868 * the CAP_SETUID and CAP_SETGID capabilities using the capable hook.
1869 */
1870
1871static int selinux_capable(struct task_struct *tsk, const struct cred *cred,
1872                           struct user_namespace *ns, int cap, int audit)
1873{
1874        int rc;
1875
1876        rc = cap_capable(tsk, cred, ns, cap, audit);
1877        if (rc)
1878                return rc;
1879
1880        return task_has_capability(tsk, cred, cap, audit);
1881}
1882
1883static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
1884{
1885        const struct cred *cred = current_cred();
1886        int rc = 0;
1887
1888        if (!sb)
1889                return 0;
1890
1891        switch (cmds) {
1892        case Q_SYNC:
1893        case Q_QUOTAON:
1894        case Q_QUOTAOFF:
1895        case Q_SETINFO:
1896        case Q_SETQUOTA:
1897                rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAMOD, NULL);
1898                break;
1899        case Q_GETFMT:
1900        case Q_GETINFO:
1901        case Q_GETQUOTA:
1902                rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAGET, NULL);
1903                break;
1904        default:
1905                rc = 0;  /* let the kernel handle invalid cmds */
1906                break;
1907        }
1908        return rc;
1909}
1910
1911static int selinux_quota_on(struct dentry *dentry)
1912{
1913        const struct cred *cred = current_cred();
1914
1915        return dentry_has_perm(cred, dentry, FILE__QUOTAON);
1916}
1917
1918static int selinux_syslog(int type)
1919{
1920        int rc;
1921
1922        switch (type) {
1923        case SYSLOG_ACTION_READ_ALL:    /* Read last kernel messages */
1924        case SYSLOG_ACTION_SIZE_BUFFER: /* Return size of the log buffer */
1925                rc = task_has_system(current, SYSTEM__SYSLOG_READ);
1926                break;
1927        case SYSLOG_ACTION_CONSOLE_OFF: /* Disable logging to console */
1928        case SYSLOG_ACTION_CONSOLE_ON:  /* Enable logging to console */
1929        /* Set level of messages printed to console */
1930        case SYSLOG_ACTION_CONSOLE_LEVEL:
1931                rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
1932                break;
1933        case SYSLOG_ACTION_CLOSE:       /* Close log */
1934        case SYSLOG_ACTION_OPEN:        /* Open log */
1935        case SYSLOG_ACTION_READ:        /* Read from log */
1936        case SYSLOG_ACTION_READ_CLEAR:  /* Read/clear last kernel messages */
1937        case SYSLOG_ACTION_CLEAR:       /* Clear ring buffer */
1938        default:
1939                rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
1940                break;
1941        }
1942        return rc;
1943}
1944
1945/*
1946 * Check that a process has enough memory to allocate a new virtual
1947 * mapping. 0 means there is enough memory for the allocation to
1948 * succeed and -ENOMEM implies there is not.
1949 *
1950 * Do not audit the selinux permission check, as this is applied to all
1951 * processes that allocate mappings.
1952 */
1953static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
1954{
1955        int rc, cap_sys_admin = 0;
1956
1957        rc = selinux_capable(current, current_cred(),
1958                             &init_user_ns, CAP_SYS_ADMIN,
1959                             SECURITY_CAP_NOAUDIT);
1960        if (rc == 0)
1961                cap_sys_admin = 1;
1962
1963        return __vm_enough_memory(mm, pages, cap_sys_admin);
1964}
1965
1966/* binprm security operations */
1967
1968static int selinux_bprm_set_creds(struct linux_binprm *bprm)
1969{
1970        const struct task_security_struct *old_tsec;
1971        struct task_security_struct *new_tsec;
1972        struct inode_security_struct *isec;
1973        struct common_audit_data ad;
1974        struct inode *inode = bprm->file->f_path.dentry->d_inode;
1975        int rc;
1976
1977        rc = cap_bprm_set_creds(bprm);
1978        if (rc)
1979                return rc;
1980
1981        /* SELinux context only depends on initial program or script and not
1982         * the script interpreter */
1983        if (bprm->cred_prepared)
1984                return 0;
1985
1986        old_tsec = current_security();
1987        new_tsec = bprm->cred->security;
1988        isec = inode->i_security;
1989
1990        /* Default to the current task SID. */
1991        new_tsec->sid = old_tsec->sid;
1992        new_tsec->osid = old_tsec->sid;
1993
1994        /* Reset fs, key, and sock SIDs on execve. */
1995        new_tsec->create_sid = 0;
1996        new_tsec->keycreate_sid = 0;
1997        new_tsec->sockcreate_sid = 0;
1998
1999        if (old_tsec->exec_sid) {
2000                new_tsec->sid = old_tsec->exec_sid;
2001                /* Reset exec SID on execve. */
2002                new_tsec->exec_sid = 0;
2003        } else {
2004                /* Check for a default transition on this program. */
2005                rc = security_transition_sid(old_tsec->sid, isec->sid,
2006                                             SECCLASS_PROCESS, NULL,
2007                                             &new_tsec->sid);
2008                if (rc)
2009                        return rc;
2010        }
2011
2012        COMMON_AUDIT_DATA_INIT(&ad, PATH);
2013        ad.u.path = bprm->file->f_path;
2014
2015        if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)
2016                new_tsec->sid = old_tsec->sid;
2017
2018        if (new_tsec->sid == old_tsec->sid) {
2019                rc = avc_has_perm(old_tsec->sid, isec->sid,
2020                                  SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
2021                if (rc)
2022                        return rc;
2023        } else {
2024                /* Check permissions for the transition. */
2025                rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2026                                  SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
2027                if (rc)
2028                        return rc;
2029
2030                rc = avc_has_perm(new_tsec->sid, isec->sid,
2031                                  SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
2032                if (rc)
2033                        return rc;
2034
2035                /* Check for shared state */
2036                if (bprm->unsafe & LSM_UNSAFE_SHARE) {
2037                        rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2038                                          SECCLASS_PROCESS, PROCESS__SHARE,
2039                                          NULL);
2040                        if (rc)
2041                                return -EPERM;
2042                }
2043
2044                /* Make sure that anyone attempting to ptrace over a task that
2045                 * changes its SID has the appropriate permit */
2046                if (bprm->unsafe &
2047                    (LSM_UNSAFE_PTRACE | LSM_UNSAFE_PTRACE_CAP)) {
2048                        struct task_struct *tracer;
2049                        struct task_security_struct *sec;
2050                        u32 ptsid = 0;
2051
2052                        rcu_read_lock();
2053                        tracer = ptrace_parent(current);
2054                        if (likely(tracer != NULL)) {
2055                                sec = __task_cred(tracer)->security;
2056                                ptsid = sec->sid;
2057                        }
2058                        rcu_read_unlock();
2059
2060                        if (ptsid != 0) {
2061                                rc = avc_has_perm(ptsid, new_tsec->sid,
2062                                                  SECCLASS_PROCESS,
2063                                                  PROCESS__PTRACE, NULL);
2064                                if (rc)
2065                                        return -EPERM;
2066                        }
2067                }
2068
2069                /* Clear any possibly unsafe personality bits on exec: */
2070                bprm->per_clear |= PER_CLEAR_ON_SETID;
2071        }
2072
2073        return 0;
2074}
2075
2076static int selinux_bprm_secureexec(struct linux_binprm *bprm)
2077{
2078        const struct task_security_struct *tsec = current_security();
2079        u32 sid, osid;
2080        int atsecure = 0;
2081
2082        sid = tsec->sid;
2083        osid = tsec->osid;
2084
2085        if (osid != sid) {
2086                /* Enable secure mode for SIDs transitions unless
2087                   the noatsecure permission is granted between
2088                   the two SIDs, i.e. ahp returns 0. */
2089                atsecure = avc_has_perm(osid, sid,
2090                                        SECCLASS_PROCESS,
2091                                        PROCESS__NOATSECURE, NULL);
2092        }
2093
2094        return (atsecure || cap_bprm_secureexec(bprm));
2095}
2096
2097/* Derived from fs/exec.c:flush_old_files. */
2098static inline void flush_unauthorized_files(const struct cred *cred,
2099                                            struct files_struct *files)
2100{
2101        struct common_audit_data ad;
2102        struct file *file, *devnull = NULL;
2103        struct tty_struct *tty;
2104        struct fdtable *fdt;
2105        long j = -1;
2106        int drop_tty = 0;
2107
2108        tty = get_current_tty();
2109        if (tty) {
2110                spin_lock(&tty_files_lock);
2111                if (!list_empty(&tty->tty_files)) {
2112                        struct tty_file_private *file_priv;
2113                        struct inode *inode;
2114
2115                        /* Revalidate access to controlling tty.
2116                           Use inode_has_perm on the tty inode directly rather
2117                           than using file_has_perm, as this particular open
2118                           file may belong to another process and we are only
2119                           interested in the inode-based check here. */
2120                        file_priv = list_first_entry(&tty->tty_files,
2121                                                struct tty_file_private, list);
2122                        file = file_priv->file;
2123                        inode = file->f_path.dentry->d_inode;
2124                        if (inode_has_perm_noadp(cred, inode,
2125                                           FILE__READ | FILE__WRITE, 0)) {
2126                                drop_tty = 1;
2127                        }
2128                }
2129                spin_unlock(&tty_files_lock);
2130                tty_kref_put(tty);
2131        }
2132        /* Reset controlling tty. */
2133        if (drop_tty)
2134                no_tty();
2135
2136        /* Revalidate access to inherited open files. */
2137
2138        COMMON_AUDIT_DATA_INIT(&ad, INODE);
2139
2140        spin_lock(&files->file_lock);
2141        for (;;) {
2142                unsigned long set, i;
2143                int fd;
2144
2145                j++;
2146                i = j * __NFDBITS;
2147                fdt = files_fdtable(files);
2148                if (i >= fdt->max_fds)
2149                        break;
2150                set = fdt->open_fds->fds_bits[j];
2151                if (!set)
2152                        continue;
2153                spin_unlock(&files->file_lock);
2154                for ( ; set ; i++, set >>= 1) {
2155                        if (set & 1) {
2156                                file = fget(i);
2157                                if (!file)
2158                                        continue;
2159                                if (file_has_perm(cred,
2160                                                  file,
2161                                                  file_to_av(file))) {
2162                                        sys_close(i);
2163                                        fd = get_unused_fd();
2164                                        if (fd != i) {
2165                                                if (fd >= 0)
2166                                                        put_unused_fd(fd);
2167                                                fput(file);
2168                                                continue;
2169                                        }
2170                                        if (devnull) {
2171                                                get_file(devnull);
2172                                        } else {
2173                                                devnull = dentry_open(
2174                                                        dget(selinux_null),
2175                                                        mntget(selinuxfs_mount),
2176                                                        O_RDWR, cred);
2177                                                if (IS_ERR(devnull)) {
2178                                                        devnull = NULL;
2179                                                        put_unused_fd(fd);
2180                                                        fput(file);
2181                                                        continue;
2182                                                }
2183                                        }
2184                                        fd_install(fd, devnull);
2185                                }
2186                                fput(file);
2187                        }
2188                }
2189                spin_lock(&files->file_lock);
2190
2191        }
2192        spin_unlock(&files->file_lock);
2193}
2194
2195/*
2196 * Prepare a process for imminent new credential changes due to exec
2197 */
2198static void selinux_bprm_committing_creds(struct linux_binprm *bprm)
2199{
2200        struct task_security_struct *new_tsec;
2201        struct rlimit *rlim, *initrlim;
2202        int rc, i;
2203
2204        new_tsec = bprm->cred->security;
2205        if (new_tsec->sid == new_tsec->osid)
2206                return;
2207
2208        /* Close files for which the new task SID is not authorized. */
2209        flush_unauthorized_files(bprm->cred, current->files);
2210
2211        /* Always clear parent death signal on SID transitions. */
2212        current->pdeath_signal = 0;
2213
2214        /* Check whether the new SID can inherit resource limits from the old
2215         * SID.  If not, reset all soft limits to the lower of the current
2216         * task's hard limit and the init task's soft limit.
2217         *
2218         * Note that the setting of hard limits (even to lower them) can be
2219         * controlled by the setrlimit check.  The inclusion of the init task's
2220         * soft limit into the computation is to avoid resetting soft limits
2221         * higher than the default soft limit for cases where the default is
2222         * lower than the hard limit, e.g. RLIMIT_CORE or RLIMIT_STACK.
2223         */
2224        rc = avc_has_perm(new_tsec->osid, new_tsec->sid, SECCLASS_PROCESS,
2225                          PROCESS__RLIMITINH, NULL);
2226        if (rc) {
2227                /* protect against do_prlimit() */
2228                task_lock(current);
2229                for (i = 0; i < RLIM_NLIMITS; i++) {
2230                        rlim = current->signal->rlim + i;
2231                        initrlim = init_task.signal->rlim + i;
2232                        rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
2233                }
2234                task_unlock(current);
2235                update_rlimit_cpu(current, rlimit(RLIMIT_CPU));
2236        }
2237}
2238
2239/*
2240 * Clean up the process immediately after the installation of new credentials
2241 * due to exec
2242 */
2243static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
2244{
2245        const struct task_security_struct *tsec = current_security();
2246        struct itimerval itimer;
2247        u32 osid, sid;
2248        int rc, i;
2249
2250        osid = tsec->osid;
2251        sid = tsec->sid;
2252
2253        if (sid == osid)
2254                return;
2255
2256        /* Check whether the new SID can inherit signal state from the old SID.
2257         * If not, clear itimers to avoid subsequent signal generation and
2258         * flush and unblock signals.
2259         *
2260         * This must occur _after_ the task SID has been updated so that any
2261         * kill done after the flush will be checked against the new SID.
2262         */
2263        rc = avc_has_perm(osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL);
2264        if (rc) {
2265                memset(&itimer, 0, sizeof itimer);
2266                for (i = 0; i < 3; i++)
2267                        do_setitimer(i, &itimer, NULL);
2268                spin_lock_irq(&current->sighand->siglock);
2269                if (!(current->signal->flags & SIGNAL_GROUP_EXIT)) {
2270                        __flush_signals(current);
2271                        flush_signal_handlers(current, 1);
2272                        sigemptyset(&current->blocked);
2273                }
2274                spin_unlock_irq(&current->sighand->siglock);
2275        }
2276
2277        /* Wake up the parent if it is waiting so that it can recheck
2278         * wait permission to the new task SID. */
2279        read_lock(&tasklist_lock);
2280        __wake_up_parent(current, current->real_parent);
2281        read_unlock(&tasklist_lock);
2282}
2283
2284/* superblock security operations */
2285
2286static int selinux_sb_alloc_security(struct super_block *sb)
2287{
2288        return superblock_alloc_security(sb);
2289}
2290
2291static void selinux_sb_free_security(struct super_block *sb)
2292{
2293        superblock_free_security(sb);
2294}
2295
2296static inline int match_prefix(char *prefix, int plen, char *option, int olen)
2297{
2298        if (plen > olen)
2299                return 0;
2300
2301        return !memcmp(prefix, option, plen);
2302}
2303
2304static inline int selinux_option(char *option, int len)
2305{
2306        return (match_prefix(CONTEXT_STR, sizeof(CONTEXT_STR)-1, option, len) ||
2307                match_prefix(FSCONTEXT_STR, sizeof(FSCONTEXT_STR)-1, option, len) ||
2308                match_prefix(DEFCONTEXT_STR, sizeof(DEFCONTEXT_STR)-1, option, len) ||
2309                match_prefix(ROOTCONTEXT_STR, sizeof(ROOTCONTEXT_STR)-1, option, len) ||
2310                match_prefix(LABELSUPP_STR, sizeof(LABELSUPP_STR)-1, option, len));
2311}
2312
2313static inline void take_option(char **to, char *from, int *first, int len)
2314{
2315        if (!*first) {
2316                **to = ',';
2317                *to += 1;
2318        } else
2319                *first = 0;
2320        memcpy(*to, from, len);
2321        *to += len;
2322}
2323
2324static inline void take_selinux_option(char **to, char *from, int *first,
2325                                       int len)
2326{
2327        int current_size = 0;
2328
2329        if (!*first) {
2330                **to = '|';
2331                *to += 1;
2332        } else
2333                *first = 0;
2334
2335        while (current_size < len) {
2336                if (*from != '"') {
2337                        **to = *from;
2338                        *to += 1;
2339                }
2340                from += 1;
2341                current_size += 1;
2342        }
2343}
2344
2345static int selinux_sb_copy_data(char *orig, char *copy)
2346{
2347        int fnosec, fsec, rc = 0;
2348        char *in_save, *in_curr, *in_end;
2349        char *sec_curr, *nosec_save, *nosec;
2350        int open_quote = 0;
2351
2352        in_curr = orig;
2353        sec_curr = copy;
2354
2355        nosec = (char *)get_zeroed_page(GFP_KERNEL);
2356        if (!nosec) {
2357                rc = -ENOMEM;
2358                goto out;
2359        }
2360
2361        nosec_save = nosec;
2362        fnosec = fsec = 1;
2363        in_save = in_end = orig;
2364
2365        do {
2366                if (*in_end == '"')
2367                        open_quote = !open_quote;
2368                if ((*in_end == ',' && open_quote == 0) ||
2369                                *in_end == '\0') {
2370                        int len = in_end - in_curr;
2371
2372                        if (selinux_option(in_curr, len))
2373                                take_selinux_option(&sec_curr, in_curr, &fsec, len);
2374                        else
2375                                take_option(&nosec, in_curr, &fnosec, len);
2376
2377                        in_curr = in_end + 1;
2378                }
2379        } while (*in_end++);
2380
2381        strcpy(in_save, nosec_save);
2382        free_page((unsigned long)nosec_save);
2383out:
2384        return rc;
2385}
2386
2387static int selinux_sb_remount(struct super_block *sb, void *data)
2388{
2389        int rc, i, *flags;
2390        struct security_mnt_opts opts;
2391        char *secdata, **mount_options;
2392        struct superblock_security_struct *sbsec = sb->s_security;
2393
2394        if (!(sbsec->flags & SE_SBINITIALIZED))
2395                return 0;
2396
2397        if (!data)
2398                return 0;
2399
2400        if (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
2401                return 0;
2402
2403        security_init_mnt_opts(&opts);
2404        secdata = alloc_secdata();
2405        if (!secdata)
2406                return -ENOMEM;
2407        rc = selinux_sb_copy_data(data, secdata);
2408        if (rc)
2409                goto out_free_secdata;
2410
2411        rc = selinux_parse_opts_str(secdata, &opts);
2412        if (rc)
2413                goto out_free_secdata;
2414
2415        mount_options = opts.mnt_opts;
2416        flags = opts.mnt_opts_flags;
2417
2418        for (i = 0; i < opts.num_mnt_opts; i++) {
2419                u32 sid;
2420                size_t len;
2421
2422                if (flags[i] == SE_SBLABELSUPP)
2423                        continue;
2424                len = strlen(mount_options[i]);
2425                rc = security_context_to_sid(mount_options[i], len, &sid);
2426                if (rc) {
2427                        printk(KERN_WARNING "SELinux: security_context_to_sid"
2428                               "(%s) failed for (dev %s, type %s) errno=%d\n",
2429                               mount_options[i], sb->s_id, sb->s_type->name, rc);
2430                        goto out_free_opts;
2431                }
2432                rc = -EINVAL;
2433                switch (flags[i]) {
2434                case FSCONTEXT_MNT:
2435                        if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid, sid))
2436                                goto out_bad_option;
2437                        break;
2438                case CONTEXT_MNT:
2439                        if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid, sid))
2440                                goto out_bad_option;
2441                        break;
2442                case ROOTCONTEXT_MNT: {
2443                        struct inode_security_struct *root_isec;
2444                        root_isec = sb->s_root->d_inode->i_security;
2445
2446                        if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid, sid))
2447                                goto out_bad_option;
2448                        break;
2449                }
2450                case DEFCONTEXT_MNT:
2451                        if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid, sid))
2452                                goto out_bad_option;
2453                        break;
2454                default:
2455                        goto out_free_opts;
2456                }
2457        }
2458
2459        rc = 0;
2460out_free_opts:
2461        security_free_mnt_opts(&opts);
2462out_free_secdata:
2463        free_secdata(secdata);
2464        return rc;
2465out_bad_option:
2466        printk(KERN_WARNING "SELinux: unable to change security options "
2467               "during remount (dev %s, type=%s)\n", sb->s_id,
2468               sb->s_type->name);
2469        goto out_free_opts;
2470}
2471
2472static int selinux_sb_kern_mount(struct super_block *sb, int flags, void *data)
2473{
2474        const struct cred *cred = current_cred();
2475        struct common_audit_data ad;
2476        int rc;
2477
2478        rc = superblock_doinit(sb, data);
2479        if (rc)
2480                return rc;
2481
2482        /* Allow all mounts performed by the kernel */
2483        if (flags & MS_KERNMOUNT)
2484                return 0;
2485
2486        COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
2487        ad.u.dentry = sb->s_root;
2488        return superblock_has_perm(cred, sb, FILESYSTEM__MOUNT, &ad);
2489}
2490
2491static int selinux_sb_statfs(struct dentry *dentry)
2492{
2493        const struct cred *cred = current_cred();
2494        struct common_audit_data ad;
2495
2496        COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
2497        ad.u.dentry = dentry->d_sb->s_root;
2498        return superblock_has_perm(cred, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
2499}
2500
2501static int selinux_mount(char *dev_name,
2502                         struct path *path,
2503                         char *type,
2504                         unsigned long flags,
2505                         void *data)
2506{
2507        const struct cred *cred = current_cred();
2508
2509        if (flags & MS_REMOUNT)
2510                return superblock_has_perm(cred, path->mnt->mnt_sb,
2511                                           FILESYSTEM__REMOUNT, NULL);
2512        else
2513                return path_has_perm(cred, path, FILE__MOUNTON);
2514}
2515
2516static int selinux_umount(struct vfsmount *mnt, int flags)
2517{
2518        const struct cred *cred = current_cred();
2519
2520        return superblock_has_perm(cred, mnt->mnt_sb,
2521                                   FILESYSTEM__UNMOUNT, NULL);
2522}
2523
2524/* inode security operations */
2525
2526static int selinux_inode_alloc_security(struct inode *inode)
2527{
2528        return inode_alloc_security(inode);
2529}
2530
2531static void selinux_inode_free_security(struct inode *inode)
2532{
2533        inode_free_security(inode);
2534}
2535
2536static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
2537                                       const struct qstr *qstr, char **name,
2538                                       void **value, size_t *len)
2539{
2540        const struct task_security_struct *tsec = current_security();
2541        struct inode_security_struct *dsec;
2542        struct superblock_security_struct *sbsec;
2543        u32 sid, newsid, clen;
2544        int rc;
2545        char *namep = NULL, *context;
2546
2547        dsec = dir->i_security;
2548        sbsec = dir->i_sb->s_security;
2549
2550        sid = tsec->sid;
2551        newsid = tsec->create_sid;
2552
2553        if ((sbsec->flags & SE_SBINITIALIZED) &&
2554            (sbsec->behavior == SECURITY_FS_USE_MNTPOINT))
2555                newsid = sbsec->mntpoint_sid;
2556        else if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) {
2557                rc = security_transition_sid(sid, dsec->sid,
2558                                             inode_mode_to_security_class(inode->i_mode),
2559                                             qstr, &newsid);
2560                if (rc) {
2561                        printk(KERN_WARNING "%s:  "
2562                               "security_transition_sid failed, rc=%d (dev=%s "
2563                               "ino=%ld)\n",
2564                               __func__,
2565                               -rc, inode->i_sb->s_id, inode->i_ino);
2566                        return rc;
2567                }
2568        }
2569
2570        /* Possibly defer initialization to selinux_complete_init. */
2571        if (sbsec->flags & SE_SBINITIALIZED) {
2572                struct inode_security_struct *isec = inode->i_security;
2573                isec->sclass = inode_mode_to_security_class(inode->i_mode);
2574                isec->sid = newsid;
2575                isec->initialized = 1;
2576        }
2577
2578        if (!ss_initialized || !(sbsec->flags & SE_SBLABELSUPP))
2579                return -EOPNOTSUPP;
2580
2581        if (name) {
2582                namep = kstrdup(XATTR_SELINUX_SUFFIX, GFP_NOFS);
2583                if (!namep)
2584                        return -ENOMEM;
2585                *name = namep;
2586        }
2587
2588        if (value && len) {
2589                rc = security_sid_to_context_force(newsid, &context, &clen);
2590                if (rc) {
2591                        kfree(namep);
2592                        return rc;
2593                }
2594                *value = context;
2595                *len = clen;
2596        }
2597
2598        return 0;
2599}
2600
2601static int selinux_inode_create(struct inode *dir, struct dentry *dentry, int mask)
2602{
2603        return may_create(dir, dentry, SECCLASS_FILE);
2604}
2605
2606static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2607{
2608        return may_link(dir, old_dentry, MAY_LINK);
2609}
2610
2611static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
2612{
2613        return may_link(dir, dentry, MAY_UNLINK);
2614}
2615
2616static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2617{
2618        return may_create(dir, dentry, SECCLASS_LNK_FILE);
2619}
2620
2621static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, int mask)
2622{
2623        return may_create(dir, dentry, SECCLASS_DIR);
2624}
2625
2626static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
2627{
2628        return may_link(dir, dentry, MAY_RMDIR);
2629}
2630
2631static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
2632{
2633        return may_create(dir, dentry, inode_mode_to_security_class(mode));
2634}
2635
2636static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
2637                                struct inode *new_inode, struct dentry *new_dentry)
2638{
2639        return may_rename(old_inode, old_dentry, new_inode, new_dentry);
2640}
2641
2642static int selinux_inode_readlink(struct dentry *dentry)
2643{
2644        const struct cred *cred = current_cred();
2645
2646        return dentry_has_perm(cred, dentry, FILE__READ);
2647}
2648
2649static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *nameidata)
2650{
2651        const struct cred *cred = current_cred();
2652
2653        return dentry_has_perm(cred, dentry, FILE__READ);
2654}
2655
2656static int selinux_inode_permission(struct inode *inode, int mask)
2657{
2658        const struct cred *cred = current_cred();
2659        struct common_audit_data ad;
2660        u32 perms;
2661        bool from_access;
2662        unsigned flags = mask & MAY_NOT_BLOCK;
2663
2664        from_access = mask & MAY_ACCESS;
2665        mask &= (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND);
2666
2667        /* No permission to check.  Existence test. */
2668        if (!mask)
2669                return 0;
2670
2671        COMMON_AUDIT_DATA_INIT(&ad, INODE);
2672        ad.u.inode = inode;
2673
2674        if (from_access)
2675                ad.selinux_audit_data.auditdeny |= FILE__AUDIT_ACCESS;
2676
2677        perms = file_mask_to_av(inode->i_mode, mask);
2678
2679        return inode_has_perm(cred, inode, perms, &ad, flags);
2680}
2681
2682static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
2683{
2684        const struct cred *cred = current_cred();
2685        unsigned int ia_valid = iattr->ia_valid;
2686
2687        /* ATTR_FORCE is just used for ATTR_KILL_S[UG]ID. */
2688        if (ia_valid & ATTR_FORCE) {
2689                ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_MODE |
2690                              ATTR_FORCE);
2691                if (!ia_valid)
2692                        return 0;
2693        }
2694
2695        if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
2696                        ATTR_ATIME_SET | ATTR_MTIME_SET | ATTR_TIMES_SET))
2697                return dentry_has_perm(cred, dentry, FILE__SETATTR);
2698
2699        return dentry_has_perm(cred, dentry, FILE__WRITE);
2700}
2701
2702static int selinux_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
2703{
2704        const struct cred *cred = current_cred();
2705        struct path path;
2706
2707        path.dentry = dentry;
2708        path.mnt = mnt;
2709
2710        return path_has_perm(cred, &path, FILE__GETATTR);
2711}
2712
2713static int selinux_inode_setotherxattr(struct dentry *dentry, const char *name)
2714{
2715        const struct cred *cred = current_cred();
2716
2717        if (!strncmp(name, XATTR_SECURITY_PREFIX,
2718                     sizeof XATTR_SECURITY_PREFIX - 1)) {
2719                if (!strcmp(name, XATTR_NAME_CAPS)) {
2720                        if (!capable(CAP_SETFCAP))
2721                                return -EPERM;
2722                } else if (!capable(CAP_SYS_ADMIN)) {
2723                        /* A different attribute in the security namespace.
2724                           Restrict to administrator. */
2725                        return -EPERM;
2726                }
2727        }
2728
2729        /* Not an attribute we recognize, so just check the
2730           ordinary setattr permission. */
2731        return dentry_has_perm(cred, dentry, FILE__SETATTR);
2732}
2733
2734static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
2735                                  const void *value, size_t size, int flags)
2736{
2737        struct inode *inode = dentry->d_inode;
2738        struct inode_security_struct *isec = inode->i_security;
2739        struct superblock_security_struct *sbsec;
2740        struct common_audit_data ad;
2741        u32 newsid, sid = current_sid();
2742        int rc = 0;
2743
2744        if (strcmp(name, XATTR_NAME_SELINUX))
2745                return selinux_inode_setotherxattr(dentry, name);
2746
2747        sbsec = inode->i_sb->s_security;
2748        if (!(sbsec->flags & SE_SBLABELSUPP))
2749                return -EOPNOTSUPP;
2750
2751        if (!inode_owner_or_capable(inode))
2752                return -EPERM;
2753
2754        COMMON_AUDIT_DATA_INIT(&ad, DENTRY);
2755        ad.u.dentry = dentry;
2756
2757        rc = avc_has_perm(sid, isec->sid, isec->sclass,
2758                          FILE__RELABELFROM, &ad);
2759        if (rc)
2760                return rc;
2761
2762        rc = security_context_to_sid(value, size, &newsid);
2763        if (rc == -EINVAL) {
2764                if (!capable(CAP_MAC_ADMIN))
2765                        return rc;
2766                rc = security_context_to_sid_force(value, size, &newsid);
2767        }
2768        if (rc)
2769                return rc;
2770
2771        rc = avc_has_perm(sid, newsid, isec->sclass,
2772                          FILE__RELABELTO, &ad);
2773        if (rc)
2774                return rc;
2775
2776        rc = security_validate_transition(isec->sid, newsid, sid,
2777                                          isec->sclass);
2778        if (rc)
2779                return rc;
2780
2781        return avc_has_perm(newsid,
2782                            sbsec->sid,
2783                            SECCLASS_FILESYSTEM,
2784                            FILESYSTEM__ASSOCIATE,
2785                            &ad);
2786}
2787
2788static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
2789                                        const void *value, size_t size,
2790                                        int flags)
2791{
2792        struct inode *inode = dentry->d_inode;
2793        struct inode_security_struct *isec = inode->i_security;
2794        u32 newsid;
2795        int rc;
2796
2797        if (strcmp(name, XATTR_NAME_SELINUX)) {
2798                /* Not an attribute we recognize, so nothing to do. */
2799                return;
2800        }
2801
2802        rc = security_context_to_sid_force(value, size, &newsid);
2803        if (rc) {
2804                printk(KERN_ERR "SELinux:  unable to map context to SID"
2805                       "for (%s, %lu), rc=%d\n",
2806                       inode->i_sb->s_id, inode->i_ino, -rc);
2807                return;
2808        }
2809
2810        isec->sid = newsid;
2811        return;
2812}
2813
2814static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
2815{
2816        const struct cred *cred = current_cred();
2817
2818        return dentry_has_perm(cred, dentry, FILE__GETATTR);
2819}
2820
2821static int selinux_inode_listxattr(struct dentry *dentry)
2822{
2823        const struct cred *cred = current_cred();
2824
2825        return dentry_has_perm(cred, dentry, FILE__GETATTR);
2826}
2827
2828static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
2829{
2830        if (strcmp(name, XATTR_NAME_SELINUX))
2831                return selinux_inode_setotherxattr(dentry, name);
2832
2833        /* No one is allowed to remove a SELinux security label.
2834           You can change the label, but all data must be labeled. */
2835        return -EACCES;
2836}
2837
2838/*
2839 * Copy the inode security context value to the user.
2840 *
2841 * Permission check is handled by selinux_inode_getxattr hook.
2842 */
2843static int selinux_inode_getsecurity(const struct inode *inode, const char *name, void **buffer, bool alloc)
2844{
2845        u32 size;
2846        int error;
2847        char *context = NULL;
2848        struct inode_security_struct *isec = inode->i_security;
2849
2850        if (strcmp(name, XATTR_SELINUX_SUFFIX))
2851                return -EOPNOTSUPP;
2852
2853        /*
2854         * If the caller has CAP_MAC_ADMIN, then get the raw context
2855         * value even if it is not defined by current policy; otherwise,
2856         * use the in-core value under current policy.
2857         * Use the non-auditing forms of the permission checks since
2858         * getxattr may be called by unprivileged processes commonly
2859         * and lack of permission just means that we fall back to the
2860         * in-core context value, not a denial.
2861         */
2862        error = selinux_capable(current, current_cred(),
2863                                &init_user_ns, CAP_MAC_ADMIN,
2864                                SECURITY_CAP_NOAUDIT);
2865        if (!error)
2866                error = security_sid_to_context_force(isec->sid, &context,
2867                                                      &size);
2868        else
2869                error = security_sid_to_context(isec->sid, &context, &size);
2870        if (error)
2871                return error;
2872        error = size;
2873        if (alloc) {
2874                *buffer = context;
2875                goto out_nofree;
2876        }
2877        kfree(context);
2878out_nofree:
2879        return error;
2880}
2881
2882static int selinux_inode_setsecurity(struct inode *inode, const char *name,
2883                                     const void *value, size_t size, int flags)
2884{
2885        struct inode_security_struct *isec = inode->i_security;
2886        u32 newsid;
2887        int rc;
2888
2889        if (strcmp(name, XATTR_SELINUX_SUFFIX))
2890                return -EOPNOTSUPP;
2891
2892        if (!value || !size)
2893                return -EACCES;
2894
2895        rc = security_context_to_sid((void *)value, size, &newsid);
2896        if (rc)
2897                return rc;
2898
2899        isec->sid = newsid;
2900        isec->initialized = 1;
2901        return 0;
2902}
2903
2904static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
2905{
2906        const int len = sizeof(XATTR_NAME_SELINUX);
2907        if (buffer && len <= buffer_size)
2908                memcpy(buffer, XATTR_NAME_SELINUX, len);
2909        return len;
2910}
2911
2912static void selinux_inode_getsecid(const struct inode *inode, u32 *secid)
2913{
2914        struct inode_security_struct *isec = inode->i_security;
2915        *secid = isec->sid;
2916}
2917
2918/* file security operations */
2919
2920static int selinux_revalidate_file_permission(struct file *file, int mask)
2921{
2922        const struct cred *cred = current_cred();
2923        struct inode *inode = file->f_path.dentry->d_inode;
2924
2925        /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
2926        if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
2927                mask |= MAY_APPEND;
2928
2929        return file_has_perm(cred, file,
2930                             file_mask_to_av(inode->i_mode, mask));
2931}
2932
2933static int selinux_file_permission(struct file *file, int mask)
2934{
2935        struct inode *inode = file->f_path.dentry->d_inode;
2936        struct file_security_struct *fsec = file->f_security;
2937        struct inode_security_struct *isec = inode->i_security;
2938        u32 sid = current_sid();
2939
2940        if (!mask)
2941                /* No permission to check.  Existence test. */
2942                return 0;
2943
2944        if (sid == fsec->sid && fsec->isid == isec->sid &&
2945            fsec->pseqno == avc_policy_seqno())
2946                /* No change since dentry_open check. */
2947                return 0;
2948
2949        return selinux_revalidate_file_permission(file, mask);
2950}
2951
2952static int selinux_file_alloc_security(struct file *file)
2953{
2954        return file_alloc_security(file);
2955}
2956
2957static void selinux_file_free_security(struct file *file)
2958{
2959        file_free_security(file);
2960}
2961
2962static int selinux_file_ioctl(struct file *file, unsigned int cmd,
2963                              unsigned long arg)
2964{
2965        const struct cred *cred = current_cred();
2966        int error = 0;
2967
2968        switch (cmd) {
2969        case FIONREAD:
2970        /* fall through */
2971        case FIBMAP:
2972        /* fall through */
2973        case FIGETBSZ:
2974        /* fall through */
2975        case EXT2_IOC_GETFLAGS:
2976        /* fall through */
2977        case EXT2_IOC_GETVERSION:
2978                error = file_has_perm(cred, file, FILE__GETATTR);
2979                break;
2980
2981        case EXT2_IOC_SETFLAGS:
2982        /* fall through */
2983        case EXT2_IOC_SETVERSION:
2984                error = file_has_perm(cred, file, FILE__SETATTR);
2985                break;
2986
2987        /* sys_ioctl() checks */
2988        case FIONBIO:
2989        /* fall through */
2990        case FIOASYNC:
2991                error = file_has_perm(cred, file, 0);
2992                break;
2993
2994        case KDSKBENT:
2995        case KDSKBSENT:
2996                error = task_has_capability(current, cred, CAP_SYS_TTY_CONFIG,
2997                                        SECURITY_CAP_AUDIT);
2998                break;
2999
3000        /* default case assumes that the command will go
3001         * to the file's ioctl() function.
3002         */
3003        default:
3004                error = file_has_perm(cred, file, FILE__IOCTL);
3005        }
3006        return error;
3007}
3008
3009static int default_noexec;
3010
3011static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
3012{
3013        const struct cred *cred = current_cred();
3014        int rc = 0;
3015
3016        if (default_noexec &&
3017            (prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) {
3018                /*
3019                 * We are making executable an anonymous mapping or a
3020                 * private file mapping that will also be writable.
3021                 * This has an additional check.
3022                 */
3023                rc = cred_has_perm(cred, cred, PROCESS__EXECMEM);
3024                if (rc)
3025                        goto error;
3026        }
3027
3028        if (file) {
3029                /* read access is always possible with a mapping */
3030                u32 av = FILE__READ;
3031
3032                /* write access only matters if the mapping is shared */
3033                if (shared && (prot & PROT_WRITE))
3034                        av |= FILE__WRITE;
3035
3036                if (prot & PROT_EXEC)
3037                        av |= FILE__EXECUTE;
3038
3039                return file_has_perm(cred, file, av);
3040        }
3041
3042error:
3043        return rc;
3044}
3045
3046static int selinux_file_mmap(struct file *file, unsigned long reqprot,
3047                             unsigned long prot, unsigned long flags,
3048                             unsigned long addr, unsigned long addr_only)
3049{
3050        int rc = 0;
3051        u32 sid = current_sid();
3052
3053        /*
3054         * notice that we are intentionally putting the SELinux check before
3055         * the secondary cap_file_mmap check.  This is such a likely attempt
3056         * at bad behaviour/exploit that we always want to get the AVC, even
3057         * if DAC would have also denied the operation.
3058         */
3059        if (addr < CONFIG_LSM_MMAP_MIN_ADDR) {
3060                rc = avc_has_perm(sid, sid, SECCLASS_MEMPROTECT,
3061                                  MEMPROTECT__MMAP_ZERO, NULL);
3062                if (rc)
3063                        return rc;
3064        }
3065
3066        /* do DAC check on address space usage */
3067        rc = cap_file_mmap(file, reqprot, prot, flags, addr, addr_only);
3068        if (rc || addr_only)
3069                return rc;
3070
3071        if (selinux_checkreqprot)
3072                prot = reqprot;
3073
3074        return file_map_prot_check(file, prot,
3075                                   (flags & MAP_TYPE) == MAP_SHARED);
3076}
3077
3078static int selinux_file_mprotect(struct vm_area_struct *vma,
3079                                 unsigned long reqprot,
3080                                 unsigned long prot)
3081{
3082        const struct cred *cred = current_cred();
3083
3084        if (selinux_checkreqprot)
3085                prot = reqprot;
3086
3087        if (default_noexec &&
3088            (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
3089                int rc = 0;
3090                if (vma->vm_start >= vma->vm_mm->start_brk &&
3091                    vma->vm_end <= vma->vm_mm->brk) {
3092                        rc = cred_has_perm(cred, cred, PROCESS__EXECHEAP);
3093                } else if (!vma->vm_file &&
3094                           vma->vm_start <= vma->vm_mm->start_stack &&
3095                           vma->vm_end >= vma->vm_mm->start_stack) {
3096                        rc = current_has_perm(current, PROCESS__EXECSTACK);
3097                } else if (vma->vm_file && vma->anon_vma) {
3098                        /*
3099                         * We are making executable a file mapping that has
3100                         * had some COW done. Since pages might have been
3101                         * written, check ability to execute the possibly
3102                         * modified content.  This typically should only
3103                         * occur for text relocations.
3104                         */
3105                        rc = file_has_perm(cred, vma->vm_file, FILE__EXECMOD);
3106                }
3107                if (rc)
3108                        return rc;
3109        }
3110
3111        return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
3112}
3113
3114static int selinux_file_lock(struct file *file, unsigned int cmd)
3115{
3116        const struct cred *cred = current_cred();
3117
3118        return file_has_perm(cred, file, FILE__LOCK);
3119}
3120
3121static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3122                              unsigned long arg)
3123{
3124        const struct cred *cred = current_cred();
3125        int err = 0;
3126
3127        switch (cmd) {
3128        case F_SETFL:
3129                if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {
3130                        err = -EINVAL;
3131                        break;
3132                }
3133
3134                if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
3135                        err = file_has_perm(cred, file, FILE__WRITE);
3136                        break;
3137                }
3138                /* fall through */
3139        case F_SETOWN:
3140        case F_SETSIG:
3141        case F_GETFL:
3142        case F_GETOWN:
3143        case F_GETSIG:
3144                /* Just check FD__USE permission */
3145                err = file_has_perm(cred, file, 0);
3146                break;
3147        case F_GETLK:
3148        case F_SETLK:
3149        case F_SETLKW:
3150#if BITS_PER_LONG == 32
3151        case F_GETLK64:
3152        case F_SETLK64:
3153        case F_SETLKW64:
3154#endif
3155                if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {
3156                        err = -EINVAL;
3157                        break;
3158                }
3159                err = file_has_perm(cred, file, FILE__LOCK);
3160                break;
3161        }
3162
3163        return err;
3164}
3165
3166static int selinux_file_set_fowner(struct file *file)
3167{
3168        struct file_security_struct *fsec;
3169
3170        fsec = file->f_security;
3171        fsec->fown_sid = current_sid();
3172
3173        return 0;
3174}
3175
3176static int selinux_file_send_sigiotask(struct task_struct *tsk,
3177                                       struct fown_struct *fown, int signum)
3178{
3179        struct file *file;
3180        u32 sid = task_sid(tsk);
3181        u32 perm;
3182        struct file_security_struct *fsec;
3183
3184        /* struct fown_struct is never outside the context of a struct file */
3185        file = container_of(fown, struct file, f_owner);
3186
3187        fsec = file->f_security;
3188
3189        if (!signum)
3190                perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
3191        else
3192                perm = signal_to_av(signum);
3193
3194        return avc_has_perm(fsec->fown_sid, sid,
3195                            SECCLASS_PROCESS, perm, NULL);
3196}
3197
3198static int selinux_file_receive(struct file *file)
3199{
3200        const struct cred *cred = current_cred();
3201
3202        return file_has_perm(cred, file, file_to_av(file));
3203}
3204
3205static int selinux_dentry_open(struct file *file, const struct cred *cred)
3206{
3207        struct file_security_struct *fsec;
3208        struct inode *inode;
3209        struct inode_security_struct *isec;
3210
3211        inode = file->f_path.dentry->d_inode;
3212        fsec = file->f_security;
3213        isec = inode->i_security;
3214        /*
3215         * Save inode label and policy sequence number
3216         * at open-time so that selinux_file_permission
3217         * can determine whether revalidation is necessary.
3218         * Task label is already saved in the file security
3219         * struct as its SID.
3220         */
3221        fsec->isid = isec->sid;
3222        fsec->pseqno = avc_policy_seqno();
3223        /*
3224         * Since the inode label or policy seqno may have changed
3225         * between the selinux_inode_permission check and the saving
3226         * of state above, recheck that access is still permitted.
3227         * Otherwise, access might never be revalidated against the
3228         * new inode label or new policy.
3229         * This check is not redundant - do not remove.
3230         */
3231        return inode_has_perm_noadp(cred, inode, open_file_to_av(file), 0);
3232}
3233
3234/* task security operations */
3235
3236static int selinux_task_create(unsigned long clone_flags)
3237{
3238        return current_has_perm(current, PROCESS__FORK);
3239}
3240
3241/*
3242 * allocate the SELinux part of blank credentials
3243 */
3244static int selinux_cred_alloc_blank(struct cred *cred, gfp_t gfp)
3245{
3246        struct task_security_struct *tsec;
3247
3248        tsec = kzalloc(sizeof(struct task_security_struct), gfp);
3249        if (!tsec)
3250                return -ENOMEM;
3251
3252        cred->security = tsec;
3253        return 0;
3254}
3255
3256/*
3257 * detach and free the LSM part of a set of credentials
3258 */
3259static void selinux_cred_free(struct cred *cred)
3260{
3261        struct task_security_struct *tsec = cred->security;
3262
3263        /*
3264         * cred->security == NULL if security_cred_alloc_blank() or
3265         * security_prepare_creds() returned an error.
3266         */
3267        BUG_ON(cred->security && (unsigned long) cred->security < PAGE_SIZE);
3268        cred->security = (void *) 0x7UL;
3269        kfree(tsec);
3270}
3271
3272/*
3273 * prepare a new set of credentials for modification
3274 */
3275static int selinux_cred_prepare(struct cred *new, const struct cred *old,
3276                                gfp_t gfp)
3277{
3278        const struct task_security_struct *old_tsec;
3279        struct task_security_struct *tsec;
3280
3281        old_tsec = old->security;
3282
3283        tsec = kmemdup(old_tsec, sizeof(struct task_security_struct), gfp);
3284        if (!tsec)
3285                return -ENOMEM;
3286
3287        new->security = tsec;
3288        return 0;
3289}
3290
3291/*
3292 * transfer the SELinux data to a blank set of creds
3293 */
3294static void selinux_cred_transfer(struct cred *new, const struct cred *old)
3295{
3296        const struct task_security_struct *old_tsec = old->security;
3297        struct task_security_struct *tsec = new->security;
3298
3299        *tsec = *old_tsec;
3300}
3301
3302/*
3303 * set the security data for a kernel service
3304 * - all the creation contexts are set to unlabelled
3305 */
3306static int selinux_kernel_act_as(struct cred *new, u32 secid)
3307{
3308        struct task_security_struct *tsec = new->security;
3309        u32 sid = current_sid();
3310        int ret;
3311
3312        ret = avc_has_perm(sid, secid,
3313                           SECCLASS_KERNEL_SERVICE,
3314                           KERNEL_SERVICE__USE_AS_OVERRIDE,
3315                           NULL);
3316        if (ret == 0) {
3317                tsec->sid = secid;
3318                tsec->create_sid = 0;
3319                tsec->keycreate_sid = 0;
3320                tsec->sockcreate_sid = 0;
3321        }
3322        return ret;
3323}
3324
3325/*
3326 * set the file creation context in a security record to the same as the
3327 * objective context of the specified inode
3328 */
3329static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
3330{
3331        struct inode_security_struct *isec = inode->i_security;
3332        struct task_security_struct *tsec = new->security;
3333        u32 sid = current_sid();
3334        int ret;
3335
3336        ret = avc_has_perm(sid, isec->sid,
3337                           SECCLASS_KERNEL_SERVICE,
3338                           KERNEL_SERVICE__CREATE_FILES_AS,
3339                           NULL);
3340
3341        if (ret == 0)
3342                tsec->create_sid = isec->sid;
3343        return ret;
3344}
3345
3346static int selinux_kernel_module_request(char *kmod_name)
3347{
3348        u32 sid;
3349        struct common_audit_data ad;
3350
3351        sid = task_sid(current);
3352
3353        COMMON_AUDIT_DATA_INIT(&ad, KMOD);
3354        ad.u.kmod_name = kmod_name;
3355
3356        return avc_has_perm(sid, SECINITSID_KERNEL, SECCLASS_SYSTEM,
3357                            SYSTEM__MODULE_REQUEST, &ad);
3358}
3359
3360static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
3361{
3362        return current_has_perm(p, PROCESS__SETPGID);
3363}
3364
3365static int selinux_task_getpgid(struct task_struct *p)
3366{
3367        return current_has_perm(p, PROCESS__GETPGID);
3368}
3369
3370static int selinux_task_getsid(struct task_struct *p)
3371{
3372        return current_has_perm(p, PROCESS__GETSESSION);
3373}
3374
3375static void selinux_task_getsecid(struct task_struct *p, u32 *secid)
3376{
3377        *secid = task_sid(p);
3378}
3379
3380static int selinux_task_setnice(struct task_struct *p, int nice)
3381{
3382        int rc;
3383
3384        rc = cap_task_setnice(p, nice);
3385        if (rc)
3386                return rc;
3387
3388        return current_has_perm(p, PROCESS__SETSCHED);
3389}
3390
3391static int selinux_task_setioprio(struct task_struct *p, int ioprio)
3392{
3393        int rc;
3394
3395        rc = cap_task_setioprio(p, ioprio);
3396        if (rc)
3397                return rc;
3398
3399        return current_has_perm(p, PROCESS__SETSCHED);
3400}
3401
3402static int selinux_task_getioprio(struct task_struct *p)
3403{
3404        return current_has_perm(p, PROCESS__GETSCHED);
3405}
3406
3407static int selinux_task_setrlimit(struct task_struct *p, unsigned int resource,
3408                struct rlimit *new_rlim)
3409{
3410        struct rlimit *old_rlim = p->signal->rlim + resource;
3411
3412        /* Control the ability to change the hard limit (whether
3413           lowering or raising it), so that the hard limit can
3414           later be used as a safe reset point for the soft limit
3415           upon context transitions.  See selinux_bprm_committing_creds. */
3416        if (old_rlim->rlim_max != new_rlim->rlim_max)
3417                return current_has_perm(p, PROCESS__SETRLIMIT);
3418
3419        return 0;
3420}
3421
3422static int selinux_task_setscheduler(struct task_struct *p)
3423{
3424        int rc;
3425
3426        rc = cap_task_setscheduler(p);
3427        if (rc)
3428                return rc;
3429
3430        return current_has_perm(p, PROCESS__SETSCHED);
3431}
3432
3433static int selinux_task_getscheduler(struct task_struct *p)
3434{
3435        return current_has_perm(p, PROCESS__GETSCHED);
3436}
3437
3438static int selinux_task_movememory(struct task_struct *p)
3439{
3440        return current_has_perm(p, PROCESS__SETSCHED);
3441}
3442
3443static int selinux_task_kill(struct task_struct *p, struct siginfo *info,
3444                                int sig, u32 secid)
3445{
3446        u32 perm;
3447        int rc;
3448
3449        if (!sig)
3450                perm = PROCESS__SIGNULL; /* null signal; existence test */
3451        else
3452                perm = signal_to_av(sig);
3453        if (secid)
3454                rc = avc_has_perm(secid, task_sid(p),
3455                                  SECCLASS_PROCESS, perm, NULL);
3456        else
3457                rc = current_has_perm(p, perm);
3458        return rc;
3459}
3460
3461static int selinux_task_wait(struct task_struct *p)
3462{
3463        return task_has_perm(p, current, PROCESS__SIGCHLD);
3464}
3465
3466static void selinux_task_to_inode(struct task_struct *p,
3467                                  struct inode *inode)
3468{
3469        struct inode_security_struct *isec = inode->i_security;
3470        u32 sid = task_sid(p);
3471
3472        isec->sid = sid;
3473        isec->initialized = 1;
3474}
3475
3476/* Returns error only if unable to parse addresses */
3477static int selinux_parse_skb_ipv4(struct sk_buff *skb,
3478                        struct common_audit_data *ad, u8 *proto)
3479{
3480        int offset, ihlen, ret = -EINVAL;
3481        struct iphdr _iph, *ih;
3482
3483        offset = skb_network_offset(skb);
3484        ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
3485        if (ih == NULL)
3486                goto out;
3487
3488        ihlen = ih->ihl * 4;
3489        if (ihlen < sizeof(_iph))
3490                goto out;
3491
3492        ad->u.net.v4info.saddr = ih->saddr;
3493        ad->u.net.v4info.daddr = ih->daddr;
3494        ret = 0;
3495
3496        if (proto)
3497                *proto = ih->protocol;
3498
3499        switch (ih->protocol) {
3500        case IPPROTO_TCP: {
3501                struct tcphdr _tcph, *th;
3502
3503                if (ntohs(ih->frag_off) & IP_OFFSET)
3504                        break;
3505
3506                offset += ihlen;
3507                th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3508                if (th == NULL)
3509                        break;
3510
3511                ad->u.net.sport = th->source;
3512                ad->u.net.dport = th->dest;
3513                break;
3514        }
3515
3516        case IPPROTO_UDP: {
3517                struct udphdr _udph, *uh;
3518
3519                if (ntohs(ih->frag_off) & IP_OFFSET)
3520                        break;
3521
3522                offset += ihlen;
3523                uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3524                if (uh == NULL)
3525                        break;
3526
3527                ad->u.net.sport = uh->source;
3528                ad->u.net.dport = uh->dest;
3529                break;
3530        }
3531
3532        case IPPROTO_DCCP: {
3533                struct dccp_hdr _dccph, *dh;
3534
3535                if (ntohs(ih->frag_off) & IP_OFFSET)
3536                        break;
3537
3538                offset += ihlen;
3539                dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3540                if (dh == NULL)
3541                        break;
3542
3543                ad->u.net.sport = dh->dccph_sport;
3544                ad->u.net.dport = dh->dccph_dport;
3545                break;
3546        }
3547
3548        default:
3549                break;
3550        }
3551out:
3552        return ret;
3553}
3554
3555#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3556
3557/* Returns error only if unable to parse addresses */
3558static int selinux_parse_skb_ipv6(struct sk_buff *skb,
3559                        struct common_audit_data *ad, u8 *proto)
3560{
3561        u8 nexthdr;
3562        int ret = -EINVAL, offset;
3563        struct ipv6hdr _ipv6h, *ip6;
3564
3565        offset = skb_network_offset(skb);
3566        ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
3567        if (ip6 == NULL)
3568                goto out;
3569
3570        ipv6_addr_copy(&ad->u.net.v6info.saddr, &ip6->saddr);
3571        ipv6_addr_copy(&ad->u.net.v6info.daddr, &ip6->daddr);
3572        ret = 0;
3573
3574        nexthdr = ip6->nexthdr;
3575        offset += sizeof(_ipv6h);
3576        offset = ipv6_skip_exthdr(skb, offset, &nexthdr);
3577        if (offset < 0)
3578                goto out;
3579
3580        if (proto)
3581                *proto = nexthdr;
3582
3583        switch (nexthdr) {
3584        case IPPROTO_TCP: {
3585                struct tcphdr _tcph, *th;
3586
3587                th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3588                if (th == NULL)
3589                        break;
3590
3591                ad->u.net.sport = th->source;
3592                ad->u.net.dport = th->dest;
3593                break;
3594        }
3595
3596        case IPPROTO_UDP: {
3597                struct udphdr _udph, *uh;
3598
3599                uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3600                if (uh == NULL)
3601                        break;
3602
3603                ad->u.net.sport = uh->source;
3604                ad->u.net.dport = uh->dest;
3605                break;
3606        }
3607
3608        case IPPROTO_DCCP: {
3609                struct dccp_hdr _dccph, *dh;
3610
3611                dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3612                if (dh == NULL)
3613                        break;
3614
3615                ad->u.net.sport = dh->dccph_sport;
3616                ad->u.net.dport = dh->dccph_dport;
3617                break;
3618        }
3619
3620        /* includes fragments */
3621        default:
3622                break;
3623        }
3624out:
3625        return ret;
3626}
3627
3628#endif /* IPV6 */
3629
3630static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
3631                             char **_addrp, int src, u8 *proto)
3632{
3633        char *addrp;
3634        int ret;
3635
3636        switch (ad->u.net.family) {
3637        case PF_INET:
3638                ret = selinux_parse_skb_ipv4(skb, ad, proto);
3639                if (ret)
3640                        goto parse_error;
3641                addrp = (char *)(src ? &ad->u.net.v4info.saddr :
3642                                       &ad->u.net.v4info.daddr);
3643                goto okay;
3644
3645#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3646        case PF_INET6:
3647                ret = selinux_parse_skb_ipv6(skb, ad, proto);
3648                if (ret)
3649                        goto parse_error;
3650                addrp = (char *)(src ? &ad->u.net.v6info.saddr :
3651                                       &ad->u.net.v6info.daddr);
3652                goto okay;
3653#endif  /* IPV6 */
3654        default:
3655                addrp = NULL;
3656                goto okay;
3657        }
3658
3659parse_error:
3660        printk(KERN_WARNING
3661               "SELinux: failure in selinux_parse_skb(),"
3662               " unable to parse packet\n");
3663        return ret;
3664
3665okay:
3666        if (_addrp)
3667                *_addrp = addrp;
3668        return 0;
3669}
3670
3671/**
3672 * selinux_skb_peerlbl_sid - Determine the peer label of a packet
3673 * @skb: the packet
3674 * @family: protocol family
3675 * @sid: the packet's peer label SID
3676 *
3677 * Description:
3678 * Check the various different forms of network peer labeling and determine
3679 * the peer label/SID for the packet; most of the magic actually occurs in
3680 * the security server function security_net_peersid_cmp().  The function
3681 * returns zero if the value in @sid is valid (although it may be SECSID_NULL)
3682 * or -EACCES if @sid is invalid due to inconsistencies with the different
3683 * peer labels.
3684 *
3685 */
3686static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
3687{
3688        int err;
3689        u32 xfrm_sid;
3690        u32 nlbl_sid;
3691        u32 nlbl_type;
3692
3693        selinux_skb_xfrm_sid(skb, &xfrm_sid);
3694        selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
3695
3696        err = security_net_peersid_resolve(nlbl_sid, nlbl_type, xfrm_sid, sid);
3697        if (unlikely(err)) {
3698                printk(KERN_WARNING
3699                       "SELinux: failure in selinux_skb_peerlbl_sid(),"
3700                       " unable to determine packet's peer label\n");
3701                return -EACCES;
3702        }
3703
3704        return 0;
3705}
3706
3707/* socket security operations */
3708
3709static int socket_sockcreate_sid(const struct task_security_struct *tsec,
3710                                 u16 secclass, u32 *socksid)
3711{
3712        if (tsec->sockcreate_sid > SECSID_NULL) {
3713                *socksid = tsec->sockcreate_sid;
3714                return 0;
3715        }
3716
3717        return security_transition_sid(tsec->sid, tsec->sid, secclass, NULL,
3718                                       socksid);
3719}
3720
3721static int sock_has_perm(struct task_struct *task, struct sock *sk, u32 perms)
3722{
3723        struct sk_security_struct *sksec = sk->sk_security;
3724        struct common_audit_data ad;
3725        u32 tsid = task_sid(task);
3726
3727        if (sksec->sid == SECINITSID_KERNEL)
3728                return 0;
3729
3730        COMMON_AUDIT_DATA_INIT(&ad, NET);
3731        ad.u.net.sk = sk;
3732
3733        return avc_has_perm(tsid, sksec->sid, sksec->sclass, perms, &ad);
3734}
3735
3736static int selinux_socket_create(int family, int type,
3737                                 int protocol, int kern)
3738{
3739        const struct task_security_struct *tsec = current_security();
3740        u32 newsid;
3741        u16 secclass;
3742        int rc;
3743
3744        if (kern)
3745                return 0;
3746
3747        secclass = socket_type_to_security_class(family, type, protocol);
3748        rc = socket_sockcreate_sid(tsec, secclass, &newsid);
3749        if (rc)
3750                return rc;
3751
3752        return avc_has_perm(tsec->sid, newsid, secclass, SOCKET__CREATE, NULL);
3753}
3754
3755static int selinux_socket_post_create(struct socket *sock, int family,
3756                                      int type, int protocol, int kern)
3757{
3758        const struct task_security_struct *tsec = current_security();
3759        struct inode_security_struct *isec = SOCK_INODE(sock)->i_security;
3760        struct sk_security_struct *sksec;
3761        int err = 0;
3762
3763        isec->sclass = socket_type_to_security_class(family, type, protocol);
3764
3765        if (kern)
3766                isec->sid = SECINITSID_KERNEL;
3767        else {
3768                err = socket_sockcreate_sid(tsec, isec->sclass, &(isec->sid));
3769                if (err)
3770                        return err;
3771        }
3772
3773        isec->initialized = 1;
3774
3775        if (sock->sk) {
3776                sksec = sock->sk->sk_security;
3777                sksec->sid = isec->sid;
3778                sksec->sclass = isec->sclass;
3779                err = selinux_netlbl_socket_post_create(sock->sk, family);
3780        }
3781
3782        return err;
3783}
3784
3785/* Range of port numbers used to automatically bind.
3786   Need to determine whether we should perform a name_bind
3787   permission check between the socket and the port number. */
3788
3789static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
3790{
3791        struct sock *sk = sock->sk;
3792        u16 family;
3793        int err;
3794
3795        err = sock_has_perm(current, sk, SOCKET__BIND);
3796        if (err)
3797                goto out;
3798
3799        /*
3800         * If PF_INET or PF_INET6, check name_bind permission for the port.
3801         * Multiple address binding for SCTP is not supported yet: we just
3802         * check the first address now.
3803         */
3804        family = sk->sk_family;
3805        if (family == PF_INET || family == PF_INET6) {
3806                char *addrp;
3807                struct sk_security_struct *sksec = sk->sk_security;
3808                struct common_audit_data ad;
3809                struct sockaddr_in *addr4 = NULL;
3810                struct sockaddr_in6 *addr6 = NULL;
3811                unsigned short snum;
3812                u32 sid, node_perm;
3813
3814                if (family == PF_INET) {
3815                        addr4 = (struct sockaddr_in *)address;
3816                        snum = ntohs(addr4->sin_port);
3817                        addrp = (char *)&addr4->sin_addr.s_addr;
3818                } else {
3819                        addr6 = (struct sockaddr_in6 *)address;
3820                        snum = ntohs(addr6->sin6_port);
3821                        addrp = (char *)&addr6->sin6_addr.s6_addr;
3822                }
3823
3824                if (snum) {
3825                        int low, high;
3826
3827                        inet_get_local_port_range(&low, &high);
3828
3829                        if (snum < max(PROT_SOCK, low) || snum > high) {
3830                                err = sel_netport_sid(sk->sk_protocol,
3831                                                      snum, &sid);
3832                                if (err)
3833                                        goto out;
3834                                COMMON_AUDIT_DATA_INIT(&ad, NET);
3835                                ad.u.net.sport = htons(snum);
3836                                ad.u.net.family = family;
3837                                err = avc_has_perm(sksec->sid, sid,
3838                                                   sksec->sclass,
3839                                                   SOCKET__NAME_BIND, &ad);
3840                                if (err)
3841                                        goto out;
3842                        }
3843                }
3844
3845                switch (sksec->sclass) {
3846                case SECCLASS_TCP_SOCKET:
3847                        node_perm = TCP_SOCKET__NODE_BIND;
3848                        break;
3849
3850                case SECCLASS_UDP_SOCKET:
3851                        node_perm = UDP_SOCKET__NODE_BIND;
3852                        break;
3853
3854                case SECCLASS_DCCP_SOCKET:
3855                        node_perm = DCCP_SOCKET__NODE_BIND;
3856                        break;
3857
3858                default:
3859                        node_perm = RAWIP_SOCKET__NODE_BIND;
3860                        break;
3861                }
3862
3863                err = sel_netnode_sid(addrp, family, &sid);
3864                if (err)
3865                        goto out;
3866
3867                COMMON_AUDIT_DATA_INIT(&ad, NET);
3868                ad.u.net.sport = htons(snum);
3869                ad.u.net.family = family;
3870
3871                if (family == PF_INET)
3872                        ad.u.net.v4info.saddr = addr4->sin_addr.s_addr;
3873                else
3874                        ipv6_addr_copy(&ad.u.net.v6info.saddr, &addr6->sin6_addr);
3875
3876                err = avc_has_perm(sksec->sid, sid,
3877                                   sksec->sclass, node_perm, &ad);
3878                if (err)
3879                        goto out;
3880        }
3881out:
3882        return err;
3883}
3884
3885static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
3886{
3887        struct sock *sk = sock->sk;
3888        struct sk_security_struct *sksec = sk->sk_security;
3889        int err;
3890
3891        err = sock_has_perm(current, sk, SOCKET__CONNECT);
3892        if (err)
3893                return err;
3894
3895        /*
3896         * If a TCP or DCCP socket, check name_connect permission for the port.
3897         */
3898        if (sksec->sclass == SECCLASS_TCP_SOCKET ||
3899            sksec->sclass == SECCLASS_DCCP_SOCKET) {
3900                struct common_audit_data ad;
3901                struct sockaddr_in *addr4 = NULL;
3902                struct sockaddr_in6 *addr6 = NULL;
3903                unsigned short snum;
3904                u32 sid, perm;
3905
3906                if (sk->sk_family == PF_INET) {
3907                        addr4 = (struct sockaddr_in *)address;
3908                        if (addrlen < sizeof(struct sockaddr_in))
3909                                return -EINVAL;
3910                        snum = ntohs(addr4->sin_port);
3911                } else {
3912                        addr6 = (struct sockaddr_in6 *)address;
3913                        if (addrlen < SIN6_LEN_RFC2133)
3914                                return -EINVAL;
3915                        snum = ntohs(addr6->sin6_port);
3916                }
3917
3918                err = sel_netport_sid(sk->sk_protocol, snum, &sid);
3919                if (err)
3920                        goto out;
3921
3922                perm = (sksec->sclass == SECCLASS_TCP_SOCKET) ?
3923                       TCP_SOCKET__NAME_CONNECT : DCCP_SOCKET__NAME_CONNECT;
3924
3925                COMMON_AUDIT_DATA_INIT(&ad, NET);
3926                ad.u.net.dport = htons(snum);
3927                ad.u.net.family = sk->sk_family;
3928                err = avc_has_perm(sksec->sid, sid, sksec->sclass, perm, &ad);
3929                if (err)
3930                        goto out;
3931        }
3932
3933        err = selinux_netlbl_socket_connect(sk, address);
3934
3935out:
3936        return err;
3937}
3938
3939static int selinux_socket_listen(struct socket *sock, int backlog)
3940{
3941        return sock_has_perm(current, sock->sk, SOCKET__LISTEN);
3942}
3943
3944static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
3945{
3946        int err;
3947        struct inode_security_struct *isec;
3948        struct inode_security_struct *newisec;
3949
3950        err = sock_has_perm(current, sock->sk, SOCKET__ACCEPT);
3951        if (err)
3952                return err;
3953
3954        newisec = SOCK_INODE(newsock)->i_security;
3955
3956        isec = SOCK_INODE(sock)->i_security;
3957        newisec->sclass = isec->sclass;
3958        newisec->sid = isec->sid;
3959        newisec->initialized = 1;
3960
3961        return 0;
3962}
3963
3964static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
3965                                  int size)
3966{
3967        return sock_has_perm(current, sock->sk, SOCKET__WRITE);
3968}
3969
3970static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
3971                                  int size, int flags)
3972{
3973        return sock_has_perm(current, sock->sk, SOCKET__READ);
3974}
3975
3976static int selinux_socket_getsockname(struct socket *sock)
3977{
3978        return sock_has_perm(current, sock->sk, SOCKET__GETATTR);
3979}
3980
3981static int selinux_socket_getpeername(struct socket *sock)
3982{
3983        return sock_has_perm(current, sock->sk, SOCKET__GETATTR);
3984}
3985
3986static int selinux_socket_setsockopt(struct socket *sock, int level, int optname)
3987{
3988        int err;
3989
3990        err = sock_has_perm(current, sock->sk, SOCKET__SETOPT);
3991        if (err)
3992                return err;
3993
3994        return selinux_netlbl_socket_setsockopt(sock, level, optname);
3995}
3996
3997static int selinux_socket_getsockopt(struct socket *sock, int level,
3998                                     int optname)
3999{
4000        return sock_has_perm(current, sock->sk, SOCKET__GETOPT);
4001}
4002
4003static int selinux_socket_shutdown(struct socket *sock, int how)
4004{
4005        return sock_has_perm(current, sock->sk, SOCKET__SHUTDOWN);
4006}
4007
4008static int selinux_socket_unix_stream_connect(struct sock *sock,
4009                                              struct sock *other,
4010                                              struct sock *newsk)
4011{
4012        struct sk_security_struct *sksec_sock = sock->sk_security;
4013        struct sk_security_struct *sksec_other = other->sk_security;
4014        struct sk_security_struct *sksec_new = newsk->sk_security;
4015        struct common_audit_data ad;
4016        int err;
4017
4018        COMMON_AUDIT_DATA_INIT(&ad, NET);
4019        ad.u.net.sk = other;
4020
4021        err = avc_has_perm(sksec_sock->sid, sksec_other->sid,
4022                           sksec_other->sclass,
4023                           UNIX_STREAM_SOCKET__CONNECTTO, &ad);
4024        if (err)
4025                return err;
4026
4027        /* server child socket */
4028        sksec_new->peer_sid = sksec_sock->sid;
4029        err = security_sid_mls_copy(sksec_other->sid, sksec_sock->sid,
4030                                    &sksec_new->sid);
4031        if (err)
4032                return err;
4033
4034        /* connecting socket */
4035        sksec_sock->peer_sid = sksec_new->sid;
4036
4037        return 0;
4038}
4039
4040static int selinux_socket_unix_may_send(struct socket *sock,
4041                                        struct socket *other)
4042{
4043        struct sk_security_struct *ssec = sock->sk->sk_security;
4044        struct sk_security_struct *osec = other->sk->sk_security;
4045        struct common_audit_data ad;
4046
4047        COMMON_AUDIT_DATA_INIT(&ad, NET);
4048        ad.u.net.sk = other->sk;
4049
4050        return avc_has_perm(ssec->sid, osec->sid, osec->sclass, SOCKET__SENDTO,
4051                            &ad);
4052}
4053
4054static int selinux_inet_sys_rcv_skb(int ifindex, char *addrp, u16 family,
4055                                    u32 peer_sid,
4056                                    struct common_audit_data *ad)
4057{
4058        int err;
4059        u32 if_sid;
4060        u32 node_sid;
4061
4062        err = sel_netif_sid(ifindex, &if_sid);
4063        if (err)
4064                return err;
4065        err = avc_has_perm(peer_sid, if_sid,
4066                           SECCLASS_NETIF, NETIF__INGRESS, ad);
4067        if (err)
4068                return err;
4069
4070        err = sel_netnode_sid(addrp, family, &node_sid);
4071        if (err)
4072                return err;
4073        return avc_has_perm(peer_sid, node_sid,
4074                            SECCLASS_NODE, NODE__RECVFROM, ad);
4075}
4076
4077static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
4078                                       u16 family)
4079{
4080        int err = 0;
4081        struct sk_security_struct *sksec = sk->sk_security;
4082        u32 sk_sid = sksec->sid;
4083        struct common_audit_data ad;
4084        char *addrp;
4085
4086        COMMON_AUDIT_DATA_INIT(&ad, NET);
4087        ad.u.net.netif = skb->skb_iif;
4088        ad.u.net.family = family;
4089        err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4090        if (err)
4091                return err;
4092
4093        if (selinux_secmark_enabled()) {
4094                err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4095                                   PACKET__RECV, &ad);
4096                if (err)
4097                        return err;
4098        }
4099
4100        err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad);
4101        if (err)
4102                return err;
4103        err = selinux_xfrm_sock_rcv_skb(sksec->sid, skb, &ad);
4104
4105        return err;
4106}
4107
4108static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
4109{
4110        int err;
4111        struct sk_security_struct *sksec = sk->sk_security;
4112        u16 family = sk->sk_family;
4113        u32 sk_sid = sksec->sid;
4114        struct common_audit_data ad;
4115        char *addrp;
4116        u8 secmark_active;
4117        u8 peerlbl_active;
4118
4119        if (family != PF_INET && family != PF_INET6)
4120                return 0;
4121
4122        /* Handle mapped IPv4 packets arriving via IPv6 sockets */
4123        if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4124                family = PF_INET;
4125
4126        /* If any sort of compatibility mode is enabled then handoff processing
4127         * to the selinux_sock_rcv_skb_compat() function to deal with the
4128         * special handling.  We do this in an attempt to keep this function
4129         * as fast and as clean as possible. */
4130        if (!selinux_policycap_netpeer)
4131                return selinux_sock_rcv_skb_compat(sk, skb, family);
4132
4133        secmark_active = selinux_secmark_enabled();
4134        peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled();
4135        if (!secmark_active && !peerlbl_active)
4136                return 0;
4137
4138        COMMON_AUDIT_DATA_INIT(&ad, NET);
4139        ad.u.net.netif = skb->skb_iif;
4140        ad.u.net.family = family;
4141        err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4142        if (err)
4143                return err;
4144
4145        if (peerlbl_active) {
4146                u32 peer_sid;
4147
4148                err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
4149                if (err)
4150                        return err;
4151                err = selinux_inet_sys_rcv_skb(skb->skb_iif, addrp, family,
4152                                               peer_sid, &ad);
4153                if (err) {
4154                        selinux_netlbl_err(skb, err, 0);
4155                        return err;
4156                }
4157                err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER,
4158                                   PEER__RECV, &ad);
4159                if (err)
4160                        selinux_netlbl_err(skb, err, 0);
4161        }
4162
4163        if (secmark_active) {
4164                err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4165                                   PACKET__RECV, &ad);
4166                if (err)
4167                        return err;
4168        }
4169
4170        return err;
4171}
4172
4173static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval,
4174                                            int __user *optlen, unsigned len)
4175{
4176        int err = 0;
4177        char *scontext;
4178        u32 scontext_len;
4179        struct sk_security_struct *sksec = sock->sk->sk_security;
4180        u32 peer_sid = SECSID_NULL;
4181
4182        if (sksec->sclass == SECCLASS_UNIX_STREAM_SOCKET ||
4183            sksec->sclass == SECCLASS_TCP_SOCKET)
4184                peer_sid = sksec->peer_sid;
4185        if (peer_sid == SECSID_NULL)
4186                return -ENOPROTOOPT;
4187
4188        err = security_sid_to_context(peer_sid, &scontext, &scontext_len);
4189        if (err)
4190                return err;
4191
4192        if (scontext_len > len) {
4193                err = -ERANGE;
4194                goto out_len;
4195        }
4196
4197        if (copy_to_user(optval, scontext, scontext_len))
4198                err = -EFAULT;
4199
4200out_len:
4201        if (put_user(scontext_len, optlen))
4202                err = -EFAULT;
4203        kfree(scontext);
4204        return err;
4205}
4206
4207static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
4208{
4209        u32 peer_secid = SECSID_NULL;
4210        u16 family;
4211
4212        if (skb && skb->protocol == htons(ETH_P_IP))
4213                family = PF_INET;
4214        else if (skb && skb->protocol == htons(ETH_P_IPV6))
4215                family = PF_INET6;
4216        else if (sock)
4217                family = sock->sk->sk_family;
4218        else
4219                goto out;
4220
4221        if (sock && family == PF_UNIX)
4222                selinux_inode_getsecid(SOCK_INODE(sock), &peer_secid);
4223        else if (skb)
4224                selinux_skb_peerlbl_sid(skb, family, &peer_secid);
4225
4226out:
4227        *secid = peer_secid;
4228        if (peer_secid == SECSID_NULL)
4229                return -EINVAL;
4230        return 0;
4231}
4232
4233static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
4234{
4235        struct sk_security_struct *sksec;
4236
4237        sksec = kzalloc(sizeof(*sksec), priority);
4238        if (!sksec)
4239                return -ENOMEM;
4240
4241        sksec->peer_sid = SECINITSID_UNLABELED;
4242        sksec->sid = SECINITSID_UNLABELED;
4243        selinux_netlbl_sk_security_reset(sksec);
4244        sk->sk_security = sksec;
4245
4246        return 0;
4247}
4248
4249static void selinux_sk_free_security(struct sock *sk)
4250{
4251        struct sk_security_struct *sksec = sk->sk_security;
4252
4253        sk->sk_security = NULL;
4254        selinux_netlbl_sk_security_free(sksec);
4255        kfree(sksec);
4256}
4257
4258static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk)
4259{
4260        struct sk_security_struct *sksec = sk->sk_security;
4261        struct sk_security_struct *newsksec = newsk->sk_security;
4262
4263        newsksec->sid = sksec->sid;
4264        newsksec->peer_sid = sksec->peer_sid;
4265        newsksec->sclass = sksec->sclass;
4266
4267        selinux_netlbl_sk_security_reset(newsksec);
4268}
4269
4270static void selinux_sk_getsecid(struct sock *sk, u32 *secid)
4271{
4272        if (!sk)
4273                *secid = SECINITSID_ANY_SOCKET;
4274        else {
4275                struct sk_security_struct *sksec = sk->sk_security;
4276
4277                *secid = sksec->sid;
4278        }
4279}
4280
4281static void selinux_sock_graft(struct sock *sk, struct socket *parent)
4282{
4283        struct inode_security_struct *isec = SOCK_INODE(parent)->i_security;
4284        struct sk_security_struct *sksec = sk->sk_security;
4285
4286        if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
4287            sk->sk_family == PF_UNIX)
4288                isec->sid = sksec->sid;
4289        sksec->sclass = isec->sclass;
4290}
4291
4292static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb,
4293                                     struct request_sock *req)
4294{
4295        struct sk_security_struct *sksec = sk->sk_security;
4296        int err;
4297        u16 family = sk->sk_family;
4298        u32 newsid;
4299        u32 peersid;
4300
4301        /* handle mapped IPv4 packets arriving via IPv6 sockets */
4302        if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4303                family = PF_INET;
4304
4305        err = selinux_skb_peerlbl_sid(skb, family, &peersid);
4306        if (err)
4307                return err;
4308        if (peersid == SECSID_NULL) {
4309                req->secid = sksec->sid;
4310                req->peer_secid = SECSID_NULL;
4311        } else {
4312                err = security_sid_mls_copy(sksec->sid, peersid, &newsid);
4313                if (err)
4314                        return err;
4315                req->secid = newsid;
4316                req->peer_secid = peersid;
4317        }
4318
4319        return selinux_netlbl_inet_conn_request(req, family);
4320}
4321
4322static void selinux_inet_csk_clone(struct sock *newsk,
4323                                   const struct request_sock *req)
4324{
4325        struct sk_security_struct *newsksec = newsk->sk_security;
4326
4327        newsksec->sid = req->secid;
4328        newsksec->peer_sid = req->peer_secid;
4329        /* NOTE: Ideally, we should also get the isec->sid for the
4330           new socket in sync, but we don't have the isec available yet.
4331           So we will wait until sock_graft to do it, by which
4332           time it will have been created and available. */
4333
4334        /* We don't need to take any sort of lock here as we are the only
4335         * thread with access to newsksec */
4336        selinux_netlbl_inet_csk_clone(newsk, req->rsk_ops->family);
4337}
4338
4339static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
4340{
4341        u16 family = sk->sk_family;
4342        struct sk_security_struct *sksec = sk->sk_security;
4343
4344        /* handle mapped IPv4 packets arriving via IPv6 sockets */
4345        if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4346                family = PF_INET;
4347
4348        selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
4349}
4350
4351static int selinux_secmark_relabel_packet(u32 sid)
4352{
4353        const struct task_security_struct *__tsec;
4354        u32 tsid;
4355
4356        __tsec = current_security();
4357        tsid = __tsec->sid;
4358
4359        return avc_has_perm(tsid, sid, SECCLASS_PACKET, PACKET__RELABELTO, NULL);
4360}
4361
4362static void selinux_secmark_refcount_inc(void)
4363{
4364        atomic_inc(&selinux_secmark_refcount);
4365}
4366
4367static void selinux_secmark_refcount_dec(void)
4368{
4369        atomic_dec(&selinux_secmark_refcount);
4370}
4371
4372static void selinux_req_classify_flow(const struct request_sock *req,
4373                                      struct flowi *fl)
4374{
4375        fl->flowi_secid = req->secid;
4376}
4377
4378static int selinux_tun_dev_create(void)
4379{
4380        u32 sid = current_sid();
4381
4382        /* we aren't taking into account the "sockcreate" SID since the socket
4383         * that is being created here is not a socket in the traditional sense,
4384         * instead it is a private sock, accessible only to the kernel, and
4385         * representing a wide range of network traffic spanning multiple
4386         * connections unlike traditional sockets - check the TUN driver to
4387         * get a better understanding of why this socket is special */
4388
4389        return avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET, TUN_SOCKET__CREATE,
4390                            NULL);
4391}
4392
4393static void selinux_tun_dev_post_create(struct sock *sk)
4394{
4395        struct sk_security_struct *sksec = sk->sk_security;
4396
4397        /* we don't currently perform any NetLabel based labeling here and it
4398         * isn't clear that we would want to do so anyway; while we could apply
4399         * labeling without the support of the TUN user the resulting labeled
4400         * traffic from the other end of the connection would almost certainly
4401         * cause confusion to the TUN user that had no idea network labeling
4402         * protocols were being used */
4403
4404        /* see the comments in selinux_tun_dev_create() about why we don't use
4405         * the sockcreate SID here */
4406
4407        sksec->sid = current_sid();
4408        sksec->sclass = SECCLASS_TUN_SOCKET;
4409}
4410
4411static int selinux_tun_dev_attach(struct sock *sk)
4412{
4413        struct sk_security_struct *sksec = sk->sk_security;
4414        u32 sid = current_sid();
4415        int err;
4416
4417        err = avc_has_perm(sid, sksec->sid, SECCLASS_TUN_SOCKET,
4418                           TUN_SOCKET__RELABELFROM, NULL);
4419        if (err)
4420                return err;
4421        err = avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET,
4422                           TUN_SOCKET__RELABELTO, NULL);
4423        if (err)
4424                return err;
4425
4426        sksec->sid = sid;
4427
4428        return 0;
4429}
4430
4431static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
4432{
4433        int err = 0;
4434        u32 perm;
4435        struct nlmsghdr *nlh;
4436        struct sk_security_struct *sksec = sk->sk_security;
4437
4438        if (skb->len < NLMSG_SPACE(0)) {
4439                err = -EINVAL;
4440                goto out;
4441        }
4442        nlh = nlmsg_hdr(skb);
4443
4444        err = selinux_nlmsg_lookup(sksec->sclass, nlh->nlmsg_type, &perm);
4445        if (err) {
4446                if (err == -EINVAL) {
4447                        audit_log(current->audit_context, GFP_KERNEL, AUDIT_SELINUX_ERR,
4448                                  "SELinux:  unrecognized netlink message"
4449                                  " type=%hu for sclass=%hu\n",
4450                                  nlh->nlmsg_type, sksec->sclass);
4451                        if (!selinux_enforcing || security_get_allow_unknown())
4452                                err = 0;
4453                }
4454
4455                /* Ignore */
4456                if (err == -ENOENT)
4457                        err = 0;
4458                goto out;
4459        }
4460
4461        err = sock_has_perm(current, sk, perm);
4462out:
4463        return err;
4464}
4465
4466#ifdef CONFIG_NETFILTER
4467
4468static unsigned int selinux_ip_forward(struct sk_buff *skb, int ifindex,
4469                                       u16 family)
4470{
4471        int err;
4472        char *addrp;
4473        u32 peer_sid;
4474        struct common_audit_data ad;
4475        u8 secmark_active;
4476        u8 netlbl_active;
4477        u8 peerlbl_active;
4478
4479        if (!selinux_policycap_netpeer)
4480                return NF_ACCEPT;
4481
4482        secmark_active = selinux_secmark_enabled();
4483        netlbl_active = netlbl_enabled();
4484        peerlbl_active = netlbl_active || selinux_xfrm_enabled();
4485        if (!secmark_active && !peerlbl_active)
4486                return NF_ACCEPT;
4487
4488        if (selinux_skb_peerlbl_sid(skb, family, &peer_sid) != 0)
4489                return NF_DROP;
4490
4491        COMMON_AUDIT_DATA_INIT(&ad, NET);
4492        ad.u.net.netif = ifindex;
4493        ad.u.net.family = family;
4494        if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
4495                return NF_DROP;
4496
4497        if (peerlbl_active) {
4498                err = selinux_inet_sys_rcv_skb(ifindex, addrp, family,
4499                                               peer_sid, &ad);
4500                if (err) {
4501                        selinux_netlbl_err(skb, err, 1);
4502                        return NF_DROP;
4503                }
4504        }
4505
4506        if (secmark_active)
4507                if (avc_has_perm(peer_sid, skb->secmark,
4508                                 SECCLASS_PACKET, PACKET__FORWARD_IN, &ad))
4509                        return NF_DROP;
4510
4511        if (netlbl_active)
4512                /* we do this in the FORWARD path and not the POST_ROUTING
4513                 * path because we want to make sure we apply the necessary
4514                 * labeling before IPsec is applied so we can leverage AH
4515                 * protection */
4516                if (selinux_netlbl_skbuff_setsid(skb, family, peer_sid) != 0)
4517                        return NF_DROP;
4518
4519        return NF_ACCEPT;
4520}
4521
4522static unsigned int selinux_ipv4_forward(unsigned int hooknum,
4523                                         struct sk_buff *skb,
4524                                         const struct net_device *in,
4525                                         const struct net_device *out,
4526                                         int (*okfn)(struct sk_buff *))
4527{
4528        return selinux_ip_forward(skb, in->ifindex, PF_INET);
4529}
4530
4531#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4532static unsigned int selinux_ipv6_forward(unsigned int hooknum,
4533                                         struct sk_buff *skb,
4534                                         const struct net_device *in,
4535                                         const struct net_device *out,
4536                                         int (*okfn)(struct sk_buff *))
4537{
4538        return selinux_ip_forward(skb, in->ifindex, PF_INET6);
4539}
4540#endif  /* IPV6 */
4541
4542static unsigned int selinux_ip_output(struct sk_buff *skb,
4543                                      u16 family)
4544{
4545        u32 sid;
4546
4547        if (!netlbl_enabled())
4548                return NF_ACCEPT;
4549
4550        /* we do this in the LOCAL_OUT path and not the POST_ROUTING path
4551         * because we want to make sure we apply the necessary labeling
4552         * before IPsec is applied so we can leverage AH protection */
4553        if (skb->sk) {
4554                struct sk_security_struct *sksec = skb->sk->sk_security;
4555                sid = sksec->sid;
4556        } else
4557                sid = SECINITSID_KERNEL;
4558        if (selinux_netlbl_skbuff_setsid(skb, family, sid) != 0)
4559                return NF_DROP;
4560
4561        return NF_ACCEPT;
4562}
4563
4564static unsigned int selinux_ipv4_output(unsigned int hooknum,
4565                                        struct sk_buff *skb,
4566                                        const struct net_device *in,
4567                                        const struct net_device *out,
4568                                        int (*okfn)(struct sk_buff *))
4569{
4570        return selinux_ip_output(skb, PF_INET);
4571}
4572
4573static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
4574                                                int ifindex,
4575                                                u16 family)
4576{
4577        struct sock *sk = skb->sk;
4578        struct sk_security_struct *sksec;
4579        struct common_audit_data ad;
4580        char *addrp;
4581        u8 proto;
4582
4583        if (sk == NULL)
4584                return NF_ACCEPT;
4585        sksec = sk->sk_security;
4586
4587        COMMON_AUDIT_DATA_INIT(&ad, NET);
4588        ad.u.net.netif = ifindex;
4589        ad.u.net.family = family;
4590        if (selinux_parse_skb(skb, &ad, &addrp, 0, &proto))
4591                return NF_DROP;
4592
4593        if (selinux_secmark_enabled())
4594                if (avc_has_perm(sksec->sid, skb->secmark,
4595                                 SECCLASS_PACKET, PACKET__SEND, &ad))
4596                        return NF_DROP_ERR(-ECONNREFUSED);
4597
4598        if (selinux_xfrm_postroute_last(sksec->sid, skb, &ad, proto))
4599                return NF_DROP_ERR(-ECONNREFUSED);
4600
4601        return NF_ACCEPT;
4602}
4603
4604static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
4605                                         u16 family)
4606{
4607        u32 secmark_perm;
4608        u32 peer_sid;
4609        struct sock *sk;
4610        struct common_audit_data ad;
4611        char *addrp;
4612        u8 secmark_active;
4613        u8 peerlbl_active;
4614
4615        /* If any sort of compatibility mode is enabled then handoff processing
4616         * to the selinux_ip_postroute_compat() function to deal with the
4617         * special handling.  We do this in an attempt to keep this function
4618         * as fast and as clean as possible. */
4619        if (!selinux_policycap_netpeer)
4620                return selinux_ip_postroute_compat(skb, ifindex, family);
4621#ifdef CONFIG_XFRM
4622        /* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
4623         * packet transformation so allow the packet to pass without any checks
4624         * since we'll have another chance to perform access control checks
4625         * when the packet is on it's final way out.
4626         * NOTE: there appear to be some IPv6 multicast cases where skb->dst
4627         *       is NULL, in this case go ahead and apply access control. */
4628        if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL)
4629                return NF_ACCEPT;
4630#endif
4631        secmark_active = selinux_secmark_enabled();
4632        peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled();
4633        if (!secmark_active && !peerlbl_active)
4634                return NF_ACCEPT;
4635
4636        /* if the packet is being forwarded then get the peer label from the
4637         * packet itself; otherwise check to see if it is from a local
4638         * application or the kernel, if from an application get the peer label
4639         * from the sending socket, otherwise use the kernel's sid */
4640        sk = skb->sk;
4641        if (sk == NULL) {
4642                if (skb->skb_iif) {
4643                        secmark_perm = PACKET__FORWARD_OUT;
4644                        if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
4645                                return NF_DROP;
4646                } else {
4647                        secmark_perm = PACKET__SEND;
4648                        peer_sid = SECINITSID_KERNEL;
4649                }
4650        } else {
4651                struct sk_security_struct *sksec = sk->sk_security;
4652                peer_sid = sksec->sid;
4653                secmark_perm = PACKET__SEND;
4654        }
4655
4656        COMMON_AUDIT_DATA_INIT(&ad, NET);
4657        ad.u.net.netif = ifindex;
4658        ad.u.net.family = family;
4659        if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
4660                return NF_DROP;
4661
4662        if (secmark_active)
4663                if (avc_has_perm(peer_sid, skb->secmark,
4664                                 SECCLASS_PACKET, secmark_perm, &ad))
4665                        return NF_DROP_ERR(-ECONNREFUSED);
4666
4667        if (peerlbl_active) {
4668                u32 if_sid;
4669                u32 node_sid;
4670
4671                if (sel_netif_sid(ifindex, &if_sid))
4672                        return NF_DROP;
4673                if (avc_has_perm(peer_sid, if_sid,
4674                                 SECCLASS_NETIF, NETIF__EGRESS, &ad))
4675                        return NF_DROP_ERR(-ECONNREFUSED);
4676
4677                if (sel_netnode_sid(addrp, family, &node_sid))
4678                        return NF_DROP;
4679                if (avc_has_perm(peer_sid, node_sid,
4680                                 SECCLASS_NODE, NODE__SENDTO, &ad))
4681                        return NF_DROP_ERR(-ECONNREFUSED);
4682        }
4683
4684        return NF_ACCEPT;
4685}
4686
4687static unsigned int selinux_ipv4_postroute(unsigned int hooknum,
4688                                           struct sk_buff *skb,
4689                                           const struct net_device *in,
4690                                           const struct net_device *out,
4691                                           int (*okfn)(struct sk_buff *))
4692{
4693        return selinux_ip_postroute(skb, out->ifindex, PF_INET);
4694}
4695
4696#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4697static unsigned int selinux_ipv6_postroute(unsigned int hooknum,
4698                                           struct sk_buff *skb,
4699                                           const struct net_device *in,
4700                                           const struct net_device *out,
4701                                           int (*okfn)(struct sk_buff *))
4702{
4703        return selinux_ip_postroute(skb, out->ifindex, PF_INET6);
4704}
4705#endif  /* IPV6 */
4706
4707#endif  /* CONFIG_NETFILTER */
4708
4709static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
4710{
4711        int err;
4712
4713        err = cap_netlink_send(sk, skb);
4714        if (err)
4715                return err;
4716
4717        return selinux_nlmsg_perm(sk, skb);
4718}
4719
4720static int selinux_netlink_recv(struct sk_buff *skb, int capability)
4721{
4722        int err;
4723        struct common_audit_data ad;
4724        u32 sid;
4725
4726        err = cap_netlink_recv(skb, capability);
4727        if (err)
4728                return err;
4729
4730        COMMON_AUDIT_DATA_INIT(&ad, CAP);
4731        ad.u.cap = capability;
4732
4733        security_task_getsecid(current, &sid);
4734        return avc_has_perm(sid, sid, SECCLASS_CAPABILITY,
4735                            CAP_TO_MASK(capability), &ad);
4736}
4737
4738static int ipc_alloc_security(struct task_struct *task,
4739                              struct kern_ipc_perm *perm,
4740                              u16 sclass)
4741{
4742        struct ipc_security_struct *isec;
4743        u32 sid;
4744
4745        isec = kzalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
4746        if (!isec)
4747                return -ENOMEM;
4748
4749        sid = task_sid(task);
4750        isec->sclass = sclass;
4751        isec->sid = sid;
4752        perm->security = isec;
4753
4754        return 0;
4755}
4756
4757static void ipc_free_security(struct kern_ipc_perm *perm)
4758{
4759        struct ipc_security_struct *isec = perm->security;
4760        perm->security = NULL;
4761        kfree(isec);
4762}
4763
4764static int msg_msg_alloc_security(struct msg_msg *msg)
4765{
4766        struct msg_security_struct *msec;
4767
4768        msec = kzalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
4769        if (!msec)
4770                return -ENOMEM;
4771
4772        msec->sid = SECINITSID_UNLABELED;
4773        msg->security = msec;
4774
4775        return 0;
4776}
4777
4778static void msg_msg_free_security(struct msg_msg *msg)
4779{
4780        struct msg_security_struct *msec = msg->security;
4781
4782        msg->security = NULL;
4783        kfree(msec);
4784}
4785
4786static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
4787                        u32 perms)
4788{
4789        struct ipc_security_struct *isec;
4790        struct common_audit_data ad;
4791        u32 sid = current_sid();
4792
4793        isec = ipc_perms->security;
4794
4795        COMMON_AUDIT_DATA_INIT(&ad, IPC);
4796        ad.u.ipc_id = ipc_perms->key;
4797
4798        return avc_has_perm(sid, isec->sid, isec->sclass, perms, &ad);
4799}
4800
4801static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
4802{
4803        return msg_msg_alloc_security(msg);
4804}
4805
4806static void selinux_msg_msg_free_security(struct msg_msg *msg)
4807{
4808        msg_msg_free_security(msg);
4809}
4810
4811/* message queue security operations */
4812static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
4813{
4814        struct ipc_security_struct *isec;
4815        struct common_audit_data ad;
4816        u32 sid = current_sid();
4817        int rc;
4818
4819        rc = ipc_alloc_security(current, &msq->q_perm, SECCLASS_MSGQ);
4820        if (rc)
4821                return rc;
4822
4823        isec = msq->q_perm.security;
4824
4825        COMMON_AUDIT_DATA_INIT(&ad, IPC);
4826        ad.u.ipc_id = msq->q_perm.key;
4827
4828        rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
4829                          MSGQ__CREATE, &ad);
4830        if (rc) {
4831                ipc_free_security(&msq->q_perm);
4832                return rc;
4833        }
4834        return 0;
4835}
4836
4837static void selinux_msg_queue_free_security(struct msg_queue *msq)
4838{
4839        ipc_free_security(&msq->q_perm);
4840}
4841
4842static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
4843{
4844        struct ipc_security_struct *isec;
4845        struct common_audit_data ad;
4846        u32 sid = current_sid();
4847
4848        isec = msq->q_perm.security;
4849
4850        COMMON_AUDIT_DATA_INIT(&ad, IPC);
4851        ad.u.ipc_id = msq->q_perm.key;
4852
4853        return avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
4854                            MSGQ__ASSOCIATE, &ad);
4855}
4856
4857static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
4858{
4859        int err;
4860        int perms;
4861
4862        switch (cmd) {
4863        case IPC_INFO:
4864        case MSG_INFO:
4865                /* No specific object, just general system-wide information. */
4866                return task_has_system(current, SYSTEM__IPC_INFO);
4867        case IPC_STAT:
4868        case MSG_STAT:
4869                perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
4870                break;
4871        case IPC_SET:
4872                perms = MSGQ__SETATTR;
4873                break;
4874        case IPC_RMID:
4875                perms = MSGQ__DESTROY;
4876                break;
4877        default:
4878                return 0;
4879        }
4880
4881        err = ipc_has_perm(&msq->q_perm, perms);
4882        return err;
4883}
4884
4885static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
4886{
4887        struct ipc_security_struct *isec;
4888        struct msg_security_struct *msec;
4889        struct common_audit_data ad;
4890        u32 sid = current_sid();
4891        int rc;
4892
4893        isec = msq->q_perm.security;
4894        msec = msg->security;
4895
4896        /*
4897         * First time through, need to assign label to the message
4898         */
4899        if (msec->sid == SECINITSID_UNLABELED) {
4900                /*
4901                 * Compute new sid based on current process and
4902                 * message queue this message will be stored in
4903                 */
4904                rc = security_transition_sid(sid, isec->sid, SECCLASS_MSG,
4905                                             NULL, &msec->sid);
4906                if (rc)
4907                        return rc;
4908        }
4909
4910        COMMON_AUDIT_DATA_INIT(&ad, IPC);
4911        ad.u.ipc_id = msq->q_perm.key;
4912
4913        /* Can this process write to the queue? */
4914        rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
4915                          MSGQ__WRITE, &ad);
4916        if (!rc)
4917                /* Can this process send the message */
4918                rc = avc_has_perm(sid, msec->sid, SECCLASS_MSG,
4919                                  MSG__SEND, &ad);
4920        if (!rc)
4921                /* Can the message be put in the queue? */
4922                rc = avc_has_perm(msec->sid, isec->sid, SECCLASS_MSGQ,
4923                                  MSGQ__ENQUEUE, &ad);
4924
4925        return rc;
4926}
4927
4928static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
4929                                    struct task_struct *target,
4930                                    long type, int mode)
4931{
4932        struct ipc_security_struct *isec;
4933        struct msg_security_struct *msec;
4934        struct common_audit_data ad;
4935        u32 sid = task_sid(target);
4936        int rc;
4937
4938        isec = msq->q_perm.security;
4939        msec = msg->security;
4940
4941        COMMON_AUDIT_DATA_INIT(&ad, IPC);
4942        ad.u.ipc_id = msq->q_perm.key;
4943
4944        rc = avc_has_perm(sid, isec->sid,
4945                          SECCLASS_MSGQ, MSGQ__READ, &ad);
4946        if (!rc)
4947                rc = avc_has_perm(sid, msec->sid,
4948                                  SECCLASS_MSG, MSG__RECEIVE, &ad);
4949        return rc;
4950}
4951
4952/* Shared Memory security operations */
4953static int selinux_shm_alloc_security(struct shmid_kernel *shp)
4954{
4955        struct ipc_security_struct *isec;
4956        struct common_audit_data ad;
4957        u32 sid = current_sid();
4958        int rc;
4959
4960        rc = ipc_alloc_security(current, &shp->shm_perm, SECCLASS_SHM);
4961        if (rc)
4962                return rc;
4963
4964        isec = shp->shm_perm.security;
4965
4966        COMMON_AUDIT_DATA_INIT(&ad, IPC);
4967        ad.u.ipc_id = shp->shm_perm.key;
4968
4969        rc = avc_has_perm(sid, isec->sid, SECCLASS_SHM,
4970                          SHM__CREATE, &ad);
4971        if (rc) {
4972                ipc_free_security(&shp->shm_perm);
4973                return rc;
4974        }
4975        return 0;
4976}
4977
4978static void selinux_shm_free_security(struct shmid_kernel *shp)
4979{
4980        ipc_free_security(&shp->shm_perm);
4981}
4982
4983static int selinux_shm_associate(struct shmid_kernel *shp, int shmflg)
4984{
4985        struct ipc_security_struct *isec;
4986        struct common_audit_data ad;
4987        u32 sid = current_sid();
4988
4989        isec = shp->shm_perm.security;
4990
4991        COMMON_AUDIT_DATA_INIT(&ad, IPC);
4992        ad.u.ipc_id = shp->shm_perm.key;
4993
4994        return avc_has_perm(sid, isec->sid, SECCLASS_SHM,
4995                            SHM__ASSOCIATE, &ad);
4996}
4997
4998/* Note, at this point, shp is locked down */
4999static int selinux_shm_shmctl(struct shmid_kernel *shp, int cmd)
5000{
5001        int perms;
5002        int err;
5003
5004        switch (cmd) {
5005        case IPC_INFO:
5006        case SHM_INFO:
5007                /* No specific object, just general system-wide information. */
5008                return task_has_system(current, SYSTEM__IPC_INFO);
5009        case IPC_STAT:
5010        case SHM_STAT:
5011                perms = SHM__GETATTR | SHM__ASSOCIATE;
5012                break;
5013        case IPC_SET:
5014                perms = SHM__SETATTR;
5015                break;
5016        case SHM_LOCK:
5017        case SHM_UNLOCK:
5018                perms = SHM__LOCK;
5019                break;
5020        case IPC_RMID:
5021                perms = SHM__DESTROY;
5022                break;
5023        default:
5024                return 0;
5025        }
5026
5027        err = ipc_has_perm(&shp->shm_perm, perms);
5028        return err;
5029}
5030
5031static int selinux_shm_shmat(struct shmid_kernel *shp,
5032                             char __user *shmaddr, int shmflg)
5033{
5034        u32 perms;
5035
5036        if (shmflg & SHM_RDONLY)
5037                perms = SHM__READ;
5038        else
5039                perms = SHM__READ | SHM__WRITE;
5040
5041        return ipc_has_perm(&shp->shm_perm, perms);
5042}
5043
5044/* Semaphore security operations */
5045static int selinux_sem_alloc_security(struct sem_array *sma)
5046{
5047        struct ipc_security_struct *isec;
5048        struct common_audit_data ad;
5049        u32 sid = current_sid();
5050        int rc;
5051
5052        rc = ipc_alloc_security(current, &sma->sem_perm, SECCLASS_SEM);
5053        if (rc)
5054                return rc;
5055
5056        isec = sma->sem_perm.security;
5057
5058        COMMON_AUDIT_DATA_INIT(&ad, IPC);
5059        ad.u.ipc_id = sma->sem_perm.key;
5060
5061        rc = avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5062                          SEM__CREATE, &ad);
5063        if (rc) {
5064                ipc_free_security(&sma->sem_perm);
5065                return rc;
5066        }
5067        return 0;
5068}
5069
5070static void selinux_sem_free_security(struct sem_array *sma)
5071{
5072        ipc_free_security(&sma->sem_perm);
5073}
5074
5075static int selinux_sem_associate(struct sem_array *sma, int semflg)
5076{
5077        struct ipc_security_struct *isec;
5078        struct common_audit_data ad;
5079        u32 sid = current_sid();
5080
5081        isec = sma->sem_perm.security;
5082
5083        COMMON_AUDIT_DATA_INIT(&ad, IPC);
5084        ad.u.ipc_id = sma->sem_perm.key;
5085
5086        return avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5087                            SEM__ASSOCIATE, &ad);
5088}
5089
5090/* Note, at this point, sma is locked down */
5091static int selinux_sem_semctl(struct sem_array *sma, int cmd)
5092{
5093        int err;
5094        u32 perms;
5095
5096        switch (cmd) {
5097        case IPC_INFO:
5098        case SEM_INFO:
5099                /* No specific object, just general system-wide information. */
5100                return task_has_system(current, SYSTEM__IPC_INFO);
5101        case GETPID:
5102        case GETNCNT:
5103        case GETZCNT:
5104                perms = SEM__GETATTR;
5105                break;
5106        case GETVAL:
5107        case GETALL:
5108                perms = SEM__READ;
5109                break;
5110        case SETVAL:
5111        case SETALL:
5112                perms = SEM__WRITE;
5113                break;
5114        case IPC_RMID:
5115                perms = SEM__DESTROY;
5116                break;
5117        case IPC_SET:
5118                perms = SEM__SETATTR;
5119                break;
5120        case IPC_STAT:
5121        case SEM_STAT:
5122                perms = SEM__GETATTR | SEM__ASSOCIATE;
5123                break;
5124        default:
5125                return 0;
5126        }
5127
5128        err = ipc_has_perm(&sma->sem_perm, perms);
5129        return err;
5130}
5131
5132static int selinux_sem_semop(struct sem_array *sma,
5133                             struct sembuf *sops, unsigned nsops, int alter)
5134{
5135        u32 perms;
5136
5137        if (alter)
5138                perms = SEM__READ | SEM__WRITE;
5139        else
5140                perms = SEM__READ;
5141
5142        return ipc_has_perm(&sma->sem_perm, perms);
5143}
5144
5145static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
5146{
5147        u32 av = 0;
5148
5149        av = 0;
5150        if (flag & S_IRUGO)
5151                av |= IPC__UNIX_READ;
5152        if (flag & S_IWUGO)
5153                av |= IPC__UNIX_WRITE;
5154
5155        if (av == 0)
5156                return 0;
5157
5158        return ipc_has_perm(ipcp, av);
5159}
5160
5161static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
5162{
5163        struct ipc_security_struct *isec = ipcp->security;
5164        *secid = isec->sid;
5165}
5166
5167static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
5168{
5169        if (inode)
5170                inode_doinit_with_dentry(inode, dentry);
5171}
5172
5173static int selinux_getprocattr(struct task_struct *p,
5174                               char *name, char **value)
5175{
5176        const struct task_security_struct *__tsec;
5177        u32 sid;
5178        int error;
5179        unsigned len;
5180
5181        if (current != p) {
5182                error = current_has_perm(p, PROCESS__GETATTR);
5183                if (error)
5184                        return error;
5185        }
5186
5187        rcu_read_lock();
5188        __tsec = __task_cred(p)->security;
5189
5190        if (!strcmp(name, "current"))
5191                sid = __tsec->sid;
5192        else if (!strcmp(name, "prev"))
5193                sid = __tsec->osid;
5194        else if (!strcmp(name, "exec"))
5195                sid = __tsec->exec_sid;
5196        else if (!strcmp(name, "fscreate"))
5197                sid = __tsec->create_sid;
5198        else if (!strcmp(name, "keycreate"))
5199                sid = __tsec->keycreate_sid;
5200        else if (!strcmp(name, "sockcreate"))
5201                sid = __tsec->sockcreate_sid;
5202        else
5203                goto invalid;
5204        rcu_read_unlock();
5205
5206        if (!sid)
5207                return 0;
5208
5209        error = security_sid_to_context(sid, value, &len);
5210        if (error)
5211                return error;
5212        return len;
5213
5214invalid:
5215        rcu_read_unlock();
5216        return -EINVAL;
5217}
5218
5219static int selinux_setprocattr(struct task_struct *p,
5220                               char *name, void *value, size_t size)
5221{
5222        struct task_security_struct *tsec;
5223        struct task_struct *tracer;
5224        struct cred *new;
5225        u32 sid = 0, ptsid;
5226        int error;
5227        char *str = value;
5228
5229        if (current != p) {
5230                /* SELinux only allows a process to change its own
5231                   security attributes. */
5232                return -EACCES;
5233        }
5234
5235        /*
5236         * Basic control over ability to set these attributes at all.
5237         * current == p, but we'll pass them separately in case the
5238         * above restriction is ever removed.
5239         */
5240        if (!strcmp(name, "exec"))
5241                error = current_has_perm(p, PROCESS__SETEXEC);
5242        else if (!strcmp(name, "fscreate"))
5243                error = current_has_perm(p, PROCESS__SETFSCREATE);
5244        else if (!strcmp(name, "keycreate"))
5245                error = current_has_perm(p, PROCESS__SETKEYCREATE);
5246        else if (!strcmp(name, "sockcreate"))
5247                error = current_has_perm(p, PROCESS__SETSOCKCREATE);
5248        else if (!strcmp(name, "current"))
5249                error = current_has_perm(p, PROCESS__SETCURRENT);
5250        else
5251                error = -EINVAL;
5252        if (error)
5253                return error;
5254
5255        /* Obtain a SID for the context, if one was specified. */
5256        if (size && str[1] && str[1] != '\n') {
5257                if (str[size-1] == '\n') {
5258                        str[size-1] = 0;
5259                        size--;
5260                }
5261                error = security_context_to_sid(value, size, &sid);
5262                if (error == -EINVAL && !strcmp(name, "fscreate")) {
5263                        if (!capable(CAP_MAC_ADMIN))
5264                                return error;
5265                        error = security_context_to_sid_force(value, size,
5266                                                              &sid);
5267                }
5268                if (error)
5269                        return error;
5270        }
5271
5272        new = prepare_creds();
5273        if (!new)
5274                return -ENOMEM;
5275
5276        /* Permission checking based on the specified context is
5277           performed during the actual operation (execve,
5278           open/mkdir/...), when we know the full context of the
5279           operation.  See selinux_bprm_set_creds for the execve
5280           checks and may_create for the file creation checks. The
5281           operation will then fail if the context is not permitted. */
5282        tsec = new->security;
5283        if (!strcmp(name, "exec")) {
5284                tsec->exec_sid = sid;
5285        } else if (!strcmp(name, "fscreate")) {
5286                tsec->create_sid = sid;
5287        } else if (!strcmp(name, "keycreate")) {
5288                error = may_create_key(sid, p);
5289                if (error)
5290                        goto abort_change;
5291                tsec->keycreate_sid = sid;
5292        } else if (!strcmp(name, "sockcreate")) {
5293                tsec->sockcreate_sid = sid;
5294        } else if (!strcmp(name, "current")) {
5295                error = -EINVAL;
5296                if (sid == 0)
5297                        goto abort_change;
5298
5299                /* Only allow single threaded processes to change context */
5300                error = -EPERM;
5301                if (!current_is_single_threaded()) {
5302                        error = security_bounded_transition(tsec->sid, sid);
5303                        if (error)
5304                                goto abort_change;
5305                }
5306
5307                /* Check permissions for the transition. */
5308                error = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
5309                                     PROCESS__DYNTRANSITION, NULL);
5310                if (error)
5311                        goto abort_change;
5312
5313                /* Check for ptracing, and update the task SID if ok.
5314                   Otherwise, leave SID unchanged and fail. */
5315                ptsid = 0;
5316                task_lock(p);
5317                tracer = ptrace_parent(p);
5318                if (tracer)
5319                        ptsid = task_sid(tracer);
5320                task_unlock(p);
5321
5322                if (tracer) {
5323                        error = avc_has_perm(ptsid, sid, SECCLASS_PROCESS,
5324                                             PROCESS__PTRACE, NULL);
5325                        if (error)
5326                                goto abort_change;
5327                }
5328
5329                tsec->sid = sid;
5330        } else {
5331                error = -EINVAL;
5332                goto abort_change;
5333        }
5334
5335        commit_creds(new);
5336        return size;
5337
5338abort_change:
5339        abort_creds(new);
5340        return error;
5341}
5342
5343static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
5344{
5345        return security_sid_to_context(secid, secdata, seclen);
5346}
5347
5348static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
5349{
5350        return security_context_to_sid(secdata, seclen, secid);
5351}
5352
5353static void selinux_release_secctx(char *secdata, u32 seclen)
5354{
5355        kfree(secdata);
5356}
5357
5358/*
5359 *      called with inode->i_mutex locked
5360 */
5361static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
5362{
5363        return selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, ctx, ctxlen, 0);
5364}
5365
5366/*
5367 *      called with inode->i_mutex locked
5368 */
5369static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
5370{
5371        return __vfs_setxattr_noperm(dentry, XATTR_NAME_SELINUX, ctx, ctxlen, 0);
5372}
5373
5374static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
5375{
5376        int len = 0;
5377        len = selinux_inode_getsecurity(inode, XATTR_SELINUX_SUFFIX,
5378                                                ctx, true);
5379        if (len < 0)
5380                return len;
5381        *ctxlen = len;
5382        return 0;
5383}
5384#ifdef CONFIG_KEYS
5385
5386static int selinux_key_alloc(struct key *k, const struct cred *cred,
5387                             unsigned long flags)
5388{
5389        const struct task_security_struct *tsec;
5390        struct key_security_struct *ksec;
5391
5392        ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL);
5393        if (!ksec)
5394                return -ENOMEM;
5395
5396        tsec = cred->security;
5397        if (tsec->keycreate_sid)
5398                ksec->sid = tsec->keycreate_sid;
5399        else
5400                ksec->sid = tsec->sid;
5401
5402        k->security = ksec;
5403        return 0;
5404}
5405
5406static void selinux_key_free(struct key *k)
5407{
5408        struct key_security_struct *ksec = k->security;
5409
5410        k->security = NULL;
5411        kfree(ksec);
5412}
5413
5414static int selinux_key_permission(key_ref_t key_ref,
5415                                  const struct cred *cred,
5416                                  key_perm_t perm)
5417{
5418        struct key *key;
5419        struct key_security_struct *ksec;
5420        u32 sid;
5421
5422        /* if no specific permissions are requested, we skip the
5423           permission check. No serious, additional covert channels
5424           appear to be created. */
5425        if (perm == 0)
5426                return 0;
5427
5428        sid = cred_sid(cred);
5429
5430        key = key_ref_to_ptr(key_ref);
5431        ksec = key->security;
5432
5433        return avc_has_perm(sid, ksec->sid, SECCLASS_KEY, perm, NULL);
5434}
5435
5436static int selinux_key_getsecurity(struct key *key, char **_buffer)
5437{
5438        struct key_security_struct *ksec = key->security;
5439        char *context = NULL;
5440        unsigned len;
5441        int rc;
5442
5443        rc = security_sid_to_context(ksec->sid, &context, &len);
5444        if (!rc)
5445                rc = len;
5446        *_buffer = context;
5447        return rc;
5448}
5449
5450#endif
5451
5452static struct security_operations selinux_ops = {
5453        .name =                         "selinux",
5454
5455        .ptrace_access_check =          selinux_ptrace_access_check,
5456        .ptrace_traceme =               selinux_ptrace_traceme,
5457        .capget =                       selinux_capget,
5458        .capset =                       selinux_capset,
5459        .capable =                      selinux_capable,
5460        .quotactl =                     selinux_quotactl,
5461        .quota_on =                     selinux_quota_on,
5462        .syslog =                       selinux_syslog,
5463        .vm_enough_memory =             selinux_vm_enough_memory,
5464
5465        .netlink_send =                 selinux_netlink_send,
5466        .netlink_recv =                 selinux_netlink_recv,
5467
5468        .bprm_set_creds =               selinux_bprm_set_creds,
5469        .bprm_committing_creds =        selinux_bprm_committing_creds,
5470        .bprm_committed_creds =         selinux_bprm_committed_creds,
5471        .bprm_secureexec =              selinux_bprm_secureexec,
5472
5473        .sb_alloc_security =            selinux_sb_alloc_security,
5474        .sb_free_security =             selinux_sb_free_security,
5475        .sb_copy_data =                 selinux_sb_copy_data,
5476        .sb_remount =                   selinux_sb_remount,
5477        .sb_kern_mount =                selinux_sb_kern_mount,
5478        .sb_show_options =              selinux_sb_show_options,
5479        .sb_statfs =                    selinux_sb_statfs,
5480        .sb_mount =                     selinux_mount,
5481        .sb_umount =                    selinux_umount,
5482        .sb_set_mnt_opts =              selinux_set_mnt_opts,
5483        .sb_clone_mnt_opts =            selinux_sb_clone_mnt_opts,
5484        .sb_parse_opts_str =            selinux_parse_opts_str,
5485
5486
5487        .inode_alloc_security =         selinux_inode_alloc_security,
5488        .inode_free_security =          selinux_inode_free_security,
5489        .inode_init_security =          selinux_inode_init_security,
5490        .inode_create =                 selinux_inode_create,
5491        .inode_link =                   selinux_inode_link,
5492        .inode_unlink =                 selinux_inode_unlink,
5493        .inode_symlink =                selinux_inode_symlink,
5494        .inode_mkdir =                  selinux_inode_mkdir,
5495        .inode_rmdir =                  selinux_inode_rmdir,
5496        .inode_mknod =                  selinux_inode_mknod,
5497        .inode_rename =                 selinux_inode_rename,
5498        .inode_readlink =               selinux_inode_readlink,
5499        .inode_follow_link =            selinux_inode_follow_link,
5500        .inode_permission =             selinux_inode_permission,
5501        .inode_setattr =                selinux_inode_setattr,
5502        .inode_getattr =                selinux_inode_getattr,
5503        .inode_setxattr =               selinux_inode_setxattr,
5504        .inode_post_setxattr =          selinux_inode_post_setxattr,
5505        .inode_getxattr =               selinux_inode_getxattr,
5506        .inode_listxattr =              selinux_inode_listxattr,
5507        .inode_removexattr =            selinux_inode_removexattr,
5508        .inode_getsecurity =            selinux_inode_getsecurity,
5509        .inode_setsecurity =            selinux_inode_setsecurity,
5510        .inode_listsecurity =           selinux_inode_listsecurity,
5511        .inode_getsecid =               selinux_inode_getsecid,
5512
5513        .file_permission =              selinux_file_permission,
5514        .file_alloc_security =          selinux_file_alloc_security,
5515        .file_free_security =           selinux_file_free_security,
5516        .file_ioctl =                   selinux_file_ioctl,
5517        .file_mmap =                    selinux_file_mmap,
5518        .file_mprotect =                selinux_file_mprotect,
5519        .file_lock =                    selinux_file_lock,
5520        .file_fcntl =                   selinux_file_fcntl,
5521        .file_set_fowner =              selinux_file_set_fowner,
5522        .file_send_sigiotask =          selinux_file_send_sigiotask,
5523        .file_receive =                 selinux_file_receive,
5524
5525        .dentry_open =                  selinux_dentry_open,
5526
5527        .task_create =                  selinux_task_create,
5528        .cred_alloc_blank =             selinux_cred_alloc_blank,
5529        .cred_free =                    selinux_cred_free,
5530        .cred_prepare =                 selinux_cred_prepare,
5531        .cred_transfer =                selinux_cred_transfer,
5532        .kernel_act_as =                selinux_kernel_act_as,
5533        .kernel_create_files_as =       selinux_kernel_create_files_as,
5534        .kernel_module_request =        selinux_kernel_module_request,
5535        .task_setpgid =                 selinux_task_setpgid,
5536        .task_getpgid =                 selinux_task_getpgid,
5537        .task_getsid =                  selinux_task_getsid,
5538        .task_getsecid =                selinux_task_getsecid,
5539        .task_setnice =                 selinux_task_setnice,
5540        .task_setioprio =               selinux_task_setioprio,
5541        .task_getioprio =               selinux_task_getioprio,
5542        .task_setrlimit =               selinux_task_setrlimit,
5543        .task_setscheduler =            selinux_task_setscheduler,
5544        .task_getscheduler =            selinux_task_getscheduler,
5545        .task_movememory =              selinux_task_movememory,
5546        .task_kill =                    selinux_task_kill,
5547        .task_wait =                    selinux_task_wait,
5548        .task_to_inode =                selinux_task_to_inode,
5549
5550        .ipc_permission =               selinux_ipc_permission,
5551        .ipc_getsecid =                 selinux_ipc_getsecid,
5552
5553        .msg_msg_alloc_security =       selinux_msg_msg_alloc_security,
5554        .msg_msg_free_security =        selinux_msg_msg_free_security,
5555
5556        .msg_queue_alloc_security =     selinux_msg_queue_alloc_security,
5557        .msg_queue_free_security =      selinux_msg_queue_free_security,
5558        .msg_queue_associate =          selinux_msg_queue_associate,
5559        .msg_queue_msgctl =             selinux_msg_queue_msgctl,
5560        .msg_queue_msgsnd =             selinux_msg_queue_msgsnd,
5561        .msg_queue_msgrcv =             selinux_msg_queue_msgrcv,
5562
5563        .shm_alloc_security =           selinux_shm_alloc_security,
5564        .shm_free_security =            selinux_shm_free_security,
5565        .shm_associate =                selinux_shm_associate,
5566        .shm_shmctl =                   selinux_shm_shmctl,
5567        .shm_shmat =                    selinux_shm_shmat,
5568
5569        .sem_alloc_security =           selinux_sem_alloc_security,
5570        .sem_free_security =            selinux_sem_free_security,
5571        .sem_associate =                selinux_sem_associate,
5572        .sem_semctl =                   selinux_sem_semctl,
5573        .sem_semop =                    selinux_sem_semop,
5574
5575        .d_instantiate =                selinux_d_instantiate,
5576
5577        .getprocattr =                  selinux_getprocattr,
5578        .setprocattr =                  selinux_setprocattr,
5579
5580        .secid_to_secctx =              selinux_secid_to_secctx,
5581        .secctx_to_secid =              selinux_secctx_to_secid,
5582        .release_secctx =               selinux_release_secctx,
5583        .inode_notifysecctx =           selinux_inode_notifysecctx,
5584        .inode_setsecctx =              selinux_inode_setsecctx,
5585        .inode_getsecctx =              selinux_inode_getsecctx,
5586
5587        .unix_stream_connect =          selinux_socket_unix_stream_connect,
5588        .unix_may_send =                selinux_socket_unix_may_send,
5589
5590        .socket_create =                selinux_socket_create,
5591        .socket_post_create =           selinux_socket_post_create,
5592        .socket_bind =                  selinux_socket_bind,
5593        .socket_connect =               selinux_socket_connect,
5594        .socket_listen =                selinux_socket_listen,
5595        .socket_accept =                selinux_socket_accept,
5596        .socket_sendmsg =               selinux_socket_sendmsg,
5597        .socket_recvmsg =               selinux_socket_recvmsg,
5598        .socket_getsockname =           selinux_socket_getsockname,
5599        .socket_getpeername =           selinux_socket_getpeername,
5600        .socket_getsockopt =            selinux_socket_getsockopt,
5601        .socket_setsockopt =            selinux_socket_setsockopt,
5602        .socket_shutdown =              selinux_socket_shutdown,
5603        .socket_sock_rcv_skb =          selinux_socket_sock_rcv_skb,
5604        .socket_getpeersec_stream =     selinux_socket_getpeersec_stream,
5605        .socket_getpeersec_dgram =      selinux_socket_getpeersec_dgram,
5606        .sk_alloc_security =            selinux_sk_alloc_security,
5607        .sk_free_security =             selinux_sk_free_security,
5608        .sk_clone_security =            selinux_sk_clone_security,
5609        .sk_getsecid =                  selinux_sk_getsecid,
5610        .sock_graft =                   selinux_sock_graft,
5611        .inet_conn_request =            selinux_inet_conn_request,
5612        .inet_csk_clone =               selinux_inet_csk_clone,
5613        .inet_conn_established =        selinux_inet_conn_established,
5614        .secmark_relabel_packet =       selinux_secmark_relabel_packet,
5615        .secmark_refcount_inc =         selinux_secmark_refcount_inc,
5616        .secmark_refcount_dec =         selinux_secmark_refcount_dec,
5617        .req_classify_flow =            selinux_req_classify_flow,
5618        .tun_dev_create =               selinux_tun_dev_create,
5619        .tun_dev_post_create =          selinux_tun_dev_post_create,
5620        .tun_dev_attach =               selinux_tun_dev_attach,
5621
5622#ifdef CONFIG_SECURITY_NETWORK_XFRM
5623        .xfrm_policy_alloc_security =   selinux_xfrm_policy_alloc,
5624        .xfrm_policy_clone_security =   selinux_xfrm_policy_clone,
5625        .xfrm_policy_free_security =    selinux_xfrm_policy_free,
5626        .xfrm_policy_delete_security =  selinux_xfrm_policy_delete,
5627        .xfrm_state_alloc_security =    selinux_xfrm_state_alloc,
5628        .xfrm_state_free_security =     selinux_xfrm_state_free,
5629        .xfrm_state_delete_security =   selinux_xfrm_state_delete,
5630        .xfrm_policy_lookup =           selinux_xfrm_policy_lookup,
5631        .xfrm_state_pol_flow_match =    selinux_xfrm_state_pol_flow_match,
5632        .xfrm_decode_session =          selinux_xfrm_decode_session,
5633#endif
5634
5635#ifdef CONFIG_KEYS
5636        .key_alloc =                    selinux_key_alloc,
5637        .key_free =                     selinux_key_free,
5638        .key_permission =               selinux_key_permission,
5639        .key_getsecurity =              selinux_key_getsecurity,
5640#endif
5641
5642#ifdef CONFIG_AUDIT
5643        .audit_rule_init =              selinux_audit_rule_init,
5644        .audit_rule_known =             selinux_audit_rule_known,
5645        .audit_rule_match =             selinux_audit_rule_match,
5646        .audit_rule_free =              selinux_audit_rule_free,
5647#endif
5648};
5649
5650static __init int selinux_init(void)
5651{
5652        if (!security_module_enable(&selinux_ops)) {
5653                selinux_enabled = 0;
5654                return 0;
5655        }
5656
5657        if (!selinux_enabled) {
5658                printk(KERN_INFO "SELinux:  Disabled at boot.\n");
5659                return 0;
5660        }
5661
5662        printk(KERN_INFO "SELinux:  Initializing.\n");
5663
5664        /* Set the security state for the initial task. */
5665        cred_init_security();
5666
5667        default_noexec = !(VM_DATA_DEFAULT_FLAGS & VM_EXEC);
5668
5669        sel_inode_cache = kmem_cache_create("selinux_inode_security",
5670                                            sizeof(struct inode_security_struct),
5671                                            0, SLAB_PANIC, NULL);
5672        avc_init();
5673
5674        if (register_security(&selinux_ops))
5675                panic("SELinux: Unable to register with kernel.\n");
5676
5677        if (selinux_enforcing)
5678                printk(KERN_DEBUG "SELinux:  Starting in enforcing mode\n");
5679        else
5680                printk(KERN_DEBUG "SELinux:  Starting in permissive mode\n");
5681
5682        return 0;
5683}
5684
5685static void delayed_superblock_init(struct super_block *sb, void *unused)
5686{
5687        superblock_doinit(sb, NULL);
5688}
5689
5690void selinux_complete_init(void)
5691{
5692        printk(KERN_DEBUG "SELinux:  Completing initialization.\n");
5693
5694        /* Set up any superblocks initialized prior to the policy load. */
5695        printk(KERN_DEBUG "SELinux:  Setting up existing superblocks.\n");
5696        iterate_supers(delayed_superblock_init, NULL);
5697}
5698
5699/* SELinux requires early initialization in order to label
5700   all processes and objects when they are created. */
5701security_initcall(selinux_init);
5702
5703#if defined(CONFIG_NETFILTER)
5704
5705static struct nf_hook_ops selinux_ipv4_ops[] = {
5706        {
5707                .hook =         selinux_ipv4_postroute,
5708                .owner =        THIS_MODULE,
5709                .pf =           PF_INET,
5710                .hooknum =      NF_INET_POST_ROUTING,
5711                .priority =     NF_IP_PRI_SELINUX_LAST,
5712        },
5713        {
5714                .hook =         selinux_ipv4_forward,
5715                .owner =        THIS_MODULE,
5716                .pf =           PF_INET,
5717                .hooknum =      NF_INET_FORWARD,
5718                .priority =     NF_IP_PRI_SELINUX_FIRST,
5719        },
5720        {
5721                .hook =         selinux_ipv4_output,
5722                .owner =        THIS_MODULE,
5723                .pf =           PF_INET,
5724                .hooknum =      NF_INET_LOCAL_OUT,
5725                .priority =     NF_IP_PRI_SELINUX_FIRST,
5726        }
5727};
5728
5729#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5730
5731static struct nf_hook_ops selinux_ipv6_ops[] = {
5732        {
5733                .hook =         selinux_ipv6_postroute,
5734                .owner =        THIS_MODULE,
5735                .pf =           PF_INET6,
5736                .hooknum =      NF_INET_POST_ROUTING,
5737                .priority =     NF_IP6_PRI_SELINUX_LAST,
5738        },
5739        {
5740                .hook =         selinux_ipv6_forward,
5741                .owner =        THIS_MODULE,
5742                .pf =           PF_INET6,
5743                .hooknum =      NF_INET_FORWARD,
5744                .priority =     NF_IP6_PRI_SELINUX_FIRST,
5745        }
5746};
5747
5748#endif  /* IPV6 */
5749
5750static int __init selinux_nf_ip_init(void)
5751{
5752        int err = 0;
5753
5754        if (!selinux_enabled)
5755                goto out;
5756
5757        printk(KERN_DEBUG "SELinux:  Registering netfilter hooks\n");
5758
5759        err = nf_register_hooks(selinux_ipv4_ops, ARRAY_SIZE(selinux_ipv4_ops));
5760        if (err)
5761                panic("SELinux: nf_register_hooks for IPv4: error %d\n", err);
5762
5763#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5764        err = nf_register_hooks(selinux_ipv6_ops, ARRAY_SIZE(selinux_ipv6_ops));
5765        if (err)
5766                panic("SELinux: nf_register_hooks for IPv6: error %d\n", err);
5767#endif  /* IPV6 */
5768
5769out:
5770        return err;
5771}
5772
5773__initcall(selinux_nf_ip_init);
5774
5775#ifdef CONFIG_SECURITY_SELINUX_DISABLE
5776static void selinux_nf_ip_exit(void)
5777{
5778        printk(KERN_DEBUG "SELinux:  Unregistering netfilter hooks\n");
5779
5780        nf_unregister_hooks(selinux_ipv4_ops, ARRAY_SIZE(selinux_ipv4_ops));
5781#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5782        nf_unregister_hooks(selinux_ipv6_ops, ARRAY_SIZE(selinux_ipv6_ops));
5783#endif  /* IPV6 */
5784}
5785#endif
5786
5787#else /* CONFIG_NETFILTER */
5788
5789#ifdef CONFIG_SECURITY_SELINUX_DISABLE
5790#define selinux_nf_ip_exit()
5791#endif
5792
5793#endif /* CONFIG_NETFILTER */
5794
5795#ifdef CONFIG_SECURITY_SELINUX_DISABLE
5796static int selinux_disabled;
5797
5798int selinux_disable(void)
5799{
5800        if (ss_initialized) {
5801                /* Not permitted after initial policy load. */
5802                return -EINVAL;
5803        }
5804
5805        if (selinux_disabled) {
5806                /* Only do this once. */
5807                return -EINVAL;
5808        }
5809
5810        printk(KERN_INFO "SELinux:  Disabled at runtime.\n");
5811
5812        selinux_disabled = 1;
5813        selinux_enabled = 0;
5814
5815        reset_security_ops();
5816
5817        /* Try to destroy the avc node cache */
5818        avc_disable();
5819
5820        /* Unregister netfilter hooks. */
5821        selinux_nf_ip_exit();
5822
5823        /* Unregister selinuxfs. */
5824        exit_sel_fs();
5825
5826        return 0;
5827}
5828#endif
5829