1/* 2 * Implementation of the policy database. 3 * 4 * Author : Stephen Smalley, <sds@epoch.ncsc.mil> 5 */ 6 7/* 8 * Updated: Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com> 9 * 10 * Support for enhanced MLS infrastructure. 11 * 12 * Updated: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com> 13 * 14 * Added conditional policy language extensions 15 * 16 * Updated: Hewlett-Packard <paul.moore@hp.com> 17 * 18 * Added support for the policy capability bitmap 19 * 20 * Copyright (C) 2007 Hewlett-Packard Development Company, L.P. 21 * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc. 22 * Copyright (C) 2003 - 2004 Tresys Technology, LLC 23 * This program is free software; you can redistribute it and/or modify 24 * it under the terms of the GNU General Public License as published by 25 * the Free Software Foundation, version 2. 26 */ 27 28#include <linux/kernel.h> 29#include <linux/sched.h> 30#include <linux/slab.h> 31#include <linux/string.h> 32#include <linux/errno.h> 33#include <linux/audit.h> 34#include <linux/flex_array.h> 35#include "security.h" 36 37#include "policydb.h" 38#include "conditional.h" 39#include "mls.h" 40 41#define _DEBUG_HASHES 42 43#ifdef DEBUG_HASHES 44static const char *symtab_name[SYM_NUM] = { 45 "common prefixes", 46 "classes", 47 "roles", 48 "types", 49 "users", 50 "bools", 51 "levels", 52 "categories", 53}; 54#endif 55 56static unsigned int symtab_sizes[SYM_NUM] = { 57 2, 58 32, 59 16, 60 512, 61 128, 62 16, 63 16, 64 16, 65}; 66 67struct policydb_compat_info { 68 int version; 69 int sym_num; 70 int ocon_num; 71}; 72 73/* These need to be updated if SYM_NUM or OCON_NUM changes */ 74static struct policydb_compat_info policydb_compat[] = { 75 { 76 .version = POLICYDB_VERSION_BASE, 77 .sym_num = SYM_NUM - 3, 78 .ocon_num = OCON_NUM - 1, 79 }, 80 { 81 .version = POLICYDB_VERSION_BOOL, 82 .sym_num = SYM_NUM - 2, 83 .ocon_num = OCON_NUM - 1, 84 }, 85 { 86 .version = POLICYDB_VERSION_IPV6, 87 .sym_num = SYM_NUM - 2, 88 .ocon_num = OCON_NUM, 89 }, 90 { 91 .version = POLICYDB_VERSION_NLCLASS, 92 .sym_num = SYM_NUM - 2, 93 .ocon_num = OCON_NUM, 94 }, 95 { 96 .version = POLICYDB_VERSION_MLS, 97 .sym_num = SYM_NUM, 98 .ocon_num = OCON_NUM, 99 }, 100 { 101 .version = POLICYDB_VERSION_AVTAB, 102 .sym_num = SYM_NUM, 103 .ocon_num = OCON_NUM, 104 }, 105 { 106 .version = POLICYDB_VERSION_RANGETRANS, 107 .sym_num = SYM_NUM, 108 .ocon_num = OCON_NUM, 109 }, 110 { 111 .version = POLICYDB_VERSION_POLCAP, 112 .sym_num = SYM_NUM, 113 .ocon_num = OCON_NUM, 114 }, 115 { 116 .version = POLICYDB_VERSION_PERMISSIVE, 117 .sym_num = SYM_NUM, 118 .ocon_num = OCON_NUM, 119 }, 120 { 121 .version = POLICYDB_VERSION_BOUNDARY, 122 .sym_num = SYM_NUM, 123 .ocon_num = OCON_NUM, 124 }, 125}; 126 127static struct policydb_compat_info *policydb_lookup_compat(int version) 128{ 129 int i; 130 struct policydb_compat_info *info = NULL; 131 132 for (i = 0; i < ARRAY_SIZE(policydb_compat); i++) { 133 if (policydb_compat[i].version == version) { 134 info = &policydb_compat[i]; 135 break; 136 } 137 } 138 return info; 139} 140 141/* 142 * Initialize the role table. 143 */ 144static int roles_init(struct policydb *p) 145{ 146 char *key = NULL; 147 int rc; 148 struct role_datum *role; 149 150 role = kzalloc(sizeof(*role), GFP_KERNEL); 151 if (!role) { 152 rc = -ENOMEM; 153 goto out; 154 } 155 role->value = ++p->p_roles.nprim; 156 if (role->value != OBJECT_R_VAL) { 157 rc = -EINVAL; 158 goto out_free_role; 159 } 160 key = kstrdup(OBJECT_R, GFP_KERNEL); 161 if (!key) { 162 rc = -ENOMEM; 163 goto out_free_role; 164 } 165 rc = hashtab_insert(p->p_roles.table, key, role); 166 if (rc) 167 goto out_free_key; 168out: 169 return rc; 170 171out_free_key: 172 kfree(key); 173out_free_role: 174 kfree(role); 175 goto out; 176} 177 178static u32 rangetr_hash(struct hashtab *h, const void *k) 179{ 180 const struct range_trans *key = k; 181 return (key->source_type + (key->target_type << 3) + 182 (key->target_class << 5)) & (h->size - 1); 183} 184 185static int rangetr_cmp(struct hashtab *h, const void *k1, const void *k2) 186{ 187 const struct range_trans *key1 = k1, *key2 = k2; 188 return (key1->source_type != key2->source_type || 189 key1->target_type != key2->target_type || 190 key1->target_class != key2->target_class); 191} 192 193/* 194 * Initialize a policy database structure. 195 */ 196static int policydb_init(struct policydb *p) 197{ 198 int i, rc; 199 200 memset(p, 0, sizeof(*p)); 201 202 for (i = 0; i < SYM_NUM; i++) { 203 rc = symtab_init(&p->symtab[i], symtab_sizes[i]); 204 if (rc) 205 goto out_free_symtab; 206 } 207 208 rc = avtab_init(&p->te_avtab); 209 if (rc) 210 goto out_free_symtab; 211 212 rc = roles_init(p); 213 if (rc) 214 goto out_free_symtab; 215 216 rc = cond_policydb_init(p); 217 if (rc) 218 goto out_free_symtab; 219 220 p->range_tr = hashtab_create(rangetr_hash, rangetr_cmp, 256); 221 if (!p->range_tr) 222 goto out_free_symtab; 223 224 ebitmap_init(&p->policycaps); 225 ebitmap_init(&p->permissive_map); 226 227out: 228 return rc; 229 230out_free_symtab: 231 for (i = 0; i < SYM_NUM; i++) 232 hashtab_destroy(p->symtab[i].table); 233 goto out; 234} 235 236/* 237 * The following *_index functions are used to 238 * define the val_to_name and val_to_struct arrays 239 * in a policy database structure. The val_to_name 240 * arrays are used when converting security context 241 * structures into string representations. The 242 * val_to_struct arrays are used when the attributes 243 * of a class, role, or user are needed. 244 */ 245 246static int common_index(void *key, void *datum, void *datap) 247{ 248 struct policydb *p; 249 struct common_datum *comdatum; 250 251 comdatum = datum; 252 p = datap; 253 if (!comdatum->value || comdatum->value > p->p_commons.nprim) 254 return -EINVAL; 255 p->p_common_val_to_name[comdatum->value - 1] = key; 256 return 0; 257} 258 259static int class_index(void *key, void *datum, void *datap) 260{ 261 struct policydb *p; 262 struct class_datum *cladatum; 263 264 cladatum = datum; 265 p = datap; 266 if (!cladatum->value || cladatum->value > p->p_classes.nprim) 267 return -EINVAL; 268 p->p_class_val_to_name[cladatum->value - 1] = key; 269 p->class_val_to_struct[cladatum->value - 1] = cladatum; 270 return 0; 271} 272 273static int role_index(void *key, void *datum, void *datap) 274{ 275 struct policydb *p; 276 struct role_datum *role; 277 278 role = datum; 279 p = datap; 280 if (!role->value 281 || role->value > p->p_roles.nprim 282 || role->bounds > p->p_roles.nprim) 283 return -EINVAL; 284 p->p_role_val_to_name[role->value - 1] = key; 285 p->role_val_to_struct[role->value - 1] = role; 286 return 0; 287} 288 289static int type_index(void *key, void *datum, void *datap) 290{ 291 struct policydb *p; 292 struct type_datum *typdatum; 293 294 typdatum = datum; 295 p = datap; 296 297 if (typdatum->primary) { 298 if (!typdatum->value 299 || typdatum->value > p->p_types.nprim 300 || typdatum->bounds > p->p_types.nprim) 301 return -EINVAL; 302 p->p_type_val_to_name[typdatum->value - 1] = key; 303 p->type_val_to_struct[typdatum->value - 1] = typdatum; 304 } 305 306 return 0; 307} 308 309static int user_index(void *key, void *datum, void *datap) 310{ 311 struct policydb *p; 312 struct user_datum *usrdatum; 313 314 usrdatum = datum; 315 p = datap; 316 if (!usrdatum->value 317 || usrdatum->value > p->p_users.nprim 318 || usrdatum->bounds > p->p_users.nprim) 319 return -EINVAL; 320 p->p_user_val_to_name[usrdatum->value - 1] = key; 321 p->user_val_to_struct[usrdatum->value - 1] = usrdatum; 322 return 0; 323} 324 325static int sens_index(void *key, void *datum, void *datap) 326{ 327 struct policydb *p; 328 struct level_datum *levdatum; 329 330 levdatum = datum; 331 p = datap; 332 333 if (!levdatum->isalias) { 334 if (!levdatum->level->sens || 335 levdatum->level->sens > p->p_levels.nprim) 336 return -EINVAL; 337 p->p_sens_val_to_name[levdatum->level->sens - 1] = key; 338 } 339 340 return 0; 341} 342 343static int cat_index(void *key, void *datum, void *datap) 344{ 345 struct policydb *p; 346 struct cat_datum *catdatum; 347 348 catdatum = datum; 349 p = datap; 350 351 if (!catdatum->isalias) { 352 if (!catdatum->value || catdatum->value > p->p_cats.nprim) 353 return -EINVAL; 354 p->p_cat_val_to_name[catdatum->value - 1] = key; 355 } 356 357 return 0; 358} 359 360static int (*index_f[SYM_NUM]) (void *key, void *datum, void *datap) = 361{ 362 common_index, 363 class_index, 364 role_index, 365 type_index, 366 user_index, 367 cond_index_bool, 368 sens_index, 369 cat_index, 370}; 371 372/* 373 * Define the common val_to_name array and the class 374 * val_to_name and val_to_struct arrays in a policy 375 * database structure. 376 * 377 * Caller must clean up upon failure. 378 */ 379static int policydb_index_classes(struct policydb *p) 380{ 381 int rc; 382 383 p->p_common_val_to_name = 384 kmalloc(p->p_commons.nprim * sizeof(char *), GFP_KERNEL); 385 if (!p->p_common_val_to_name) { 386 rc = -ENOMEM; 387 goto out; 388 } 389 390 rc = hashtab_map(p->p_commons.table, common_index, p); 391 if (rc) 392 goto out; 393 394 p->class_val_to_struct = 395 kmalloc(p->p_classes.nprim * sizeof(*(p->class_val_to_struct)), GFP_KERNEL); 396 if (!p->class_val_to_struct) { 397 rc = -ENOMEM; 398 goto out; 399 } 400 401 p->p_class_val_to_name = 402 kmalloc(p->p_classes.nprim * sizeof(char *), GFP_KERNEL); 403 if (!p->p_class_val_to_name) { 404 rc = -ENOMEM; 405 goto out; 406 } 407 408 rc = hashtab_map(p->p_classes.table, class_index, p); 409out: 410 return rc; 411} 412 413#ifdef DEBUG_HASHES 414static void symtab_hash_eval(struct symtab *s) 415{ 416 int i; 417 418 for (i = 0; i < SYM_NUM; i++) { 419 struct hashtab *h = s[i].table; 420 struct hashtab_info info; 421 422 hashtab_stat(h, &info); 423 printk(KERN_DEBUG "SELinux: %s: %d entries and %d/%d buckets used, " 424 "longest chain length %d\n", symtab_name[i], h->nel, 425 info.slots_used, h->size, info.max_chain_len); 426 } 427} 428 429static void rangetr_hash_eval(struct hashtab *h) 430{ 431 struct hashtab_info info; 432 433 hashtab_stat(h, &info); 434 printk(KERN_DEBUG "SELinux: rangetr: %d entries and %d/%d buckets used, " 435 "longest chain length %d\n", h->nel, 436 info.slots_used, h->size, info.max_chain_len); 437} 438#else 439static inline void rangetr_hash_eval(struct hashtab *h) 440{ 441} 442#endif 443 444/* 445 * Define the other val_to_name and val_to_struct arrays 446 * in a policy database structure. 447 * 448 * Caller must clean up on failure. 449 */ 450static int policydb_index_others(struct policydb *p) 451{ 452 int i, rc = 0; 453 454 printk(KERN_DEBUG "SELinux: %d users, %d roles, %d types, %d bools", 455 p->p_users.nprim, p->p_roles.nprim, p->p_types.nprim, p->p_bools.nprim); 456 if (p->mls_enabled) 457 printk(", %d sens, %d cats", p->p_levels.nprim, 458 p->p_cats.nprim); 459 printk("\n"); 460 461 printk(KERN_DEBUG "SELinux: %d classes, %d rules\n", 462 p->p_classes.nprim, p->te_avtab.nel); 463 464#ifdef DEBUG_HASHES 465 avtab_hash_eval(&p->te_avtab, "rules"); 466 symtab_hash_eval(p->symtab); 467#endif 468 469 p->role_val_to_struct = 470 kmalloc(p->p_roles.nprim * sizeof(*(p->role_val_to_struct)), 471 GFP_KERNEL); 472 if (!p->role_val_to_struct) { 473 rc = -ENOMEM; 474 goto out; 475 } 476 477 p->user_val_to_struct = 478 kmalloc(p->p_users.nprim * sizeof(*(p->user_val_to_struct)), 479 GFP_KERNEL); 480 if (!p->user_val_to_struct) { 481 rc = -ENOMEM; 482 goto out; 483 } 484 485 p->type_val_to_struct = 486 kmalloc(p->p_types.nprim * sizeof(*(p->type_val_to_struct)), 487 GFP_KERNEL); 488 if (!p->type_val_to_struct) { 489 rc = -ENOMEM; 490 goto out; 491 } 492 493 if (cond_init_bool_indexes(p)) { 494 rc = -ENOMEM; 495 goto out; 496 } 497 498 for (i = SYM_ROLES; i < SYM_NUM; i++) { 499 p->sym_val_to_name[i] = 500 kmalloc(p->symtab[i].nprim * sizeof(char *), GFP_KERNEL); 501 if (!p->sym_val_to_name[i]) { 502 rc = -ENOMEM; 503 goto out; 504 } 505 rc = hashtab_map(p->symtab[i].table, index_f[i], p); 506 if (rc) 507 goto out; 508 } 509 510out: 511 return rc; 512} 513 514/* 515 * The following *_destroy functions are used to 516 * free any memory allocated for each kind of 517 * symbol data in the policy database. 518 */ 519 520static int perm_destroy(void *key, void *datum, void *p) 521{ 522 kfree(key); 523 kfree(datum); 524 return 0; 525} 526 527static int common_destroy(void *key, void *datum, void *p) 528{ 529 struct common_datum *comdatum; 530 531 kfree(key); 532 comdatum = datum; 533 hashtab_map(comdatum->permissions.table, perm_destroy, NULL); 534 hashtab_destroy(comdatum->permissions.table); 535 kfree(datum); 536 return 0; 537} 538 539static int cls_destroy(void *key, void *datum, void *p) 540{ 541 struct class_datum *cladatum; 542 struct constraint_node *constraint, *ctemp; 543 struct constraint_expr *e, *etmp; 544 545 kfree(key); 546 cladatum = datum; 547 hashtab_map(cladatum->permissions.table, perm_destroy, NULL); 548 hashtab_destroy(cladatum->permissions.table); 549 constraint = cladatum->constraints; 550 while (constraint) { 551 e = constraint->expr; 552 while (e) { 553 ebitmap_destroy(&e->names); 554 etmp = e; 555 e = e->next; 556 kfree(etmp); 557 } 558 ctemp = constraint; 559 constraint = constraint->next; 560 kfree(ctemp); 561 } 562 563 constraint = cladatum->validatetrans; 564 while (constraint) { 565 e = constraint->expr; 566 while (e) { 567 ebitmap_destroy(&e->names); 568 etmp = e; 569 e = e->next; 570 kfree(etmp); 571 } 572 ctemp = constraint; 573 constraint = constraint->next; 574 kfree(ctemp); 575 } 576 577 kfree(cladatum->comkey); 578 kfree(datum); 579 return 0; 580} 581 582static int role_destroy(void *key, void *datum, void *p) 583{ 584 struct role_datum *role; 585 586 kfree(key); 587 role = datum; 588 ebitmap_destroy(&role->dominates); 589 ebitmap_destroy(&role->types); 590 kfree(datum); 591 return 0; 592} 593 594static int type_destroy(void *key, void *datum, void *p) 595{ 596 kfree(key); 597 kfree(datum); 598 return 0; 599} 600 601static int user_destroy(void *key, void *datum, void *p) 602{ 603 struct user_datum *usrdatum; 604 605 kfree(key); 606 usrdatum = datum; 607 ebitmap_destroy(&usrdatum->roles); 608 ebitmap_destroy(&usrdatum->range.level[0].cat); 609 ebitmap_destroy(&usrdatum->range.level[1].cat); 610 ebitmap_destroy(&usrdatum->dfltlevel.cat); 611 kfree(datum); 612 return 0; 613} 614 615static int sens_destroy(void *key, void *datum, void *p) 616{ 617 struct level_datum *levdatum; 618 619 kfree(key); 620 levdatum = datum; 621 ebitmap_destroy(&levdatum->level->cat); 622 kfree(levdatum->level); 623 kfree(datum); 624 return 0; 625} 626 627static int cat_destroy(void *key, void *datum, void *p) 628{ 629 kfree(key); 630 kfree(datum); 631 return 0; 632} 633 634static int (*destroy_f[SYM_NUM]) (void *key, void *datum, void *datap) = 635{ 636 common_destroy, 637 cls_destroy, 638 role_destroy, 639 type_destroy, 640 user_destroy, 641 cond_destroy_bool, 642 sens_destroy, 643 cat_destroy, 644}; 645 646static int range_tr_destroy(void *key, void *datum, void *p) 647{ 648 struct mls_range *rt = datum; 649 kfree(key); 650 ebitmap_destroy(&rt->level[0].cat); 651 ebitmap_destroy(&rt->level[1].cat); 652 kfree(datum); 653 cond_resched(); 654 return 0; 655} 656 657static void ocontext_destroy(struct ocontext *c, int i) 658{ 659 if (!c) 660 return; 661 662 context_destroy(&c->context[0]); 663 context_destroy(&c->context[1]); 664 if (i == OCON_ISID || i == OCON_FS || 665 i == OCON_NETIF || i == OCON_FSUSE) 666 kfree(c->u.name); 667 kfree(c); 668} 669 670/* 671 * Free any memory allocated by a policy database structure. 672 */ 673void policydb_destroy(struct policydb *p) 674{ 675 struct ocontext *c, *ctmp; 676 struct genfs *g, *gtmp; 677 int i; 678 struct role_allow *ra, *lra = NULL; 679 struct role_trans *tr, *ltr = NULL; 680 681 for (i = 0; i < SYM_NUM; i++) { 682 cond_resched(); 683 hashtab_map(p->symtab[i].table, destroy_f[i], NULL); 684 hashtab_destroy(p->symtab[i].table); 685 } 686 687 for (i = 0; i < SYM_NUM; i++) 688 kfree(p->sym_val_to_name[i]); 689 690 kfree(p->class_val_to_struct); 691 kfree(p->role_val_to_struct); 692 kfree(p->user_val_to_struct); 693 kfree(p->type_val_to_struct); 694 695 avtab_destroy(&p->te_avtab); 696 697 for (i = 0; i < OCON_NUM; i++) { 698 cond_resched(); 699 c = p->ocontexts[i]; 700 while (c) { 701 ctmp = c; 702 c = c->next; 703 ocontext_destroy(ctmp, i); 704 } 705 p->ocontexts[i] = NULL; 706 } 707 708 g = p->genfs; 709 while (g) { 710 cond_resched(); 711 kfree(g->fstype); 712 c = g->head; 713 while (c) { 714 ctmp = c; 715 c = c->next; 716 ocontext_destroy(ctmp, OCON_FSUSE); 717 } 718 gtmp = g; 719 g = g->next; 720 kfree(gtmp); 721 } 722 p->genfs = NULL; 723 724 cond_policydb_destroy(p); 725 726 for (tr = p->role_tr; tr; tr = tr->next) { 727 cond_resched(); 728 kfree(ltr); 729 ltr = tr; 730 } 731 kfree(ltr); 732 733 for (ra = p->role_allow; ra; ra = ra->next) { 734 cond_resched(); 735 kfree(lra); 736 lra = ra; 737 } 738 kfree(lra); 739 740 hashtab_map(p->range_tr, range_tr_destroy, NULL); 741 hashtab_destroy(p->range_tr); 742 743 if (p->type_attr_map_array) { 744 for (i = 0; i < p->p_types.nprim; i++) { 745 struct ebitmap *e; 746 747 e = flex_array_get(p->type_attr_map_array, i); 748 if (!e) 749 continue; 750 ebitmap_destroy(e); 751 } 752 flex_array_free(p->type_attr_map_array); 753 } 754 ebitmap_destroy(&p->policycaps); 755 ebitmap_destroy(&p->permissive_map); 756 757 return; 758} 759 760/* 761 * Load the initial SIDs specified in a policy database 762 * structure into a SID table. 763 */ 764int policydb_load_isids(struct policydb *p, struct sidtab *s) 765{ 766 struct ocontext *head, *c; 767 int rc; 768 769 rc = sidtab_init(s); 770 if (rc) { 771 printk(KERN_ERR "SELinux: out of memory on SID table init\n"); 772 goto out; 773 } 774 775 head = p->ocontexts[OCON_ISID]; 776 for (c = head; c; c = c->next) { 777 if (!c->context[0].user) { 778 printk(KERN_ERR "SELinux: SID %s was never " 779 "defined.\n", c->u.name); 780 rc = -EINVAL; 781 goto out; 782 } 783 if (sidtab_insert(s, c->sid[0], &c->context[0])) { 784 printk(KERN_ERR "SELinux: unable to load initial " 785 "SID %s.\n", c->u.name); 786 rc = -EINVAL; 787 goto out; 788 } 789 } 790out: 791 return rc; 792} 793 794int policydb_class_isvalid(struct policydb *p, unsigned int class) 795{ 796 if (!class || class > p->p_classes.nprim) 797 return 0; 798 return 1; 799} 800 801int policydb_role_isvalid(struct policydb *p, unsigned int role) 802{ 803 if (!role || role > p->p_roles.nprim) 804 return 0; 805 return 1; 806} 807 808int policydb_type_isvalid(struct policydb *p, unsigned int type) 809{ 810 if (!type || type > p->p_types.nprim) 811 return 0; 812 return 1; 813} 814 815/* 816 * Return 1 if the fields in the security context 817 * structure `c' are valid. Return 0 otherwise. 818 */ 819int policydb_context_isvalid(struct policydb *p, struct context *c) 820{ 821 struct role_datum *role; 822 struct user_datum *usrdatum; 823 824 if (!c->role || c->role > p->p_roles.nprim) 825 return 0; 826 827 if (!c->user || c->user > p->p_users.nprim) 828 return 0; 829 830 if (!c->type || c->type > p->p_types.nprim) 831 return 0; 832 833 if (c->role != OBJECT_R_VAL) { 834 /* 835 * Role must be authorized for the type. 836 */ 837 role = p->role_val_to_struct[c->role - 1]; 838 if (!ebitmap_get_bit(&role->types, 839 c->type - 1)) 840 /* role may not be associated with type */ 841 return 0; 842 843 /* 844 * User must be authorized for the role. 845 */ 846 usrdatum = p->user_val_to_struct[c->user - 1]; 847 if (!usrdatum) 848 return 0; 849 850 if (!ebitmap_get_bit(&usrdatum->roles, 851 c->role - 1)) 852 /* user may not be associated with role */ 853 return 0; 854 } 855 856 if (!mls_context_isvalid(p, c)) 857 return 0; 858 859 return 1; 860} 861 862/* 863 * Read a MLS range structure from a policydb binary 864 * representation file. 865 */ 866static int mls_read_range_helper(struct mls_range *r, void *fp) 867{ 868 __le32 buf[2]; 869 u32 items; 870 int rc; 871 872 rc = next_entry(buf, fp, sizeof(u32)); 873 if (rc < 0) 874 goto out; 875 876 items = le32_to_cpu(buf[0]); 877 if (items > ARRAY_SIZE(buf)) { 878 printk(KERN_ERR "SELinux: mls: range overflow\n"); 879 rc = -EINVAL; 880 goto out; 881 } 882 rc = next_entry(buf, fp, sizeof(u32) * items); 883 if (rc < 0) { 884 printk(KERN_ERR "SELinux: mls: truncated range\n"); 885 goto out; 886 } 887 r->level[0].sens = le32_to_cpu(buf[0]); 888 if (items > 1) 889 r->level[1].sens = le32_to_cpu(buf[1]); 890 else 891 r->level[1].sens = r->level[0].sens; 892 893 rc = ebitmap_read(&r->level[0].cat, fp); 894 if (rc) { 895 printk(KERN_ERR "SELinux: mls: error reading low " 896 "categories\n"); 897 goto out; 898 } 899 if (items > 1) { 900 rc = ebitmap_read(&r->level[1].cat, fp); 901 if (rc) { 902 printk(KERN_ERR "SELinux: mls: error reading high " 903 "categories\n"); 904 goto bad_high; 905 } 906 } else { 907 rc = ebitmap_cpy(&r->level[1].cat, &r->level[0].cat); 908 if (rc) { 909 printk(KERN_ERR "SELinux: mls: out of memory\n"); 910 goto bad_high; 911 } 912 } 913 914 rc = 0; 915out: 916 return rc; 917bad_high: 918 ebitmap_destroy(&r->level[0].cat); 919 goto out; 920} 921 922/* 923 * Read and validate a security context structure 924 * from a policydb binary representation file. 925 */ 926static int context_read_and_validate(struct context *c, 927 struct policydb *p, 928 void *fp) 929{ 930 __le32 buf[3]; 931 int rc; 932 933 rc = next_entry(buf, fp, sizeof buf); 934 if (rc < 0) { 935 printk(KERN_ERR "SELinux: context truncated\n"); 936 goto out; 937 } 938 c->user = le32_to_cpu(buf[0]); 939 c->role = le32_to_cpu(buf[1]); 940 c->type = le32_to_cpu(buf[2]); 941 if (p->policyvers >= POLICYDB_VERSION_MLS) { 942 if (mls_read_range_helper(&c->range, fp)) { 943 printk(KERN_ERR "SELinux: error reading MLS range of " 944 "context\n"); 945 rc = -EINVAL; 946 goto out; 947 } 948 } 949 950 if (!policydb_context_isvalid(p, c)) { 951 printk(KERN_ERR "SELinux: invalid security context\n"); 952 context_destroy(c); 953 rc = -EINVAL; 954 } 955out: 956 return rc; 957} 958 959/* 960 * The following *_read functions are used to 961 * read the symbol data from a policy database 962 * binary representation file. 963 */ 964 965static int perm_read(struct policydb *p, struct hashtab *h, void *fp) 966{ 967 char *key = NULL; 968 struct perm_datum *perdatum; 969 int rc; 970 __le32 buf[2]; 971 u32 len; 972 973 perdatum = kzalloc(sizeof(*perdatum), GFP_KERNEL); 974 if (!perdatum) { 975 rc = -ENOMEM; 976 goto out; 977 } 978 979 rc = next_entry(buf, fp, sizeof buf); 980 if (rc < 0) 981 goto bad; 982 983 len = le32_to_cpu(buf[0]); 984 perdatum->value = le32_to_cpu(buf[1]); 985 986 key = kmalloc(len + 1, GFP_KERNEL); 987 if (!key) { 988 rc = -ENOMEM; 989 goto bad; 990 } 991 rc = next_entry(key, fp, len); 992 if (rc < 0) 993 goto bad; 994 key[len] = '\0'; 995 996 rc = hashtab_insert(h, key, perdatum); 997 if (rc) 998 goto bad; 999out: 1000 return rc; 1001bad: 1002 perm_destroy(key, perdatum, NULL); 1003 goto out; 1004} 1005 1006static int common_read(struct policydb *p, struct hashtab *h, void *fp) 1007{ 1008 char *key = NULL; 1009 struct common_datum *comdatum; 1010 __le32 buf[4]; 1011 u32 len, nel; 1012 int i, rc; 1013 1014 comdatum = kzalloc(sizeof(*comdatum), GFP_KERNEL); 1015 if (!comdatum) { 1016 rc = -ENOMEM; 1017 goto out; 1018 } 1019 1020 rc = next_entry(buf, fp, sizeof buf); 1021 if (rc < 0) 1022 goto bad; 1023 1024 len = le32_to_cpu(buf[0]); 1025 comdatum->value = le32_to_cpu(buf[1]); 1026 1027 rc = symtab_init(&comdatum->permissions, PERM_SYMTAB_SIZE); 1028 if (rc) 1029 goto bad; 1030 comdatum->permissions.nprim = le32_to_cpu(buf[2]); 1031 nel = le32_to_cpu(buf[3]); 1032 1033 key = kmalloc(len + 1, GFP_KERNEL); 1034 if (!key) { 1035 rc = -ENOMEM; 1036 goto bad; 1037 } 1038 rc = next_entry(key, fp, len); 1039 if (rc < 0) 1040 goto bad; 1041 key[len] = '\0'; 1042 1043 for (i = 0; i < nel; i++) { 1044 rc = perm_read(p, comdatum->permissions.table, fp); 1045 if (rc) 1046 goto bad; 1047 } 1048 1049 rc = hashtab_insert(h, key, comdatum); 1050 if (rc) 1051 goto bad; 1052out: 1053 return rc; 1054bad: 1055 common_destroy(key, comdatum, NULL); 1056 goto out; 1057} 1058 1059static int read_cons_helper(struct constraint_node **nodep, int ncons, 1060 int allowxtarget, void *fp) 1061{ 1062 struct constraint_node *c, *lc; 1063 struct constraint_expr *e, *le; 1064 __le32 buf[3]; 1065 u32 nexpr; 1066 int rc, i, j, depth; 1067 1068 lc = NULL; 1069 for (i = 0; i < ncons; i++) { 1070 c = kzalloc(sizeof(*c), GFP_KERNEL); 1071 if (!c) 1072 return -ENOMEM; 1073 1074 if (lc) 1075 lc->next = c; 1076 else 1077 *nodep = c; 1078 1079 rc = next_entry(buf, fp, (sizeof(u32) * 2)); 1080 if (rc < 0) 1081 return rc; 1082 c->permissions = le32_to_cpu(buf[0]); 1083 nexpr = le32_to_cpu(buf[1]); 1084 le = NULL; 1085 depth = -1; 1086 for (j = 0; j < nexpr; j++) { 1087 e = kzalloc(sizeof(*e), GFP_KERNEL); 1088 if (!e) 1089 return -ENOMEM; 1090 1091 if (le) 1092 le->next = e; 1093 else 1094 c->expr = e; 1095 1096 rc = next_entry(buf, fp, (sizeof(u32) * 3)); 1097 if (rc < 0) 1098 return rc; 1099 e->expr_type = le32_to_cpu(buf[0]); 1100 e->attr = le32_to_cpu(buf[1]); 1101 e->op = le32_to_cpu(buf[2]); 1102 1103 switch (e->expr_type) { 1104 case CEXPR_NOT: 1105 if (depth < 0) 1106 return -EINVAL; 1107 break; 1108 case CEXPR_AND: 1109 case CEXPR_OR: 1110 if (depth < 1) 1111 return -EINVAL; 1112 depth--; 1113 break; 1114 case CEXPR_ATTR: 1115 if (depth == (CEXPR_MAXDEPTH - 1)) 1116 return -EINVAL; 1117 depth++; 1118 break; 1119 case CEXPR_NAMES: 1120 if (!allowxtarget && (e->attr & CEXPR_XTARGET)) 1121 return -EINVAL; 1122 if (depth == (CEXPR_MAXDEPTH - 1)) 1123 return -EINVAL; 1124 depth++; 1125 if (ebitmap_read(&e->names, fp)) 1126 return -EINVAL; 1127 break; 1128 default: 1129 return -EINVAL; 1130 } 1131 le = e; 1132 } 1133 if (depth != 0) 1134 return -EINVAL; 1135 lc = c; 1136 } 1137 1138 return 0; 1139} 1140 1141static int class_read(struct policydb *p, struct hashtab *h, void *fp) 1142{ 1143 char *key = NULL; 1144 struct class_datum *cladatum; 1145 __le32 buf[6]; 1146 u32 len, len2, ncons, nel; 1147 int i, rc; 1148 1149 cladatum = kzalloc(sizeof(*cladatum), GFP_KERNEL); 1150 if (!cladatum) { 1151 rc = -ENOMEM; 1152 goto out; 1153 } 1154 1155 rc = next_entry(buf, fp, sizeof(u32)*6); 1156 if (rc < 0) 1157 goto bad; 1158 1159 len = le32_to_cpu(buf[0]); 1160 len2 = le32_to_cpu(buf[1]); 1161 cladatum->value = le32_to_cpu(buf[2]); 1162 1163 rc = symtab_init(&cladatum->permissions, PERM_SYMTAB_SIZE); 1164 if (rc) 1165 goto bad; 1166 cladatum->permissions.nprim = le32_to_cpu(buf[3]); 1167 nel = le32_to_cpu(buf[4]); 1168 1169 ncons = le32_to_cpu(buf[5]); 1170 1171 key = kmalloc(len + 1, GFP_KERNEL); 1172 if (!key) { 1173 rc = -ENOMEM; 1174 goto bad; 1175 } 1176 rc = next_entry(key, fp, len); 1177 if (rc < 0) 1178 goto bad; 1179 key[len] = '\0'; 1180 1181 if (len2) { 1182 cladatum->comkey = kmalloc(len2 + 1, GFP_KERNEL); 1183 if (!cladatum->comkey) { 1184 rc = -ENOMEM; 1185 goto bad; 1186 } 1187 rc = next_entry(cladatum->comkey, fp, len2); 1188 if (rc < 0) 1189 goto bad; 1190 cladatum->comkey[len2] = '\0'; 1191 1192 cladatum->comdatum = hashtab_search(p->p_commons.table, 1193 cladatum->comkey); 1194 if (!cladatum->comdatum) { 1195 printk(KERN_ERR "SELinux: unknown common %s\n", 1196 cladatum->comkey); 1197 rc = -EINVAL; 1198 goto bad; 1199 } 1200 } 1201 for (i = 0; i < nel; i++) { 1202 rc = perm_read(p, cladatum->permissions.table, fp); 1203 if (rc) 1204 goto bad; 1205 } 1206 1207 rc = read_cons_helper(&cladatum->constraints, ncons, 0, fp); 1208 if (rc) 1209 goto bad; 1210 1211 if (p->policyvers >= POLICYDB_VERSION_VALIDATETRANS) { 1212 /* grab the validatetrans rules */ 1213 rc = next_entry(buf, fp, sizeof(u32)); 1214 if (rc < 0) 1215 goto bad; 1216 ncons = le32_to_cpu(buf[0]); 1217 rc = read_cons_helper(&cladatum->validatetrans, ncons, 1, fp); 1218 if (rc) 1219 goto bad; 1220 } 1221 1222 rc = hashtab_insert(h, key, cladatum); 1223 if (rc) 1224 goto bad; 1225 1226 rc = 0; 1227out: 1228 return rc; 1229bad: 1230 cls_destroy(key, cladatum, NULL); 1231 goto out; 1232} 1233 1234static int role_read(struct policydb *p, struct hashtab *h, void *fp) 1235{ 1236 char *key = NULL; 1237 struct role_datum *role; 1238 int rc, to_read = 2; 1239 __le32 buf[3]; 1240 u32 len; 1241 1242 role = kzalloc(sizeof(*role), GFP_KERNEL); 1243 if (!role) { 1244 rc = -ENOMEM; 1245 goto out; 1246 } 1247 1248 if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) 1249 to_read = 3; 1250 1251 rc = next_entry(buf, fp, sizeof(buf[0]) * to_read); 1252 if (rc < 0) 1253 goto bad; 1254 1255 len = le32_to_cpu(buf[0]); 1256 role->value = le32_to_cpu(buf[1]); 1257 if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) 1258 role->bounds = le32_to_cpu(buf[2]); 1259 1260 key = kmalloc(len + 1, GFP_KERNEL); 1261 if (!key) { 1262 rc = -ENOMEM; 1263 goto bad; 1264 } 1265 rc = next_entry(key, fp, len); 1266 if (rc < 0) 1267 goto bad; 1268 key[len] = '\0'; 1269 1270 rc = ebitmap_read(&role->dominates, fp); 1271 if (rc) 1272 goto bad; 1273 1274 rc = ebitmap_read(&role->types, fp); 1275 if (rc) 1276 goto bad; 1277 1278 if (strcmp(key, OBJECT_R) == 0) { 1279 if (role->value != OBJECT_R_VAL) { 1280 printk(KERN_ERR "SELinux: Role %s has wrong value %d\n", 1281 OBJECT_R, role->value); 1282 rc = -EINVAL; 1283 goto bad; 1284 } 1285 rc = 0; 1286 goto bad; 1287 } 1288 1289 rc = hashtab_insert(h, key, role); 1290 if (rc) 1291 goto bad; 1292out: 1293 return rc; 1294bad: 1295 role_destroy(key, role, NULL); 1296 goto out; 1297} 1298 1299static int type_read(struct policydb *p, struct hashtab *h, void *fp) 1300{ 1301 char *key = NULL; 1302 struct type_datum *typdatum; 1303 int rc, to_read = 3; 1304 __le32 buf[4]; 1305 u32 len; 1306 1307 typdatum = kzalloc(sizeof(*typdatum), GFP_KERNEL); 1308 if (!typdatum) { 1309 rc = -ENOMEM; 1310 return rc; 1311 } 1312 1313 if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) 1314 to_read = 4; 1315 1316 rc = next_entry(buf, fp, sizeof(buf[0]) * to_read); 1317 if (rc < 0) 1318 goto bad; 1319 1320 len = le32_to_cpu(buf[0]); 1321 typdatum->value = le32_to_cpu(buf[1]); 1322 if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) { 1323 u32 prop = le32_to_cpu(buf[2]); 1324 1325 if (prop & TYPEDATUM_PROPERTY_PRIMARY) 1326 typdatum->primary = 1; 1327 if (prop & TYPEDATUM_PROPERTY_ATTRIBUTE) 1328 typdatum->attribute = 1; 1329 1330 typdatum->bounds = le32_to_cpu(buf[3]); 1331 } else { 1332 typdatum->primary = le32_to_cpu(buf[2]); 1333 } 1334 1335 key = kmalloc(len + 1, GFP_KERNEL); 1336 if (!key) { 1337 rc = -ENOMEM; 1338 goto bad; 1339 } 1340 rc = next_entry(key, fp, len); 1341 if (rc < 0) 1342 goto bad; 1343 key[len] = '\0'; 1344 1345 rc = hashtab_insert(h, key, typdatum); 1346 if (rc) 1347 goto bad; 1348out: 1349 return rc; 1350bad: 1351 type_destroy(key, typdatum, NULL); 1352 goto out; 1353} 1354 1355 1356/* 1357 * Read a MLS level structure from a policydb binary 1358 * representation file. 1359 */ 1360static int mls_read_level(struct mls_level *lp, void *fp) 1361{ 1362 __le32 buf[1]; 1363 int rc; 1364 1365 memset(lp, 0, sizeof(*lp)); 1366 1367 rc = next_entry(buf, fp, sizeof buf); 1368 if (rc < 0) { 1369 printk(KERN_ERR "SELinux: mls: truncated level\n"); 1370 goto bad; 1371 } 1372 lp->sens = le32_to_cpu(buf[0]); 1373 1374 if (ebitmap_read(&lp->cat, fp)) { 1375 printk(KERN_ERR "SELinux: mls: error reading level " 1376 "categories\n"); 1377 goto bad; 1378 } 1379 1380 return 0; 1381 1382bad: 1383 return -EINVAL; 1384} 1385 1386static int user_read(struct policydb *p, struct hashtab *h, void *fp) 1387{ 1388 char *key = NULL; 1389 struct user_datum *usrdatum; 1390 int rc, to_read = 2; 1391 __le32 buf[3]; 1392 u32 len; 1393 1394 usrdatum = kzalloc(sizeof(*usrdatum), GFP_KERNEL); 1395 if (!usrdatum) { 1396 rc = -ENOMEM; 1397 goto out; 1398 } 1399 1400 if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) 1401 to_read = 3; 1402 1403 rc = next_entry(buf, fp, sizeof(buf[0]) * to_read); 1404 if (rc < 0) 1405 goto bad; 1406 1407 len = le32_to_cpu(buf[0]); 1408 usrdatum->value = le32_to_cpu(buf[1]); 1409 if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) 1410 usrdatum->bounds = le32_to_cpu(buf[2]); 1411 1412 key = kmalloc(len + 1, GFP_KERNEL); 1413 if (!key) { 1414 rc = -ENOMEM; 1415 goto bad; 1416 } 1417 rc = next_entry(key, fp, len); 1418 if (rc < 0) 1419 goto bad; 1420 key[len] = '\0'; 1421 1422 rc = ebitmap_read(&usrdatum->roles, fp); 1423 if (rc) 1424 goto bad; 1425 1426 if (p->policyvers >= POLICYDB_VERSION_MLS) { 1427 rc = mls_read_range_helper(&usrdatum->range, fp); 1428 if (rc) 1429 goto bad; 1430 rc = mls_read_level(&usrdatum->dfltlevel, fp); 1431 if (rc) 1432 goto bad; 1433 } 1434 1435 rc = hashtab_insert(h, key, usrdatum); 1436 if (rc) 1437 goto bad; 1438out: 1439 return rc; 1440bad: 1441 user_destroy(key, usrdatum, NULL); 1442 goto out; 1443} 1444 1445static int sens_read(struct policydb *p, struct hashtab *h, void *fp) 1446{ 1447 char *key = NULL; 1448 struct level_datum *levdatum; 1449 int rc; 1450 __le32 buf[2]; 1451 u32 len; 1452 1453 levdatum = kzalloc(sizeof(*levdatum), GFP_ATOMIC); 1454 if (!levdatum) { 1455 rc = -ENOMEM; 1456 goto out; 1457 } 1458 1459 rc = next_entry(buf, fp, sizeof buf); 1460 if (rc < 0) 1461 goto bad; 1462 1463 len = le32_to_cpu(buf[0]); 1464 levdatum->isalias = le32_to_cpu(buf[1]); 1465 1466 key = kmalloc(len + 1, GFP_ATOMIC); 1467 if (!key) { 1468 rc = -ENOMEM; 1469 goto bad; 1470 } 1471 rc = next_entry(key, fp, len); 1472 if (rc < 0) 1473 goto bad; 1474 key[len] = '\0'; 1475 1476 levdatum->level = kmalloc(sizeof(struct mls_level), GFP_ATOMIC); 1477 if (!levdatum->level) { 1478 rc = -ENOMEM; 1479 goto bad; 1480 } 1481 if (mls_read_level(levdatum->level, fp)) { 1482 rc = -EINVAL; 1483 goto bad; 1484 } 1485 1486 rc = hashtab_insert(h, key, levdatum); 1487 if (rc) 1488 goto bad; 1489out: 1490 return rc; 1491bad: 1492 sens_destroy(key, levdatum, NULL); 1493 goto out; 1494} 1495 1496static int cat_read(struct policydb *p, struct hashtab *h, void *fp) 1497{ 1498 char *key = NULL; 1499 struct cat_datum *catdatum; 1500 int rc; 1501 __le32 buf[3]; 1502 u32 len; 1503 1504 catdatum = kzalloc(sizeof(*catdatum), GFP_ATOMIC); 1505 if (!catdatum) { 1506 rc = -ENOMEM; 1507 goto out; 1508 } 1509 1510 rc = next_entry(buf, fp, sizeof buf); 1511 if (rc < 0) 1512 goto bad; 1513 1514 len = le32_to_cpu(buf[0]); 1515 catdatum->value = le32_to_cpu(buf[1]); 1516 catdatum->isalias = le32_to_cpu(buf[2]); 1517 1518 key = kmalloc(len + 1, GFP_ATOMIC); 1519 if (!key) { 1520 rc = -ENOMEM; 1521 goto bad; 1522 } 1523 rc = next_entry(key, fp, len); 1524 if (rc < 0) 1525 goto bad; 1526 key[len] = '\0'; 1527 1528 rc = hashtab_insert(h, key, catdatum); 1529 if (rc) 1530 goto bad; 1531out: 1532 return rc; 1533 1534bad: 1535 cat_destroy(key, catdatum, NULL); 1536 goto out; 1537} 1538 1539static int (*read_f[SYM_NUM]) (struct policydb *p, struct hashtab *h, void *fp) = 1540{ 1541 common_read, 1542 class_read, 1543 role_read, 1544 type_read, 1545 user_read, 1546 cond_read_bool, 1547 sens_read, 1548 cat_read, 1549}; 1550 1551static int user_bounds_sanity_check(void *key, void *datum, void *datap) 1552{ 1553 struct user_datum *upper, *user; 1554 struct policydb *p = datap; 1555 int depth = 0; 1556 1557 upper = user = datum; 1558 while (upper->bounds) { 1559 struct ebitmap_node *node; 1560 unsigned long bit; 1561 1562 if (++depth == POLICYDB_BOUNDS_MAXDEPTH) { 1563 printk(KERN_ERR "SELinux: user %s: " 1564 "too deep or looped boundary", 1565 (char *) key); 1566 return -EINVAL; 1567 } 1568 1569 upper = p->user_val_to_struct[upper->bounds - 1]; 1570 ebitmap_for_each_positive_bit(&user->roles, node, bit) { 1571 if (ebitmap_get_bit(&upper->roles, bit)) 1572 continue; 1573 1574 printk(KERN_ERR 1575 "SELinux: boundary violated policy: " 1576 "user=%s role=%s bounds=%s\n", 1577 p->p_user_val_to_name[user->value - 1], 1578 p->p_role_val_to_name[bit], 1579 p->p_user_val_to_name[upper->value - 1]); 1580 1581 return -EINVAL; 1582 } 1583 } 1584 1585 return 0; 1586} 1587 1588static int role_bounds_sanity_check(void *key, void *datum, void *datap) 1589{ 1590 struct role_datum *upper, *role; 1591 struct policydb *p = datap; 1592 int depth = 0; 1593 1594 upper = role = datum; 1595 while (upper->bounds) { 1596 struct ebitmap_node *node; 1597 unsigned long bit; 1598 1599 if (++depth == POLICYDB_BOUNDS_MAXDEPTH) { 1600 printk(KERN_ERR "SELinux: role %s: " 1601 "too deep or looped bounds\n", 1602 (char *) key); 1603 return -EINVAL; 1604 } 1605 1606 upper = p->role_val_to_struct[upper->bounds - 1]; 1607 ebitmap_for_each_positive_bit(&role->types, node, bit) { 1608 if (ebitmap_get_bit(&upper->types, bit)) 1609 continue; 1610 1611 printk(KERN_ERR 1612 "SELinux: boundary violated policy: " 1613 "role=%s type=%s bounds=%s\n", 1614 p->p_role_val_to_name[role->value - 1], 1615 p->p_type_val_to_name[bit], 1616 p->p_role_val_to_name[upper->value - 1]); 1617 1618 return -EINVAL; 1619 } 1620 } 1621 1622 return 0; 1623} 1624 1625static int type_bounds_sanity_check(void *key, void *datum, void *datap) 1626{ 1627 struct type_datum *upper, *type; 1628 struct policydb *p = datap; 1629 int depth = 0; 1630 1631 upper = type = datum; 1632 while (upper->bounds) { 1633 if (++depth == POLICYDB_BOUNDS_MAXDEPTH) { 1634 printk(KERN_ERR "SELinux: type %s: " 1635 "too deep or looped boundary\n", 1636 (char *) key); 1637 return -EINVAL; 1638 } 1639 1640 upper = p->type_val_to_struct[upper->bounds - 1]; 1641 if (upper->attribute) { 1642 printk(KERN_ERR "SELinux: type %s: " 1643 "bounded by attribute %s", 1644 (char *) key, 1645 p->p_type_val_to_name[upper->value - 1]); 1646 return -EINVAL; 1647 } 1648 } 1649 1650 return 0; 1651} 1652 1653static int policydb_bounds_sanity_check(struct policydb *p) 1654{ 1655 int rc; 1656 1657 if (p->policyvers < POLICYDB_VERSION_BOUNDARY) 1658 return 0; 1659 1660 rc = hashtab_map(p->p_users.table, 1661 user_bounds_sanity_check, p); 1662 if (rc) 1663 return rc; 1664 1665 rc = hashtab_map(p->p_roles.table, 1666 role_bounds_sanity_check, p); 1667 if (rc) 1668 return rc; 1669 1670 rc = hashtab_map(p->p_types.table, 1671 type_bounds_sanity_check, p); 1672 if (rc) 1673 return rc; 1674 1675 return 0; 1676} 1677 1678extern int ss_initialized; 1679 1680u16 string_to_security_class(struct policydb *p, const char *name) 1681{ 1682 struct class_datum *cladatum; 1683 1684 cladatum = hashtab_search(p->p_classes.table, name); 1685 if (!cladatum) 1686 return 0; 1687 1688 return cladatum->value; 1689} 1690 1691u32 string_to_av_perm(struct policydb *p, u16 tclass, const char *name) 1692{ 1693 struct class_datum *cladatum; 1694 struct perm_datum *perdatum = NULL; 1695 struct common_datum *comdatum; 1696 1697 if (!tclass || tclass > p->p_classes.nprim) 1698 return 0; 1699 1700 cladatum = p->class_val_to_struct[tclass-1]; 1701 comdatum = cladatum->comdatum; 1702 if (comdatum) 1703 perdatum = hashtab_search(comdatum->permissions.table, 1704 name); 1705 if (!perdatum) 1706 perdatum = hashtab_search(cladatum->permissions.table, 1707 name); 1708 if (!perdatum) 1709 return 0; 1710 1711 return 1U << (perdatum->value-1); 1712} 1713 1714static int range_read(struct policydb *p, void *fp) 1715{ 1716 struct range_trans *rt = NULL; 1717 struct mls_range *r = NULL; 1718 int i, rc; 1719 __le32 buf[2]; 1720 u32 nel; 1721 1722 if (p->policyvers < POLICYDB_VERSION_MLS) 1723 return 0; 1724 1725 rc = next_entry(buf, fp, sizeof(u32)); 1726 if (rc) 1727 goto out; 1728 1729 nel = le32_to_cpu(buf[0]); 1730 for (i = 0; i < nel; i++) { 1731 rc = -ENOMEM; 1732 rt = kzalloc(sizeof(*rt), GFP_KERNEL); 1733 if (!rt) 1734 goto out; 1735 1736 rc = next_entry(buf, fp, (sizeof(u32) * 2)); 1737 if (rc) 1738 goto out; 1739 1740 rt->source_type = le32_to_cpu(buf[0]); 1741 rt->target_type = le32_to_cpu(buf[1]); 1742 if (p->policyvers >= POLICYDB_VERSION_RANGETRANS) { 1743 rc = next_entry(buf, fp, sizeof(u32)); 1744 if (rc) 1745 goto out; 1746 rt->target_class = le32_to_cpu(buf[0]); 1747 } else 1748 rt->target_class = p->process_class; 1749 1750 rc = -EINVAL; 1751 if (!policydb_type_isvalid(p, rt->source_type) || 1752 !policydb_type_isvalid(p, rt->target_type) || 1753 !policydb_class_isvalid(p, rt->target_class)) 1754 goto out; 1755 1756 rc = -ENOMEM; 1757 r = kzalloc(sizeof(*r), GFP_KERNEL); 1758 if (!r) 1759 goto out; 1760 1761 rc = mls_read_range_helper(r, fp); 1762 if (rc) 1763 goto out; 1764 1765 rc = -EINVAL; 1766 if (!mls_range_isvalid(p, r)) { 1767 printk(KERN_WARNING "SELinux: rangetrans: invalid range\n"); 1768 goto out; 1769 } 1770 1771 rc = hashtab_insert(p->range_tr, rt, r); 1772 if (rc) 1773 goto out; 1774 1775 rt = NULL; 1776 r = NULL; 1777 } 1778 rangetr_hash_eval(p->range_tr); 1779 rc = 0; 1780out: 1781 kfree(rt); 1782 kfree(r); 1783 return rc; 1784} 1785 1786static int genfs_read(struct policydb *p, void *fp) 1787{ 1788 int i, j, rc; 1789 u32 nel, nel2, len, len2; 1790 __le32 buf[1]; 1791 struct ocontext *l, *c; 1792 struct ocontext *newc = NULL; 1793 struct genfs *genfs_p, *genfs; 1794 struct genfs *newgenfs = NULL; 1795 1796 rc = next_entry(buf, fp, sizeof(u32)); 1797 if (rc) 1798 goto out; 1799 nel = le32_to_cpu(buf[0]); 1800 1801 for (i = 0; i < nel; i++) { 1802 rc = next_entry(buf, fp, sizeof(u32)); 1803 if (rc) 1804 goto out; 1805 len = le32_to_cpu(buf[0]); 1806 1807 rc = -ENOMEM; 1808 newgenfs = kzalloc(sizeof(*newgenfs), GFP_KERNEL); 1809 if (!newgenfs) 1810 goto out; 1811 1812 rc = -ENOMEM; 1813 newgenfs->fstype = kmalloc(len + 1, GFP_KERNEL); 1814 if (!newgenfs->fstype) 1815 goto out; 1816 1817 rc = next_entry(newgenfs->fstype, fp, len); 1818 if (rc) 1819 goto out; 1820 1821 newgenfs->fstype[len] = 0; 1822 1823 for (genfs_p = NULL, genfs = p->genfs; genfs; 1824 genfs_p = genfs, genfs = genfs->next) { 1825 rc = -EINVAL; 1826 if (strcmp(newgenfs->fstype, genfs->fstype) == 0) { 1827 printk(KERN_ERR "SELinux: dup genfs fstype %s\n", 1828 newgenfs->fstype); 1829 goto out; 1830 } 1831 if (strcmp(newgenfs->fstype, genfs->fstype) < 0) 1832 break; 1833 } 1834 newgenfs->next = genfs; 1835 if (genfs_p) 1836 genfs_p->next = newgenfs; 1837 else 1838 p->genfs = newgenfs; 1839 genfs = newgenfs; 1840 newgenfs = NULL; 1841 1842 rc = next_entry(buf, fp, sizeof(u32)); 1843 if (rc) 1844 goto out; 1845 1846 nel2 = le32_to_cpu(buf[0]); 1847 for (j = 0; j < nel2; j++) { 1848 rc = next_entry(buf, fp, sizeof(u32)); 1849 if (rc) 1850 goto out; 1851 len = le32_to_cpu(buf[0]); 1852 1853 rc = -ENOMEM; 1854 newc = kzalloc(sizeof(*newc), GFP_KERNEL); 1855 if (!newc) 1856 goto out; 1857 1858 rc = -ENOMEM; 1859 newc->u.name = kmalloc(len + 1, GFP_KERNEL); 1860 if (!newc->u.name) 1861 goto out; 1862 1863 rc = next_entry(newc->u.name, fp, len); 1864 if (rc) 1865 goto out; 1866 newc->u.name[len] = 0; 1867 1868 rc = next_entry(buf, fp, sizeof(u32)); 1869 if (rc) 1870 goto out; 1871 1872 newc->v.sclass = le32_to_cpu(buf[0]); 1873 rc = context_read_and_validate(&newc->context[0], p, fp); 1874 if (rc) 1875 goto out; 1876 1877 for (l = NULL, c = genfs->head; c; 1878 l = c, c = c->next) { 1879 rc = -EINVAL; 1880 if (!strcmp(newc->u.name, c->u.name) && 1881 (!c->v.sclass || !newc->v.sclass || 1882 newc->v.sclass == c->v.sclass)) { 1883 printk(KERN_ERR "SELinux: dup genfs entry (%s,%s)\n", 1884 genfs->fstype, c->u.name); 1885 goto out; 1886 } 1887 len = strlen(newc->u.name); 1888 len2 = strlen(c->u.name); 1889 if (len > len2) 1890 break; 1891 } 1892 1893 newc->next = c; 1894 if (l) 1895 l->next = newc; 1896 else 1897 genfs->head = newc; 1898 newc = NULL; 1899 } 1900 } 1901 rc = 0; 1902out: 1903 if (newgenfs) 1904 kfree(newgenfs->fstype); 1905 kfree(newgenfs); 1906 ocontext_destroy(newc, OCON_FSUSE); 1907 1908 return rc; 1909} 1910 1911static int ocontext_read(struct policydb *p, struct policydb_compat_info *info, 1912 void *fp) 1913{ 1914 int i, j, rc; 1915 u32 nel, len; 1916 __le32 buf[3]; 1917 struct ocontext *l, *c; 1918 u32 nodebuf[8]; 1919 1920 for (i = 0; i < info->ocon_num; i++) { 1921 rc = next_entry(buf, fp, sizeof(u32)); 1922 if (rc) 1923 goto out; 1924 nel = le32_to_cpu(buf[0]); 1925 1926 l = NULL; 1927 for (j = 0; j < nel; j++) { 1928 rc = -ENOMEM; 1929 c = kzalloc(sizeof(*c), GFP_KERNEL); 1930 if (!c) 1931 goto out; 1932 if (l) 1933 l->next = c; 1934 else 1935 p->ocontexts[i] = c; 1936 l = c; 1937 1938 switch (i) { 1939 case OCON_ISID: 1940 rc = next_entry(buf, fp, sizeof(u32)); 1941 if (rc) 1942 goto out; 1943 1944 c->sid[0] = le32_to_cpu(buf[0]); 1945 rc = context_read_and_validate(&c->context[0], p, fp); 1946 if (rc) 1947 goto out; 1948 break; 1949 case OCON_FS: 1950 case OCON_NETIF: 1951 rc = next_entry(buf, fp, sizeof(u32)); 1952 if (rc) 1953 goto out; 1954 len = le32_to_cpu(buf[0]); 1955 1956 rc = -ENOMEM; 1957 c->u.name = kmalloc(len + 1, GFP_KERNEL); 1958 if (!c->u.name) 1959 goto out; 1960 1961 rc = next_entry(c->u.name, fp, len); 1962 if (rc) 1963 goto out; 1964 1965 c->u.name[len] = 0; 1966 rc = context_read_and_validate(&c->context[0], p, fp); 1967 if (rc) 1968 goto out; 1969 rc = context_read_and_validate(&c->context[1], p, fp); 1970 if (rc) 1971 goto out; 1972 break; 1973 case OCON_PORT: 1974 rc = next_entry(buf, fp, sizeof(u32)*3); 1975 if (rc) 1976 goto out; 1977 c->u.port.protocol = le32_to_cpu(buf[0]); 1978 c->u.port.low_port = le32_to_cpu(buf[1]); 1979 c->u.port.high_port = le32_to_cpu(buf[2]); 1980 rc = context_read_and_validate(&c->context[0], p, fp); 1981 if (rc) 1982 goto out; 1983 break; 1984 case OCON_NODE: 1985 rc = next_entry(nodebuf, fp, sizeof(u32) * 2); 1986 if (rc) 1987 goto out; 1988 c->u.node.addr = nodebuf[0]; /* network order */ 1989 c->u.node.mask = nodebuf[1]; /* network order */ 1990 rc = context_read_and_validate(&c->context[0], p, fp); 1991 if (rc) 1992 goto out; 1993 break; 1994 case OCON_FSUSE: 1995 rc = next_entry(buf, fp, sizeof(u32)*2); 1996 if (rc) 1997 goto out; 1998 1999 rc = -EINVAL; 2000 c->v.behavior = le32_to_cpu(buf[0]); 2001 if (c->v.behavior > SECURITY_FS_USE_NONE) 2002 goto out; 2003 2004 rc = -ENOMEM; 2005 len = le32_to_cpu(buf[1]); 2006 c->u.name = kmalloc(len + 1, GFP_KERNEL); 2007 if (!c->u.name) 2008 goto out; 2009 2010 rc = next_entry(c->u.name, fp, len); 2011 if (rc) 2012 goto out; 2013 c->u.name[len] = 0; 2014 rc = context_read_and_validate(&c->context[0], p, fp); 2015 if (rc) 2016 goto out; 2017 break; 2018 case OCON_NODE6: { 2019 int k; 2020 2021 rc = next_entry(nodebuf, fp, sizeof(u32) * 8); 2022 if (rc) 2023 goto out; 2024 for (k = 0; k < 4; k++) 2025 c->u.node6.addr[k] = nodebuf[k]; 2026 for (k = 0; k < 4; k++) 2027 c->u.node6.mask[k] = nodebuf[k+4]; 2028 rc = context_read_and_validate(&c->context[0], p, fp); 2029 if (rc) 2030 goto out; 2031 break; 2032 } 2033 } 2034 } 2035 } 2036 rc = 0; 2037out: 2038 return rc; 2039} 2040 2041/* 2042 * Read the configuration data from a policy database binary 2043 * representation file into a policy database structure. 2044 */ 2045int policydb_read(struct policydb *p, void *fp) 2046{ 2047 struct role_allow *ra, *lra; 2048 struct role_trans *tr, *ltr; 2049 int i, j, rc; 2050 __le32 buf[4]; 2051 u32 len, nprim, nel; 2052 2053 char *policydb_str; 2054 struct policydb_compat_info *info; 2055 2056 rc = policydb_init(p); 2057 if (rc) 2058 goto out; 2059 2060 /* Read the magic number and string length. */ 2061 rc = next_entry(buf, fp, sizeof(u32) * 2); 2062 if (rc < 0) 2063 goto bad; 2064 2065 if (le32_to_cpu(buf[0]) != POLICYDB_MAGIC) { 2066 printk(KERN_ERR "SELinux: policydb magic number 0x%x does " 2067 "not match expected magic number 0x%x\n", 2068 le32_to_cpu(buf[0]), POLICYDB_MAGIC); 2069 goto bad; 2070 } 2071 2072 len = le32_to_cpu(buf[1]); 2073 if (len != strlen(POLICYDB_STRING)) { 2074 printk(KERN_ERR "SELinux: policydb string length %d does not " 2075 "match expected length %Zu\n", 2076 len, strlen(POLICYDB_STRING)); 2077 goto bad; 2078 } 2079 policydb_str = kmalloc(len + 1, GFP_KERNEL); 2080 if (!policydb_str) { 2081 printk(KERN_ERR "SELinux: unable to allocate memory for policydb " 2082 "string of length %d\n", len); 2083 rc = -ENOMEM; 2084 goto bad; 2085 } 2086 rc = next_entry(policydb_str, fp, len); 2087 if (rc < 0) { 2088 printk(KERN_ERR "SELinux: truncated policydb string identifier\n"); 2089 kfree(policydb_str); 2090 goto bad; 2091 } 2092 policydb_str[len] = '\0'; 2093 if (strcmp(policydb_str, POLICYDB_STRING)) { 2094 printk(KERN_ERR "SELinux: policydb string %s does not match " 2095 "my string %s\n", policydb_str, POLICYDB_STRING); 2096 kfree(policydb_str); 2097 goto bad; 2098 } 2099 /* Done with policydb_str. */ 2100 kfree(policydb_str); 2101 policydb_str = NULL; 2102 2103 /* Read the version and table sizes. */ 2104 rc = next_entry(buf, fp, sizeof(u32)*4); 2105 if (rc < 0) 2106 goto bad; 2107 2108 p->policyvers = le32_to_cpu(buf[0]); 2109 if (p->policyvers < POLICYDB_VERSION_MIN || 2110 p->policyvers > POLICYDB_VERSION_MAX) { 2111 printk(KERN_ERR "SELinux: policydb version %d does not match " 2112 "my version range %d-%d\n", 2113 le32_to_cpu(buf[0]), POLICYDB_VERSION_MIN, POLICYDB_VERSION_MAX); 2114 goto bad; 2115 } 2116 2117 if ((le32_to_cpu(buf[1]) & POLICYDB_CONFIG_MLS)) { 2118 p->mls_enabled = 1; 2119 2120 if (p->policyvers < POLICYDB_VERSION_MLS) { 2121 printk(KERN_ERR "SELinux: security policydb version %d " 2122 "(MLS) not backwards compatible\n", 2123 p->policyvers); 2124 goto bad; 2125 } 2126 } 2127 p->reject_unknown = !!(le32_to_cpu(buf[1]) & REJECT_UNKNOWN); 2128 p->allow_unknown = !!(le32_to_cpu(buf[1]) & ALLOW_UNKNOWN); 2129 2130 if (p->policyvers >= POLICYDB_VERSION_POLCAP && 2131 ebitmap_read(&p->policycaps, fp) != 0) 2132 goto bad; 2133 2134 if (p->policyvers >= POLICYDB_VERSION_PERMISSIVE && 2135 ebitmap_read(&p->permissive_map, fp) != 0) 2136 goto bad; 2137 2138 info = policydb_lookup_compat(p->policyvers); 2139 if (!info) { 2140 printk(KERN_ERR "SELinux: unable to find policy compat info " 2141 "for version %d\n", p->policyvers); 2142 goto bad; 2143 } 2144 2145 if (le32_to_cpu(buf[2]) != info->sym_num || 2146 le32_to_cpu(buf[3]) != info->ocon_num) { 2147 printk(KERN_ERR "SELinux: policydb table sizes (%d,%d) do " 2148 "not match mine (%d,%d)\n", le32_to_cpu(buf[2]), 2149 le32_to_cpu(buf[3]), 2150 info->sym_num, info->ocon_num); 2151 goto bad; 2152 } 2153 2154 for (i = 0; i < info->sym_num; i++) { 2155 rc = next_entry(buf, fp, sizeof(u32)*2); 2156 if (rc < 0) 2157 goto bad; 2158 nprim = le32_to_cpu(buf[0]); 2159 nel = le32_to_cpu(buf[1]); 2160 for (j = 0; j < nel; j++) { 2161 rc = read_f[i](p, p->symtab[i].table, fp); 2162 if (rc) 2163 goto bad; 2164 } 2165 2166 p->symtab[i].nprim = nprim; 2167 } 2168 2169 rc = avtab_read(&p->te_avtab, fp, p); 2170 if (rc) 2171 goto bad; 2172 2173 if (p->policyvers >= POLICYDB_VERSION_BOOL) { 2174 rc = cond_read_list(p, fp); 2175 if (rc) 2176 goto bad; 2177 } 2178 2179 rc = next_entry(buf, fp, sizeof(u32)); 2180 if (rc < 0) 2181 goto bad; 2182 nel = le32_to_cpu(buf[0]); 2183 ltr = NULL; 2184 for (i = 0; i < nel; i++) { 2185 tr = kzalloc(sizeof(*tr), GFP_KERNEL); 2186 if (!tr) { 2187 rc = -ENOMEM; 2188 goto bad; 2189 } 2190 if (ltr) 2191 ltr->next = tr; 2192 else 2193 p->role_tr = tr; 2194 rc = next_entry(buf, fp, sizeof(u32)*3); 2195 if (rc < 0) 2196 goto bad; 2197 tr->role = le32_to_cpu(buf[0]); 2198 tr->type = le32_to_cpu(buf[1]); 2199 tr->new_role = le32_to_cpu(buf[2]); 2200 if (!policydb_role_isvalid(p, tr->role) || 2201 !policydb_type_isvalid(p, tr->type) || 2202 !policydb_role_isvalid(p, tr->new_role)) { 2203 rc = -EINVAL; 2204 goto bad; 2205 } 2206 ltr = tr; 2207 } 2208 2209 rc = next_entry(buf, fp, sizeof(u32)); 2210 if (rc < 0) 2211 goto bad; 2212 nel = le32_to_cpu(buf[0]); 2213 lra = NULL; 2214 for (i = 0; i < nel; i++) { 2215 ra = kzalloc(sizeof(*ra), GFP_KERNEL); 2216 if (!ra) { 2217 rc = -ENOMEM; 2218 goto bad; 2219 } 2220 if (lra) 2221 lra->next = ra; 2222 else 2223 p->role_allow = ra; 2224 rc = next_entry(buf, fp, sizeof(u32)*2); 2225 if (rc < 0) 2226 goto bad; 2227 ra->role = le32_to_cpu(buf[0]); 2228 ra->new_role = le32_to_cpu(buf[1]); 2229 if (!policydb_role_isvalid(p, ra->role) || 2230 !policydb_role_isvalid(p, ra->new_role)) { 2231 rc = -EINVAL; 2232 goto bad; 2233 } 2234 lra = ra; 2235 } 2236 2237 rc = policydb_index_classes(p); 2238 if (rc) 2239 goto bad; 2240 2241 rc = policydb_index_others(p); 2242 if (rc) 2243 goto bad; 2244 2245 p->process_class = string_to_security_class(p, "process"); 2246 if (!p->process_class) 2247 goto bad; 2248 p->process_trans_perms = string_to_av_perm(p, p->process_class, 2249 "transition"); 2250 p->process_trans_perms |= string_to_av_perm(p, p->process_class, 2251 "dyntransition"); 2252 if (!p->process_trans_perms) 2253 goto bad; 2254 2255 rc = ocontext_read(p, info, fp); 2256 if (rc) 2257 goto bad; 2258 2259 rc = genfs_read(p, fp); 2260 if (rc) 2261 goto bad; 2262 2263 rc = range_read(p, fp); 2264 if (rc) 2265 goto bad; 2266 2267 rc = -ENOMEM; 2268 p->type_attr_map_array = flex_array_alloc(sizeof(struct ebitmap), 2269 p->p_types.nprim, 2270 GFP_KERNEL | __GFP_ZERO); 2271 if (!p->type_attr_map_array) 2272 goto bad; 2273 2274 /* preallocate so we don't have to worry about the put ever failing */ 2275 rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim - 1, 2276 GFP_KERNEL | __GFP_ZERO); 2277 if (rc) 2278 goto bad; 2279 2280 for (i = 0; i < p->p_types.nprim; i++) { 2281 struct ebitmap *e = flex_array_get(p->type_attr_map_array, i); 2282 2283 BUG_ON(!e); 2284 ebitmap_init(e); 2285 if (p->policyvers >= POLICYDB_VERSION_AVTAB) { 2286 rc = ebitmap_read(e, fp); 2287 if (rc) 2288 goto bad; 2289 } 2290 /* add the type itself as the degenerate case */ 2291 rc = ebitmap_set_bit(e, i, 1); 2292 if (rc) 2293 goto bad; 2294 } 2295 2296 rc = policydb_bounds_sanity_check(p); 2297 if (rc) 2298 goto bad; 2299 2300 rc = 0; 2301out: 2302 return rc; 2303bad: 2304 if (!rc) 2305 rc = -EINVAL; 2306 policydb_destroy(p); 2307 goto out; 2308} 2309