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