Linux Audio

Check our new training course

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