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