Linux Audio

Check our new training course

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