1 /* 2 * Implementation of the kernel access vector cache (AVC). 3 * 4 * Authors: Stephen Smalley, <sds@epoch.ncsc.mil> 5 * James Morris <jmorris@redhat.com> 6 * 7 * Update: KaiGai, Kohei <kaigai@ak.jp.nec.com> 8 * Replaced the avc_lock spinlock by RCU. 9 * 10 * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com> 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License version 2, 14 * as published by the Free Software Foundation. 15 */ 16 #include <linux/types.h> 17 #include <linux/stddef.h> 18 #include <linux/kernel.h> 19 #include <linux/slab.h> 20 #include <linux/fs.h> 21 #include <linux/dcache.h> 22 #include <linux/init.h> 23 #include <linux/skbuff.h> 24 #include <linux/percpu.h> 25 #include <net/sock.h> 26 #include <linux/un.h> 27 #include <net/af_unix.h> 28 #include <linux/ip.h> 29 #include <linux/audit.h> 30 #include <linux/ipv6.h> 31 #include <net/ipv6.h> 32 #include "avc.h" 33 #include "avc_ss.h" 34 35 static const struct av_perm_to_string 36 { 37 u16 tclass; 38 u32 value; 39 const char *name; 40 } av_perm_to_string[] = { 41 #define S_(c, v, s) { c, v, s }, 42 #include "av_perm_to_string.h" 43 #undef S_ 44 }; 45 46 static const char *class_to_string[] = { 47 #define S_(s) s, 48 #include "class_to_string.h" 49 #undef S_ 50 }; 51 52 #define TB_(s) static const char * s [] = { 53 #define TE_(s) }; 54 #define S_(s) s, 55 #include "common_perm_to_string.h" 56 #undef TB_ 57 #undef TE_ 58 #undef S_ 59 60 static const struct av_inherit 61 { 62 u16 tclass; 63 const char **common_pts; 64 u32 common_base; 65 } av_inherit[] = { 66 #define S_(c, i, b) { c, common_##i##_perm_to_string, b }, 67 #include "av_inherit.h" 68 #undef S_ 69 }; 70 71 #define AVC_CACHE_SLOTS 512 72 #define AVC_DEF_CACHE_THRESHOLD 512 73 #define AVC_CACHE_RECLAIM 16 74 75 #ifdef CONFIG_SECURITY_SELINUX_AVC_STATS 76 #define avc_cache_stats_incr(field) \ 77 do { \ 78 per_cpu(avc_cache_stats, get_cpu()).field++; \ 79 put_cpu(); \ 80 } while (0) 81 #else 82 #define avc_cache_stats_incr(field) do {} while (0) 83 #endif 84 85 struct avc_entry { 86 u32 ssid; 87 u32 tsid; 88 u16 tclass; 89 struct av_decision avd; 90 atomic_t used; /* used recently */ 91 }; 92 93 struct avc_node { 94 struct avc_entry ae; 95 struct list_head list; 96 struct rcu_head rhead; 97 }; 98 99 struct avc_cache { 100 struct list_head slots[AVC_CACHE_SLOTS]; 101 spinlock_t slots_lock[AVC_CACHE_SLOTS]; /* lock for writes */ 102 atomic_t lru_hint; /* LRU hint for reclaim scan */ 103 atomic_t active_nodes; 104 u32 latest_notif; /* latest revocation notification */ 105 }; 106 107 struct avc_callback_node { 108 int (*callback) (u32 event, u32 ssid, u32 tsid, 109 u16 tclass, u32 perms, 110 u32 *out_retained); 111 u32 events; 112 u32 ssid; 113 u32 tsid; 114 u16 tclass; 115 u32 perms; 116 struct avc_callback_node *next; 117 }; 118 119 /* Exported via selinufs */ 120 unsigned int avc_cache_threshold = AVC_DEF_CACHE_THRESHOLD; 121 122 #ifdef CONFIG_SECURITY_SELINUX_AVC_STATS 123 DEFINE_PER_CPU(struct avc_cache_stats, avc_cache_stats) = { 0 }; 124 #endif 125 126 static struct avc_cache avc_cache; 127 static struct avc_callback_node *avc_callbacks; 128 static kmem_cache_t *avc_node_cachep; 129 130 static inline int avc_hash(u32 ssid, u32 tsid, u16 tclass) 131 { 132 return (ssid ^ (tsid<<2) ^ (tclass<<4)) & (AVC_CACHE_SLOTS - 1); 133 } 134 135 /** 136 * avc_dump_av - Display an access vector in human-readable form. 137 * @tclass: target security class 138 * @av: access vector 139 */ 140 static void avc_dump_av(struct audit_buffer *ab, u16 tclass, u32 av) 141 { 142 const char **common_pts = NULL; 143 u32 common_base = 0; 144 int i, i2, perm; 145 146 if (av == 0) { 147 audit_log_format(ab, " null"); 148 return; 149 } 150 151 for (i = 0; i < ARRAY_SIZE(av_inherit); i++) { 152 if (av_inherit[i].tclass == tclass) { 153 common_pts = av_inherit[i].common_pts; 154 common_base = av_inherit[i].common_base; 155 break; 156 } 157 } 158 159 audit_log_format(ab, " {"); 160 i = 0; 161 perm = 1; 162 while (perm < common_base) { 163 if (perm & av) { 164 audit_log_format(ab, " %s", common_pts[i]); 165 av &= ~perm; 166 } 167 i++; 168 perm <<= 1; 169 } 170 171 while (i < sizeof(av) * 8) { 172 if (perm & av) { 173 for (i2 = 0; i2 < ARRAY_SIZE(av_perm_to_string); i2++) { 174 if ((av_perm_to_string[i2].tclass == tclass) && 175 (av_perm_to_string[i2].value == perm)) 176 break; 177 } 178 if (i2 < ARRAY_SIZE(av_perm_to_string)) { 179 audit_log_format(ab, " %s", 180 av_perm_to_string[i2].name); 181 av &= ~perm; 182 } 183 } 184 i++; 185 perm <<= 1; 186 } 187 188 if (av) 189 audit_log_format(ab, " 0x%x", av); 190 191 audit_log_format(ab, " }"); 192 } 193 194 /** 195 * avc_dump_query - Display a SID pair and a class in human-readable form. 196 * @ssid: source security identifier 197 * @tsid: target security identifier 198 * @tclass: target security class 199 */ 200 static void avc_dump_query(struct audit_buffer *ab, u32 ssid, u32 tsid, u16 tclass) 201 { 202 int rc; 203 char *scontext; 204 u32 scontext_len; 205 206 rc = security_sid_to_context(ssid, &scontext, &scontext_len); 207 if (rc) 208 audit_log_format(ab, "ssid=%d", ssid); 209 else { 210 audit_log_format(ab, "scontext=%s", scontext); 211 kfree(scontext); 212 } 213 214 rc = security_sid_to_context(tsid, &scontext, &scontext_len); 215 if (rc) 216 audit_log_format(ab, " tsid=%d", tsid); 217 else { 218 audit_log_format(ab, " tcontext=%s", scontext); 219 kfree(scontext); 220 } 221 audit_log_format(ab, " tclass=%s", class_to_string[tclass]); 222 } 223 224 /** 225 * avc_init - Initialize the AVC. 226 * 227 * Initialize the access vector cache. 228 */ 229 void __init avc_init(void) 230 { 231 int i; 232 233 for (i = 0; i < AVC_CACHE_SLOTS; i++) { 234 INIT_LIST_HEAD(&avc_cache.slots[i]); 235 spin_lock_init(&avc_cache.slots_lock[i]); 236 } 237 atomic_set(&avc_cache.active_nodes, 0); 238 atomic_set(&avc_cache.lru_hint, 0); 239 240 avc_node_cachep = kmem_cache_create("avc_node", sizeof(struct avc_node), 241 0, SLAB_PANIC, NULL, NULL); 242 243 audit_log(current->audit_context, GFP_KERNEL, AUDIT_KERNEL, "AVC INITIALIZED\n"); 244 } 245 246 int avc_get_hash_stats(char *page) 247 { 248 int i, chain_len, max_chain_len, slots_used; 249 struct avc_node *node; 250 251 rcu_read_lock(); 252 253 slots_used = 0; 254 max_chain_len = 0; 255 for (i = 0; i < AVC_CACHE_SLOTS; i++) { 256 if (!list_empty(&avc_cache.slots[i])) { 257 slots_used++; 258 chain_len = 0; 259 list_for_each_entry_rcu(node, &avc_cache.slots[i], list) 260 chain_len++; 261 if (chain_len > max_chain_len) 262 max_chain_len = chain_len; 263 } 264 } 265 266 rcu_read_unlock(); 267 268 return scnprintf(page, PAGE_SIZE, "entries: %d\nbuckets used: %d/%d\n" 269 "longest chain: %d\n", 270 atomic_read(&avc_cache.active_nodes), 271 slots_used, AVC_CACHE_SLOTS, max_chain_len); 272 } 273 274 static void avc_node_free(struct rcu_head *rhead) 275 { 276 struct avc_node *node = container_of(rhead, struct avc_node, rhead); 277 kmem_cache_free(avc_node_cachep, node); 278 avc_cache_stats_incr(frees); 279 } 280 281 static void avc_node_delete(struct avc_node *node) 282 { 283 list_del_rcu(&node->list); 284 call_rcu(&node->rhead, avc_node_free); 285 atomic_dec(&avc_cache.active_nodes); 286 } 287 288 static void avc_node_kill(struct avc_node *node) 289 { 290 kmem_cache_free(avc_node_cachep, node); 291 avc_cache_stats_incr(frees); 292 atomic_dec(&avc_cache.active_nodes); 293 } 294 295 static void avc_node_replace(struct avc_node *new, struct avc_node *old) 296 { 297 list_replace_rcu(&old->list, &new->list); 298 call_rcu(&old->rhead, avc_node_free); 299 atomic_dec(&avc_cache.active_nodes); 300 } 301 302 static inline int avc_reclaim_node(void) 303 { 304 struct avc_node *node; 305 int hvalue, try, ecx; 306 unsigned long flags; 307 308 for (try = 0, ecx = 0; try < AVC_CACHE_SLOTS; try++ ) { 309 hvalue = atomic_inc_return(&avc_cache.lru_hint) & (AVC_CACHE_SLOTS - 1); 310 311 if (!spin_trylock_irqsave(&avc_cache.slots_lock[hvalue], flags)) 312 continue; 313 314 list_for_each_entry(node, &avc_cache.slots[hvalue], list) { 315 if (atomic_dec_and_test(&node->ae.used)) { 316 /* Recently Unused */ 317 avc_node_delete(node); 318 avc_cache_stats_incr(reclaims); 319 ecx++; 320 if (ecx >= AVC_CACHE_RECLAIM) { 321 spin_unlock_irqrestore(&avc_cache.slots_lock[hvalue], flags); 322 goto out; 323 } 324 } 325 } 326 spin_unlock_irqrestore(&avc_cache.slots_lock[hvalue], flags); 327 } 328 out: 329 return ecx; 330 } 331 332 static struct avc_node *avc_alloc_node(void) 333 { 334 struct avc_node *node; 335 336 node = kmem_cache_alloc(avc_node_cachep, SLAB_ATOMIC); 337 if (!node) 338 goto out; 339 340 memset(node, 0, sizeof(*node)); 341 INIT_RCU_HEAD(&node->rhead); 342 INIT_LIST_HEAD(&node->list); 343 atomic_set(&node->ae.used, 1); 344 avc_cache_stats_incr(allocations); 345 346 if (atomic_inc_return(&avc_cache.active_nodes) > avc_cache_threshold) 347 avc_reclaim_node(); 348 349 out: 350 return node; 351 } 352 353 static void avc_node_populate(struct avc_node *node, u32 ssid, u32 tsid, u16 tclass, struct avc_entry *ae) 354 { 355 node->ae.ssid = ssid; 356 node->ae.tsid = tsid; 357 node->ae.tclass = tclass; 358 memcpy(&node->ae.avd, &ae->avd, sizeof(node->ae.avd)); 359 } 360 361 static inline struct avc_node *avc_search_node(u32 ssid, u32 tsid, u16 tclass) 362 { 363 struct avc_node *node, *ret = NULL; 364 int hvalue; 365 366 hvalue = avc_hash(ssid, tsid, tclass); 367 list_for_each_entry_rcu(node, &avc_cache.slots[hvalue], list) { 368 if (ssid == node->ae.ssid && 369 tclass == node->ae.tclass && 370 tsid == node->ae.tsid) { 371 ret = node; 372 break; 373 } 374 } 375 376 if (ret == NULL) { 377 /* cache miss */ 378 goto out; 379 } 380 381 /* cache hit */ 382 if (atomic_read(&ret->ae.used) != 1) 383 atomic_set(&ret->ae.used, 1); 384 out: 385 return ret; 386 } 387 388 /** 389 * avc_lookup - Look up an AVC entry. 390 * @ssid: source security identifier 391 * @tsid: target security identifier 392 * @tclass: target security class 393 * @requested: requested permissions, interpreted based on @tclass 394 * 395 * Look up an AVC entry that is valid for the 396 * @requested permissions between the SID pair 397 * (@ssid, @tsid), interpreting the permissions 398 * based on @tclass. If a valid AVC entry exists, 399 * then this function return the avc_node. 400 * Otherwise, this function returns NULL. 401 */ 402 static struct avc_node *avc_lookup(u32 ssid, u32 tsid, u16 tclass, u32 requested) 403 { 404 struct avc_node *node; 405 406 avc_cache_stats_incr(lookups); 407 node = avc_search_node(ssid, tsid, tclass); 408 409 if (node && ((node->ae.avd.decided & requested) == requested)) { 410 avc_cache_stats_incr(hits); 411 goto out; 412 } 413 414 node = NULL; 415 avc_cache_stats_incr(misses); 416 out: 417 return node; 418 } 419 420 static int avc_latest_notif_update(int seqno, int is_insert) 421 { 422 int ret = 0; 423 static DEFINE_SPINLOCK(notif_lock); 424 unsigned long flag; 425 426 spin_lock_irqsave(¬if_lock, flag); 427 if (is_insert) { 428 if (seqno < avc_cache.latest_notif) { 429 printk(KERN_WARNING "avc: seqno %d < latest_notif %d\n", 430 seqno, avc_cache.latest_notif); 431 ret = -EAGAIN; 432 } 433 } else { 434 if (seqno > avc_cache.latest_notif) 435 avc_cache.latest_notif = seqno; 436 } 437 spin_unlock_irqrestore(¬if_lock, flag); 438 439 return ret; 440 } 441 442 /** 443 * avc_insert - Insert an AVC entry. 444 * @ssid: source security identifier 445 * @tsid: target security identifier 446 * @tclass: target security class 447 * @ae: AVC entry 448 * 449 * Insert an AVC entry for the SID pair 450 * (@ssid, @tsid) and class @tclass. 451 * The access vectors and the sequence number are 452 * normally provided by the security server in 453 * response to a security_compute_av() call. If the 454 * sequence number @ae->avd.seqno is not less than the latest 455 * revocation notification, then the function copies 456 * the access vectors into a cache entry, returns 457 * avc_node inserted. Otherwise, this function returns NULL. 458 */ 459 static struct avc_node *avc_insert(u32 ssid, u32 tsid, u16 tclass, struct avc_entry *ae) 460 { 461 struct avc_node *pos, *node = NULL; 462 int hvalue; 463 unsigned long flag; 464 465 if (avc_latest_notif_update(ae->avd.seqno, 1)) 466 goto out; 467 468 node = avc_alloc_node(); 469 if (node) { 470 hvalue = avc_hash(ssid, tsid, tclass); 471 avc_node_populate(node, ssid, tsid, tclass, ae); 472 473 spin_lock_irqsave(&avc_cache.slots_lock[hvalue], flag); 474 list_for_each_entry(pos, &avc_cache.slots[hvalue], list) { 475 if (pos->ae.ssid == ssid && 476 pos->ae.tsid == tsid && 477 pos->ae.tclass == tclass) { 478 avc_node_replace(node, pos); 479 goto found; 480 } 481 } 482 list_add_rcu(&node->list, &avc_cache.slots[hvalue]); 483 found: 484 spin_unlock_irqrestore(&avc_cache.slots_lock[hvalue], flag); 485 } 486 out: 487 return node; 488 } 489 490 static inline void avc_print_ipv6_addr(struct audit_buffer *ab, 491 struct in6_addr *addr, __be16 port, 492 char *name1, char *name2) 493 { 494 if (!ipv6_addr_any(addr)) 495 audit_log_format(ab, " %s=" NIP6_FMT, name1, NIP6(*addr)); 496 if (port) 497 audit_log_format(ab, " %s=%d", name2, ntohs(port)); 498 } 499 500 static inline void avc_print_ipv4_addr(struct audit_buffer *ab, u32 addr, 501 __be16 port, char *name1, char *name2) 502 { 503 if (addr) 504 audit_log_format(ab, " %s=" NIPQUAD_FMT, name1, NIPQUAD(addr)); 505 if (port) 506 audit_log_format(ab, " %s=%d", name2, ntohs(port)); 507 } 508 509 /** 510 * avc_audit - Audit the granting or denial of permissions. 511 * @ssid: source security identifier 512 * @tsid: target security identifier 513 * @tclass: target security class 514 * @requested: requested permissions 515 * @avd: access vector decisions 516 * @result: result from avc_has_perm_noaudit 517 * @a: auxiliary audit data 518 * 519 * Audit the granting or denial of permissions in accordance 520 * with the policy. This function is typically called by 521 * avc_has_perm() after a permission check, but can also be 522 * called directly by callers who use avc_has_perm_noaudit() 523 * in order to separate the permission check from the auditing. 524 * For example, this separation is useful when the permission check must 525 * be performed under a lock, to allow the lock to be released 526 * before calling the auditing code. 527 */ 528 void avc_audit(u32 ssid, u32 tsid, 529 u16 tclass, u32 requested, 530 struct av_decision *avd, int result, struct avc_audit_data *a) 531 { 532 struct task_struct *tsk = current; 533 struct inode *inode = NULL; 534 u32 denied, audited; 535 struct audit_buffer *ab; 536 537 denied = requested & ~avd->allowed; 538 if (denied) { 539 audited = denied; 540 if (!(audited & avd->auditdeny)) 541 return; 542 } else if (result) { 543 audited = denied = requested; 544 } else { 545 audited = requested; 546 if (!(audited & avd->auditallow)) 547 return; 548 } 549 550 ab = audit_log_start(current->audit_context, GFP_ATOMIC, AUDIT_AVC); 551 if (!ab) 552 return; /* audit_panic has been called */ 553 audit_log_format(ab, "avc: %s ", denied ? "denied" : "granted"); 554 avc_dump_av(ab, tclass,audited); 555 audit_log_format(ab, " for "); 556 if (a && a->tsk) 557 tsk = a->tsk; 558 if (tsk && tsk->pid) { 559 audit_log_format(ab, " pid=%d comm=", tsk->pid); 560 audit_log_untrustedstring(ab, tsk->comm); 561 } 562 if (a) { 563 switch (a->type) { 564 case AVC_AUDIT_DATA_IPC: 565 audit_log_format(ab, " key=%d", a->u.ipc_id); 566 break; 567 case AVC_AUDIT_DATA_CAP: 568 audit_log_format(ab, " capability=%d", a->u.cap); 569 break; 570 case AVC_AUDIT_DATA_FS: 571 if (a->u.fs.dentry) { 572 struct dentry *dentry = a->u.fs.dentry; 573 if (a->u.fs.mnt) 574 audit_avc_path(dentry, a->u.fs.mnt); 575 audit_log_format(ab, " name="); 576 audit_log_untrustedstring(ab, dentry->d_name.name); 577 inode = dentry->d_inode; 578 } else if (a->u.fs.inode) { 579 struct dentry *dentry; 580 inode = a->u.fs.inode; 581 dentry = d_find_alias(inode); 582 if (dentry) { 583 audit_log_format(ab, " name="); 584 audit_log_untrustedstring(ab, dentry->d_name.name); 585 dput(dentry); 586 } 587 } 588 if (inode) 589 audit_log_format(ab, " dev=%s ino=%ld", 590 inode->i_sb->s_id, 591 inode->i_ino); 592 break; 593 case AVC_AUDIT_DATA_NET: 594 if (a->u.net.sk) { 595 struct sock *sk = a->u.net.sk; 596 struct unix_sock *u; 597 int len = 0; 598 char *p = NULL; 599 600 switch (sk->sk_family) { 601 case AF_INET: { 602 struct inet_sock *inet = inet_sk(sk); 603 604 avc_print_ipv4_addr(ab, inet->rcv_saddr, 605 inet->sport, 606 "laddr", "lport"); 607 avc_print_ipv4_addr(ab, inet->daddr, 608 inet->dport, 609 "faddr", "fport"); 610 break; 611 } 612 case AF_INET6: { 613 struct inet_sock *inet = inet_sk(sk); 614 struct ipv6_pinfo *inet6 = inet6_sk(sk); 615 616 avc_print_ipv6_addr(ab, &inet6->rcv_saddr, 617 inet->sport, 618 "laddr", "lport"); 619 avc_print_ipv6_addr(ab, &inet6->daddr, 620 inet->dport, 621 "faddr", "fport"); 622 break; 623 } 624 case AF_UNIX: 625 u = unix_sk(sk); 626 if (u->dentry) { 627 audit_avc_path(u->dentry, u->mnt); 628 audit_log_format(ab, " name="); 629 audit_log_untrustedstring(ab, u->dentry->d_name.name); 630 break; 631 } 632 if (!u->addr) 633 break; 634 len = u->addr->len-sizeof(short); 635 p = &u->addr->name->sun_path[0]; 636 audit_log_format(ab, " path="); 637 if (*p) 638 audit_log_untrustedstring(ab, p); 639 else 640 audit_log_hex(ab, p, len); 641 break; 642 } 643 } 644 645 switch (a->u.net.family) { 646 case AF_INET: 647 avc_print_ipv4_addr(ab, a->u.net.v4info.saddr, 648 a->u.net.sport, 649 "saddr", "src"); 650 avc_print_ipv4_addr(ab, a->u.net.v4info.daddr, 651 a->u.net.dport, 652 "daddr", "dest"); 653 break; 654 case AF_INET6: 655 avc_print_ipv6_addr(ab, &a->u.net.v6info.saddr, 656 a->u.net.sport, 657 "saddr", "src"); 658 avc_print_ipv6_addr(ab, &a->u.net.v6info.daddr, 659 a->u.net.dport, 660 "daddr", "dest"); 661 break; 662 } 663 if (a->u.net.netif) 664 audit_log_format(ab, " netif=%s", 665 a->u.net.netif); 666 break; 667 } 668 } 669 audit_log_format(ab, " "); 670 avc_dump_query(ab, ssid, tsid, tclass); 671 audit_log_end(ab); 672 } 673 674 /** 675 * avc_add_callback - Register a callback for security events. 676 * @callback: callback function 677 * @events: security events 678 * @ssid: source security identifier or %SECSID_WILD 679 * @tsid: target security identifier or %SECSID_WILD 680 * @tclass: target security class 681 * @perms: permissions 682 * 683 * Register a callback function for events in the set @events 684 * related to the SID pair (@ssid, @tsid) and 685 * and the permissions @perms, interpreting 686 * @perms based on @tclass. Returns %0 on success or 687 * -%ENOMEM if insufficient memory exists to add the callback. 688 */ 689 int avc_add_callback(int (*callback)(u32 event, u32 ssid, u32 tsid, 690 u16 tclass, u32 perms, 691 u32 *out_retained), 692 u32 events, u32 ssid, u32 tsid, 693 u16 tclass, u32 perms) 694 { 695 struct avc_callback_node *c; 696 int rc = 0; 697 698 c = kmalloc(sizeof(*c), GFP_ATOMIC); 699 if (!c) { 700 rc = -ENOMEM; 701 goto out; 702 } 703 704 c->callback = callback; 705 c->events = events; 706 c->ssid = ssid; 707 c->tsid = tsid; 708 c->perms = perms; 709 c->next = avc_callbacks; 710 avc_callbacks = c; 711 out: 712 return rc; 713 } 714 715 static inline int avc_sidcmp(u32 x, u32 y) 716 { 717 return (x == y || x == SECSID_WILD || y == SECSID_WILD); 718 } 719 720 /** 721 * avc_update_node Update an AVC entry 722 * @event : Updating event 723 * @perms : Permission mask bits 724 * @ssid,@tsid,@tclass : identifier of an AVC entry 725 * 726 * if a valid AVC entry doesn't exist,this function returns -ENOENT. 727 * if kmalloc() called internal returns NULL, this function returns -ENOMEM. 728 * otherwise, this function update the AVC entry. The original AVC-entry object 729 * will release later by RCU. 730 */ 731 static int avc_update_node(u32 event, u32 perms, u32 ssid, u32 tsid, u16 tclass) 732 { 733 int hvalue, rc = 0; 734 unsigned long flag; 735 struct avc_node *pos, *node, *orig = NULL; 736 737 node = avc_alloc_node(); 738 if (!node) { 739 rc = -ENOMEM; 740 goto out; 741 } 742 743 /* Lock the target slot */ 744 hvalue = avc_hash(ssid, tsid, tclass); 745 spin_lock_irqsave(&avc_cache.slots_lock[hvalue], flag); 746 747 list_for_each_entry(pos, &avc_cache.slots[hvalue], list){ 748 if ( ssid==pos->ae.ssid && 749 tsid==pos->ae.tsid && 750 tclass==pos->ae.tclass ){ 751 orig = pos; 752 break; 753 } 754 } 755 756 if (!orig) { 757 rc = -ENOENT; 758 avc_node_kill(node); 759 goto out_unlock; 760 } 761 762 /* 763 * Copy and replace original node. 764 */ 765 766 avc_node_populate(node, ssid, tsid, tclass, &orig->ae); 767 768 switch (event) { 769 case AVC_CALLBACK_GRANT: 770 node->ae.avd.allowed |= perms; 771 break; 772 case AVC_CALLBACK_TRY_REVOKE: 773 case AVC_CALLBACK_REVOKE: 774 node->ae.avd.allowed &= ~perms; 775 break; 776 case AVC_CALLBACK_AUDITALLOW_ENABLE: 777 node->ae.avd.auditallow |= perms; 778 break; 779 case AVC_CALLBACK_AUDITALLOW_DISABLE: 780 node->ae.avd.auditallow &= ~perms; 781 break; 782 case AVC_CALLBACK_AUDITDENY_ENABLE: 783 node->ae.avd.auditdeny |= perms; 784 break; 785 case AVC_CALLBACK_AUDITDENY_DISABLE: 786 node->ae.avd.auditdeny &= ~perms; 787 break; 788 } 789 avc_node_replace(node, orig); 790 out_unlock: 791 spin_unlock_irqrestore(&avc_cache.slots_lock[hvalue], flag); 792 out: 793 return rc; 794 } 795 796 /** 797 * avc_ss_reset - Flush the cache and revalidate migrated permissions. 798 * @seqno: policy sequence number 799 */ 800 int avc_ss_reset(u32 seqno) 801 { 802 struct avc_callback_node *c; 803 int i, rc = 0; 804 unsigned long flag; 805 struct avc_node *node; 806 807 for (i = 0; i < AVC_CACHE_SLOTS; i++) { 808 spin_lock_irqsave(&avc_cache.slots_lock[i], flag); 809 list_for_each_entry(node, &avc_cache.slots[i], list) 810 avc_node_delete(node); 811 spin_unlock_irqrestore(&avc_cache.slots_lock[i], flag); 812 } 813 814 for (c = avc_callbacks; c; c = c->next) { 815 if (c->events & AVC_CALLBACK_RESET) { 816 rc = c->callback(AVC_CALLBACK_RESET, 817 0, 0, 0, 0, NULL); 818 if (rc) 819 goto out; 820 } 821 } 822 823 avc_latest_notif_update(seqno, 0); 824 out: 825 return rc; 826 } 827 828 /** 829 * avc_has_perm_noaudit - Check permissions but perform no auditing. 830 * @ssid: source security identifier 831 * @tsid: target security identifier 832 * @tclass: target security class 833 * @requested: requested permissions, interpreted based on @tclass 834 * @avd: access vector decisions 835 * 836 * Check the AVC to determine whether the @requested permissions are granted 837 * for the SID pair (@ssid, @tsid), interpreting the permissions 838 * based on @tclass, and call the security server on a cache miss to obtain 839 * a new decision and add it to the cache. Return a copy of the decisions 840 * in @avd. Return %0 if all @requested permissions are granted, 841 * -%EACCES if any permissions are denied, or another -errno upon 842 * other errors. This function is typically called by avc_has_perm(), 843 * but may also be called directly to separate permission checking from 844 * auditing, e.g. in cases where a lock must be held for the check but 845 * should be released for the auditing. 846 */ 847 int avc_has_perm_noaudit(u32 ssid, u32 tsid, 848 u16 tclass, u32 requested, 849 struct av_decision *avd) 850 { 851 struct avc_node *node; 852 struct avc_entry entry, *p_ae; 853 int rc = 0; 854 u32 denied; 855 856 rcu_read_lock(); 857 858 node = avc_lookup(ssid, tsid, tclass, requested); 859 if (!node) { 860 rcu_read_unlock(); 861 rc = security_compute_av(ssid,tsid,tclass,requested,&entry.avd); 862 if (rc) 863 goto out; 864 rcu_read_lock(); 865 node = avc_insert(ssid,tsid,tclass,&entry); 866 } 867 868 p_ae = node ? &node->ae : &entry; 869 870 if (avd) 871 memcpy(avd, &p_ae->avd, sizeof(*avd)); 872 873 denied = requested & ~(p_ae->avd.allowed); 874 875 if (!requested || denied) { 876 if (selinux_enforcing) 877 rc = -EACCES; 878 else 879 if (node) 880 avc_update_node(AVC_CALLBACK_GRANT,requested, 881 ssid,tsid,tclass); 882 } 883 884 rcu_read_unlock(); 885 out: 886 return rc; 887 } 888 889 /** 890 * avc_has_perm - Check permissions and perform any appropriate auditing. 891 * @ssid: source security identifier 892 * @tsid: target security identifier 893 * @tclass: target security class 894 * @requested: requested permissions, interpreted based on @tclass 895 * @auditdata: auxiliary audit data 896 * 897 * Check the AVC to determine whether the @requested permissions are granted 898 * for the SID pair (@ssid, @tsid), interpreting the permissions 899 * based on @tclass, and call the security server on a cache miss to obtain 900 * a new decision and add it to the cache. Audit the granting or denial of 901 * permissions in accordance with the policy. Return %0 if all @requested 902 * permissions are granted, -%EACCES if any permissions are denied, or 903 * another -errno upon other errors. 904 */ 905 int avc_has_perm(u32 ssid, u32 tsid, u16 tclass, 906 u32 requested, struct avc_audit_data *auditdata) 907 { 908 struct av_decision avd; 909 int rc; 910 911 rc = avc_has_perm_noaudit(ssid, tsid, tclass, requested, &avd); 912 avc_audit(ssid, tsid, tclass, requested, &avd, rc, auditdata); 913 return rc; 914 } 915