Linux Audio

Check our new training course

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