Linux Audio

Check our new training course

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