1 /* 2 * Simplified MAC Kernel (smack) security module 3 * 4 * This file contains the smack hook function implementations. 5 * 6 * Authors: 7 * Casey Schaufler <casey@schaufler-ca.com> 8 * Jarkko Sakkinen <jarkko.sakkinen@intel.com> 9 * 10 * Copyright (C) 2007 Casey Schaufler <casey@schaufler-ca.com> 11 * Copyright (C) 2009 Hewlett-Packard Development Company, L.P. 12 * Paul Moore <paul@paul-moore.com> 13 * Copyright (C) 2010 Nokia Corporation 14 * Copyright (C) 2011 Intel Corporation. 15 * 16 * This program is free software; you can redistribute it and/or modify 17 * it under the terms of the GNU General Public License version 2, 18 * as published by the Free Software Foundation. 19 */ 20 21 #include <linux/xattr.h> 22 #include <linux/pagemap.h> 23 #include <linux/mount.h> 24 #include <linux/stat.h> 25 #include <linux/kd.h> 26 #include <asm/ioctls.h> 27 #include <linux/ip.h> 28 #include <linux/tcp.h> 29 #include <linux/udp.h> 30 #include <linux/dccp.h> 31 #include <linux/slab.h> 32 #include <linux/mutex.h> 33 #include <linux/pipe_fs_i.h> 34 #include <net/cipso_ipv4.h> 35 #include <net/ip.h> 36 #include <net/ipv6.h> 37 #include <linux/audit.h> 38 #include <linux/magic.h> 39 #include <linux/dcache.h> 40 #include <linux/personality.h> 41 #include <linux/msg.h> 42 #include <linux/shm.h> 43 #include <linux/binfmts.h> 44 #include <linux/parser.h> 45 #include "smack.h" 46 47 #define TRANS_TRUE "TRUE" 48 #define TRANS_TRUE_SIZE 4 49 50 #define SMK_CONNECTING 0 51 #define SMK_RECEIVING 1 52 #define SMK_SENDING 2 53 54 #ifdef SMACK_IPV6_PORT_LABELING 55 DEFINE_MUTEX(smack_ipv6_lock); 56 static LIST_HEAD(smk_ipv6_port_list); 57 #endif 58 static struct kmem_cache *smack_inode_cache; 59 int smack_enabled; 60 61 static const match_table_t smk_mount_tokens = { 62 {Opt_fsdefault, SMK_FSDEFAULT "%s"}, 63 {Opt_fsfloor, SMK_FSFLOOR "%s"}, 64 {Opt_fshat, SMK_FSHAT "%s"}, 65 {Opt_fsroot, SMK_FSROOT "%s"}, 66 {Opt_fstransmute, SMK_FSTRANS "%s"}, 67 {Opt_error, NULL}, 68 }; 69 70 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 71 static char *smk_bu_mess[] = { 72 "Bringup Error", /* Unused */ 73 "Bringup", /* SMACK_BRINGUP_ALLOW */ 74 "Unconfined Subject", /* SMACK_UNCONFINED_SUBJECT */ 75 "Unconfined Object", /* SMACK_UNCONFINED_OBJECT */ 76 }; 77 78 static void smk_bu_mode(int mode, char *s) 79 { 80 int i = 0; 81 82 if (mode & MAY_READ) 83 s[i++] = 'r'; 84 if (mode & MAY_WRITE) 85 s[i++] = 'w'; 86 if (mode & MAY_EXEC) 87 s[i++] = 'x'; 88 if (mode & MAY_APPEND) 89 s[i++] = 'a'; 90 if (mode & MAY_TRANSMUTE) 91 s[i++] = 't'; 92 if (mode & MAY_LOCK) 93 s[i++] = 'l'; 94 if (i == 0) 95 s[i++] = '-'; 96 s[i] = '\0'; 97 } 98 #endif 99 100 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 101 static int smk_bu_note(char *note, struct smack_known *sskp, 102 struct smack_known *oskp, int mode, int rc) 103 { 104 char acc[SMK_NUM_ACCESS_TYPE + 1]; 105 106 if (rc <= 0) 107 return rc; 108 if (rc > SMACK_UNCONFINED_OBJECT) 109 rc = 0; 110 111 smk_bu_mode(mode, acc); 112 pr_info("Smack %s: (%s %s %s) %s\n", smk_bu_mess[rc], 113 sskp->smk_known, oskp->smk_known, acc, note); 114 return 0; 115 } 116 #else 117 #define smk_bu_note(note, sskp, oskp, mode, RC) (RC) 118 #endif 119 120 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 121 static int smk_bu_current(char *note, struct smack_known *oskp, 122 int mode, int rc) 123 { 124 struct task_smack *tsp = current_security(); 125 char acc[SMK_NUM_ACCESS_TYPE + 1]; 126 127 if (rc <= 0) 128 return rc; 129 if (rc > SMACK_UNCONFINED_OBJECT) 130 rc = 0; 131 132 smk_bu_mode(mode, acc); 133 pr_info("Smack %s: (%s %s %s) %s %s\n", smk_bu_mess[rc], 134 tsp->smk_task->smk_known, oskp->smk_known, 135 acc, current->comm, note); 136 return 0; 137 } 138 #else 139 #define smk_bu_current(note, oskp, mode, RC) (RC) 140 #endif 141 142 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 143 static int smk_bu_task(struct task_struct *otp, int mode, int rc) 144 { 145 struct task_smack *tsp = current_security(); 146 struct smack_known *smk_task = smk_of_task_struct(otp); 147 char acc[SMK_NUM_ACCESS_TYPE + 1]; 148 149 if (rc <= 0) 150 return rc; 151 if (rc > SMACK_UNCONFINED_OBJECT) 152 rc = 0; 153 154 smk_bu_mode(mode, acc); 155 pr_info("Smack %s: (%s %s %s) %s to %s\n", smk_bu_mess[rc], 156 tsp->smk_task->smk_known, smk_task->smk_known, acc, 157 current->comm, otp->comm); 158 return 0; 159 } 160 #else 161 #define smk_bu_task(otp, mode, RC) (RC) 162 #endif 163 164 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 165 static int smk_bu_inode(struct inode *inode, int mode, int rc) 166 { 167 struct task_smack *tsp = current_security(); 168 struct inode_smack *isp = inode->i_security; 169 char acc[SMK_NUM_ACCESS_TYPE + 1]; 170 171 if (isp->smk_flags & SMK_INODE_IMPURE) 172 pr_info("Smack Unconfined Corruption: inode=(%s %ld) %s\n", 173 inode->i_sb->s_id, inode->i_ino, current->comm); 174 175 if (rc <= 0) 176 return rc; 177 if (rc > SMACK_UNCONFINED_OBJECT) 178 rc = 0; 179 if (rc == SMACK_UNCONFINED_SUBJECT && 180 (mode & (MAY_WRITE | MAY_APPEND))) 181 isp->smk_flags |= SMK_INODE_IMPURE; 182 183 smk_bu_mode(mode, acc); 184 185 pr_info("Smack %s: (%s %s %s) inode=(%s %ld) %s\n", smk_bu_mess[rc], 186 tsp->smk_task->smk_known, isp->smk_inode->smk_known, acc, 187 inode->i_sb->s_id, inode->i_ino, current->comm); 188 return 0; 189 } 190 #else 191 #define smk_bu_inode(inode, mode, RC) (RC) 192 #endif 193 194 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 195 static int smk_bu_file(struct file *file, int mode, int rc) 196 { 197 struct task_smack *tsp = current_security(); 198 struct smack_known *sskp = tsp->smk_task; 199 struct inode *inode = file_inode(file); 200 struct inode_smack *isp = inode->i_security; 201 char acc[SMK_NUM_ACCESS_TYPE + 1]; 202 203 if (isp->smk_flags & SMK_INODE_IMPURE) 204 pr_info("Smack Unconfined Corruption: inode=(%s %ld) %s\n", 205 inode->i_sb->s_id, inode->i_ino, current->comm); 206 207 if (rc <= 0) 208 return rc; 209 if (rc > SMACK_UNCONFINED_OBJECT) 210 rc = 0; 211 212 smk_bu_mode(mode, acc); 213 pr_info("Smack %s: (%s %s %s) file=(%s %ld %pD) %s\n", smk_bu_mess[rc], 214 sskp->smk_known, smk_of_inode(inode)->smk_known, acc, 215 inode->i_sb->s_id, inode->i_ino, file, 216 current->comm); 217 return 0; 218 } 219 #else 220 #define smk_bu_file(file, mode, RC) (RC) 221 #endif 222 223 #ifdef CONFIG_SECURITY_SMACK_BRINGUP 224 static int smk_bu_credfile(const struct cred *cred, struct file *file, 225 int mode, int rc) 226 { 227 struct task_smack *tsp = cred->security; 228 struct smack_known *sskp = tsp->smk_task; 229 struct inode *inode = file_inode(file); 230 struct inode_smack *isp = inode->i_security; 231 char acc[SMK_NUM_ACCESS_TYPE + 1]; 232 233 if (isp->smk_flags & SMK_INODE_IMPURE) 234 pr_info("Smack Unconfined Corruption: inode=(%s %ld) %s\n", 235 inode->i_sb->s_id, inode->i_ino, current->comm); 236 237 if (rc <= 0) 238 return rc; 239 if (rc > SMACK_UNCONFINED_OBJECT) 240 rc = 0; 241 242 smk_bu_mode(mode, acc); 243 pr_info("Smack %s: (%s %s %s) file=(%s %ld %pD) %s\n", smk_bu_mess[rc], 244 sskp->smk_known, smk_of_inode(inode)->smk_known, acc, 245 inode->i_sb->s_id, inode->i_ino, file, 246 current->comm); 247 return 0; 248 } 249 #else 250 #define smk_bu_credfile(cred, file, mode, RC) (RC) 251 #endif 252 253 /** 254 * smk_fetch - Fetch the smack label from a file. 255 * @name: type of the label (attribute) 256 * @ip: a pointer to the inode 257 * @dp: a pointer to the dentry 258 * 259 * Returns a pointer to the master list entry for the Smack label, 260 * NULL if there was no label to fetch, or an error code. 261 */ 262 static struct smack_known *smk_fetch(const char *name, struct inode *ip, 263 struct dentry *dp) 264 { 265 int rc; 266 char *buffer; 267 struct smack_known *skp = NULL; 268 269 if (!(ip->i_opflags & IOP_XATTR)) 270 return ERR_PTR(-EOPNOTSUPP); 271 272 buffer = kzalloc(SMK_LONGLABEL, GFP_KERNEL); 273 if (buffer == NULL) 274 return ERR_PTR(-ENOMEM); 275 276 rc = __vfs_getxattr(dp, ip, name, buffer, SMK_LONGLABEL); 277 if (rc < 0) 278 skp = ERR_PTR(rc); 279 else if (rc == 0) 280 skp = NULL; 281 else 282 skp = smk_import_entry(buffer, rc); 283 284 kfree(buffer); 285 286 return skp; 287 } 288 289 /** 290 * new_inode_smack - allocate an inode security blob 291 * @skp: a pointer to the Smack label entry to use in the blob 292 * 293 * Returns the new blob or NULL if there's no memory available 294 */ 295 static struct inode_smack *new_inode_smack(struct smack_known *skp) 296 { 297 struct inode_smack *isp; 298 299 isp = kmem_cache_zalloc(smack_inode_cache, GFP_NOFS); 300 if (isp == NULL) 301 return NULL; 302 303 isp->smk_inode = skp; 304 isp->smk_flags = 0; 305 mutex_init(&isp->smk_lock); 306 307 return isp; 308 } 309 310 /** 311 * new_task_smack - allocate a task security blob 312 * @task: a pointer to the Smack label for the running task 313 * @forked: a pointer to the Smack label for the forked task 314 * @gfp: type of the memory for the allocation 315 * 316 * Returns the new blob or NULL if there's no memory available 317 */ 318 static struct task_smack *new_task_smack(struct smack_known *task, 319 struct smack_known *forked, gfp_t gfp) 320 { 321 struct task_smack *tsp; 322 323 tsp = kzalloc(sizeof(struct task_smack), gfp); 324 if (tsp == NULL) 325 return NULL; 326 327 tsp->smk_task = task; 328 tsp->smk_forked = forked; 329 INIT_LIST_HEAD(&tsp->smk_rules); 330 INIT_LIST_HEAD(&tsp->smk_relabel); 331 mutex_init(&tsp->smk_rules_lock); 332 333 return tsp; 334 } 335 336 /** 337 * smk_copy_rules - copy a rule set 338 * @nhead: new rules header pointer 339 * @ohead: old rules header pointer 340 * @gfp: type of the memory for the allocation 341 * 342 * Returns 0 on success, -ENOMEM on error 343 */ 344 static int smk_copy_rules(struct list_head *nhead, struct list_head *ohead, 345 gfp_t gfp) 346 { 347 struct smack_rule *nrp; 348 struct smack_rule *orp; 349 int rc = 0; 350 351 list_for_each_entry_rcu(orp, ohead, list) { 352 nrp = kzalloc(sizeof(struct smack_rule), gfp); 353 if (nrp == NULL) { 354 rc = -ENOMEM; 355 break; 356 } 357 *nrp = *orp; 358 list_add_rcu(&nrp->list, nhead); 359 } 360 return rc; 361 } 362 363 /** 364 * smk_copy_relabel - copy smk_relabel labels list 365 * @nhead: new rules header pointer 366 * @ohead: old rules header pointer 367 * @gfp: type of the memory for the allocation 368 * 369 * Returns 0 on success, -ENOMEM on error 370 */ 371 static int smk_copy_relabel(struct list_head *nhead, struct list_head *ohead, 372 gfp_t gfp) 373 { 374 struct smack_known_list_elem *nklep; 375 struct smack_known_list_elem *oklep; 376 377 list_for_each_entry(oklep, ohead, list) { 378 nklep = kzalloc(sizeof(struct smack_known_list_elem), gfp); 379 if (nklep == NULL) { 380 smk_destroy_label_list(nhead); 381 return -ENOMEM; 382 } 383 nklep->smk_label = oklep->smk_label; 384 list_add(&nklep->list, nhead); 385 } 386 387 return 0; 388 } 389 390 /** 391 * smk_ptrace_mode - helper function for converting PTRACE_MODE_* into MAY_* 392 * @mode - input mode in form of PTRACE_MODE_* 393 * 394 * Returns a converted MAY_* mode usable by smack rules 395 */ 396 static inline unsigned int smk_ptrace_mode(unsigned int mode) 397 { 398 if (mode & PTRACE_MODE_ATTACH) 399 return MAY_READWRITE; 400 if (mode & PTRACE_MODE_READ) 401 return MAY_READ; 402 403 return 0; 404 } 405 406 /** 407 * smk_ptrace_rule_check - helper for ptrace access 408 * @tracer: tracer process 409 * @tracee_known: label entry of the process that's about to be traced 410 * @mode: ptrace attachment mode (PTRACE_MODE_*) 411 * @func: name of the function that called us, used for audit 412 * 413 * Returns 0 on access granted, -error on error 414 */ 415 static int smk_ptrace_rule_check(struct task_struct *tracer, 416 struct smack_known *tracee_known, 417 unsigned int mode, const char *func) 418 { 419 int rc; 420 struct smk_audit_info ad, *saip = NULL; 421 struct task_smack *tsp; 422 struct smack_known *tracer_known; 423 424 if ((mode & PTRACE_MODE_NOAUDIT) == 0) { 425 smk_ad_init(&ad, func, LSM_AUDIT_DATA_TASK); 426 smk_ad_setfield_u_tsk(&ad, tracer); 427 saip = &ad; 428 } 429 430 rcu_read_lock(); 431 tsp = __task_cred(tracer)->security; 432 tracer_known = smk_of_task(tsp); 433 434 if ((mode & PTRACE_MODE_ATTACH) && 435 (smack_ptrace_rule == SMACK_PTRACE_EXACT || 436 smack_ptrace_rule == SMACK_PTRACE_DRACONIAN)) { 437 if (tracer_known->smk_known == tracee_known->smk_known) 438 rc = 0; 439 else if (smack_ptrace_rule == SMACK_PTRACE_DRACONIAN) 440 rc = -EACCES; 441 else if (capable(CAP_SYS_PTRACE)) 442 rc = 0; 443 else 444 rc = -EACCES; 445 446 if (saip) 447 smack_log(tracer_known->smk_known, 448 tracee_known->smk_known, 449 0, rc, saip); 450 451 rcu_read_unlock(); 452 return rc; 453 } 454 455 /* In case of rule==SMACK_PTRACE_DEFAULT or mode==PTRACE_MODE_READ */ 456 rc = smk_tskacc(tsp, tracee_known, smk_ptrace_mode(mode), saip); 457 458 rcu_read_unlock(); 459 return rc; 460 } 461 462 /* 463 * LSM hooks. 464 * We he, that is fun! 465 */ 466 467 /** 468 * smack_ptrace_access_check - Smack approval on PTRACE_ATTACH 469 * @ctp: child task pointer 470 * @mode: ptrace attachment mode (PTRACE_MODE_*) 471 * 472 * Returns 0 if access is OK, an error code otherwise 473 * 474 * Do the capability checks. 475 */ 476 static int smack_ptrace_access_check(struct task_struct *ctp, unsigned int mode) 477 { 478 struct smack_known *skp; 479 480 skp = smk_of_task_struct(ctp); 481 482 return smk_ptrace_rule_check(current, skp, mode, __func__); 483 } 484 485 /** 486 * smack_ptrace_traceme - Smack approval on PTRACE_TRACEME 487 * @ptp: parent task pointer 488 * 489 * Returns 0 if access is OK, an error code otherwise 490 * 491 * Do the capability checks, and require PTRACE_MODE_ATTACH. 492 */ 493 static int smack_ptrace_traceme(struct task_struct *ptp) 494 { 495 int rc; 496 struct smack_known *skp; 497 498 skp = smk_of_task(current_security()); 499 500 rc = smk_ptrace_rule_check(ptp, skp, PTRACE_MODE_ATTACH, __func__); 501 return rc; 502 } 503 504 /** 505 * smack_syslog - Smack approval on syslog 506 * @type: message type 507 * 508 * Returns 0 on success, error code otherwise. 509 */ 510 static int smack_syslog(int typefrom_file) 511 { 512 int rc = 0; 513 struct smack_known *skp = smk_of_current(); 514 515 if (smack_privileged(CAP_MAC_OVERRIDE)) 516 return 0; 517 518 if (smack_syslog_label != NULL && smack_syslog_label != skp) 519 rc = -EACCES; 520 521 return rc; 522 } 523 524 525 /* 526 * Superblock Hooks. 527 */ 528 529 /** 530 * smack_sb_alloc_security - allocate a superblock blob 531 * @sb: the superblock getting the blob 532 * 533 * Returns 0 on success or -ENOMEM on error. 534 */ 535 static int smack_sb_alloc_security(struct super_block *sb) 536 { 537 struct superblock_smack *sbsp; 538 539 sbsp = kzalloc(sizeof(struct superblock_smack), GFP_KERNEL); 540 541 if (sbsp == NULL) 542 return -ENOMEM; 543 544 sbsp->smk_root = &smack_known_floor; 545 sbsp->smk_default = &smack_known_floor; 546 sbsp->smk_floor = &smack_known_floor; 547 sbsp->smk_hat = &smack_known_hat; 548 /* 549 * SMK_SB_INITIALIZED will be zero from kzalloc. 550 */ 551 sb->s_security = sbsp; 552 553 return 0; 554 } 555 556 /** 557 * smack_sb_free_security - free a superblock blob 558 * @sb: the superblock getting the blob 559 * 560 */ 561 static void smack_sb_free_security(struct super_block *sb) 562 { 563 kfree(sb->s_security); 564 sb->s_security = NULL; 565 } 566 567 /** 568 * smack_sb_copy_data - copy mount options data for processing 569 * @orig: where to start 570 * @smackopts: mount options string 571 * 572 * Returns 0 on success or -ENOMEM on error. 573 * 574 * Copy the Smack specific mount options out of the mount 575 * options list. 576 */ 577 static int smack_sb_copy_data(char *orig, char *smackopts) 578 { 579 char *cp, *commap, *otheropts, *dp; 580 581 otheropts = (char *)get_zeroed_page(GFP_KERNEL); 582 if (otheropts == NULL) 583 return -ENOMEM; 584 585 for (cp = orig, commap = orig; commap != NULL; cp = commap + 1) { 586 if (strstr(cp, SMK_FSDEFAULT) == cp) 587 dp = smackopts; 588 else if (strstr(cp, SMK_FSFLOOR) == cp) 589 dp = smackopts; 590 else if (strstr(cp, SMK_FSHAT) == cp) 591 dp = smackopts; 592 else if (strstr(cp, SMK_FSROOT) == cp) 593 dp = smackopts; 594 else if (strstr(cp, SMK_FSTRANS) == cp) 595 dp = smackopts; 596 else 597 dp = otheropts; 598 599 commap = strchr(cp, ','); 600 if (commap != NULL) 601 *commap = '\0'; 602 603 if (*dp != '\0') 604 strcat(dp, ","); 605 strcat(dp, cp); 606 } 607 608 strcpy(orig, otheropts); 609 free_page((unsigned long)otheropts); 610 611 return 0; 612 } 613 614 /** 615 * smack_parse_opts_str - parse Smack specific mount options 616 * @options: mount options string 617 * @opts: where to store converted mount opts 618 * 619 * Returns 0 on success or -ENOMEM on error. 620 * 621 * converts Smack specific mount options to generic security option format 622 */ 623 static int smack_parse_opts_str(char *options, 624 struct security_mnt_opts *opts) 625 { 626 char *p; 627 char *fsdefault = NULL; 628 char *fsfloor = NULL; 629 char *fshat = NULL; 630 char *fsroot = NULL; 631 char *fstransmute = NULL; 632 int rc = -ENOMEM; 633 int num_mnt_opts = 0; 634 int token; 635 636 opts->num_mnt_opts = 0; 637 638 if (!options) 639 return 0; 640 641 while ((p = strsep(&options, ",")) != NULL) { 642 substring_t args[MAX_OPT_ARGS]; 643 644 if (!*p) 645 continue; 646 647 token = match_token(p, smk_mount_tokens, args); 648 649 switch (token) { 650 case Opt_fsdefault: 651 if (fsdefault) 652 goto out_opt_err; 653 fsdefault = match_strdup(&args[0]); 654 if (!fsdefault) 655 goto out_err; 656 break; 657 case Opt_fsfloor: 658 if (fsfloor) 659 goto out_opt_err; 660 fsfloor = match_strdup(&args[0]); 661 if (!fsfloor) 662 goto out_err; 663 break; 664 case Opt_fshat: 665 if (fshat) 666 goto out_opt_err; 667 fshat = match_strdup(&args[0]); 668 if (!fshat) 669 goto out_err; 670 break; 671 case Opt_fsroot: 672 if (fsroot) 673 goto out_opt_err; 674 fsroot = match_strdup(&args[0]); 675 if (!fsroot) 676 goto out_err; 677 break; 678 case Opt_fstransmute: 679 if (fstransmute) 680 goto out_opt_err; 681 fstransmute = match_strdup(&args[0]); 682 if (!fstransmute) 683 goto out_err; 684 break; 685 default: 686 rc = -EINVAL; 687 pr_warn("Smack: unknown mount option\n"); 688 goto out_err; 689 } 690 } 691 692 opts->mnt_opts = kcalloc(NUM_SMK_MNT_OPTS, sizeof(char *), GFP_KERNEL); 693 if (!opts->mnt_opts) 694 goto out_err; 695 696 opts->mnt_opts_flags = kcalloc(NUM_SMK_MNT_OPTS, sizeof(int), 697 GFP_KERNEL); 698 if (!opts->mnt_opts_flags) 699 goto out_err; 700 701 if (fsdefault) { 702 opts->mnt_opts[num_mnt_opts] = fsdefault; 703 opts->mnt_opts_flags[num_mnt_opts++] = FSDEFAULT_MNT; 704 } 705 if (fsfloor) { 706 opts->mnt_opts[num_mnt_opts] = fsfloor; 707 opts->mnt_opts_flags[num_mnt_opts++] = FSFLOOR_MNT; 708 } 709 if (fshat) { 710 opts->mnt_opts[num_mnt_opts] = fshat; 711 opts->mnt_opts_flags[num_mnt_opts++] = FSHAT_MNT; 712 } 713 if (fsroot) { 714 opts->mnt_opts[num_mnt_opts] = fsroot; 715 opts->mnt_opts_flags[num_mnt_opts++] = FSROOT_MNT; 716 } 717 if (fstransmute) { 718 opts->mnt_opts[num_mnt_opts] = fstransmute; 719 opts->mnt_opts_flags[num_mnt_opts++] = FSTRANS_MNT; 720 } 721 722 opts->num_mnt_opts = num_mnt_opts; 723 return 0; 724 725 out_opt_err: 726 rc = -EINVAL; 727 pr_warn("Smack: duplicate mount options\n"); 728 729 out_err: 730 kfree(fsdefault); 731 kfree(fsfloor); 732 kfree(fshat); 733 kfree(fsroot); 734 kfree(fstransmute); 735 return rc; 736 } 737 738 /** 739 * smack_set_mnt_opts - set Smack specific mount options 740 * @sb: the file system superblock 741 * @opts: Smack mount options 742 * @kern_flags: mount option from kernel space or user space 743 * @set_kern_flags: where to store converted mount opts 744 * 745 * Returns 0 on success, an error code on failure 746 * 747 * Allow filesystems with binary mount data to explicitly set Smack mount 748 * labels. 749 */ 750 static int smack_set_mnt_opts(struct super_block *sb, 751 struct security_mnt_opts *opts, 752 unsigned long kern_flags, 753 unsigned long *set_kern_flags) 754 { 755 struct dentry *root = sb->s_root; 756 struct inode *inode = d_backing_inode(root); 757 struct superblock_smack *sp = sb->s_security; 758 struct inode_smack *isp; 759 struct smack_known *skp; 760 int i; 761 int num_opts = opts->num_mnt_opts; 762 int transmute = 0; 763 764 if (sp->smk_flags & SMK_SB_INITIALIZED) 765 return 0; 766 767 if (!smack_privileged(CAP_MAC_ADMIN)) { 768 /* 769 * Unprivileged mounts don't get to specify Smack values. 770 */ 771 if (num_opts) 772 return -EPERM; 773 /* 774 * Unprivileged mounts get root and default from the caller. 775 */ 776 skp = smk_of_current(); 777 sp->smk_root = skp; 778 sp->smk_default = skp; 779 /* 780 * For a handful of fs types with no user-controlled 781 * backing store it's okay to trust security labels 782 * in the filesystem. The rest are untrusted. 783 */ 784 if (sb->s_user_ns != &init_user_ns && 785 sb->s_magic != SYSFS_MAGIC && sb->s_magic != TMPFS_MAGIC && 786 sb->s_magic != RAMFS_MAGIC) { 787 transmute = 1; 788 sp->smk_flags |= SMK_SB_UNTRUSTED; 789 } 790 } 791 792 sp->smk_flags |= SMK_SB_INITIALIZED; 793 794 for (i = 0; i < num_opts; i++) { 795 switch (opts->mnt_opts_flags[i]) { 796 case FSDEFAULT_MNT: 797 skp = smk_import_entry(opts->mnt_opts[i], 0); 798 if (IS_ERR(skp)) 799 return PTR_ERR(skp); 800 sp->smk_default = skp; 801 break; 802 case FSFLOOR_MNT: 803 skp = smk_import_entry(opts->mnt_opts[i], 0); 804 if (IS_ERR(skp)) 805 return PTR_ERR(skp); 806 sp->smk_floor = skp; 807 break; 808 case FSHAT_MNT: 809 skp = smk_import_entry(opts->mnt_opts[i], 0); 810 if (IS_ERR(skp)) 811 return PTR_ERR(skp); 812 sp->smk_hat = skp; 813 break; 814 case FSROOT_MNT: 815 skp = smk_import_entry(opts->mnt_opts[i], 0); 816 if (IS_ERR(skp)) 817 return PTR_ERR(skp); 818 sp->smk_root = skp; 819 break; 820 case FSTRANS_MNT: 821 skp = smk_import_entry(opts->mnt_opts[i], 0); 822 if (IS_ERR(skp)) 823 return PTR_ERR(skp); 824 sp->smk_root = skp; 825 transmute = 1; 826 break; 827 default: 828 break; 829 } 830 } 831 832 /* 833 * Initialize the root inode. 834 */ 835 isp = inode->i_security; 836 if (isp == NULL) { 837 isp = new_inode_smack(sp->smk_root); 838 if (isp == NULL) 839 return -ENOMEM; 840 inode->i_security = isp; 841 } else 842 isp->smk_inode = sp->smk_root; 843 844 if (transmute) 845 isp->smk_flags |= SMK_INODE_TRANSMUTE; 846 847 return 0; 848 } 849 850 /** 851 * smack_sb_kern_mount - Smack specific mount processing 852 * @sb: the file system superblock 853 * @flags: the mount flags 854 * @data: the smack mount options 855 * 856 * Returns 0 on success, an error code on failure 857 */ 858 static int smack_sb_kern_mount(struct super_block *sb, int flags, void *data) 859 { 860 int rc = 0; 861 char *options = data; 862 struct security_mnt_opts opts; 863 864 security_init_mnt_opts(&opts); 865 866 if (!options) 867 goto out; 868 869 rc = smack_parse_opts_str(options, &opts); 870 if (rc) 871 goto out_err; 872 873 out: 874 rc = smack_set_mnt_opts(sb, &opts, 0, NULL); 875 876 out_err: 877 security_free_mnt_opts(&opts); 878 return rc; 879 } 880 881 /** 882 * smack_sb_statfs - Smack check on statfs 883 * @dentry: identifies the file system in question 884 * 885 * Returns 0 if current can read the floor of the filesystem, 886 * and error code otherwise 887 */ 888 static int smack_sb_statfs(struct dentry *dentry) 889 { 890 struct superblock_smack *sbp = dentry->d_sb->s_security; 891 int rc; 892 struct smk_audit_info ad; 893 894 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); 895 smk_ad_setfield_u_fs_path_dentry(&ad, dentry); 896 897 rc = smk_curacc(sbp->smk_floor, MAY_READ, &ad); 898 rc = smk_bu_current("statfs", sbp->smk_floor, MAY_READ, rc); 899 return rc; 900 } 901 902 /* 903 * BPRM hooks 904 */ 905 906 /** 907 * smack_bprm_set_creds - set creds for exec 908 * @bprm: the exec information 909 * 910 * Returns 0 if it gets a blob, -EPERM if exec forbidden and -ENOMEM otherwise 911 */ 912 static int smack_bprm_set_creds(struct linux_binprm *bprm) 913 { 914 struct inode *inode = file_inode(bprm->file); 915 struct task_smack *bsp = bprm->cred->security; 916 struct inode_smack *isp; 917 struct superblock_smack *sbsp; 918 int rc; 919 920 if (bprm->called_set_creds) 921 return 0; 922 923 isp = inode->i_security; 924 if (isp->smk_task == NULL || isp->smk_task == bsp->smk_task) 925 return 0; 926 927 sbsp = inode->i_sb->s_security; 928 if ((sbsp->smk_flags & SMK_SB_UNTRUSTED) && 929 isp->smk_task != sbsp->smk_root) 930 return 0; 931 932 if (bprm->unsafe & LSM_UNSAFE_PTRACE) { 933 struct task_struct *tracer; 934 rc = 0; 935 936 rcu_read_lock(); 937 tracer = ptrace_parent(current); 938 if (likely(tracer != NULL)) 939 rc = smk_ptrace_rule_check(tracer, 940 isp->smk_task, 941 PTRACE_MODE_ATTACH, 942 __func__); 943 rcu_read_unlock(); 944 945 if (rc != 0) 946 return rc; 947 } else if (bprm->unsafe) 948 return -EPERM; 949 950 bsp->smk_task = isp->smk_task; 951 bprm->per_clear |= PER_CLEAR_ON_SETID; 952 953 /* Decide if this is a secure exec. */ 954 if (bsp->smk_task != bsp->smk_forked) 955 bprm->secureexec = 1; 956 957 return 0; 958 } 959 960 /* 961 * Inode hooks 962 */ 963 964 /** 965 * smack_inode_alloc_security - allocate an inode blob 966 * @inode: the inode in need of a blob 967 * 968 * Returns 0 if it gets a blob, -ENOMEM otherwise 969 */ 970 static int smack_inode_alloc_security(struct inode *inode) 971 { 972 struct smack_known *skp = smk_of_current(); 973 974 inode->i_security = new_inode_smack(skp); 975 if (inode->i_security == NULL) 976 return -ENOMEM; 977 return 0; 978 } 979 980 /** 981 * smack_inode_free_rcu - Free inode_smack blob from cache 982 * @head: the rcu_head for getting inode_smack pointer 983 * 984 * Call back function called from call_rcu() to free 985 * the i_security blob pointer in inode 986 */ 987 static void smack_inode_free_rcu(struct rcu_head *head) 988 { 989 struct inode_smack *issp; 990 991 issp = container_of(head, struct inode_smack, smk_rcu); 992 kmem_cache_free(smack_inode_cache, issp); 993 } 994 995 /** 996 * smack_inode_free_security - free an inode blob using call_rcu() 997 * @inode: the inode with a blob 998 * 999 * Clears the blob pointer in inode using RCU 1000 */ 1001 static void smack_inode_free_security(struct inode *inode) 1002 { 1003 struct inode_smack *issp = inode->i_security; 1004 1005 /* 1006 * The inode may still be referenced in a path walk and 1007 * a call to smack_inode_permission() can be made 1008 * after smack_inode_free_security() is called. 1009 * To avoid race condition free the i_security via RCU 1010 * and leave the current inode->i_security pointer intact. 1011 * The inode will be freed after the RCU grace period too. 1012 */ 1013 call_rcu(&issp->smk_rcu, smack_inode_free_rcu); 1014 } 1015 1016 /** 1017 * smack_inode_init_security - copy out the smack from an inode 1018 * @inode: the newly created inode 1019 * @dir: containing directory object 1020 * @qstr: unused 1021 * @name: where to put the attribute name 1022 * @value: where to put the attribute value 1023 * @len: where to put the length of the attribute 1024 * 1025 * Returns 0 if it all works out, -ENOMEM if there's no memory 1026 */ 1027 static int smack_inode_init_security(struct inode *inode, struct inode *dir, 1028 const struct qstr *qstr, const char **name, 1029 void **value, size_t *len) 1030 { 1031 struct inode_smack *issp = inode->i_security; 1032 struct smack_known *skp = smk_of_current(); 1033 struct smack_known *isp = smk_of_inode(inode); 1034 struct smack_known *dsp = smk_of_inode(dir); 1035 int may; 1036 1037 if (name) 1038 *name = XATTR_SMACK_SUFFIX; 1039 1040 if (value && len) { 1041 rcu_read_lock(); 1042 may = smk_access_entry(skp->smk_known, dsp->smk_known, 1043 &skp->smk_rules); 1044 rcu_read_unlock(); 1045 1046 /* 1047 * If the access rule allows transmutation and 1048 * the directory requests transmutation then 1049 * by all means transmute. 1050 * Mark the inode as changed. 1051 */ 1052 if (may > 0 && ((may & MAY_TRANSMUTE) != 0) && 1053 smk_inode_transmutable(dir)) { 1054 isp = dsp; 1055 issp->smk_flags |= SMK_INODE_CHANGED; 1056 } 1057 1058 *value = kstrdup(isp->smk_known, GFP_NOFS); 1059 if (*value == NULL) 1060 return -ENOMEM; 1061 1062 *len = strlen(isp->smk_known); 1063 } 1064 1065 return 0; 1066 } 1067 1068 /** 1069 * smack_inode_link - Smack check on link 1070 * @old_dentry: the existing object 1071 * @dir: unused 1072 * @new_dentry: the new object 1073 * 1074 * Returns 0 if access is permitted, an error code otherwise 1075 */ 1076 static int smack_inode_link(struct dentry *old_dentry, struct inode *dir, 1077 struct dentry *new_dentry) 1078 { 1079 struct smack_known *isp; 1080 struct smk_audit_info ad; 1081 int rc; 1082 1083 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); 1084 smk_ad_setfield_u_fs_path_dentry(&ad, old_dentry); 1085 1086 isp = smk_of_inode(d_backing_inode(old_dentry)); 1087 rc = smk_curacc(isp, MAY_WRITE, &ad); 1088 rc = smk_bu_inode(d_backing_inode(old_dentry), MAY_WRITE, rc); 1089 1090 if (rc == 0 && d_is_positive(new_dentry)) { 1091 isp = smk_of_inode(d_backing_inode(new_dentry)); 1092 smk_ad_setfield_u_fs_path_dentry(&ad, new_dentry); 1093 rc = smk_curacc(isp, MAY_WRITE, &ad); 1094 rc = smk_bu_inode(d_backing_inode(new_dentry), MAY_WRITE, rc); 1095 } 1096 1097 return rc; 1098 } 1099 1100 /** 1101 * smack_inode_unlink - Smack check on inode deletion 1102 * @dir: containing directory object 1103 * @dentry: file to unlink 1104 * 1105 * Returns 0 if current can write the containing directory 1106 * and the object, error code otherwise 1107 */ 1108 static int smack_inode_unlink(struct inode *dir, struct dentry *dentry) 1109 { 1110 struct inode *ip = d_backing_inode(dentry); 1111 struct smk_audit_info ad; 1112 int rc; 1113 1114 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); 1115 smk_ad_setfield_u_fs_path_dentry(&ad, dentry); 1116 1117 /* 1118 * You need write access to the thing you're unlinking 1119 */ 1120 rc = smk_curacc(smk_of_inode(ip), MAY_WRITE, &ad); 1121 rc = smk_bu_inode(ip, MAY_WRITE, rc); 1122 if (rc == 0) { 1123 /* 1124 * You also need write access to the containing directory 1125 */ 1126 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_INODE); 1127 smk_ad_setfield_u_fs_inode(&ad, dir); 1128 rc = smk_curacc(smk_of_inode(dir), MAY_WRITE, &ad); 1129 rc = smk_bu_inode(dir, MAY_WRITE, rc); 1130 } 1131 return rc; 1132 } 1133 1134 /** 1135 * smack_inode_rmdir - Smack check on directory deletion 1136 * @dir: containing directory object 1137 * @dentry: directory to unlink 1138 * 1139 * Returns 0 if current can write the containing directory 1140 * and the directory, error code otherwise 1141 */ 1142 static int smack_inode_rmdir(struct inode *dir, struct dentry *dentry) 1143 { 1144 struct smk_audit_info ad; 1145 int rc; 1146 1147 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); 1148 smk_ad_setfield_u_fs_path_dentry(&ad, dentry); 1149 1150 /* 1151 * You need write access to the thing you're removing 1152 */ 1153 rc = smk_curacc(smk_of_inode(d_backing_inode(dentry)), MAY_WRITE, &ad); 1154 rc = smk_bu_inode(d_backing_inode(dentry), MAY_WRITE, rc); 1155 if (rc == 0) { 1156 /* 1157 * You also need write access to the containing directory 1158 */ 1159 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_INODE); 1160 smk_ad_setfield_u_fs_inode(&ad, dir); 1161 rc = smk_curacc(smk_of_inode(dir), MAY_WRITE, &ad); 1162 rc = smk_bu_inode(dir, MAY_WRITE, rc); 1163 } 1164 1165 return rc; 1166 } 1167 1168 /** 1169 * smack_inode_rename - Smack check on rename 1170 * @old_inode: unused 1171 * @old_dentry: the old object 1172 * @new_inode: unused 1173 * @new_dentry: the new object 1174 * 1175 * Read and write access is required on both the old and 1176 * new directories. 1177 * 1178 * Returns 0 if access is permitted, an error code otherwise 1179 */ 1180 static int smack_inode_rename(struct inode *old_inode, 1181 struct dentry *old_dentry, 1182 struct inode *new_inode, 1183 struct dentry *new_dentry) 1184 { 1185 int rc; 1186 struct smack_known *isp; 1187 struct smk_audit_info ad; 1188 1189 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); 1190 smk_ad_setfield_u_fs_path_dentry(&ad, old_dentry); 1191 1192 isp = smk_of_inode(d_backing_inode(old_dentry)); 1193 rc = smk_curacc(isp, MAY_READWRITE, &ad); 1194 rc = smk_bu_inode(d_backing_inode(old_dentry), MAY_READWRITE, rc); 1195 1196 if (rc == 0 && d_is_positive(new_dentry)) { 1197 isp = smk_of_inode(d_backing_inode(new_dentry)); 1198 smk_ad_setfield_u_fs_path_dentry(&ad, new_dentry); 1199 rc = smk_curacc(isp, MAY_READWRITE, &ad); 1200 rc = smk_bu_inode(d_backing_inode(new_dentry), MAY_READWRITE, rc); 1201 } 1202 return rc; 1203 } 1204 1205 /** 1206 * smack_inode_permission - Smack version of permission() 1207 * @inode: the inode in question 1208 * @mask: the access requested 1209 * 1210 * This is the important Smack hook. 1211 * 1212 * Returns 0 if access is permitted, -EACCES otherwise 1213 */ 1214 static int smack_inode_permission(struct inode *inode, int mask) 1215 { 1216 struct superblock_smack *sbsp = inode->i_sb->s_security; 1217 struct smk_audit_info ad; 1218 int no_block = mask & MAY_NOT_BLOCK; 1219 int rc; 1220 1221 mask &= (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND); 1222 /* 1223 * No permission to check. Existence test. Yup, it's there. 1224 */ 1225 if (mask == 0) 1226 return 0; 1227 1228 if (sbsp->smk_flags & SMK_SB_UNTRUSTED) { 1229 if (smk_of_inode(inode) != sbsp->smk_root) 1230 return -EACCES; 1231 } 1232 1233 /* May be droppable after audit */ 1234 if (no_block) 1235 return -ECHILD; 1236 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_INODE); 1237 smk_ad_setfield_u_fs_inode(&ad, inode); 1238 rc = smk_curacc(smk_of_inode(inode), mask, &ad); 1239 rc = smk_bu_inode(inode, mask, rc); 1240 return rc; 1241 } 1242 1243 /** 1244 * smack_inode_setattr - Smack check for setting attributes 1245 * @dentry: the object 1246 * @iattr: for the force flag 1247 * 1248 * Returns 0 if access is permitted, an error code otherwise 1249 */ 1250 static int smack_inode_setattr(struct dentry *dentry, struct iattr *iattr) 1251 { 1252 struct smk_audit_info ad; 1253 int rc; 1254 1255 /* 1256 * Need to allow for clearing the setuid bit. 1257 */ 1258 if (iattr->ia_valid & ATTR_FORCE) 1259 return 0; 1260 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); 1261 smk_ad_setfield_u_fs_path_dentry(&ad, dentry); 1262 1263 rc = smk_curacc(smk_of_inode(d_backing_inode(dentry)), MAY_WRITE, &ad); 1264 rc = smk_bu_inode(d_backing_inode(dentry), MAY_WRITE, rc); 1265 return rc; 1266 } 1267 1268 /** 1269 * smack_inode_getattr - Smack check for getting attributes 1270 * @mnt: vfsmount of the object 1271 * @dentry: the object 1272 * 1273 * Returns 0 if access is permitted, an error code otherwise 1274 */ 1275 static int smack_inode_getattr(const struct path *path) 1276 { 1277 struct smk_audit_info ad; 1278 struct inode *inode = d_backing_inode(path->dentry); 1279 int rc; 1280 1281 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_PATH); 1282 smk_ad_setfield_u_fs_path(&ad, *path); 1283 rc = smk_curacc(smk_of_inode(inode), MAY_READ, &ad); 1284 rc = smk_bu_inode(inode, MAY_READ, rc); 1285 return rc; 1286 } 1287 1288 /** 1289 * smack_inode_setxattr - Smack check for setting xattrs 1290 * @dentry: the object 1291 * @name: name of the attribute 1292 * @value: value of the attribute 1293 * @size: size of the value 1294 * @flags: unused 1295 * 1296 * This protects the Smack attribute explicitly. 1297 * 1298 * Returns 0 if access is permitted, an error code otherwise 1299 */ 1300 static int smack_inode_setxattr(struct dentry *dentry, const char *name, 1301 const void *value, size_t size, int flags) 1302 { 1303 struct smk_audit_info ad; 1304 struct smack_known *skp; 1305 int check_priv = 0; 1306 int check_import = 0; 1307 int check_star = 0; 1308 int rc = 0; 1309 1310 /* 1311 * Check label validity here so import won't fail in post_setxattr 1312 */ 1313 if (strcmp(name, XATTR_NAME_SMACK) == 0 || 1314 strcmp(name, XATTR_NAME_SMACKIPIN) == 0 || 1315 strcmp(name, XATTR_NAME_SMACKIPOUT) == 0) { 1316 check_priv = 1; 1317 check_import = 1; 1318 } else if (strcmp(name, XATTR_NAME_SMACKEXEC) == 0 || 1319 strcmp(name, XATTR_NAME_SMACKMMAP) == 0) { 1320 check_priv = 1; 1321 check_import = 1; 1322 check_star = 1; 1323 } else if (strcmp(name, XATTR_NAME_SMACKTRANSMUTE) == 0) { 1324 check_priv = 1; 1325 if (size != TRANS_TRUE_SIZE || 1326 strncmp(value, TRANS_TRUE, TRANS_TRUE_SIZE) != 0) 1327 rc = -EINVAL; 1328 } else 1329 rc = cap_inode_setxattr(dentry, name, value, size, flags); 1330 1331 if (check_priv && !smack_privileged(CAP_MAC_ADMIN)) 1332 rc = -EPERM; 1333 1334 if (rc == 0 && check_import) { 1335 skp = size ? smk_import_entry(value, size) : NULL; 1336 if (IS_ERR(skp)) 1337 rc = PTR_ERR(skp); 1338 else if (skp == NULL || (check_star && 1339 (skp == &smack_known_star || skp == &smack_known_web))) 1340 rc = -EINVAL; 1341 } 1342 1343 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); 1344 smk_ad_setfield_u_fs_path_dentry(&ad, dentry); 1345 1346 if (rc == 0) { 1347 rc = smk_curacc(smk_of_inode(d_backing_inode(dentry)), MAY_WRITE, &ad); 1348 rc = smk_bu_inode(d_backing_inode(dentry), MAY_WRITE, rc); 1349 } 1350 1351 return rc; 1352 } 1353 1354 /** 1355 * smack_inode_post_setxattr - Apply the Smack update approved above 1356 * @dentry: object 1357 * @name: attribute name 1358 * @value: attribute value 1359 * @size: attribute size 1360 * @flags: unused 1361 * 1362 * Set the pointer in the inode blob to the entry found 1363 * in the master label list. 1364 */ 1365 static void smack_inode_post_setxattr(struct dentry *dentry, const char *name, 1366 const void *value, size_t size, int flags) 1367 { 1368 struct smack_known *skp; 1369 struct inode_smack *isp = d_backing_inode(dentry)->i_security; 1370 1371 if (strcmp(name, XATTR_NAME_SMACKTRANSMUTE) == 0) { 1372 isp->smk_flags |= SMK_INODE_TRANSMUTE; 1373 return; 1374 } 1375 1376 if (strcmp(name, XATTR_NAME_SMACK) == 0) { 1377 skp = smk_import_entry(value, size); 1378 if (!IS_ERR(skp)) 1379 isp->smk_inode = skp; 1380 } else if (strcmp(name, XATTR_NAME_SMACKEXEC) == 0) { 1381 skp = smk_import_entry(value, size); 1382 if (!IS_ERR(skp)) 1383 isp->smk_task = skp; 1384 } else if (strcmp(name, XATTR_NAME_SMACKMMAP) == 0) { 1385 skp = smk_import_entry(value, size); 1386 if (!IS_ERR(skp)) 1387 isp->smk_mmap = skp; 1388 } 1389 1390 return; 1391 } 1392 1393 /** 1394 * smack_inode_getxattr - Smack check on getxattr 1395 * @dentry: the object 1396 * @name: unused 1397 * 1398 * Returns 0 if access is permitted, an error code otherwise 1399 */ 1400 static int smack_inode_getxattr(struct dentry *dentry, const char *name) 1401 { 1402 struct smk_audit_info ad; 1403 int rc; 1404 1405 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); 1406 smk_ad_setfield_u_fs_path_dentry(&ad, dentry); 1407 1408 rc = smk_curacc(smk_of_inode(d_backing_inode(dentry)), MAY_READ, &ad); 1409 rc = smk_bu_inode(d_backing_inode(dentry), MAY_READ, rc); 1410 return rc; 1411 } 1412 1413 /** 1414 * smack_inode_removexattr - Smack check on removexattr 1415 * @dentry: the object 1416 * @name: name of the attribute 1417 * 1418 * Removing the Smack attribute requires CAP_MAC_ADMIN 1419 * 1420 * Returns 0 if access is permitted, an error code otherwise 1421 */ 1422 static int smack_inode_removexattr(struct dentry *dentry, const char *name) 1423 { 1424 struct inode_smack *isp; 1425 struct smk_audit_info ad; 1426 int rc = 0; 1427 1428 if (strcmp(name, XATTR_NAME_SMACK) == 0 || 1429 strcmp(name, XATTR_NAME_SMACKIPIN) == 0 || 1430 strcmp(name, XATTR_NAME_SMACKIPOUT) == 0 || 1431 strcmp(name, XATTR_NAME_SMACKEXEC) == 0 || 1432 strcmp(name, XATTR_NAME_SMACKTRANSMUTE) == 0 || 1433 strcmp(name, XATTR_NAME_SMACKMMAP) == 0) { 1434 if (!smack_privileged(CAP_MAC_ADMIN)) 1435 rc = -EPERM; 1436 } else 1437 rc = cap_inode_removexattr(dentry, name); 1438 1439 if (rc != 0) 1440 return rc; 1441 1442 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); 1443 smk_ad_setfield_u_fs_path_dentry(&ad, dentry); 1444 1445 rc = smk_curacc(smk_of_inode(d_backing_inode(dentry)), MAY_WRITE, &ad); 1446 rc = smk_bu_inode(d_backing_inode(dentry), MAY_WRITE, rc); 1447 if (rc != 0) 1448 return rc; 1449 1450 isp = d_backing_inode(dentry)->i_security; 1451 /* 1452 * Don't do anything special for these. 1453 * XATTR_NAME_SMACKIPIN 1454 * XATTR_NAME_SMACKIPOUT 1455 */ 1456 if (strcmp(name, XATTR_NAME_SMACK) == 0) { 1457 struct super_block *sbp = dentry->d_sb; 1458 struct superblock_smack *sbsp = sbp->s_security; 1459 1460 isp->smk_inode = sbsp->smk_default; 1461 } else if (strcmp(name, XATTR_NAME_SMACKEXEC) == 0) 1462 isp->smk_task = NULL; 1463 else if (strcmp(name, XATTR_NAME_SMACKMMAP) == 0) 1464 isp->smk_mmap = NULL; 1465 else if (strcmp(name, XATTR_NAME_SMACKTRANSMUTE) == 0) 1466 isp->smk_flags &= ~SMK_INODE_TRANSMUTE; 1467 1468 return 0; 1469 } 1470 1471 /** 1472 * smack_inode_getsecurity - get smack xattrs 1473 * @inode: the object 1474 * @name: attribute name 1475 * @buffer: where to put the result 1476 * @alloc: duplicate memory 1477 * 1478 * Returns the size of the attribute or an error code 1479 */ 1480 static int smack_inode_getsecurity(struct inode *inode, 1481 const char *name, void **buffer, 1482 bool alloc) 1483 { 1484 struct socket_smack *ssp; 1485 struct socket *sock; 1486 struct super_block *sbp; 1487 struct inode *ip = (struct inode *)inode; 1488 struct smack_known *isp; 1489 1490 if (strcmp(name, XATTR_SMACK_SUFFIX) == 0) 1491 isp = smk_of_inode(inode); 1492 else { 1493 /* 1494 * The rest of the Smack xattrs are only on sockets. 1495 */ 1496 sbp = ip->i_sb; 1497 if (sbp->s_magic != SOCKFS_MAGIC) 1498 return -EOPNOTSUPP; 1499 1500 sock = SOCKET_I(ip); 1501 if (sock == NULL || sock->sk == NULL) 1502 return -EOPNOTSUPP; 1503 1504 ssp = sock->sk->sk_security; 1505 1506 if (strcmp(name, XATTR_SMACK_IPIN) == 0) 1507 isp = ssp->smk_in; 1508 else if (strcmp(name, XATTR_SMACK_IPOUT) == 0) 1509 isp = ssp->smk_out; 1510 else 1511 return -EOPNOTSUPP; 1512 } 1513 1514 if (alloc) { 1515 *buffer = kstrdup(isp->smk_known, GFP_KERNEL); 1516 if (*buffer == NULL) 1517 return -ENOMEM; 1518 } 1519 1520 return strlen(isp->smk_known); 1521 } 1522 1523 1524 /** 1525 * smack_inode_listsecurity - list the Smack attributes 1526 * @inode: the object 1527 * @buffer: where they go 1528 * @buffer_size: size of buffer 1529 */ 1530 static int smack_inode_listsecurity(struct inode *inode, char *buffer, 1531 size_t buffer_size) 1532 { 1533 int len = sizeof(XATTR_NAME_SMACK); 1534 1535 if (buffer != NULL && len <= buffer_size) 1536 memcpy(buffer, XATTR_NAME_SMACK, len); 1537 1538 return len; 1539 } 1540 1541 /** 1542 * smack_inode_getsecid - Extract inode's security id 1543 * @inode: inode to extract the info from 1544 * @secid: where result will be saved 1545 */ 1546 static void smack_inode_getsecid(struct inode *inode, u32 *secid) 1547 { 1548 struct inode_smack *isp = inode->i_security; 1549 1550 *secid = isp->smk_inode->smk_secid; 1551 } 1552 1553 /* 1554 * File Hooks 1555 */ 1556 1557 /* 1558 * There is no smack_file_permission hook 1559 * 1560 * Should access checks be done on each read or write? 1561 * UNICOS and SELinux say yes. 1562 * Trusted Solaris, Trusted Irix, and just about everyone else says no. 1563 * 1564 * I'll say no for now. Smack does not do the frequent 1565 * label changing that SELinux does. 1566 */ 1567 1568 /** 1569 * smack_file_alloc_security - assign a file security blob 1570 * @file: the object 1571 * 1572 * The security blob for a file is a pointer to the master 1573 * label list, so no allocation is done. 1574 * 1575 * f_security is the owner security information. It 1576 * isn't used on file access checks, it's for send_sigio. 1577 * 1578 * Returns 0 1579 */ 1580 static int smack_file_alloc_security(struct file *file) 1581 { 1582 struct smack_known *skp = smk_of_current(); 1583 1584 file->f_security = skp; 1585 return 0; 1586 } 1587 1588 /** 1589 * smack_file_free_security - clear a file security blob 1590 * @file: the object 1591 * 1592 * The security blob for a file is a pointer to the master 1593 * label list, so no memory is freed. 1594 */ 1595 static void smack_file_free_security(struct file *file) 1596 { 1597 file->f_security = NULL; 1598 } 1599 1600 /** 1601 * smack_file_ioctl - Smack check on ioctls 1602 * @file: the object 1603 * @cmd: what to do 1604 * @arg: unused 1605 * 1606 * Relies heavily on the correct use of the ioctl command conventions. 1607 * 1608 * Returns 0 if allowed, error code otherwise 1609 */ 1610 static int smack_file_ioctl(struct file *file, unsigned int cmd, 1611 unsigned long arg) 1612 { 1613 int rc = 0; 1614 struct smk_audit_info ad; 1615 struct inode *inode = file_inode(file); 1616 1617 if (unlikely(IS_PRIVATE(inode))) 1618 return 0; 1619 1620 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_PATH); 1621 smk_ad_setfield_u_fs_path(&ad, file->f_path); 1622 1623 if (_IOC_DIR(cmd) & _IOC_WRITE) { 1624 rc = smk_curacc(smk_of_inode(inode), MAY_WRITE, &ad); 1625 rc = smk_bu_file(file, MAY_WRITE, rc); 1626 } 1627 1628 if (rc == 0 && (_IOC_DIR(cmd) & _IOC_READ)) { 1629 rc = smk_curacc(smk_of_inode(inode), MAY_READ, &ad); 1630 rc = smk_bu_file(file, MAY_READ, rc); 1631 } 1632 1633 return rc; 1634 } 1635 1636 /** 1637 * smack_file_lock - Smack check on file locking 1638 * @file: the object 1639 * @cmd: unused 1640 * 1641 * Returns 0 if current has lock access, error code otherwise 1642 */ 1643 static int smack_file_lock(struct file *file, unsigned int cmd) 1644 { 1645 struct smk_audit_info ad; 1646 int rc; 1647 struct inode *inode = file_inode(file); 1648 1649 if (unlikely(IS_PRIVATE(inode))) 1650 return 0; 1651 1652 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_PATH); 1653 smk_ad_setfield_u_fs_path(&ad, file->f_path); 1654 rc = smk_curacc(smk_of_inode(inode), MAY_LOCK, &ad); 1655 rc = smk_bu_file(file, MAY_LOCK, rc); 1656 return rc; 1657 } 1658 1659 /** 1660 * smack_file_fcntl - Smack check on fcntl 1661 * @file: the object 1662 * @cmd: what action to check 1663 * @arg: unused 1664 * 1665 * Generally these operations are harmless. 1666 * File locking operations present an obvious mechanism 1667 * for passing information, so they require write access. 1668 * 1669 * Returns 0 if current has access, error code otherwise 1670 */ 1671 static int smack_file_fcntl(struct file *file, unsigned int cmd, 1672 unsigned long arg) 1673 { 1674 struct smk_audit_info ad; 1675 int rc = 0; 1676 struct inode *inode = file_inode(file); 1677 1678 if (unlikely(IS_PRIVATE(inode))) 1679 return 0; 1680 1681 switch (cmd) { 1682 case F_GETLK: 1683 break; 1684 case F_SETLK: 1685 case F_SETLKW: 1686 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_PATH); 1687 smk_ad_setfield_u_fs_path(&ad, file->f_path); 1688 rc = smk_curacc(smk_of_inode(inode), MAY_LOCK, &ad); 1689 rc = smk_bu_file(file, MAY_LOCK, rc); 1690 break; 1691 case F_SETOWN: 1692 case F_SETSIG: 1693 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_PATH); 1694 smk_ad_setfield_u_fs_path(&ad, file->f_path); 1695 rc = smk_curacc(smk_of_inode(inode), MAY_WRITE, &ad); 1696 rc = smk_bu_file(file, MAY_WRITE, rc); 1697 break; 1698 default: 1699 break; 1700 } 1701 1702 return rc; 1703 } 1704 1705 /** 1706 * smack_mmap_file : 1707 * Check permissions for a mmap operation. The @file may be NULL, e.g. 1708 * if mapping anonymous memory. 1709 * @file contains the file structure for file to map (may be NULL). 1710 * @reqprot contains the protection requested by the application. 1711 * @prot contains the protection that will be applied by the kernel. 1712 * @flags contains the operational flags. 1713 * Return 0 if permission is granted. 1714 */ 1715 static int smack_mmap_file(struct file *file, 1716 unsigned long reqprot, unsigned long prot, 1717 unsigned long flags) 1718 { 1719 struct smack_known *skp; 1720 struct smack_known *mkp; 1721 struct smack_rule *srp; 1722 struct task_smack *tsp; 1723 struct smack_known *okp; 1724 struct inode_smack *isp; 1725 struct superblock_smack *sbsp; 1726 int may; 1727 int mmay; 1728 int tmay; 1729 int rc; 1730 1731 if (file == NULL) 1732 return 0; 1733 1734 if (unlikely(IS_PRIVATE(file_inode(file)))) 1735 return 0; 1736 1737 isp = file_inode(file)->i_security; 1738 if (isp->smk_mmap == NULL) 1739 return 0; 1740 sbsp = file_inode(file)->i_sb->s_security; 1741 if (sbsp->smk_flags & SMK_SB_UNTRUSTED && 1742 isp->smk_mmap != sbsp->smk_root) 1743 return -EACCES; 1744 mkp = isp->smk_mmap; 1745 1746 tsp = current_security(); 1747 skp = smk_of_current(); 1748 rc = 0; 1749 1750 rcu_read_lock(); 1751 /* 1752 * For each Smack rule associated with the subject 1753 * label verify that the SMACK64MMAP also has access 1754 * to that rule's object label. 1755 */ 1756 list_for_each_entry_rcu(srp, &skp->smk_rules, list) { 1757 okp = srp->smk_object; 1758 /* 1759 * Matching labels always allows access. 1760 */ 1761 if (mkp->smk_known == okp->smk_known) 1762 continue; 1763 /* 1764 * If there is a matching local rule take 1765 * that into account as well. 1766 */ 1767 may = smk_access_entry(srp->smk_subject->smk_known, 1768 okp->smk_known, 1769 &tsp->smk_rules); 1770 if (may == -ENOENT) 1771 may = srp->smk_access; 1772 else 1773 may &= srp->smk_access; 1774 /* 1775 * If may is zero the SMACK64MMAP subject can't 1776 * possibly have less access. 1777 */ 1778 if (may == 0) 1779 continue; 1780 1781 /* 1782 * Fetch the global list entry. 1783 * If there isn't one a SMACK64MMAP subject 1784 * can't have as much access as current. 1785 */ 1786 mmay = smk_access_entry(mkp->smk_known, okp->smk_known, 1787 &mkp->smk_rules); 1788 if (mmay == -ENOENT) { 1789 rc = -EACCES; 1790 break; 1791 } 1792 /* 1793 * If there is a local entry it modifies the 1794 * potential access, too. 1795 */ 1796 tmay = smk_access_entry(mkp->smk_known, okp->smk_known, 1797 &tsp->smk_rules); 1798 if (tmay != -ENOENT) 1799 mmay &= tmay; 1800 1801 /* 1802 * If there is any access available to current that is 1803 * not available to a SMACK64MMAP subject 1804 * deny access. 1805 */ 1806 if ((may | mmay) != mmay) { 1807 rc = -EACCES; 1808 break; 1809 } 1810 } 1811 1812 rcu_read_unlock(); 1813 1814 return rc; 1815 } 1816 1817 /** 1818 * smack_file_set_fowner - set the file security blob value 1819 * @file: object in question 1820 * 1821 */ 1822 static void smack_file_set_fowner(struct file *file) 1823 { 1824 file->f_security = smk_of_current(); 1825 } 1826 1827 /** 1828 * smack_file_send_sigiotask - Smack on sigio 1829 * @tsk: The target task 1830 * @fown: the object the signal come from 1831 * @signum: unused 1832 * 1833 * Allow a privileged task to get signals even if it shouldn't 1834 * 1835 * Returns 0 if a subject with the object's smack could 1836 * write to the task, an error code otherwise. 1837 */ 1838 static int smack_file_send_sigiotask(struct task_struct *tsk, 1839 struct fown_struct *fown, int signum) 1840 { 1841 struct smack_known *skp; 1842 struct smack_known *tkp = smk_of_task(tsk->cred->security); 1843 struct file *file; 1844 int rc; 1845 struct smk_audit_info ad; 1846 1847 /* 1848 * struct fown_struct is never outside the context of a struct file 1849 */ 1850 file = container_of(fown, struct file, f_owner); 1851 1852 /* we don't log here as rc can be overriden */ 1853 skp = file->f_security; 1854 rc = smk_access(skp, tkp, MAY_DELIVER, NULL); 1855 rc = smk_bu_note("sigiotask", skp, tkp, MAY_DELIVER, rc); 1856 if (rc != 0 && has_capability(tsk, CAP_MAC_OVERRIDE)) 1857 rc = 0; 1858 1859 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_TASK); 1860 smk_ad_setfield_u_tsk(&ad, tsk); 1861 smack_log(skp->smk_known, tkp->smk_known, MAY_DELIVER, rc, &ad); 1862 return rc; 1863 } 1864 1865 /** 1866 * smack_file_receive - Smack file receive check 1867 * @file: the object 1868 * 1869 * Returns 0 if current has access, error code otherwise 1870 */ 1871 static int smack_file_receive(struct file *file) 1872 { 1873 int rc; 1874 int may = 0; 1875 struct smk_audit_info ad; 1876 struct inode *inode = file_inode(file); 1877 struct socket *sock; 1878 struct task_smack *tsp; 1879 struct socket_smack *ssp; 1880 1881 if (unlikely(IS_PRIVATE(inode))) 1882 return 0; 1883 1884 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_PATH); 1885 smk_ad_setfield_u_fs_path(&ad, file->f_path); 1886 1887 if (inode->i_sb->s_magic == SOCKFS_MAGIC) { 1888 sock = SOCKET_I(inode); 1889 ssp = sock->sk->sk_security; 1890 tsp = current_security(); 1891 /* 1892 * If the receiving process can't write to the 1893 * passed socket or if the passed socket can't 1894 * write to the receiving process don't accept 1895 * the passed socket. 1896 */ 1897 rc = smk_access(tsp->smk_task, ssp->smk_out, MAY_WRITE, &ad); 1898 rc = smk_bu_file(file, may, rc); 1899 if (rc < 0) 1900 return rc; 1901 rc = smk_access(ssp->smk_in, tsp->smk_task, MAY_WRITE, &ad); 1902 rc = smk_bu_file(file, may, rc); 1903 return rc; 1904 } 1905 /* 1906 * This code relies on bitmasks. 1907 */ 1908 if (file->f_mode & FMODE_READ) 1909 may = MAY_READ; 1910 if (file->f_mode & FMODE_WRITE) 1911 may |= MAY_WRITE; 1912 1913 rc = smk_curacc(smk_of_inode(inode), may, &ad); 1914 rc = smk_bu_file(file, may, rc); 1915 return rc; 1916 } 1917 1918 /** 1919 * smack_file_open - Smack dentry open processing 1920 * @file: the object 1921 * @cred: task credential 1922 * 1923 * Set the security blob in the file structure. 1924 * Allow the open only if the task has read access. There are 1925 * many read operations (e.g. fstat) that you can do with an 1926 * fd even if you have the file open write-only. 1927 * 1928 * Returns 0 1929 */ 1930 static int smack_file_open(struct file *file, const struct cred *cred) 1931 { 1932 struct task_smack *tsp = cred->security; 1933 struct inode *inode = file_inode(file); 1934 struct smk_audit_info ad; 1935 int rc; 1936 1937 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_PATH); 1938 smk_ad_setfield_u_fs_path(&ad, file->f_path); 1939 rc = smk_tskacc(tsp, smk_of_inode(inode), MAY_READ, &ad); 1940 rc = smk_bu_credfile(cred, file, MAY_READ, rc); 1941 1942 return rc; 1943 } 1944 1945 /* 1946 * Task hooks 1947 */ 1948 1949 /** 1950 * smack_cred_alloc_blank - "allocate" blank task-level security credentials 1951 * @new: the new credentials 1952 * @gfp: the atomicity of any memory allocations 1953 * 1954 * Prepare a blank set of credentials for modification. This must allocate all 1955 * the memory the LSM module might require such that cred_transfer() can 1956 * complete without error. 1957 */ 1958 static int smack_cred_alloc_blank(struct cred *cred, gfp_t gfp) 1959 { 1960 struct task_smack *tsp; 1961 1962 tsp = new_task_smack(NULL, NULL, gfp); 1963 if (tsp == NULL) 1964 return -ENOMEM; 1965 1966 cred->security = tsp; 1967 1968 return 0; 1969 } 1970 1971 1972 /** 1973 * smack_cred_free - "free" task-level security credentials 1974 * @cred: the credentials in question 1975 * 1976 */ 1977 static void smack_cred_free(struct cred *cred) 1978 { 1979 struct task_smack *tsp = cred->security; 1980 struct smack_rule *rp; 1981 struct list_head *l; 1982 struct list_head *n; 1983 1984 if (tsp == NULL) 1985 return; 1986 cred->security = NULL; 1987 1988 smk_destroy_label_list(&tsp->smk_relabel); 1989 1990 list_for_each_safe(l, n, &tsp->smk_rules) { 1991 rp = list_entry(l, struct smack_rule, list); 1992 list_del(&rp->list); 1993 kfree(rp); 1994 } 1995 kfree(tsp); 1996 } 1997 1998 /** 1999 * smack_cred_prepare - prepare new set of credentials for modification 2000 * @new: the new credentials 2001 * @old: the original credentials 2002 * @gfp: the atomicity of any memory allocations 2003 * 2004 * Prepare a new set of credentials for modification. 2005 */ 2006 static int smack_cred_prepare(struct cred *new, const struct cred *old, 2007 gfp_t gfp) 2008 { 2009 struct task_smack *old_tsp = old->security; 2010 struct task_smack *new_tsp; 2011 int rc; 2012 2013 new_tsp = new_task_smack(old_tsp->smk_task, old_tsp->smk_task, gfp); 2014 if (new_tsp == NULL) 2015 return -ENOMEM; 2016 2017 new->security = new_tsp; 2018 2019 rc = smk_copy_rules(&new_tsp->smk_rules, &old_tsp->smk_rules, gfp); 2020 if (rc != 0) 2021 return rc; 2022 2023 rc = smk_copy_relabel(&new_tsp->smk_relabel, &old_tsp->smk_relabel, 2024 gfp); 2025 if (rc != 0) 2026 return rc; 2027 2028 return 0; 2029 } 2030 2031 /** 2032 * smack_cred_transfer - Transfer the old credentials to the new credentials 2033 * @new: the new credentials 2034 * @old: the original credentials 2035 * 2036 * Fill in a set of blank credentials from another set of credentials. 2037 */ 2038 static void smack_cred_transfer(struct cred *new, const struct cred *old) 2039 { 2040 struct task_smack *old_tsp = old->security; 2041 struct task_smack *new_tsp = new->security; 2042 2043 new_tsp->smk_task = old_tsp->smk_task; 2044 new_tsp->smk_forked = old_tsp->smk_task; 2045 mutex_init(&new_tsp->smk_rules_lock); 2046 INIT_LIST_HEAD(&new_tsp->smk_rules); 2047 2048 2049 /* cbs copy rule list */ 2050 } 2051 2052 /** 2053 * smack_kernel_act_as - Set the subjective context in a set of credentials 2054 * @new: points to the set of credentials to be modified. 2055 * @secid: specifies the security ID to be set 2056 * 2057 * Set the security data for a kernel service. 2058 */ 2059 static int smack_kernel_act_as(struct cred *new, u32 secid) 2060 { 2061 struct task_smack *new_tsp = new->security; 2062 2063 new_tsp->smk_task = smack_from_secid(secid); 2064 return 0; 2065 } 2066 2067 /** 2068 * smack_kernel_create_files_as - Set the file creation label in a set of creds 2069 * @new: points to the set of credentials to be modified 2070 * @inode: points to the inode to use as a reference 2071 * 2072 * Set the file creation context in a set of credentials to the same 2073 * as the objective context of the specified inode 2074 */ 2075 static int smack_kernel_create_files_as(struct cred *new, 2076 struct inode *inode) 2077 { 2078 struct inode_smack *isp = inode->i_security; 2079 struct task_smack *tsp = new->security; 2080 2081 tsp->smk_forked = isp->smk_inode; 2082 tsp->smk_task = tsp->smk_forked; 2083 return 0; 2084 } 2085 2086 /** 2087 * smk_curacc_on_task - helper to log task related access 2088 * @p: the task object 2089 * @access: the access requested 2090 * @caller: name of the calling function for audit 2091 * 2092 * Return 0 if access is permitted 2093 */ 2094 static int smk_curacc_on_task(struct task_struct *p, int access, 2095 const char *caller) 2096 { 2097 struct smk_audit_info ad; 2098 struct smack_known *skp = smk_of_task_struct(p); 2099 int rc; 2100 2101 smk_ad_init(&ad, caller, LSM_AUDIT_DATA_TASK); 2102 smk_ad_setfield_u_tsk(&ad, p); 2103 rc = smk_curacc(skp, access, &ad); 2104 rc = smk_bu_task(p, access, rc); 2105 return rc; 2106 } 2107 2108 /** 2109 * smack_task_setpgid - Smack check on setting pgid 2110 * @p: the task object 2111 * @pgid: unused 2112 * 2113 * Return 0 if write access is permitted 2114 */ 2115 static int smack_task_setpgid(struct task_struct *p, pid_t pgid) 2116 { 2117 return smk_curacc_on_task(p, MAY_WRITE, __func__); 2118 } 2119 2120 /** 2121 * smack_task_getpgid - Smack access check for getpgid 2122 * @p: the object task 2123 * 2124 * Returns 0 if current can read the object task, error code otherwise 2125 */ 2126 static int smack_task_getpgid(struct task_struct *p) 2127 { 2128 return smk_curacc_on_task(p, MAY_READ, __func__); 2129 } 2130 2131 /** 2132 * smack_task_getsid - Smack access check for getsid 2133 * @p: the object task 2134 * 2135 * Returns 0 if current can read the object task, error code otherwise 2136 */ 2137 static int smack_task_getsid(struct task_struct *p) 2138 { 2139 return smk_curacc_on_task(p, MAY_READ, __func__); 2140 } 2141 2142 /** 2143 * smack_task_getsecid - get the secid of the task 2144 * @p: the object task 2145 * @secid: where to put the result 2146 * 2147 * Sets the secid to contain a u32 version of the smack label. 2148 */ 2149 static void smack_task_getsecid(struct task_struct *p, u32 *secid) 2150 { 2151 struct smack_known *skp = smk_of_task_struct(p); 2152 2153 *secid = skp->smk_secid; 2154 } 2155 2156 /** 2157 * smack_task_setnice - Smack check on setting nice 2158 * @p: the task object 2159 * @nice: unused 2160 * 2161 * Return 0 if write access is permitted 2162 */ 2163 static int smack_task_setnice(struct task_struct *p, int nice) 2164 { 2165 return smk_curacc_on_task(p, MAY_WRITE, __func__); 2166 } 2167 2168 /** 2169 * smack_task_setioprio - Smack check on setting ioprio 2170 * @p: the task object 2171 * @ioprio: unused 2172 * 2173 * Return 0 if write access is permitted 2174 */ 2175 static int smack_task_setioprio(struct task_struct *p, int ioprio) 2176 { 2177 return smk_curacc_on_task(p, MAY_WRITE, __func__); 2178 } 2179 2180 /** 2181 * smack_task_getioprio - Smack check on reading ioprio 2182 * @p: the task object 2183 * 2184 * Return 0 if read access is permitted 2185 */ 2186 static int smack_task_getioprio(struct task_struct *p) 2187 { 2188 return smk_curacc_on_task(p, MAY_READ, __func__); 2189 } 2190 2191 /** 2192 * smack_task_setscheduler - Smack check on setting scheduler 2193 * @p: the task object 2194 * @policy: unused 2195 * @lp: unused 2196 * 2197 * Return 0 if read access is permitted 2198 */ 2199 static int smack_task_setscheduler(struct task_struct *p) 2200 { 2201 return smk_curacc_on_task(p, MAY_WRITE, __func__); 2202 } 2203 2204 /** 2205 * smack_task_getscheduler - Smack check on reading scheduler 2206 * @p: the task object 2207 * 2208 * Return 0 if read access is permitted 2209 */ 2210 static int smack_task_getscheduler(struct task_struct *p) 2211 { 2212 return smk_curacc_on_task(p, MAY_READ, __func__); 2213 } 2214 2215 /** 2216 * smack_task_movememory - Smack check on moving memory 2217 * @p: the task object 2218 * 2219 * Return 0 if write access is permitted 2220 */ 2221 static int smack_task_movememory(struct task_struct *p) 2222 { 2223 return smk_curacc_on_task(p, MAY_WRITE, __func__); 2224 } 2225 2226 /** 2227 * smack_task_kill - Smack check on signal delivery 2228 * @p: the task object 2229 * @info: unused 2230 * @sig: unused 2231 * @secid: identifies the smack to use in lieu of current's 2232 * 2233 * Return 0 if write access is permitted 2234 * 2235 * The secid behavior is an artifact of an SELinux hack 2236 * in the USB code. Someday it may go away. 2237 */ 2238 static int smack_task_kill(struct task_struct *p, struct siginfo *info, 2239 int sig, u32 secid) 2240 { 2241 struct smk_audit_info ad; 2242 struct smack_known *skp; 2243 struct smack_known *tkp = smk_of_task_struct(p); 2244 int rc; 2245 2246 if (!sig) 2247 return 0; /* null signal; existence test */ 2248 2249 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_TASK); 2250 smk_ad_setfield_u_tsk(&ad, p); 2251 /* 2252 * Sending a signal requires that the sender 2253 * can write the receiver. 2254 */ 2255 if (secid == 0) { 2256 rc = smk_curacc(tkp, MAY_DELIVER, &ad); 2257 rc = smk_bu_task(p, MAY_DELIVER, rc); 2258 return rc; 2259 } 2260 /* 2261 * If the secid isn't 0 we're dealing with some USB IO 2262 * specific behavior. This is not clean. For one thing 2263 * we can't take privilege into account. 2264 */ 2265 skp = smack_from_secid(secid); 2266 rc = smk_access(skp, tkp, MAY_DELIVER, &ad); 2267 rc = smk_bu_note("USB signal", skp, tkp, MAY_DELIVER, rc); 2268 return rc; 2269 } 2270 2271 /** 2272 * smack_task_to_inode - copy task smack into the inode blob 2273 * @p: task to copy from 2274 * @inode: inode to copy to 2275 * 2276 * Sets the smack pointer in the inode security blob 2277 */ 2278 static void smack_task_to_inode(struct task_struct *p, struct inode *inode) 2279 { 2280 struct inode_smack *isp = inode->i_security; 2281 struct smack_known *skp = smk_of_task_struct(p); 2282 2283 isp->smk_inode = skp; 2284 } 2285 2286 /* 2287 * Socket hooks. 2288 */ 2289 2290 /** 2291 * smack_sk_alloc_security - Allocate a socket blob 2292 * @sk: the socket 2293 * @family: unused 2294 * @gfp_flags: memory allocation flags 2295 * 2296 * Assign Smack pointers to current 2297 * 2298 * Returns 0 on success, -ENOMEM is there's no memory 2299 */ 2300 static int smack_sk_alloc_security(struct sock *sk, int family, gfp_t gfp_flags) 2301 { 2302 struct smack_known *skp = smk_of_current(); 2303 struct socket_smack *ssp; 2304 2305 ssp = kzalloc(sizeof(struct socket_smack), gfp_flags); 2306 if (ssp == NULL) 2307 return -ENOMEM; 2308 2309 /* 2310 * Sockets created by kernel threads receive web label. 2311 */ 2312 if (unlikely(current->flags & PF_KTHREAD)) { 2313 ssp->smk_in = &smack_known_web; 2314 ssp->smk_out = &smack_known_web; 2315 } else { 2316 ssp->smk_in = skp; 2317 ssp->smk_out = skp; 2318 } 2319 ssp->smk_packet = NULL; 2320 2321 sk->sk_security = ssp; 2322 2323 return 0; 2324 } 2325 2326 /** 2327 * smack_sk_free_security - Free a socket blob 2328 * @sk: the socket 2329 * 2330 * Clears the blob pointer 2331 */ 2332 static void smack_sk_free_security(struct sock *sk) 2333 { 2334 #ifdef SMACK_IPV6_PORT_LABELING 2335 struct smk_port_label *spp; 2336 2337 if (sk->sk_family == PF_INET6) { 2338 rcu_read_lock(); 2339 list_for_each_entry_rcu(spp, &smk_ipv6_port_list, list) { 2340 if (spp->smk_sock != sk) 2341 continue; 2342 spp->smk_can_reuse = 1; 2343 break; 2344 } 2345 rcu_read_unlock(); 2346 } 2347 #endif 2348 kfree(sk->sk_security); 2349 } 2350 2351 /** 2352 * smack_ipv4host_label - check host based restrictions 2353 * @sip: the object end 2354 * 2355 * looks for host based access restrictions 2356 * 2357 * This version will only be appropriate for really small sets of single label 2358 * hosts. The caller is responsible for ensuring that the RCU read lock is 2359 * taken before calling this function. 2360 * 2361 * Returns the label of the far end or NULL if it's not special. 2362 */ 2363 static struct smack_known *smack_ipv4host_label(struct sockaddr_in *sip) 2364 { 2365 struct smk_net4addr *snp; 2366 struct in_addr *siap = &sip->sin_addr; 2367 2368 if (siap->s_addr == 0) 2369 return NULL; 2370 2371 list_for_each_entry_rcu(snp, &smk_net4addr_list, list) 2372 /* 2373 * we break after finding the first match because 2374 * the list is sorted from longest to shortest mask 2375 * so we have found the most specific match 2376 */ 2377 if (snp->smk_host.s_addr == 2378 (siap->s_addr & snp->smk_mask.s_addr)) 2379 return snp->smk_label; 2380 2381 return NULL; 2382 } 2383 2384 #if IS_ENABLED(CONFIG_IPV6) 2385 /* 2386 * smk_ipv6_localhost - Check for local ipv6 host address 2387 * @sip: the address 2388 * 2389 * Returns boolean true if this is the localhost address 2390 */ 2391 static bool smk_ipv6_localhost(struct sockaddr_in6 *sip) 2392 { 2393 __be16 *be16p = (__be16 *)&sip->sin6_addr; 2394 __be32 *be32p = (__be32 *)&sip->sin6_addr; 2395 2396 if (be32p[0] == 0 && be32p[1] == 0 && be32p[2] == 0 && be16p[6] == 0 && 2397 ntohs(be16p[7]) == 1) 2398 return true; 2399 return false; 2400 } 2401 2402 /** 2403 * smack_ipv6host_label - check host based restrictions 2404 * @sip: the object end 2405 * 2406 * looks for host based access restrictions 2407 * 2408 * This version will only be appropriate for really small sets of single label 2409 * hosts. The caller is responsible for ensuring that the RCU read lock is 2410 * taken before calling this function. 2411 * 2412 * Returns the label of the far end or NULL if it's not special. 2413 */ 2414 static struct smack_known *smack_ipv6host_label(struct sockaddr_in6 *sip) 2415 { 2416 struct smk_net6addr *snp; 2417 struct in6_addr *sap = &sip->sin6_addr; 2418 int i; 2419 int found = 0; 2420 2421 /* 2422 * It's local. Don't look for a host label. 2423 */ 2424 if (smk_ipv6_localhost(sip)) 2425 return NULL; 2426 2427 list_for_each_entry_rcu(snp, &smk_net6addr_list, list) { 2428 /* 2429 * If the label is NULL the entry has 2430 * been renounced. Ignore it. 2431 */ 2432 if (snp->smk_label == NULL) 2433 continue; 2434 /* 2435 * we break after finding the first match because 2436 * the list is sorted from longest to shortest mask 2437 * so we have found the most specific match 2438 */ 2439 for (found = 1, i = 0; i < 8; i++) { 2440 if ((sap->s6_addr16[i] & snp->smk_mask.s6_addr16[i]) != 2441 snp->smk_host.s6_addr16[i]) { 2442 found = 0; 2443 break; 2444 } 2445 } 2446 if (found) 2447 return snp->smk_label; 2448 } 2449 2450 return NULL; 2451 } 2452 #endif /* CONFIG_IPV6 */ 2453 2454 /** 2455 * smack_netlabel - Set the secattr on a socket 2456 * @sk: the socket 2457 * @labeled: socket label scheme 2458 * 2459 * Convert the outbound smack value (smk_out) to a 2460 * secattr and attach it to the socket. 2461 * 2462 * Returns 0 on success or an error code 2463 */ 2464 static int smack_netlabel(struct sock *sk, int labeled) 2465 { 2466 struct smack_known *skp; 2467 struct socket_smack *ssp = sk->sk_security; 2468 int rc = 0; 2469 2470 /* 2471 * Usually the netlabel code will handle changing the 2472 * packet labeling based on the label. 2473 * The case of a single label host is different, because 2474 * a single label host should never get a labeled packet 2475 * even though the label is usually associated with a packet 2476 * label. 2477 */ 2478 local_bh_disable(); 2479 bh_lock_sock_nested(sk); 2480 2481 if (ssp->smk_out == smack_net_ambient || 2482 labeled == SMACK_UNLABELED_SOCKET) 2483 netlbl_sock_delattr(sk); 2484 else { 2485 skp = ssp->smk_out; 2486 rc = netlbl_sock_setattr(sk, sk->sk_family, &skp->smk_netlabel); 2487 } 2488 2489 bh_unlock_sock(sk); 2490 local_bh_enable(); 2491 2492 return rc; 2493 } 2494 2495 /** 2496 * smack_netlbel_send - Set the secattr on a socket and perform access checks 2497 * @sk: the socket 2498 * @sap: the destination address 2499 * 2500 * Set the correct secattr for the given socket based on the destination 2501 * address and perform any outbound access checks needed. 2502 * 2503 * Returns 0 on success or an error code. 2504 * 2505 */ 2506 static int smack_netlabel_send(struct sock *sk, struct sockaddr_in *sap) 2507 { 2508 struct smack_known *skp; 2509 int rc; 2510 int sk_lbl; 2511 struct smack_known *hkp; 2512 struct socket_smack *ssp = sk->sk_security; 2513 struct smk_audit_info ad; 2514 2515 rcu_read_lock(); 2516 hkp = smack_ipv4host_label(sap); 2517 if (hkp != NULL) { 2518 #ifdef CONFIG_AUDIT 2519 struct lsm_network_audit net; 2520 2521 smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); 2522 ad.a.u.net->family = sap->sin_family; 2523 ad.a.u.net->dport = sap->sin_port; 2524 ad.a.u.net->v4info.daddr = sap->sin_addr.s_addr; 2525 #endif 2526 sk_lbl = SMACK_UNLABELED_SOCKET; 2527 skp = ssp->smk_out; 2528 rc = smk_access(skp, hkp, MAY_WRITE, &ad); 2529 rc = smk_bu_note("IPv4 host check", skp, hkp, MAY_WRITE, rc); 2530 } else { 2531 sk_lbl = SMACK_CIPSO_SOCKET; 2532 rc = 0; 2533 } 2534 rcu_read_unlock(); 2535 if (rc != 0) 2536 return rc; 2537 2538 return smack_netlabel(sk, sk_lbl); 2539 } 2540 2541 #if IS_ENABLED(CONFIG_IPV6) 2542 /** 2543 * smk_ipv6_check - check Smack access 2544 * @subject: subject Smack label 2545 * @object: object Smack label 2546 * @address: address 2547 * @act: the action being taken 2548 * 2549 * Check an IPv6 access 2550 */ 2551 static int smk_ipv6_check(struct smack_known *subject, 2552 struct smack_known *object, 2553 struct sockaddr_in6 *address, int act) 2554 { 2555 #ifdef CONFIG_AUDIT 2556 struct lsm_network_audit net; 2557 #endif 2558 struct smk_audit_info ad; 2559 int rc; 2560 2561 #ifdef CONFIG_AUDIT 2562 smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); 2563 ad.a.u.net->family = PF_INET6; 2564 ad.a.u.net->dport = ntohs(address->sin6_port); 2565 if (act == SMK_RECEIVING) 2566 ad.a.u.net->v6info.saddr = address->sin6_addr; 2567 else 2568 ad.a.u.net->v6info.daddr = address->sin6_addr; 2569 #endif 2570 rc = smk_access(subject, object, MAY_WRITE, &ad); 2571 rc = smk_bu_note("IPv6 check", subject, object, MAY_WRITE, rc); 2572 return rc; 2573 } 2574 #endif /* CONFIG_IPV6 */ 2575 2576 #ifdef SMACK_IPV6_PORT_LABELING 2577 /** 2578 * smk_ipv6_port_label - Smack port access table management 2579 * @sock: socket 2580 * @address: address 2581 * 2582 * Create or update the port list entry 2583 */ 2584 static void smk_ipv6_port_label(struct socket *sock, struct sockaddr *address) 2585 { 2586 struct sock *sk = sock->sk; 2587 struct sockaddr_in6 *addr6; 2588 struct socket_smack *ssp = sock->sk->sk_security; 2589 struct smk_port_label *spp; 2590 unsigned short port = 0; 2591 2592 if (address == NULL) { 2593 /* 2594 * This operation is changing the Smack information 2595 * on the bound socket. Take the changes to the port 2596 * as well. 2597 */ 2598 rcu_read_lock(); 2599 list_for_each_entry_rcu(spp, &smk_ipv6_port_list, list) { 2600 if (sk != spp->smk_sock) 2601 continue; 2602 spp->smk_in = ssp->smk_in; 2603 spp->smk_out = ssp->smk_out; 2604 rcu_read_unlock(); 2605 return; 2606 } 2607 /* 2608 * A NULL address is only used for updating existing 2609 * bound entries. If there isn't one, it's OK. 2610 */ 2611 rcu_read_unlock(); 2612 return; 2613 } 2614 2615 addr6 = (struct sockaddr_in6 *)address; 2616 port = ntohs(addr6->sin6_port); 2617 /* 2618 * This is a special case that is safely ignored. 2619 */ 2620 if (port == 0) 2621 return; 2622 2623 /* 2624 * Look for an existing port list entry. 2625 * This is an indication that a port is getting reused. 2626 */ 2627 rcu_read_lock(); 2628 list_for_each_entry_rcu(spp, &smk_ipv6_port_list, list) { 2629 if (spp->smk_port != port || spp->smk_sock_type != sock->type) 2630 continue; 2631 if (spp->smk_can_reuse != 1) { 2632 rcu_read_unlock(); 2633 return; 2634 } 2635 spp->smk_port = port; 2636 spp->smk_sock = sk; 2637 spp->smk_in = ssp->smk_in; 2638 spp->smk_out = ssp->smk_out; 2639 spp->smk_can_reuse = 0; 2640 rcu_read_unlock(); 2641 return; 2642 } 2643 rcu_read_unlock(); 2644 /* 2645 * A new port entry is required. 2646 */ 2647 spp = kzalloc(sizeof(*spp), GFP_KERNEL); 2648 if (spp == NULL) 2649 return; 2650 2651 spp->smk_port = port; 2652 spp->smk_sock = sk; 2653 spp->smk_in = ssp->smk_in; 2654 spp->smk_out = ssp->smk_out; 2655 spp->smk_sock_type = sock->type; 2656 spp->smk_can_reuse = 0; 2657 2658 mutex_lock(&smack_ipv6_lock); 2659 list_add_rcu(&spp->list, &smk_ipv6_port_list); 2660 mutex_unlock(&smack_ipv6_lock); 2661 return; 2662 } 2663 2664 /** 2665 * smk_ipv6_port_check - check Smack port access 2666 * @sock: socket 2667 * @address: address 2668 * 2669 * Create or update the port list entry 2670 */ 2671 static int smk_ipv6_port_check(struct sock *sk, struct sockaddr_in6 *address, 2672 int act) 2673 { 2674 struct smk_port_label *spp; 2675 struct socket_smack *ssp = sk->sk_security; 2676 struct smack_known *skp = NULL; 2677 unsigned short port; 2678 struct smack_known *object; 2679 2680 if (act == SMK_RECEIVING) { 2681 skp = smack_ipv6host_label(address); 2682 object = ssp->smk_in; 2683 } else { 2684 skp = ssp->smk_out; 2685 object = smack_ipv6host_label(address); 2686 } 2687 2688 /* 2689 * The other end is a single label host. 2690 */ 2691 if (skp != NULL && object != NULL) 2692 return smk_ipv6_check(skp, object, address, act); 2693 if (skp == NULL) 2694 skp = smack_net_ambient; 2695 if (object == NULL) 2696 object = smack_net_ambient; 2697 2698 /* 2699 * It's remote, so port lookup does no good. 2700 */ 2701 if (!smk_ipv6_localhost(address)) 2702 return smk_ipv6_check(skp, object, address, act); 2703 2704 /* 2705 * It's local so the send check has to have passed. 2706 */ 2707 if (act == SMK_RECEIVING) 2708 return 0; 2709 2710 port = ntohs(address->sin6_port); 2711 rcu_read_lock(); 2712 list_for_each_entry_rcu(spp, &smk_ipv6_port_list, list) { 2713 if (spp->smk_port != port || spp->smk_sock_type != sk->sk_type) 2714 continue; 2715 object = spp->smk_in; 2716 if (act == SMK_CONNECTING) 2717 ssp->smk_packet = spp->smk_out; 2718 break; 2719 } 2720 rcu_read_unlock(); 2721 2722 return smk_ipv6_check(skp, object, address, act); 2723 } 2724 #endif /* SMACK_IPV6_PORT_LABELING */ 2725 2726 /** 2727 * smack_inode_setsecurity - set smack xattrs 2728 * @inode: the object 2729 * @name: attribute name 2730 * @value: attribute value 2731 * @size: size of the attribute 2732 * @flags: unused 2733 * 2734 * Sets the named attribute in the appropriate blob 2735 * 2736 * Returns 0 on success, or an error code 2737 */ 2738 static int smack_inode_setsecurity(struct inode *inode, const char *name, 2739 const void *value, size_t size, int flags) 2740 { 2741 struct smack_known *skp; 2742 struct inode_smack *nsp = inode->i_security; 2743 struct socket_smack *ssp; 2744 struct socket *sock; 2745 int rc = 0; 2746 2747 if (value == NULL || size > SMK_LONGLABEL || size == 0) 2748 return -EINVAL; 2749 2750 skp = smk_import_entry(value, size); 2751 if (IS_ERR(skp)) 2752 return PTR_ERR(skp); 2753 2754 if (strcmp(name, XATTR_SMACK_SUFFIX) == 0) { 2755 nsp->smk_inode = skp; 2756 nsp->smk_flags |= SMK_INODE_INSTANT; 2757 return 0; 2758 } 2759 /* 2760 * The rest of the Smack xattrs are only on sockets. 2761 */ 2762 if (inode->i_sb->s_magic != SOCKFS_MAGIC) 2763 return -EOPNOTSUPP; 2764 2765 sock = SOCKET_I(inode); 2766 if (sock == NULL || sock->sk == NULL) 2767 return -EOPNOTSUPP; 2768 2769 ssp = sock->sk->sk_security; 2770 2771 if (strcmp(name, XATTR_SMACK_IPIN) == 0) 2772 ssp->smk_in = skp; 2773 else if (strcmp(name, XATTR_SMACK_IPOUT) == 0) { 2774 ssp->smk_out = skp; 2775 if (sock->sk->sk_family == PF_INET) { 2776 rc = smack_netlabel(sock->sk, SMACK_CIPSO_SOCKET); 2777 if (rc != 0) 2778 printk(KERN_WARNING 2779 "Smack: \"%s\" netlbl error %d.\n", 2780 __func__, -rc); 2781 } 2782 } else 2783 return -EOPNOTSUPP; 2784 2785 #ifdef SMACK_IPV6_PORT_LABELING 2786 if (sock->sk->sk_family == PF_INET6) 2787 smk_ipv6_port_label(sock, NULL); 2788 #endif 2789 2790 return 0; 2791 } 2792 2793 /** 2794 * smack_socket_post_create - finish socket setup 2795 * @sock: the socket 2796 * @family: protocol family 2797 * @type: unused 2798 * @protocol: unused 2799 * @kern: unused 2800 * 2801 * Sets the netlabel information on the socket 2802 * 2803 * Returns 0 on success, and error code otherwise 2804 */ 2805 static int smack_socket_post_create(struct socket *sock, int family, 2806 int type, int protocol, int kern) 2807 { 2808 struct socket_smack *ssp; 2809 2810 if (sock->sk == NULL) 2811 return 0; 2812 2813 /* 2814 * Sockets created by kernel threads receive web label. 2815 */ 2816 if (unlikely(current->flags & PF_KTHREAD)) { 2817 ssp = sock->sk->sk_security; 2818 ssp->smk_in = &smack_known_web; 2819 ssp->smk_out = &smack_known_web; 2820 } 2821 2822 if (family != PF_INET) 2823 return 0; 2824 /* 2825 * Set the outbound netlbl. 2826 */ 2827 return smack_netlabel(sock->sk, SMACK_CIPSO_SOCKET); 2828 } 2829 2830 #ifdef SMACK_IPV6_PORT_LABELING 2831 /** 2832 * smack_socket_bind - record port binding information. 2833 * @sock: the socket 2834 * @address: the port address 2835 * @addrlen: size of the address 2836 * 2837 * Records the label bound to a port. 2838 * 2839 * Returns 0 2840 */ 2841 static int smack_socket_bind(struct socket *sock, struct sockaddr *address, 2842 int addrlen) 2843 { 2844 if (sock->sk != NULL && sock->sk->sk_family == PF_INET6) 2845 smk_ipv6_port_label(sock, address); 2846 return 0; 2847 } 2848 #endif /* SMACK_IPV6_PORT_LABELING */ 2849 2850 /** 2851 * smack_socket_connect - connect access check 2852 * @sock: the socket 2853 * @sap: the other end 2854 * @addrlen: size of sap 2855 * 2856 * Verifies that a connection may be possible 2857 * 2858 * Returns 0 on success, and error code otherwise 2859 */ 2860 static int smack_socket_connect(struct socket *sock, struct sockaddr *sap, 2861 int addrlen) 2862 { 2863 int rc = 0; 2864 #if IS_ENABLED(CONFIG_IPV6) 2865 struct sockaddr_in6 *sip = (struct sockaddr_in6 *)sap; 2866 #endif 2867 #ifdef SMACK_IPV6_SECMARK_LABELING 2868 struct smack_known *rsp; 2869 struct socket_smack *ssp; 2870 #endif 2871 2872 if (sock->sk == NULL) 2873 return 0; 2874 2875 #ifdef SMACK_IPV6_SECMARK_LABELING 2876 ssp = sock->sk->sk_security; 2877 #endif 2878 2879 switch (sock->sk->sk_family) { 2880 case PF_INET: 2881 if (addrlen < sizeof(struct sockaddr_in)) 2882 return -EINVAL; 2883 rc = smack_netlabel_send(sock->sk, (struct sockaddr_in *)sap); 2884 break; 2885 case PF_INET6: 2886 if (addrlen < sizeof(struct sockaddr_in6)) 2887 return -EINVAL; 2888 #ifdef SMACK_IPV6_SECMARK_LABELING 2889 rsp = smack_ipv6host_label(sip); 2890 if (rsp != NULL) 2891 rc = smk_ipv6_check(ssp->smk_out, rsp, sip, 2892 SMK_CONNECTING); 2893 #endif 2894 #ifdef SMACK_IPV6_PORT_LABELING 2895 rc = smk_ipv6_port_check(sock->sk, sip, SMK_CONNECTING); 2896 #endif 2897 break; 2898 } 2899 return rc; 2900 } 2901 2902 /** 2903 * smack_flags_to_may - convert S_ to MAY_ values 2904 * @flags: the S_ value 2905 * 2906 * Returns the equivalent MAY_ value 2907 */ 2908 static int smack_flags_to_may(int flags) 2909 { 2910 int may = 0; 2911 2912 if (flags & S_IRUGO) 2913 may |= MAY_READ; 2914 if (flags & S_IWUGO) 2915 may |= MAY_WRITE; 2916 if (flags & S_IXUGO) 2917 may |= MAY_EXEC; 2918 2919 return may; 2920 } 2921 2922 /** 2923 * smack_msg_msg_alloc_security - Set the security blob for msg_msg 2924 * @msg: the object 2925 * 2926 * Returns 0 2927 */ 2928 static int smack_msg_msg_alloc_security(struct msg_msg *msg) 2929 { 2930 struct smack_known *skp = smk_of_current(); 2931 2932 msg->security = skp; 2933 return 0; 2934 } 2935 2936 /** 2937 * smack_msg_msg_free_security - Clear the security blob for msg_msg 2938 * @msg: the object 2939 * 2940 * Clears the blob pointer 2941 */ 2942 static void smack_msg_msg_free_security(struct msg_msg *msg) 2943 { 2944 msg->security = NULL; 2945 } 2946 2947 /** 2948 * smack_of_shm - the smack pointer for the shm 2949 * @shp: the object 2950 * 2951 * Returns a pointer to the smack value 2952 */ 2953 static struct smack_known *smack_of_shm(struct shmid_kernel *shp) 2954 { 2955 return (struct smack_known *)shp->shm_perm.security; 2956 } 2957 2958 /** 2959 * smack_shm_alloc_security - Set the security blob for shm 2960 * @shp: the object 2961 * 2962 * Returns 0 2963 */ 2964 static int smack_shm_alloc_security(struct shmid_kernel *shp) 2965 { 2966 struct kern_ipc_perm *isp = &shp->shm_perm; 2967 struct smack_known *skp = smk_of_current(); 2968 2969 isp->security = skp; 2970 return 0; 2971 } 2972 2973 /** 2974 * smack_shm_free_security - Clear the security blob for shm 2975 * @shp: the object 2976 * 2977 * Clears the blob pointer 2978 */ 2979 static void smack_shm_free_security(struct shmid_kernel *shp) 2980 { 2981 struct kern_ipc_perm *isp = &shp->shm_perm; 2982 2983 isp->security = NULL; 2984 } 2985 2986 /** 2987 * smk_curacc_shm : check if current has access on shm 2988 * @shp : the object 2989 * @access : access requested 2990 * 2991 * Returns 0 if current has the requested access, error code otherwise 2992 */ 2993 static int smk_curacc_shm(struct shmid_kernel *shp, int access) 2994 { 2995 struct smack_known *ssp = smack_of_shm(shp); 2996 struct smk_audit_info ad; 2997 int rc; 2998 2999 #ifdef CONFIG_AUDIT 3000 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_IPC); 3001 ad.a.u.ipc_id = shp->shm_perm.id; 3002 #endif 3003 rc = smk_curacc(ssp, access, &ad); 3004 rc = smk_bu_current("shm", ssp, access, rc); 3005 return rc; 3006 } 3007 3008 /** 3009 * smack_shm_associate - Smack access check for shm 3010 * @shp: the object 3011 * @shmflg: access requested 3012 * 3013 * Returns 0 if current has the requested access, error code otherwise 3014 */ 3015 static int smack_shm_associate(struct shmid_kernel *shp, int shmflg) 3016 { 3017 int may; 3018 3019 may = smack_flags_to_may(shmflg); 3020 return smk_curacc_shm(shp, may); 3021 } 3022 3023 /** 3024 * smack_shm_shmctl - Smack access check for shm 3025 * @shp: the object 3026 * @cmd: what it wants to do 3027 * 3028 * Returns 0 if current has the requested access, error code otherwise 3029 */ 3030 static int smack_shm_shmctl(struct shmid_kernel *shp, int cmd) 3031 { 3032 int may; 3033 3034 switch (cmd) { 3035 case IPC_STAT: 3036 case SHM_STAT: 3037 may = MAY_READ; 3038 break; 3039 case IPC_SET: 3040 case SHM_LOCK: 3041 case SHM_UNLOCK: 3042 case IPC_RMID: 3043 may = MAY_READWRITE; 3044 break; 3045 case IPC_INFO: 3046 case SHM_INFO: 3047 /* 3048 * System level information. 3049 */ 3050 return 0; 3051 default: 3052 return -EINVAL; 3053 } 3054 return smk_curacc_shm(shp, may); 3055 } 3056 3057 /** 3058 * smack_shm_shmat - Smack access for shmat 3059 * @shp: the object 3060 * @shmaddr: unused 3061 * @shmflg: access requested 3062 * 3063 * Returns 0 if current has the requested access, error code otherwise 3064 */ 3065 static int smack_shm_shmat(struct shmid_kernel *shp, char __user *shmaddr, 3066 int shmflg) 3067 { 3068 int may; 3069 3070 may = smack_flags_to_may(shmflg); 3071 return smk_curacc_shm(shp, may); 3072 } 3073 3074 /** 3075 * smack_of_sem - the smack pointer for the sem 3076 * @sma: the object 3077 * 3078 * Returns a pointer to the smack value 3079 */ 3080 static struct smack_known *smack_of_sem(struct sem_array *sma) 3081 { 3082 return (struct smack_known *)sma->sem_perm.security; 3083 } 3084 3085 /** 3086 * smack_sem_alloc_security - Set the security blob for sem 3087 * @sma: the object 3088 * 3089 * Returns 0 3090 */ 3091 static int smack_sem_alloc_security(struct sem_array *sma) 3092 { 3093 struct kern_ipc_perm *isp = &sma->sem_perm; 3094 struct smack_known *skp = smk_of_current(); 3095 3096 isp->security = skp; 3097 return 0; 3098 } 3099 3100 /** 3101 * smack_sem_free_security - Clear the security blob for sem 3102 * @sma: the object 3103 * 3104 * Clears the blob pointer 3105 */ 3106 static void smack_sem_free_security(struct sem_array *sma) 3107 { 3108 struct kern_ipc_perm *isp = &sma->sem_perm; 3109 3110 isp->security = NULL; 3111 } 3112 3113 /** 3114 * smk_curacc_sem : check if current has access on sem 3115 * @sma : the object 3116 * @access : access requested 3117 * 3118 * Returns 0 if current has the requested access, error code otherwise 3119 */ 3120 static int smk_curacc_sem(struct sem_array *sma, int access) 3121 { 3122 struct smack_known *ssp = smack_of_sem(sma); 3123 struct smk_audit_info ad; 3124 int rc; 3125 3126 #ifdef CONFIG_AUDIT 3127 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_IPC); 3128 ad.a.u.ipc_id = sma->sem_perm.id; 3129 #endif 3130 rc = smk_curacc(ssp, access, &ad); 3131 rc = smk_bu_current("sem", ssp, access, rc); 3132 return rc; 3133 } 3134 3135 /** 3136 * smack_sem_associate - Smack access check for sem 3137 * @sma: the object 3138 * @semflg: access requested 3139 * 3140 * Returns 0 if current has the requested access, error code otherwise 3141 */ 3142 static int smack_sem_associate(struct sem_array *sma, int semflg) 3143 { 3144 int may; 3145 3146 may = smack_flags_to_may(semflg); 3147 return smk_curacc_sem(sma, may); 3148 } 3149 3150 /** 3151 * smack_sem_shmctl - Smack access check for sem 3152 * @sma: the object 3153 * @cmd: what it wants to do 3154 * 3155 * Returns 0 if current has the requested access, error code otherwise 3156 */ 3157 static int smack_sem_semctl(struct sem_array *sma, int cmd) 3158 { 3159 int may; 3160 3161 switch (cmd) { 3162 case GETPID: 3163 case GETNCNT: 3164 case GETZCNT: 3165 case GETVAL: 3166 case GETALL: 3167 case IPC_STAT: 3168 case SEM_STAT: 3169 may = MAY_READ; 3170 break; 3171 case SETVAL: 3172 case SETALL: 3173 case IPC_RMID: 3174 case IPC_SET: 3175 may = MAY_READWRITE; 3176 break; 3177 case IPC_INFO: 3178 case SEM_INFO: 3179 /* 3180 * System level information 3181 */ 3182 return 0; 3183 default: 3184 return -EINVAL; 3185 } 3186 3187 return smk_curacc_sem(sma, may); 3188 } 3189 3190 /** 3191 * smack_sem_semop - Smack checks of semaphore operations 3192 * @sma: the object 3193 * @sops: unused 3194 * @nsops: unused 3195 * @alter: unused 3196 * 3197 * Treated as read and write in all cases. 3198 * 3199 * Returns 0 if access is allowed, error code otherwise 3200 */ 3201 static int smack_sem_semop(struct sem_array *sma, struct sembuf *sops, 3202 unsigned nsops, int alter) 3203 { 3204 return smk_curacc_sem(sma, MAY_READWRITE); 3205 } 3206 3207 /** 3208 * smack_msg_alloc_security - Set the security blob for msg 3209 * @msq: the object 3210 * 3211 * Returns 0 3212 */ 3213 static int smack_msg_queue_alloc_security(struct msg_queue *msq) 3214 { 3215 struct kern_ipc_perm *kisp = &msq->q_perm; 3216 struct smack_known *skp = smk_of_current(); 3217 3218 kisp->security = skp; 3219 return 0; 3220 } 3221 3222 /** 3223 * smack_msg_free_security - Clear the security blob for msg 3224 * @msq: the object 3225 * 3226 * Clears the blob pointer 3227 */ 3228 static void smack_msg_queue_free_security(struct msg_queue *msq) 3229 { 3230 struct kern_ipc_perm *kisp = &msq->q_perm; 3231 3232 kisp->security = NULL; 3233 } 3234 3235 /** 3236 * smack_of_msq - the smack pointer for the msq 3237 * @msq: the object 3238 * 3239 * Returns a pointer to the smack label entry 3240 */ 3241 static struct smack_known *smack_of_msq(struct msg_queue *msq) 3242 { 3243 return (struct smack_known *)msq->q_perm.security; 3244 } 3245 3246 /** 3247 * smk_curacc_msq : helper to check if current has access on msq 3248 * @msq : the msq 3249 * @access : access requested 3250 * 3251 * return 0 if current has access, error otherwise 3252 */ 3253 static int smk_curacc_msq(struct msg_queue *msq, int access) 3254 { 3255 struct smack_known *msp = smack_of_msq(msq); 3256 struct smk_audit_info ad; 3257 int rc; 3258 3259 #ifdef CONFIG_AUDIT 3260 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_IPC); 3261 ad.a.u.ipc_id = msq->q_perm.id; 3262 #endif 3263 rc = smk_curacc(msp, access, &ad); 3264 rc = smk_bu_current("msq", msp, access, rc); 3265 return rc; 3266 } 3267 3268 /** 3269 * smack_msg_queue_associate - Smack access check for msg_queue 3270 * @msq: the object 3271 * @msqflg: access requested 3272 * 3273 * Returns 0 if current has the requested access, error code otherwise 3274 */ 3275 static int smack_msg_queue_associate(struct msg_queue *msq, int msqflg) 3276 { 3277 int may; 3278 3279 may = smack_flags_to_may(msqflg); 3280 return smk_curacc_msq(msq, may); 3281 } 3282 3283 /** 3284 * smack_msg_queue_msgctl - Smack access check for msg_queue 3285 * @msq: the object 3286 * @cmd: what it wants to do 3287 * 3288 * Returns 0 if current has the requested access, error code otherwise 3289 */ 3290 static int smack_msg_queue_msgctl(struct msg_queue *msq, int cmd) 3291 { 3292 int may; 3293 3294 switch (cmd) { 3295 case IPC_STAT: 3296 case MSG_STAT: 3297 may = MAY_READ; 3298 break; 3299 case IPC_SET: 3300 case IPC_RMID: 3301 may = MAY_READWRITE; 3302 break; 3303 case IPC_INFO: 3304 case MSG_INFO: 3305 /* 3306 * System level information 3307 */ 3308 return 0; 3309 default: 3310 return -EINVAL; 3311 } 3312 3313 return smk_curacc_msq(msq, may); 3314 } 3315 3316 /** 3317 * smack_msg_queue_msgsnd - Smack access check for msg_queue 3318 * @msq: the object 3319 * @msg: unused 3320 * @msqflg: access requested 3321 * 3322 * Returns 0 if current has the requested access, error code otherwise 3323 */ 3324 static int smack_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, 3325 int msqflg) 3326 { 3327 int may; 3328 3329 may = smack_flags_to_may(msqflg); 3330 return smk_curacc_msq(msq, may); 3331 } 3332 3333 /** 3334 * smack_msg_queue_msgsnd - Smack access check for msg_queue 3335 * @msq: the object 3336 * @msg: unused 3337 * @target: unused 3338 * @type: unused 3339 * @mode: unused 3340 * 3341 * Returns 0 if current has read and write access, error code otherwise 3342 */ 3343 static int smack_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg, 3344 struct task_struct *target, long type, int mode) 3345 { 3346 return smk_curacc_msq(msq, MAY_READWRITE); 3347 } 3348 3349 /** 3350 * smack_ipc_permission - Smack access for ipc_permission() 3351 * @ipp: the object permissions 3352 * @flag: access requested 3353 * 3354 * Returns 0 if current has read and write access, error code otherwise 3355 */ 3356 static int smack_ipc_permission(struct kern_ipc_perm *ipp, short flag) 3357 { 3358 struct smack_known *iskp = ipp->security; 3359 int may = smack_flags_to_may(flag); 3360 struct smk_audit_info ad; 3361 int rc; 3362 3363 #ifdef CONFIG_AUDIT 3364 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_IPC); 3365 ad.a.u.ipc_id = ipp->id; 3366 #endif 3367 rc = smk_curacc(iskp, may, &ad); 3368 rc = smk_bu_current("svipc", iskp, may, rc); 3369 return rc; 3370 } 3371 3372 /** 3373 * smack_ipc_getsecid - Extract smack security id 3374 * @ipp: the object permissions 3375 * @secid: where result will be saved 3376 */ 3377 static void smack_ipc_getsecid(struct kern_ipc_perm *ipp, u32 *secid) 3378 { 3379 struct smack_known *iskp = ipp->security; 3380 3381 *secid = iskp->smk_secid; 3382 } 3383 3384 /** 3385 * smack_d_instantiate - Make sure the blob is correct on an inode 3386 * @opt_dentry: dentry where inode will be attached 3387 * @inode: the object 3388 * 3389 * Set the inode's security blob if it hasn't been done already. 3390 */ 3391 static void smack_d_instantiate(struct dentry *opt_dentry, struct inode *inode) 3392 { 3393 struct super_block *sbp; 3394 struct superblock_smack *sbsp; 3395 struct inode_smack *isp; 3396 struct smack_known *skp; 3397 struct smack_known *ckp = smk_of_current(); 3398 struct smack_known *final; 3399 char trattr[TRANS_TRUE_SIZE]; 3400 int transflag = 0; 3401 int rc; 3402 struct dentry *dp; 3403 3404 if (inode == NULL) 3405 return; 3406 3407 isp = inode->i_security; 3408 3409 mutex_lock(&isp->smk_lock); 3410 /* 3411 * If the inode is already instantiated 3412 * take the quick way out 3413 */ 3414 if (isp->smk_flags & SMK_INODE_INSTANT) 3415 goto unlockandout; 3416 3417 sbp = inode->i_sb; 3418 sbsp = sbp->s_security; 3419 /* 3420 * We're going to use the superblock default label 3421 * if there's no label on the file. 3422 */ 3423 final = sbsp->smk_default; 3424 3425 /* 3426 * If this is the root inode the superblock 3427 * may be in the process of initialization. 3428 * If that is the case use the root value out 3429 * of the superblock. 3430 */ 3431 if (opt_dentry->d_parent == opt_dentry) { 3432 switch (sbp->s_magic) { 3433 case CGROUP_SUPER_MAGIC: 3434 /* 3435 * The cgroup filesystem is never mounted, 3436 * so there's no opportunity to set the mount 3437 * options. 3438 */ 3439 sbsp->smk_root = &smack_known_star; 3440 sbsp->smk_default = &smack_known_star; 3441 isp->smk_inode = sbsp->smk_root; 3442 break; 3443 case TMPFS_MAGIC: 3444 /* 3445 * What about shmem/tmpfs anonymous files with dentry 3446 * obtained from d_alloc_pseudo()? 3447 */ 3448 isp->smk_inode = smk_of_current(); 3449 break; 3450 case PIPEFS_MAGIC: 3451 isp->smk_inode = smk_of_current(); 3452 break; 3453 case SOCKFS_MAGIC: 3454 /* 3455 * Socket access is controlled by the socket 3456 * structures associated with the task involved. 3457 */ 3458 isp->smk_inode = &smack_known_star; 3459 break; 3460 default: 3461 isp->smk_inode = sbsp->smk_root; 3462 break; 3463 } 3464 isp->smk_flags |= SMK_INODE_INSTANT; 3465 goto unlockandout; 3466 } 3467 3468 /* 3469 * This is pretty hackish. 3470 * Casey says that we shouldn't have to do 3471 * file system specific code, but it does help 3472 * with keeping it simple. 3473 */ 3474 switch (sbp->s_magic) { 3475 case SMACK_MAGIC: 3476 case CGROUP_SUPER_MAGIC: 3477 /* 3478 * Casey says that it's a little embarrassing 3479 * that the smack file system doesn't do 3480 * extended attributes. 3481 * 3482 * Cgroupfs is special 3483 */ 3484 final = &smack_known_star; 3485 break; 3486 case DEVPTS_SUPER_MAGIC: 3487 /* 3488 * devpts seems content with the label of the task. 3489 * Programs that change smack have to treat the 3490 * pty with respect. 3491 */ 3492 final = ckp; 3493 break; 3494 case PROC_SUPER_MAGIC: 3495 /* 3496 * Casey says procfs appears not to care. 3497 * The superblock default suffices. 3498 */ 3499 break; 3500 case TMPFS_MAGIC: 3501 /* 3502 * Device labels should come from the filesystem, 3503 * but watch out, because they're volitile, 3504 * getting recreated on every reboot. 3505 */ 3506 final = &smack_known_star; 3507 /* 3508 * No break. 3509 * 3510 * If a smack value has been set we want to use it, 3511 * but since tmpfs isn't giving us the opportunity 3512 * to set mount options simulate setting the 3513 * superblock default. 3514 */ 3515 default: 3516 /* 3517 * This isn't an understood special case. 3518 * Get the value from the xattr. 3519 */ 3520 3521 /* 3522 * UNIX domain sockets use lower level socket data. 3523 */ 3524 if (S_ISSOCK(inode->i_mode)) { 3525 final = &smack_known_star; 3526 break; 3527 } 3528 /* 3529 * No xattr support means, alas, no SMACK label. 3530 * Use the aforeapplied default. 3531 * It would be curious if the label of the task 3532 * does not match that assigned. 3533 */ 3534 if (!(inode->i_opflags & IOP_XATTR)) 3535 break; 3536 /* 3537 * Get the dentry for xattr. 3538 */ 3539 dp = dget(opt_dentry); 3540 skp = smk_fetch(XATTR_NAME_SMACK, inode, dp); 3541 if (!IS_ERR_OR_NULL(skp)) 3542 final = skp; 3543 3544 /* 3545 * Transmuting directory 3546 */ 3547 if (S_ISDIR(inode->i_mode)) { 3548 /* 3549 * If this is a new directory and the label was 3550 * transmuted when the inode was initialized 3551 * set the transmute attribute on the directory 3552 * and mark the inode. 3553 * 3554 * If there is a transmute attribute on the 3555 * directory mark the inode. 3556 */ 3557 if (isp->smk_flags & SMK_INODE_CHANGED) { 3558 isp->smk_flags &= ~SMK_INODE_CHANGED; 3559 rc = __vfs_setxattr(dp, inode, 3560 XATTR_NAME_SMACKTRANSMUTE, 3561 TRANS_TRUE, TRANS_TRUE_SIZE, 3562 0); 3563 } else { 3564 rc = __vfs_getxattr(dp, inode, 3565 XATTR_NAME_SMACKTRANSMUTE, trattr, 3566 TRANS_TRUE_SIZE); 3567 if (rc >= 0 && strncmp(trattr, TRANS_TRUE, 3568 TRANS_TRUE_SIZE) != 0) 3569 rc = -EINVAL; 3570 } 3571 if (rc >= 0) 3572 transflag = SMK_INODE_TRANSMUTE; 3573 } 3574 /* 3575 * Don't let the exec or mmap label be "*" or "@". 3576 */ 3577 skp = smk_fetch(XATTR_NAME_SMACKEXEC, inode, dp); 3578 if (IS_ERR(skp) || skp == &smack_known_star || 3579 skp == &smack_known_web) 3580 skp = NULL; 3581 isp->smk_task = skp; 3582 3583 skp = smk_fetch(XATTR_NAME_SMACKMMAP, inode, dp); 3584 if (IS_ERR(skp) || skp == &smack_known_star || 3585 skp == &smack_known_web) 3586 skp = NULL; 3587 isp->smk_mmap = skp; 3588 3589 dput(dp); 3590 break; 3591 } 3592 3593 if (final == NULL) 3594 isp->smk_inode = ckp; 3595 else 3596 isp->smk_inode = final; 3597 3598 isp->smk_flags |= (SMK_INODE_INSTANT | transflag); 3599 3600 unlockandout: 3601 mutex_unlock(&isp->smk_lock); 3602 return; 3603 } 3604 3605 /** 3606 * smack_getprocattr - Smack process attribute access 3607 * @p: the object task 3608 * @name: the name of the attribute in /proc/.../attr 3609 * @value: where to put the result 3610 * 3611 * Places a copy of the task Smack into value 3612 * 3613 * Returns the length of the smack label or an error code 3614 */ 3615 static int smack_getprocattr(struct task_struct *p, char *name, char **value) 3616 { 3617 struct smack_known *skp = smk_of_task_struct(p); 3618 char *cp; 3619 int slen; 3620 3621 if (strcmp(name, "current") != 0) 3622 return -EINVAL; 3623 3624 cp = kstrdup(skp->smk_known, GFP_KERNEL); 3625 if (cp == NULL) 3626 return -ENOMEM; 3627 3628 slen = strlen(cp); 3629 *value = cp; 3630 return slen; 3631 } 3632 3633 /** 3634 * smack_setprocattr - Smack process attribute setting 3635 * @name: the name of the attribute in /proc/.../attr 3636 * @value: the value to set 3637 * @size: the size of the value 3638 * 3639 * Sets the Smack value of the task. Only setting self 3640 * is permitted and only with privilege 3641 * 3642 * Returns the length of the smack label or an error code 3643 */ 3644 static int smack_setprocattr(const char *name, void *value, size_t size) 3645 { 3646 struct task_smack *tsp = current_security(); 3647 struct cred *new; 3648 struct smack_known *skp; 3649 struct smack_known_list_elem *sklep; 3650 int rc; 3651 3652 if (!smack_privileged(CAP_MAC_ADMIN) && list_empty(&tsp->smk_relabel)) 3653 return -EPERM; 3654 3655 if (value == NULL || size == 0 || size >= SMK_LONGLABEL) 3656 return -EINVAL; 3657 3658 if (strcmp(name, "current") != 0) 3659 return -EINVAL; 3660 3661 skp = smk_import_entry(value, size); 3662 if (IS_ERR(skp)) 3663 return PTR_ERR(skp); 3664 3665 /* 3666 * No process is ever allowed the web ("@") label 3667 * and the star ("*") label. 3668 */ 3669 if (skp == &smack_known_web || skp == &smack_known_star) 3670 return -EINVAL; 3671 3672 if (!smack_privileged(CAP_MAC_ADMIN)) { 3673 rc = -EPERM; 3674 list_for_each_entry(sklep, &tsp->smk_relabel, list) 3675 if (sklep->smk_label == skp) { 3676 rc = 0; 3677 break; 3678 } 3679 if (rc) 3680 return rc; 3681 } 3682 3683 new = prepare_creds(); 3684 if (new == NULL) 3685 return -ENOMEM; 3686 3687 tsp = new->security; 3688 tsp->smk_task = skp; 3689 /* 3690 * process can change its label only once 3691 */ 3692 smk_destroy_label_list(&tsp->smk_relabel); 3693 3694 commit_creds(new); 3695 return size; 3696 } 3697 3698 /** 3699 * smack_unix_stream_connect - Smack access on UDS 3700 * @sock: one sock 3701 * @other: the other sock 3702 * @newsk: unused 3703 * 3704 * Return 0 if a subject with the smack of sock could access 3705 * an object with the smack of other, otherwise an error code 3706 */ 3707 static int smack_unix_stream_connect(struct sock *sock, 3708 struct sock *other, struct sock *newsk) 3709 { 3710 struct smack_known *skp; 3711 struct smack_known *okp; 3712 struct socket_smack *ssp = sock->sk_security; 3713 struct socket_smack *osp = other->sk_security; 3714 struct socket_smack *nsp = newsk->sk_security; 3715 struct smk_audit_info ad; 3716 int rc = 0; 3717 #ifdef CONFIG_AUDIT 3718 struct lsm_network_audit net; 3719 #endif 3720 3721 if (!smack_privileged(CAP_MAC_OVERRIDE)) { 3722 skp = ssp->smk_out; 3723 okp = osp->smk_in; 3724 #ifdef CONFIG_AUDIT 3725 smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); 3726 smk_ad_setfield_u_net_sk(&ad, other); 3727 #endif 3728 rc = smk_access(skp, okp, MAY_WRITE, &ad); 3729 rc = smk_bu_note("UDS connect", skp, okp, MAY_WRITE, rc); 3730 if (rc == 0) { 3731 okp = osp->smk_out; 3732 skp = ssp->smk_in; 3733 rc = smk_access(okp, skp, MAY_WRITE, &ad); 3734 rc = smk_bu_note("UDS connect", okp, skp, 3735 MAY_WRITE, rc); 3736 } 3737 } 3738 3739 /* 3740 * Cross reference the peer labels for SO_PEERSEC. 3741 */ 3742 if (rc == 0) { 3743 nsp->smk_packet = ssp->smk_out; 3744 ssp->smk_packet = osp->smk_out; 3745 } 3746 3747 return rc; 3748 } 3749 3750 /** 3751 * smack_unix_may_send - Smack access on UDS 3752 * @sock: one socket 3753 * @other: the other socket 3754 * 3755 * Return 0 if a subject with the smack of sock could access 3756 * an object with the smack of other, otherwise an error code 3757 */ 3758 static int smack_unix_may_send(struct socket *sock, struct socket *other) 3759 { 3760 struct socket_smack *ssp = sock->sk->sk_security; 3761 struct socket_smack *osp = other->sk->sk_security; 3762 struct smk_audit_info ad; 3763 int rc; 3764 3765 #ifdef CONFIG_AUDIT 3766 struct lsm_network_audit net; 3767 3768 smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); 3769 smk_ad_setfield_u_net_sk(&ad, other->sk); 3770 #endif 3771 3772 if (smack_privileged(CAP_MAC_OVERRIDE)) 3773 return 0; 3774 3775 rc = smk_access(ssp->smk_out, osp->smk_in, MAY_WRITE, &ad); 3776 rc = smk_bu_note("UDS send", ssp->smk_out, osp->smk_in, MAY_WRITE, rc); 3777 return rc; 3778 } 3779 3780 /** 3781 * smack_socket_sendmsg - Smack check based on destination host 3782 * @sock: the socket 3783 * @msg: the message 3784 * @size: the size of the message 3785 * 3786 * Return 0 if the current subject can write to the destination host. 3787 * For IPv4 this is only a question if the destination is a single label host. 3788 * For IPv6 this is a check against the label of the port. 3789 */ 3790 static int smack_socket_sendmsg(struct socket *sock, struct msghdr *msg, 3791 int size) 3792 { 3793 struct sockaddr_in *sip = (struct sockaddr_in *) msg->msg_name; 3794 #if IS_ENABLED(CONFIG_IPV6) 3795 struct sockaddr_in6 *sap = (struct sockaddr_in6 *) msg->msg_name; 3796 #endif 3797 #ifdef SMACK_IPV6_SECMARK_LABELING 3798 struct socket_smack *ssp = sock->sk->sk_security; 3799 struct smack_known *rsp; 3800 #endif 3801 int rc = 0; 3802 3803 /* 3804 * Perfectly reasonable for this to be NULL 3805 */ 3806 if (sip == NULL) 3807 return 0; 3808 3809 switch (sock->sk->sk_family) { 3810 case AF_INET: 3811 rc = smack_netlabel_send(sock->sk, sip); 3812 break; 3813 case AF_INET6: 3814 #ifdef SMACK_IPV6_SECMARK_LABELING 3815 rsp = smack_ipv6host_label(sap); 3816 if (rsp != NULL) 3817 rc = smk_ipv6_check(ssp->smk_out, rsp, sap, 3818 SMK_CONNECTING); 3819 #endif 3820 #ifdef SMACK_IPV6_PORT_LABELING 3821 rc = smk_ipv6_port_check(sock->sk, sap, SMK_SENDING); 3822 #endif 3823 break; 3824 } 3825 return rc; 3826 } 3827 3828 /** 3829 * smack_from_secattr - Convert a netlabel attr.mls.lvl/attr.mls.cat pair to smack 3830 * @sap: netlabel secattr 3831 * @ssp: socket security information 3832 * 3833 * Returns a pointer to a Smack label entry found on the label list. 3834 */ 3835 static struct smack_known *smack_from_secattr(struct netlbl_lsm_secattr *sap, 3836 struct socket_smack *ssp) 3837 { 3838 struct smack_known *skp; 3839 int found = 0; 3840 int acat; 3841 int kcat; 3842 3843 if ((sap->flags & NETLBL_SECATTR_MLS_LVL) != 0) { 3844 /* 3845 * Looks like a CIPSO packet. 3846 * If there are flags but no level netlabel isn't 3847 * behaving the way we expect it to. 3848 * 3849 * Look it up in the label table 3850 * Without guidance regarding the smack value 3851 * for the packet fall back on the network 3852 * ambient value. 3853 */ 3854 rcu_read_lock(); 3855 list_for_each_entry_rcu(skp, &smack_known_list, list) { 3856 if (sap->attr.mls.lvl != skp->smk_netlabel.attr.mls.lvl) 3857 continue; 3858 /* 3859 * Compare the catsets. Use the netlbl APIs. 3860 */ 3861 if ((sap->flags & NETLBL_SECATTR_MLS_CAT) == 0) { 3862 if ((skp->smk_netlabel.flags & 3863 NETLBL_SECATTR_MLS_CAT) == 0) 3864 found = 1; 3865 break; 3866 } 3867 for (acat = -1, kcat = -1; acat == kcat; ) { 3868 acat = netlbl_catmap_walk(sap->attr.mls.cat, 3869 acat + 1); 3870 kcat = netlbl_catmap_walk( 3871 skp->smk_netlabel.attr.mls.cat, 3872 kcat + 1); 3873 if (acat < 0 || kcat < 0) 3874 break; 3875 } 3876 if (acat == kcat) { 3877 found = 1; 3878 break; 3879 } 3880 } 3881 rcu_read_unlock(); 3882 3883 if (found) 3884 return skp; 3885 3886 if (ssp != NULL && ssp->smk_in == &smack_known_star) 3887 return &smack_known_web; 3888 return &smack_known_star; 3889 } 3890 if ((sap->flags & NETLBL_SECATTR_SECID) != 0) 3891 /* 3892 * Looks like a fallback, which gives us a secid. 3893 */ 3894 return smack_from_secid(sap->attr.secid); 3895 /* 3896 * Without guidance regarding the smack value 3897 * for the packet fall back on the network 3898 * ambient value. 3899 */ 3900 return smack_net_ambient; 3901 } 3902 3903 #if IS_ENABLED(CONFIG_IPV6) 3904 static int smk_skb_to_addr_ipv6(struct sk_buff *skb, struct sockaddr_in6 *sip) 3905 { 3906 u8 nexthdr; 3907 int offset; 3908 int proto = -EINVAL; 3909 struct ipv6hdr _ipv6h; 3910 struct ipv6hdr *ip6; 3911 __be16 frag_off; 3912 struct tcphdr _tcph, *th; 3913 struct udphdr _udph, *uh; 3914 struct dccp_hdr _dccph, *dh; 3915 3916 sip->sin6_port = 0; 3917 3918 offset = skb_network_offset(skb); 3919 ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h); 3920 if (ip6 == NULL) 3921 return -EINVAL; 3922 sip->sin6_addr = ip6->saddr; 3923 3924 nexthdr = ip6->nexthdr; 3925 offset += sizeof(_ipv6h); 3926 offset = ipv6_skip_exthdr(skb, offset, &nexthdr, &frag_off); 3927 if (offset < 0) 3928 return -EINVAL; 3929 3930 proto = nexthdr; 3931 switch (proto) { 3932 case IPPROTO_TCP: 3933 th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph); 3934 if (th != NULL) 3935 sip->sin6_port = th->source; 3936 break; 3937 case IPPROTO_UDP: 3938 uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph); 3939 if (uh != NULL) 3940 sip->sin6_port = uh->source; 3941 break; 3942 case IPPROTO_DCCP: 3943 dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph); 3944 if (dh != NULL) 3945 sip->sin6_port = dh->dccph_sport; 3946 break; 3947 } 3948 return proto; 3949 } 3950 #endif /* CONFIG_IPV6 */ 3951 3952 /** 3953 * smack_socket_sock_rcv_skb - Smack packet delivery access check 3954 * @sk: socket 3955 * @skb: packet 3956 * 3957 * Returns 0 if the packet should be delivered, an error code otherwise 3958 */ 3959 static int smack_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) 3960 { 3961 struct netlbl_lsm_secattr secattr; 3962 struct socket_smack *ssp = sk->sk_security; 3963 struct smack_known *skp = NULL; 3964 int rc = 0; 3965 struct smk_audit_info ad; 3966 #ifdef CONFIG_AUDIT 3967 struct lsm_network_audit net; 3968 #endif 3969 #if IS_ENABLED(CONFIG_IPV6) 3970 struct sockaddr_in6 sadd; 3971 int proto; 3972 #endif /* CONFIG_IPV6 */ 3973 3974 switch (sk->sk_family) { 3975 case PF_INET: 3976 #ifdef CONFIG_SECURITY_SMACK_NETFILTER 3977 /* 3978 * If there is a secmark use it rather than the CIPSO label. 3979 * If there is no secmark fall back to CIPSO. 3980 * The secmark is assumed to reflect policy better. 3981 */ 3982 if (skb && skb->secmark != 0) { 3983 skp = smack_from_secid(skb->secmark); 3984 goto access_check; 3985 } 3986 #endif /* CONFIG_SECURITY_SMACK_NETFILTER */ 3987 /* 3988 * Translate what netlabel gave us. 3989 */ 3990 netlbl_secattr_init(&secattr); 3991 3992 rc = netlbl_skbuff_getattr(skb, sk->sk_family, &secattr); 3993 if (rc == 0) 3994 skp = smack_from_secattr(&secattr, ssp); 3995 else 3996 skp = smack_net_ambient; 3997 3998 netlbl_secattr_destroy(&secattr); 3999 4000 #ifdef CONFIG_SECURITY_SMACK_NETFILTER 4001 access_check: 4002 #endif 4003 #ifdef CONFIG_AUDIT 4004 smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); 4005 ad.a.u.net->family = sk->sk_family; 4006 ad.a.u.net->netif = skb->skb_iif; 4007 ipv4_skb_to_auditdata(skb, &ad.a, NULL); 4008 #endif 4009 /* 4010 * Receiving a packet requires that the other end 4011 * be able to write here. Read access is not required. 4012 * This is the simplist possible security model 4013 * for networking. 4014 */ 4015 rc = smk_access(skp, ssp->smk_in, MAY_WRITE, &ad); 4016 rc = smk_bu_note("IPv4 delivery", skp, ssp->smk_in, 4017 MAY_WRITE, rc); 4018 if (rc != 0) 4019 netlbl_skbuff_err(skb, sk->sk_family, rc, 0); 4020 break; 4021 #if IS_ENABLED(CONFIG_IPV6) 4022 case PF_INET6: 4023 proto = smk_skb_to_addr_ipv6(skb, &sadd); 4024 if (proto != IPPROTO_UDP && proto != IPPROTO_TCP) 4025 break; 4026 #ifdef SMACK_IPV6_SECMARK_LABELING 4027 if (skb && skb->secmark != 0) 4028 skp = smack_from_secid(skb->secmark); 4029 else 4030 skp = smack_ipv6host_label(&sadd); 4031 if (skp == NULL) 4032 skp = smack_net_ambient; 4033 #ifdef CONFIG_AUDIT 4034 smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); 4035 ad.a.u.net->family = sk->sk_family; 4036 ad.a.u.net->netif = skb->skb_iif; 4037 ipv6_skb_to_auditdata(skb, &ad.a, NULL); 4038 #endif /* CONFIG_AUDIT */ 4039 rc = smk_access(skp, ssp->smk_in, MAY_WRITE, &ad); 4040 rc = smk_bu_note("IPv6 delivery", skp, ssp->smk_in, 4041 MAY_WRITE, rc); 4042 #endif /* SMACK_IPV6_SECMARK_LABELING */ 4043 #ifdef SMACK_IPV6_PORT_LABELING 4044 rc = smk_ipv6_port_check(sk, &sadd, SMK_RECEIVING); 4045 #endif /* SMACK_IPV6_PORT_LABELING */ 4046 break; 4047 #endif /* CONFIG_IPV6 */ 4048 } 4049 4050 return rc; 4051 } 4052 4053 /** 4054 * smack_socket_getpeersec_stream - pull in packet label 4055 * @sock: the socket 4056 * @optval: user's destination 4057 * @optlen: size thereof 4058 * @len: max thereof 4059 * 4060 * returns zero on success, an error code otherwise 4061 */ 4062 static int smack_socket_getpeersec_stream(struct socket *sock, 4063 char __user *optval, 4064 int __user *optlen, unsigned len) 4065 { 4066 struct socket_smack *ssp; 4067 char *rcp = ""; 4068 int slen = 1; 4069 int rc = 0; 4070 4071 ssp = sock->sk->sk_security; 4072 if (ssp->smk_packet != NULL) { 4073 rcp = ssp->smk_packet->smk_known; 4074 slen = strlen(rcp) + 1; 4075 } 4076 4077 if (slen > len) 4078 rc = -ERANGE; 4079 else if (copy_to_user(optval, rcp, slen) != 0) 4080 rc = -EFAULT; 4081 4082 if (put_user(slen, optlen) != 0) 4083 rc = -EFAULT; 4084 4085 return rc; 4086 } 4087 4088 4089 /** 4090 * smack_socket_getpeersec_dgram - pull in packet label 4091 * @sock: the peer socket 4092 * @skb: packet data 4093 * @secid: pointer to where to put the secid of the packet 4094 * 4095 * Sets the netlabel socket state on sk from parent 4096 */ 4097 static int smack_socket_getpeersec_dgram(struct socket *sock, 4098 struct sk_buff *skb, u32 *secid) 4099 4100 { 4101 struct netlbl_lsm_secattr secattr; 4102 struct socket_smack *ssp = NULL; 4103 struct smack_known *skp; 4104 int family = PF_UNSPEC; 4105 u32 s = 0; /* 0 is the invalid secid */ 4106 int rc; 4107 4108 if (skb != NULL) { 4109 if (skb->protocol == htons(ETH_P_IP)) 4110 family = PF_INET; 4111 #if IS_ENABLED(CONFIG_IPV6) 4112 else if (skb->protocol == htons(ETH_P_IPV6)) 4113 family = PF_INET6; 4114 #endif /* CONFIG_IPV6 */ 4115 } 4116 if (family == PF_UNSPEC && sock != NULL) 4117 family = sock->sk->sk_family; 4118 4119 switch (family) { 4120 case PF_UNIX: 4121 ssp = sock->sk->sk_security; 4122 s = ssp->smk_out->smk_secid; 4123 break; 4124 case PF_INET: 4125 #ifdef CONFIG_SECURITY_SMACK_NETFILTER 4126 s = skb->secmark; 4127 if (s != 0) 4128 break; 4129 #endif 4130 /* 4131 * Translate what netlabel gave us. 4132 */ 4133 if (sock != NULL && sock->sk != NULL) 4134 ssp = sock->sk->sk_security; 4135 netlbl_secattr_init(&secattr); 4136 rc = netlbl_skbuff_getattr(skb, family, &secattr); 4137 if (rc == 0) { 4138 skp = smack_from_secattr(&secattr, ssp); 4139 s = skp->smk_secid; 4140 } 4141 netlbl_secattr_destroy(&secattr); 4142 break; 4143 case PF_INET6: 4144 #ifdef SMACK_IPV6_SECMARK_LABELING 4145 s = skb->secmark; 4146 #endif 4147 break; 4148 } 4149 *secid = s; 4150 if (s == 0) 4151 return -EINVAL; 4152 return 0; 4153 } 4154 4155 /** 4156 * smack_sock_graft - Initialize a newly created socket with an existing sock 4157 * @sk: child sock 4158 * @parent: parent socket 4159 * 4160 * Set the smk_{in,out} state of an existing sock based on the process that 4161 * is creating the new socket. 4162 */ 4163 static void smack_sock_graft(struct sock *sk, struct socket *parent) 4164 { 4165 struct socket_smack *ssp; 4166 struct smack_known *skp = smk_of_current(); 4167 4168 if (sk == NULL || 4169 (sk->sk_family != PF_INET && sk->sk_family != PF_INET6)) 4170 return; 4171 4172 ssp = sk->sk_security; 4173 ssp->smk_in = skp; 4174 ssp->smk_out = skp; 4175 /* cssp->smk_packet is already set in smack_inet_csk_clone() */ 4176 } 4177 4178 /** 4179 * smack_inet_conn_request - Smack access check on connect 4180 * @sk: socket involved 4181 * @skb: packet 4182 * @req: unused 4183 * 4184 * Returns 0 if a task with the packet label could write to 4185 * the socket, otherwise an error code 4186 */ 4187 static int smack_inet_conn_request(struct sock *sk, struct sk_buff *skb, 4188 struct request_sock *req) 4189 { 4190 u16 family = sk->sk_family; 4191 struct smack_known *skp; 4192 struct socket_smack *ssp = sk->sk_security; 4193 struct netlbl_lsm_secattr secattr; 4194 struct sockaddr_in addr; 4195 struct iphdr *hdr; 4196 struct smack_known *hskp; 4197 int rc; 4198 struct smk_audit_info ad; 4199 #ifdef CONFIG_AUDIT 4200 struct lsm_network_audit net; 4201 #endif 4202 4203 #if IS_ENABLED(CONFIG_IPV6) 4204 if (family == PF_INET6) { 4205 /* 4206 * Handle mapped IPv4 packets arriving 4207 * via IPv6 sockets. Don't set up netlabel 4208 * processing on IPv6. 4209 */ 4210 if (skb->protocol == htons(ETH_P_IP)) 4211 family = PF_INET; 4212 else 4213 return 0; 4214 } 4215 #endif /* CONFIG_IPV6 */ 4216 4217 #ifdef CONFIG_SECURITY_SMACK_NETFILTER 4218 /* 4219 * If there is a secmark use it rather than the CIPSO label. 4220 * If there is no secmark fall back to CIPSO. 4221 * The secmark is assumed to reflect policy better. 4222 */ 4223 if (skb && skb->secmark != 0) { 4224 skp = smack_from_secid(skb->secmark); 4225 goto access_check; 4226 } 4227 #endif /* CONFIG_SECURITY_SMACK_NETFILTER */ 4228 4229 netlbl_secattr_init(&secattr); 4230 rc = netlbl_skbuff_getattr(skb, family, &secattr); 4231 if (rc == 0) 4232 skp = smack_from_secattr(&secattr, ssp); 4233 else 4234 skp = &smack_known_huh; 4235 netlbl_secattr_destroy(&secattr); 4236 4237 #ifdef CONFIG_SECURITY_SMACK_NETFILTER 4238 access_check: 4239 #endif 4240 4241 #ifdef CONFIG_AUDIT 4242 smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net); 4243 ad.a.u.net->family = family; 4244 ad.a.u.net->netif = skb->skb_iif; 4245 ipv4_skb_to_auditdata(skb, &ad.a, NULL); 4246 #endif 4247 /* 4248 * Receiving a packet requires that the other end be able to write 4249 * here. Read access is not required. 4250 */ 4251 rc = smk_access(skp, ssp->smk_in, MAY_WRITE, &ad); 4252 rc = smk_bu_note("IPv4 connect", skp, ssp->smk_in, MAY_WRITE, rc); 4253 if (rc != 0) 4254 return rc; 4255 4256 /* 4257 * Save the peer's label in the request_sock so we can later setup 4258 * smk_packet in the child socket so that SO_PEERCRED can report it. 4259 */ 4260 req->peer_secid = skp->smk_secid; 4261 4262 /* 4263 * We need to decide if we want to label the incoming connection here 4264 * if we do we only need to label the request_sock and the stack will 4265 * propagate the wire-label to the sock when it is created. 4266 */ 4267 hdr = ip_hdr(skb); 4268 addr.sin_addr.s_addr = hdr->saddr; 4269 rcu_read_lock(); 4270 hskp = smack_ipv4host_label(&addr); 4271 rcu_read_unlock(); 4272 4273 if (hskp == NULL) 4274 rc = netlbl_req_setattr(req, &skp->smk_netlabel); 4275 else 4276 netlbl_req_delattr(req); 4277 4278 return rc; 4279 } 4280 4281 /** 4282 * smack_inet_csk_clone - Copy the connection information to the new socket 4283 * @sk: the new socket 4284 * @req: the connection's request_sock 4285 * 4286 * Transfer the connection's peer label to the newly created socket. 4287 */ 4288 static void smack_inet_csk_clone(struct sock *sk, 4289 const struct request_sock *req) 4290 { 4291 struct socket_smack *ssp = sk->sk_security; 4292 struct smack_known *skp; 4293 4294 if (req->peer_secid != 0) { 4295 skp = smack_from_secid(req->peer_secid); 4296 ssp->smk_packet = skp; 4297 } else 4298 ssp->smk_packet = NULL; 4299 } 4300 4301 /* 4302 * Key management security hooks 4303 * 4304 * Casey has not tested key support very heavily. 4305 * The permission check is most likely too restrictive. 4306 * If you care about keys please have a look. 4307 */ 4308 #ifdef CONFIG_KEYS 4309 4310 /** 4311 * smack_key_alloc - Set the key security blob 4312 * @key: object 4313 * @cred: the credentials to use 4314 * @flags: unused 4315 * 4316 * No allocation required 4317 * 4318 * Returns 0 4319 */ 4320 static int smack_key_alloc(struct key *key, const struct cred *cred, 4321 unsigned long flags) 4322 { 4323 struct smack_known *skp = smk_of_task(cred->security); 4324 4325 key->security = skp; 4326 return 0; 4327 } 4328 4329 /** 4330 * smack_key_free - Clear the key security blob 4331 * @key: the object 4332 * 4333 * Clear the blob pointer 4334 */ 4335 static void smack_key_free(struct key *key) 4336 { 4337 key->security = NULL; 4338 } 4339 4340 /** 4341 * smack_key_permission - Smack access on a key 4342 * @key_ref: gets to the object 4343 * @cred: the credentials to use 4344 * @perm: requested key permissions 4345 * 4346 * Return 0 if the task has read and write to the object, 4347 * an error code otherwise 4348 */ 4349 static int smack_key_permission(key_ref_t key_ref, 4350 const struct cred *cred, unsigned perm) 4351 { 4352 struct key *keyp; 4353 struct smk_audit_info ad; 4354 struct smack_known *tkp = smk_of_task(cred->security); 4355 int request = 0; 4356 int rc; 4357 4358 keyp = key_ref_to_ptr(key_ref); 4359 if (keyp == NULL) 4360 return -EINVAL; 4361 /* 4362 * If the key hasn't been initialized give it access so that 4363 * it may do so. 4364 */ 4365 if (keyp->security == NULL) 4366 return 0; 4367 /* 4368 * This should not occur 4369 */ 4370 if (tkp == NULL) 4371 return -EACCES; 4372 4373 if (smack_privileged_cred(CAP_MAC_OVERRIDE, cred)) 4374 return 0; 4375 4376 #ifdef CONFIG_AUDIT 4377 smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_KEY); 4378 ad.a.u.key_struct.key = keyp->serial; 4379 ad.a.u.key_struct.key_desc = keyp->description; 4380 #endif 4381 if (perm & KEY_NEED_READ) 4382 request = MAY_READ; 4383 if (perm & (KEY_NEED_WRITE | KEY_NEED_LINK | KEY_NEED_SETATTR)) 4384 request = MAY_WRITE; 4385 rc = smk_access(tkp, keyp->security, request, &ad); 4386 rc = smk_bu_note("key access", tkp, keyp->security, request, rc); 4387 return rc; 4388 } 4389 4390 /* 4391 * smack_key_getsecurity - Smack label tagging the key 4392 * @key points to the key to be queried 4393 * @_buffer points to a pointer that should be set to point to the 4394 * resulting string (if no label or an error occurs). 4395 * Return the length of the string (including terminating NUL) or -ve if 4396 * an error. 4397 * May also return 0 (and a NULL buffer pointer) if there is no label. 4398 */ 4399 static int smack_key_getsecurity(struct key *key, char **_buffer) 4400 { 4401 struct smack_known *skp = key->security; 4402 size_t length; 4403 char *copy; 4404 4405 if (key->security == NULL) { 4406 *_buffer = NULL; 4407 return 0; 4408 } 4409 4410 copy = kstrdup(skp->smk_known, GFP_KERNEL); 4411 if (copy == NULL) 4412 return -ENOMEM; 4413 length = strlen(copy) + 1; 4414 4415 *_buffer = copy; 4416 return length; 4417 } 4418 4419 #endif /* CONFIG_KEYS */ 4420 4421 /* 4422 * Smack Audit hooks 4423 * 4424 * Audit requires a unique representation of each Smack specific 4425 * rule. This unique representation is used to distinguish the 4426 * object to be audited from remaining kernel objects and also 4427 * works as a glue between the audit hooks. 4428 * 4429 * Since repository entries are added but never deleted, we'll use 4430 * the smack_known label address related to the given audit rule as 4431 * the needed unique representation. This also better fits the smack 4432 * model where nearly everything is a label. 4433 */ 4434 #ifdef CONFIG_AUDIT 4435 4436 /** 4437 * smack_audit_rule_init - Initialize a smack audit rule 4438 * @field: audit rule fields given from user-space (audit.h) 4439 * @op: required testing operator (=, !=, >, <, ...) 4440 * @rulestr: smack label to be audited 4441 * @vrule: pointer to save our own audit rule representation 4442 * 4443 * Prepare to audit cases where (@field @op @rulestr) is true. 4444 * The label to be audited is created if necessay. 4445 */ 4446 static int smack_audit_rule_init(u32 field, u32 op, char *rulestr, void **vrule) 4447 { 4448 struct smack_known *skp; 4449 char **rule = (char **)vrule; 4450 *rule = NULL; 4451 4452 if (field != AUDIT_SUBJ_USER && field != AUDIT_OBJ_USER) 4453 return -EINVAL; 4454 4455 if (op != Audit_equal && op != Audit_not_equal) 4456 return -EINVAL; 4457 4458 skp = smk_import_entry(rulestr, 0); 4459 if (IS_ERR(skp)) 4460 return PTR_ERR(skp); 4461 4462 *rule = skp->smk_known; 4463 4464 return 0; 4465 } 4466 4467 /** 4468 * smack_audit_rule_known - Distinguish Smack audit rules 4469 * @krule: rule of interest, in Audit kernel representation format 4470 * 4471 * This is used to filter Smack rules from remaining Audit ones. 4472 * If it's proved that this rule belongs to us, the 4473 * audit_rule_match hook will be called to do the final judgement. 4474 */ 4475 static int smack_audit_rule_known(struct audit_krule *krule) 4476 { 4477 struct audit_field *f; 4478 int i; 4479 4480 for (i = 0; i < krule->field_count; i++) { 4481 f = &krule->fields[i]; 4482 4483 if (f->type == AUDIT_SUBJ_USER || f->type == AUDIT_OBJ_USER) 4484 return 1; 4485 } 4486 4487 return 0; 4488 } 4489 4490 /** 4491 * smack_audit_rule_match - Audit given object ? 4492 * @secid: security id for identifying the object to test 4493 * @field: audit rule flags given from user-space 4494 * @op: required testing operator 4495 * @vrule: smack internal rule presentation 4496 * @actx: audit context associated with the check 4497 * 4498 * The core Audit hook. It's used to take the decision of 4499 * whether to audit or not to audit a given object. 4500 */ 4501 static int smack_audit_rule_match(u32 secid, u32 field, u32 op, void *vrule, 4502 struct audit_context *actx) 4503 { 4504 struct smack_known *skp; 4505 char *rule = vrule; 4506 4507 if (unlikely(!rule)) { 4508 WARN_ONCE(1, "Smack: missing rule\n"); 4509 return -ENOENT; 4510 } 4511 4512 if (field != AUDIT_SUBJ_USER && field != AUDIT_OBJ_USER) 4513 return 0; 4514 4515 skp = smack_from_secid(secid); 4516 4517 /* 4518 * No need to do string comparisons. If a match occurs, 4519 * both pointers will point to the same smack_known 4520 * label. 4521 */ 4522 if (op == Audit_equal) 4523 return (rule == skp->smk_known); 4524 if (op == Audit_not_equal) 4525 return (rule != skp->smk_known); 4526 4527 return 0; 4528 } 4529 4530 /* 4531 * There is no need for a smack_audit_rule_free hook. 4532 * No memory was allocated. 4533 */ 4534 4535 #endif /* CONFIG_AUDIT */ 4536 4537 /** 4538 * smack_ismaclabel - check if xattr @name references a smack MAC label 4539 * @name: Full xattr name to check. 4540 */ 4541 static int smack_ismaclabel(const char *name) 4542 { 4543 return (strcmp(name, XATTR_SMACK_SUFFIX) == 0); 4544 } 4545 4546 4547 /** 4548 * smack_secid_to_secctx - return the smack label for a secid 4549 * @secid: incoming integer 4550 * @secdata: destination 4551 * @seclen: how long it is 4552 * 4553 * Exists for networking code. 4554 */ 4555 static int smack_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) 4556 { 4557 struct smack_known *skp = smack_from_secid(secid); 4558 4559 if (secdata) 4560 *secdata = skp->smk_known; 4561 *seclen = strlen(skp->smk_known); 4562 return 0; 4563 } 4564 4565 /** 4566 * smack_secctx_to_secid - return the secid for a smack label 4567 * @secdata: smack label 4568 * @seclen: how long result is 4569 * @secid: outgoing integer 4570 * 4571 * Exists for audit and networking code. 4572 */ 4573 static int smack_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid) 4574 { 4575 struct smack_known *skp = smk_find_entry(secdata); 4576 4577 if (skp) 4578 *secid = skp->smk_secid; 4579 else 4580 *secid = 0; 4581 return 0; 4582 } 4583 4584 /* 4585 * There used to be a smack_release_secctx hook 4586 * that did nothing back when hooks were in a vector. 4587 * Now that there's a list such a hook adds cost. 4588 */ 4589 4590 static int smack_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen) 4591 { 4592 return smack_inode_setsecurity(inode, XATTR_SMACK_SUFFIX, ctx, ctxlen, 0); 4593 } 4594 4595 static int smack_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen) 4596 { 4597 return __vfs_setxattr_noperm(dentry, XATTR_NAME_SMACK, ctx, ctxlen, 0); 4598 } 4599 4600 static int smack_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen) 4601 { 4602 int len = 0; 4603 len = smack_inode_getsecurity(inode, XATTR_SMACK_SUFFIX, ctx, true); 4604 4605 if (len < 0) 4606 return len; 4607 *ctxlen = len; 4608 return 0; 4609 } 4610 4611 static int smack_inode_copy_up(struct dentry *dentry, struct cred **new) 4612 { 4613 4614 struct task_smack *tsp; 4615 struct smack_known *skp; 4616 struct inode_smack *isp; 4617 struct cred *new_creds = *new; 4618 4619 if (new_creds == NULL) { 4620 new_creds = prepare_creds(); 4621 if (new_creds == NULL) 4622 return -ENOMEM; 4623 } 4624 4625 tsp = new_creds->security; 4626 4627 /* 4628 * Get label from overlay inode and set it in create_sid 4629 */ 4630 isp = d_inode(dentry->d_parent)->i_security; 4631 skp = isp->smk_inode; 4632 tsp->smk_task = skp; 4633 *new = new_creds; 4634 return 0; 4635 } 4636 4637 static int smack_inode_copy_up_xattr(const char *name) 4638 { 4639 /* 4640 * Return 1 if this is the smack access Smack attribute. 4641 */ 4642 if (strcmp(name, XATTR_NAME_SMACK) == 0) 4643 return 1; 4644 4645 return -EOPNOTSUPP; 4646 } 4647 4648 static int smack_dentry_create_files_as(struct dentry *dentry, int mode, 4649 struct qstr *name, 4650 const struct cred *old, 4651 struct cred *new) 4652 { 4653 struct task_smack *otsp = old->security; 4654 struct task_smack *ntsp = new->security; 4655 struct inode_smack *isp; 4656 int may; 4657 4658 /* 4659 * Use the process credential unless all of 4660 * the transmuting criteria are met 4661 */ 4662 ntsp->smk_task = otsp->smk_task; 4663 4664 /* 4665 * the attribute of the containing directory 4666 */ 4667 isp = d_inode(dentry->d_parent)->i_security; 4668 4669 if (isp->smk_flags & SMK_INODE_TRANSMUTE) { 4670 rcu_read_lock(); 4671 may = smk_access_entry(otsp->smk_task->smk_known, 4672 isp->smk_inode->smk_known, 4673 &otsp->smk_task->smk_rules); 4674 rcu_read_unlock(); 4675 4676 /* 4677 * If the directory is transmuting and the rule 4678 * providing access is transmuting use the containing 4679 * directory label instead of the process label. 4680 */ 4681 if (may > 0 && (may & MAY_TRANSMUTE)) 4682 ntsp->smk_task = isp->smk_inode; 4683 } 4684 return 0; 4685 } 4686 4687 static struct security_hook_list smack_hooks[] __lsm_ro_after_init = { 4688 LSM_HOOK_INIT(ptrace_access_check, smack_ptrace_access_check), 4689 LSM_HOOK_INIT(ptrace_traceme, smack_ptrace_traceme), 4690 LSM_HOOK_INIT(syslog, smack_syslog), 4691 4692 LSM_HOOK_INIT(sb_alloc_security, smack_sb_alloc_security), 4693 LSM_HOOK_INIT(sb_free_security, smack_sb_free_security), 4694 LSM_HOOK_INIT(sb_copy_data, smack_sb_copy_data), 4695 LSM_HOOK_INIT(sb_kern_mount, smack_sb_kern_mount), 4696 LSM_HOOK_INIT(sb_statfs, smack_sb_statfs), 4697 LSM_HOOK_INIT(sb_set_mnt_opts, smack_set_mnt_opts), 4698 LSM_HOOK_INIT(sb_parse_opts_str, smack_parse_opts_str), 4699 4700 LSM_HOOK_INIT(bprm_set_creds, smack_bprm_set_creds), 4701 4702 LSM_HOOK_INIT(inode_alloc_security, smack_inode_alloc_security), 4703 LSM_HOOK_INIT(inode_free_security, smack_inode_free_security), 4704 LSM_HOOK_INIT(inode_init_security, smack_inode_init_security), 4705 LSM_HOOK_INIT(inode_link, smack_inode_link), 4706 LSM_HOOK_INIT(inode_unlink, smack_inode_unlink), 4707 LSM_HOOK_INIT(inode_rmdir, smack_inode_rmdir), 4708 LSM_HOOK_INIT(inode_rename, smack_inode_rename), 4709 LSM_HOOK_INIT(inode_permission, smack_inode_permission), 4710 LSM_HOOK_INIT(inode_setattr, smack_inode_setattr), 4711 LSM_HOOK_INIT(inode_getattr, smack_inode_getattr), 4712 LSM_HOOK_INIT(inode_setxattr, smack_inode_setxattr), 4713 LSM_HOOK_INIT(inode_post_setxattr, smack_inode_post_setxattr), 4714 LSM_HOOK_INIT(inode_getxattr, smack_inode_getxattr), 4715 LSM_HOOK_INIT(inode_removexattr, smack_inode_removexattr), 4716 LSM_HOOK_INIT(inode_getsecurity, smack_inode_getsecurity), 4717 LSM_HOOK_INIT(inode_setsecurity, smack_inode_setsecurity), 4718 LSM_HOOK_INIT(inode_listsecurity, smack_inode_listsecurity), 4719 LSM_HOOK_INIT(inode_getsecid, smack_inode_getsecid), 4720 4721 LSM_HOOK_INIT(file_alloc_security, smack_file_alloc_security), 4722 LSM_HOOK_INIT(file_free_security, smack_file_free_security), 4723 LSM_HOOK_INIT(file_ioctl, smack_file_ioctl), 4724 LSM_HOOK_INIT(file_lock, smack_file_lock), 4725 LSM_HOOK_INIT(file_fcntl, smack_file_fcntl), 4726 LSM_HOOK_INIT(mmap_file, smack_mmap_file), 4727 LSM_HOOK_INIT(mmap_addr, cap_mmap_addr), 4728 LSM_HOOK_INIT(file_set_fowner, smack_file_set_fowner), 4729 LSM_HOOK_INIT(file_send_sigiotask, smack_file_send_sigiotask), 4730 LSM_HOOK_INIT(file_receive, smack_file_receive), 4731 4732 LSM_HOOK_INIT(file_open, smack_file_open), 4733 4734 LSM_HOOK_INIT(cred_alloc_blank, smack_cred_alloc_blank), 4735 LSM_HOOK_INIT(cred_free, smack_cred_free), 4736 LSM_HOOK_INIT(cred_prepare, smack_cred_prepare), 4737 LSM_HOOK_INIT(cred_transfer, smack_cred_transfer), 4738 LSM_HOOK_INIT(kernel_act_as, smack_kernel_act_as), 4739 LSM_HOOK_INIT(kernel_create_files_as, smack_kernel_create_files_as), 4740 LSM_HOOK_INIT(task_setpgid, smack_task_setpgid), 4741 LSM_HOOK_INIT(task_getpgid, smack_task_getpgid), 4742 LSM_HOOK_INIT(task_getsid, smack_task_getsid), 4743 LSM_HOOK_INIT(task_getsecid, smack_task_getsecid), 4744 LSM_HOOK_INIT(task_setnice, smack_task_setnice), 4745 LSM_HOOK_INIT(task_setioprio, smack_task_setioprio), 4746 LSM_HOOK_INIT(task_getioprio, smack_task_getioprio), 4747 LSM_HOOK_INIT(task_setscheduler, smack_task_setscheduler), 4748 LSM_HOOK_INIT(task_getscheduler, smack_task_getscheduler), 4749 LSM_HOOK_INIT(task_movememory, smack_task_movememory), 4750 LSM_HOOK_INIT(task_kill, smack_task_kill), 4751 LSM_HOOK_INIT(task_to_inode, smack_task_to_inode), 4752 4753 LSM_HOOK_INIT(ipc_permission, smack_ipc_permission), 4754 LSM_HOOK_INIT(ipc_getsecid, smack_ipc_getsecid), 4755 4756 LSM_HOOK_INIT(msg_msg_alloc_security, smack_msg_msg_alloc_security), 4757 LSM_HOOK_INIT(msg_msg_free_security, smack_msg_msg_free_security), 4758 4759 LSM_HOOK_INIT(msg_queue_alloc_security, smack_msg_queue_alloc_security), 4760 LSM_HOOK_INIT(msg_queue_free_security, smack_msg_queue_free_security), 4761 LSM_HOOK_INIT(msg_queue_associate, smack_msg_queue_associate), 4762 LSM_HOOK_INIT(msg_queue_msgctl, smack_msg_queue_msgctl), 4763 LSM_HOOK_INIT(msg_queue_msgsnd, smack_msg_queue_msgsnd), 4764 LSM_HOOK_INIT(msg_queue_msgrcv, smack_msg_queue_msgrcv), 4765 4766 LSM_HOOK_INIT(shm_alloc_security, smack_shm_alloc_security), 4767 LSM_HOOK_INIT(shm_free_security, smack_shm_free_security), 4768 LSM_HOOK_INIT(shm_associate, smack_shm_associate), 4769 LSM_HOOK_INIT(shm_shmctl, smack_shm_shmctl), 4770 LSM_HOOK_INIT(shm_shmat, smack_shm_shmat), 4771 4772 LSM_HOOK_INIT(sem_alloc_security, smack_sem_alloc_security), 4773 LSM_HOOK_INIT(sem_free_security, smack_sem_free_security), 4774 LSM_HOOK_INIT(sem_associate, smack_sem_associate), 4775 LSM_HOOK_INIT(sem_semctl, smack_sem_semctl), 4776 LSM_HOOK_INIT(sem_semop, smack_sem_semop), 4777 4778 LSM_HOOK_INIT(d_instantiate, smack_d_instantiate), 4779 4780 LSM_HOOK_INIT(getprocattr, smack_getprocattr), 4781 LSM_HOOK_INIT(setprocattr, smack_setprocattr), 4782 4783 LSM_HOOK_INIT(unix_stream_connect, smack_unix_stream_connect), 4784 LSM_HOOK_INIT(unix_may_send, smack_unix_may_send), 4785 4786 LSM_HOOK_INIT(socket_post_create, smack_socket_post_create), 4787 #ifdef SMACK_IPV6_PORT_LABELING 4788 LSM_HOOK_INIT(socket_bind, smack_socket_bind), 4789 #endif 4790 LSM_HOOK_INIT(socket_connect, smack_socket_connect), 4791 LSM_HOOK_INIT(socket_sendmsg, smack_socket_sendmsg), 4792 LSM_HOOK_INIT(socket_sock_rcv_skb, smack_socket_sock_rcv_skb), 4793 LSM_HOOK_INIT(socket_getpeersec_stream, smack_socket_getpeersec_stream), 4794 LSM_HOOK_INIT(socket_getpeersec_dgram, smack_socket_getpeersec_dgram), 4795 LSM_HOOK_INIT(sk_alloc_security, smack_sk_alloc_security), 4796 LSM_HOOK_INIT(sk_free_security, smack_sk_free_security), 4797 LSM_HOOK_INIT(sock_graft, smack_sock_graft), 4798 LSM_HOOK_INIT(inet_conn_request, smack_inet_conn_request), 4799 LSM_HOOK_INIT(inet_csk_clone, smack_inet_csk_clone), 4800 4801 /* key management security hooks */ 4802 #ifdef CONFIG_KEYS 4803 LSM_HOOK_INIT(key_alloc, smack_key_alloc), 4804 LSM_HOOK_INIT(key_free, smack_key_free), 4805 LSM_HOOK_INIT(key_permission, smack_key_permission), 4806 LSM_HOOK_INIT(key_getsecurity, smack_key_getsecurity), 4807 #endif /* CONFIG_KEYS */ 4808 4809 /* Audit hooks */ 4810 #ifdef CONFIG_AUDIT 4811 LSM_HOOK_INIT(audit_rule_init, smack_audit_rule_init), 4812 LSM_HOOK_INIT(audit_rule_known, smack_audit_rule_known), 4813 LSM_HOOK_INIT(audit_rule_match, smack_audit_rule_match), 4814 #endif /* CONFIG_AUDIT */ 4815 4816 LSM_HOOK_INIT(ismaclabel, smack_ismaclabel), 4817 LSM_HOOK_INIT(secid_to_secctx, smack_secid_to_secctx), 4818 LSM_HOOK_INIT(secctx_to_secid, smack_secctx_to_secid), 4819 LSM_HOOK_INIT(inode_notifysecctx, smack_inode_notifysecctx), 4820 LSM_HOOK_INIT(inode_setsecctx, smack_inode_setsecctx), 4821 LSM_HOOK_INIT(inode_getsecctx, smack_inode_getsecctx), 4822 LSM_HOOK_INIT(inode_copy_up, smack_inode_copy_up), 4823 LSM_HOOK_INIT(inode_copy_up_xattr, smack_inode_copy_up_xattr), 4824 LSM_HOOK_INIT(dentry_create_files_as, smack_dentry_create_files_as), 4825 }; 4826 4827 4828 static __init void init_smack_known_list(void) 4829 { 4830 /* 4831 * Initialize rule list locks 4832 */ 4833 mutex_init(&smack_known_huh.smk_rules_lock); 4834 mutex_init(&smack_known_hat.smk_rules_lock); 4835 mutex_init(&smack_known_floor.smk_rules_lock); 4836 mutex_init(&smack_known_star.smk_rules_lock); 4837 mutex_init(&smack_known_web.smk_rules_lock); 4838 /* 4839 * Initialize rule lists 4840 */ 4841 INIT_LIST_HEAD(&smack_known_huh.smk_rules); 4842 INIT_LIST_HEAD(&smack_known_hat.smk_rules); 4843 INIT_LIST_HEAD(&smack_known_star.smk_rules); 4844 INIT_LIST_HEAD(&smack_known_floor.smk_rules); 4845 INIT_LIST_HEAD(&smack_known_web.smk_rules); 4846 /* 4847 * Create the known labels list 4848 */ 4849 smk_insert_entry(&smack_known_huh); 4850 smk_insert_entry(&smack_known_hat); 4851 smk_insert_entry(&smack_known_star); 4852 smk_insert_entry(&smack_known_floor); 4853 smk_insert_entry(&smack_known_web); 4854 } 4855 4856 /** 4857 * smack_init - initialize the smack system 4858 * 4859 * Returns 0 4860 */ 4861 static __init int smack_init(void) 4862 { 4863 struct cred *cred; 4864 struct task_smack *tsp; 4865 4866 if (!security_module_enable("smack")) 4867 return 0; 4868 4869 smack_inode_cache = KMEM_CACHE(inode_smack, 0); 4870 if (!smack_inode_cache) 4871 return -ENOMEM; 4872 4873 tsp = new_task_smack(&smack_known_floor, &smack_known_floor, 4874 GFP_KERNEL); 4875 if (tsp == NULL) { 4876 kmem_cache_destroy(smack_inode_cache); 4877 return -ENOMEM; 4878 } 4879 4880 smack_enabled = 1; 4881 4882 pr_info("Smack: Initializing.\n"); 4883 #ifdef CONFIG_SECURITY_SMACK_NETFILTER 4884 pr_info("Smack: Netfilter enabled.\n"); 4885 #endif 4886 #ifdef SMACK_IPV6_PORT_LABELING 4887 pr_info("Smack: IPv6 port labeling enabled.\n"); 4888 #endif 4889 #ifdef SMACK_IPV6_SECMARK_LABELING 4890 pr_info("Smack: IPv6 Netfilter enabled.\n"); 4891 #endif 4892 4893 /* 4894 * Set the security state for the initial task. 4895 */ 4896 cred = (struct cred *) current->cred; 4897 cred->security = tsp; 4898 4899 /* initialize the smack_known_list */ 4900 init_smack_known_list(); 4901 4902 /* 4903 * Register with LSM 4904 */ 4905 security_add_hooks(smack_hooks, ARRAY_SIZE(smack_hooks), "smack"); 4906 4907 return 0; 4908 } 4909 4910 /* 4911 * Smack requires early initialization in order to label 4912 * all processes and objects when they are created. 4913 */ 4914 security_initcall(smack_init); 4915