00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <linux/string.h>
00015 #include <rsbac/aci.h>
00016 #include <rsbac/mac.h>
00017 #include <rsbac/adf_main.h>
00018 #include <rsbac/error.h>
00019 #include <rsbac/helpers.h>
00020 #include <rsbac/getname.h>
00021 #include <rsbac/debug.h>
00022 #include <rsbac/rkmem.h>
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 static enum rsbac_adf_req_ret_t
00033 mac_check_role(rsbac_uid_t owner, enum rsbac_system_role_t role)
00034 {
00035 union rsbac_target_id_t i_tid;
00036 union rsbac_attribute_value_t i_attr_val1;
00037
00038 i_tid.user = owner;
00039 if (rsbac_get_attr(MAC,
00040 T_USER,
00041 i_tid,
00042 A_mac_role,
00043 &i_attr_val1,
00044 TRUE))
00045 {
00046 rsbac_ds_get_error("mac_check_role", A_mac_role);
00047 return(NOT_GRANTED);
00048 }
00049
00050 if (i_attr_val1.system_role == role)
00051 return(GRANTED);
00052 else
00053 {
00054 #ifdef CONFIG_RSBAC_DEBUG
00055 if(rsbac_debug_adf_mac)
00056 {
00057 rsbac_printk(KERN_DEBUG
00058 "mac_check_role(): pid %u/%.15s: wrong mac_role %u -> NOT_GRANTED!\n",
00059 current->pid, current->comm,
00060 i_attr_val1.system_role);
00061 }
00062 #endif
00063 return(NOT_GRANTED);
00064 }
00065 }
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 static enum rsbac_adf_req_ret_t
00083 auto_write_attr( rsbac_pid_t pid,
00084 enum rsbac_target_t target,
00085 union rsbac_target_id_t tid,
00086 enum rsbac_attribute_t t_level_attr,
00087 enum rsbac_attribute_t t_cat_attr,
00088 rsbac_boolean_t set_level)
00089 {
00090 rsbac_security_level_t curr_level;
00091 rsbac_mac_category_vector_t curr_categories;
00092 rsbac_security_level_t target_sec_level;
00093 rsbac_mac_category_vector_t target_categories;
00094 union rsbac_target_id_t i_tid;
00095 union rsbac_attribute_value_t attr_val1;
00096 union rsbac_attribute_value_t attr_val2;
00097 rsbac_mac_process_flags_t flags;
00098 rsbac_boolean_t mac_auto_used_level = FALSE;
00099 rsbac_boolean_t mac_auto_used_cat = FALSE;
00100 rsbac_boolean_t raise_object_level = FALSE;
00101 rsbac_boolean_t raise_object_cat = FALSE;
00102
00103
00104 i_tid.process = pid;
00105 if (rsbac_get_attr(MAC,
00106 T_PROCESS,
00107 i_tid,
00108 A_mac_process_flags,
00109 &attr_val1,
00110 FALSE))
00111 {
00112 rsbac_ds_get_error("mac_auto_write", A_none);
00113 return(NOT_GRANTED);
00114 }
00115 flags = attr_val1.mac_process_flags;
00116 if(flags & MAC_override)
00117 return GRANTED;
00118
00119
00120 if (rsbac_get_attr(MAC,
00121 T_PROCESS,
00122 i_tid,
00123 A_current_sec_level,
00124 &attr_val1,
00125 FALSE))
00126 {
00127 rsbac_ds_get_error("mac_auto_write", A_none);
00128 return(NOT_GRANTED);
00129 }
00130 curr_level = attr_val1.security_level;
00131
00132 if (rsbac_get_attr(MAC,
00133 T_PROCESS,
00134 i_tid,
00135 A_mac_curr_categories,
00136 &attr_val1,
00137 FALSE))
00138 {
00139 rsbac_ds_get_error("mac_auto_write", A_none);
00140 return(NOT_GRANTED);
00141 }
00142 curr_categories = attr_val1.mac_categories;
00143
00144 if (rsbac_get_attr(MAC,
00145 target,
00146 tid,
00147 t_level_attr,
00148 &attr_val1,
00149 TRUE))
00150 {
00151 rsbac_ds_get_error("mac_auto_write", A_none);
00152 return(NOT_GRANTED);
00153 }
00154 target_sec_level = attr_val1.security_level;
00155
00156 if (rsbac_get_attr(MAC,
00157 target,
00158 tid,
00159 t_cat_attr,
00160 &attr_val1,
00161 TRUE))
00162 {
00163 rsbac_ds_get_error("mac_auto_write", A_none);
00164 return(NOT_GRANTED);
00165 }
00166 target_categories = attr_val1.mac_categories;
00167
00168 if(target_sec_level > curr_level)
00169 {
00170 if (rsbac_get_attr(MAC,
00171 T_PROCESS,
00172 i_tid,
00173 A_security_level,
00174 &attr_val1,
00175 FALSE))
00176 {
00177 rsbac_ds_get_error("mac_auto_write", A_none);
00178 return(NOT_GRANTED);
00179 }
00180 if(attr_val1.security_level < target_sec_level)
00181 {
00182 #ifdef CONFIG_RSBAC_DEBUG
00183 if(rsbac_debug_adf_mac)
00184 {
00185 rsbac_printk(KERN_DEBUG
00186 "mac_auto_write(): pid %u/%.15s: security_level %u under target_sec_level %u, no override -> NOT_GRANTED!\n",
00187 current->pid, current->comm,
00188 attr_val1.security_level, target_sec_level);
00189 }
00190 #endif
00191 return(NOT_GRANTED);
00192 }
00193
00194
00195 if(flags & MAC_auto)
00196 mac_auto_used_level = TRUE;
00197 else
00198 {
00199 if( !(flags & MAC_write_up)
00200 && !(flags & MAC_trusted)
00201 )
00202 {
00203
00204 switch(target)
00205 {
00206 case T_FILE:
00207 case T_DIR:
00208 case T_FIFO:
00209 case T_SYMLINK:
00210 if (rsbac_get_attr(MAC,
00211 target,
00212 tid,
00213 A_mac_file_flags,
00214 &attr_val1,
00215 TRUE))
00216 {
00217 rsbac_ds_get_error("mac_auto_write", A_none);
00218 return(NOT_GRANTED);
00219 }
00220 if( (attr_val1.mac_file_flags & MAC_write_up)
00221 || (attr_val1.mac_file_flags & MAC_trusted)
00222 )
00223 {
00224 break;
00225 }
00226
00227
00228 default:
00229 #ifdef CONFIG_RSBAC_DEBUG
00230 if(rsbac_debug_adf_mac)
00231 {
00232 rsbac_printk(KERN_DEBUG
00233 "mac_auto_write(): pid %u/%.15s: current security_level %u under target_sec_level %u, no auto, write_up, trusted -> NOT_GRANTED!\n",
00234 current->pid, current->comm,
00235 curr_level, target_sec_level);
00236 }
00237 #endif
00238 return(NOT_GRANTED);
00239 }
00240 }
00241 }
00242 }
00243 else
00244 if(target_sec_level < curr_level)
00245 {
00246 if (rsbac_get_attr(MAC,
00247 T_PROCESS,
00248 i_tid,
00249 A_min_security_level,
00250 &attr_val1,
00251 FALSE))
00252 {
00253 rsbac_ds_get_error("mac_auto_write", A_none);
00254 return(NOT_GRANTED);
00255 }
00256 if(attr_val1.security_level > target_sec_level)
00257 {
00258 #ifdef CONFIG_RSBAC_DEBUG
00259 if(rsbac_debug_adf_mac)
00260 {
00261 rsbac_printk(KERN_DEBUG
00262 "mac_auto_write(): pid %u/%.15s: min_security_level %u over target_sec_level %u, no override -> NOT_GRANTED!\n",
00263 current->pid, current->comm,
00264 attr_val1.security_level, target_sec_level);
00265 }
00266 #endif
00267 return(NOT_GRANTED);
00268 }
00269
00270 if(flags & MAC_auto)
00271 {
00272
00273 if (rsbac_get_attr(MAC,
00274 T_PROCESS,
00275 i_tid,
00276 A_max_read_open,
00277 &attr_val1,
00278 FALSE))
00279 {
00280 rsbac_ds_get_error("mac_auto_write", A_none);
00281 return(NOT_GRANTED);
00282 }
00283 if(attr_val1.security_level > target_sec_level)
00284 {
00285 if( !(flags & MAC_write_down)
00286 && !(flags & MAC_trusted)
00287 )
00288 {
00289
00290 switch(target)
00291 {
00292 case T_FILE:
00293 case T_DIR:
00294 case T_FIFO:
00295 case T_SYMLINK:
00296 if (rsbac_get_attr(MAC,
00297 target,
00298 tid,
00299 A_mac_file_flags,
00300 &attr_val1,
00301 TRUE))
00302 {
00303 rsbac_ds_get_error("mac_auto_write", A_none);
00304 return(NOT_GRANTED);
00305 }
00306 if( (attr_val1.mac_file_flags & MAC_write_down)
00307 || (attr_val1.mac_file_flags & MAC_trusted)
00308 )
00309 {
00310 if(attr_val1.mac_file_flags & MAC_auto)
00311 {
00312 raise_object_level = TRUE;
00313 }
00314 break;
00315 }
00316
00317
00318 default:
00319 #ifdef CONFIG_RSBAC_DEBUG
00320 if(rsbac_debug_adf_mac)
00321 {
00322 rsbac_printk(KERN_DEBUG
00323 "mac_auto_write(): pid %u/%.15s: max_read_open %u over target_sec_level %u, no write_down or trusted -> NOT_GRANTED!\n",
00324 current->pid, current->comm,
00325 attr_val1.security_level, target_sec_level);
00326 }
00327 #endif
00328 return(NOT_GRANTED);
00329 }
00330 }
00331 }
00332 else
00333 mac_auto_used_level = TRUE;
00334 }
00335 else
00336 {
00337 if( !(flags & MAC_write_down)
00338 && !(flags & MAC_trusted)
00339 )
00340 {
00341
00342 switch(target)
00343 {
00344 case T_FILE:
00345 case T_DIR:
00346 case T_FIFO:
00347 case T_SYMLINK:
00348 if (rsbac_get_attr(MAC,
00349 target,
00350 tid,
00351 A_mac_file_flags,
00352 &attr_val1,
00353 TRUE))
00354 {
00355 rsbac_ds_get_error("mac_auto_write", A_none);
00356 return(NOT_GRANTED);
00357 }
00358 if( (attr_val1.mac_file_flags & MAC_write_down)
00359 || (attr_val1.mac_file_flags & MAC_trusted)
00360 )
00361 {
00362 if(attr_val1.mac_file_flags & MAC_auto)
00363 {
00364 raise_object_level = TRUE;
00365 }
00366 break;
00367 }
00368
00369
00370 default:
00371 #ifdef CONFIG_RSBAC_DEBUG
00372 if(rsbac_debug_adf_mac)
00373 {
00374 rsbac_printk(KERN_DEBUG
00375 "mac_auto_write(): pid %u/%.15s: current security_level %u over target_sec_level %u, no auto, write_down or trusted -> NOT_GRANTED!\n",
00376 current->pid, current->comm,
00377 curr_level, target_sec_level);
00378 }
00379 #endif
00380 return(NOT_GRANTED);
00381 }
00382 }
00383 }
00384 }
00385
00386 if((target_categories & curr_categories) != target_categories)
00387 {
00388 if (rsbac_get_attr(MAC,
00389 T_PROCESS,
00390 i_tid,
00391 A_mac_categories,
00392 &attr_val1,
00393 FALSE))
00394 {
00395 rsbac_ds_get_error("mac_auto_write", A_none);
00396 return(NOT_GRANTED);
00397 }
00398 if((target_categories & attr_val1.mac_categories) != target_categories)
00399 {
00400 #ifdef CONFIG_RSBAC_DEBUG
00401 if(rsbac_debug_adf_mac)
00402 {
00403 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00404
00405 if(tmp)
00406 {
00407 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00408
00409 if(tmp2)
00410 {
00411 u64tostrmac(tmp, attr_val1.mac_categories);
00412 u64tostrmac(tmp2, target_categories);
00413 rsbac_printk(KERN_DEBUG
00414 "mac_auto_write(): pid %u/%.15s: max_categories %s under target categories %s, no override -> NOT_GRANTED!\n",
00415 current->pid, current->comm,
00416 tmp,
00417 tmp2);
00418 rsbac_kfree(tmp2);
00419 }
00420 rsbac_kfree(tmp);
00421 }
00422 }
00423 #endif
00424 return(NOT_GRANTED);
00425 }
00426
00427 if(flags & MAC_auto)
00428 mac_auto_used_cat = TRUE;
00429 else
00430 {
00431 if( !(flags & MAC_write_up)
00432 && !(flags & MAC_trusted)
00433 )
00434 {
00435
00436 switch(target)
00437 {
00438 case T_FILE:
00439 case T_DIR:
00440 case T_FIFO:
00441 case T_SYMLINK:
00442 if (rsbac_get_attr(MAC,
00443 target,
00444 tid,
00445 A_mac_file_flags,
00446 &attr_val1,
00447 TRUE))
00448 {
00449 rsbac_ds_get_error("mac_auto_write", A_none);
00450 return(NOT_GRANTED);
00451 }
00452 if( (attr_val1.mac_file_flags & MAC_write_up)
00453 || (attr_val1.mac_file_flags & MAC_trusted)
00454 )
00455 break;
00456
00457
00458 default:
00459 #ifdef CONFIG_RSBAC_DEBUG
00460 if(rsbac_debug_adf_mac)
00461 {
00462 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00463
00464 if(tmp)
00465 {
00466 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00467
00468 if(tmp2)
00469 {
00470 u64tostrmac(tmp, curr_categories);
00471 u64tostrmac(tmp2, target_categories);
00472 rsbac_printk(KERN_DEBUG
00473 "mac_auto_write(): pid %u/%.15s: curr_categories %s under target categories %s, no auto, write_up or trusted -> NOT_GRANTED!\n",
00474 current->pid, current->comm,
00475 tmp,
00476 tmp2);
00477 rsbac_kfree(tmp2);
00478 }
00479 rsbac_kfree(tmp);
00480 }
00481 }
00482 #endif
00483 return(NOT_GRANTED);
00484 }
00485 }
00486 }
00487 }
00488 else
00489 if((target_categories & curr_categories) != curr_categories)
00490 {
00491 if (rsbac_get_attr(MAC,
00492 T_PROCESS,
00493 i_tid,
00494 A_mac_min_categories,
00495 &attr_val1,
00496 FALSE))
00497 {
00498 rsbac_ds_get_error("mac_auto_write", A_none);
00499 return(NOT_GRANTED);
00500 }
00501 if((target_categories & attr_val1.mac_categories) != attr_val1.mac_categories)
00502 {
00503 #ifdef CONFIG_RSBAC_DEBUG
00504 if(rsbac_debug_adf_mac)
00505 {
00506 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00507
00508 if(tmp)
00509 {
00510 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00511
00512 if(tmp2)
00513 {
00514 u64tostrmac(tmp, attr_val1.mac_categories);
00515 u64tostrmac(tmp2, target_categories);
00516 rsbac_printk(KERN_DEBUG
00517 "mac_auto_write(): pid %u/%.15s: min_categories %s over target categories %s, no override -> NOT_GRANTED!\n",
00518 current->pid, current->comm,
00519 tmp,
00520 tmp2);
00521 rsbac_kfree(tmp2);
00522 }
00523 rsbac_kfree(tmp);
00524 }
00525 }
00526 #endif
00527 return(NOT_GRANTED);
00528 }
00529
00530 if(flags & MAC_auto)
00531 {
00532
00533 if (rsbac_get_attr(MAC,
00534 T_PROCESS,
00535 i_tid,
00536 A_max_read_categories,
00537 &attr_val1,
00538 FALSE))
00539 {
00540 rsbac_ds_get_error("mac_auto_write", A_none);
00541 return(NOT_GRANTED);
00542 }
00543 if((target_categories & attr_val1.mac_categories) != attr_val1.mac_categories)
00544 {
00545 if( !(flags & MAC_write_down)
00546 && !(flags & MAC_trusted)
00547 )
00548 {
00549
00550 switch(target)
00551 {
00552 case T_FILE:
00553 case T_DIR:
00554 case T_FIFO:
00555 case T_SYMLINK:
00556 if (rsbac_get_attr(MAC,
00557 target,
00558 tid,
00559 A_mac_file_flags,
00560 &attr_val1,
00561 TRUE))
00562 {
00563 rsbac_ds_get_error("mac_auto_write", A_none);
00564 return(NOT_GRANTED);
00565 }
00566 if( (attr_val1.mac_file_flags & MAC_write_down)
00567 || (attr_val1.mac_file_flags & MAC_trusted)
00568 )
00569 {
00570 if(attr_val1.mac_file_flags & MAC_auto)
00571 {
00572 raise_object_cat = TRUE;
00573 }
00574 break;
00575 }
00576
00577
00578 default:
00579 #ifdef CONFIG_RSBAC_DEBUG
00580 if(rsbac_debug_adf_mac)
00581 {
00582 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00583
00584 if(tmp)
00585 {
00586 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00587
00588 if(tmp2)
00589 {
00590 u64tostrmac(tmp, attr_val1.mac_categories);
00591 u64tostrmac(tmp2, target_categories);
00592 rsbac_printk(KERN_DEBUG
00593 "mac_auto_write(): pid %u/%.15s: max_read_categories %s over target categories %s, no write_down or trusted -> NOT_GRANTED!\n",
00594 current->pid, current->comm,
00595 tmp,
00596 tmp2);
00597 rsbac_kfree(tmp2);
00598 }
00599 rsbac_kfree(tmp);
00600 }
00601 }
00602 #endif
00603 return(NOT_GRANTED);
00604 }
00605 }
00606 }
00607 else
00608 mac_auto_used_cat = TRUE;
00609 }
00610 else
00611 {
00612 if( !(flags & MAC_write_down)
00613 && !(flags & MAC_trusted)
00614 )
00615 {
00616
00617 switch(target)
00618 {
00619 case T_FILE:
00620 case T_DIR:
00621 case T_FIFO:
00622 case T_SYMLINK:
00623 if (rsbac_get_attr(MAC,
00624 target,
00625 tid,
00626 A_mac_file_flags,
00627 &attr_val1,
00628 TRUE))
00629 {
00630 rsbac_ds_get_error("mac_auto_write", A_none);
00631 return(NOT_GRANTED);
00632 }
00633 if( (attr_val1.mac_file_flags & MAC_write_down)
00634 || (attr_val1.mac_file_flags & MAC_trusted)
00635 )
00636 {
00637 if(attr_val1.mac_file_flags & MAC_auto)
00638 {
00639 raise_object_cat = TRUE;
00640 }
00641 break;
00642 }
00643
00644
00645 default:
00646 #ifdef CONFIG_RSBAC_DEBUG
00647 if(rsbac_debug_adf_mac)
00648 {
00649 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00650
00651 if(tmp)
00652 {
00653 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00654
00655 if(tmp2)
00656 {
00657 u64tostrmac(tmp, curr_categories);
00658 u64tostrmac(tmp2, target_categories);
00659 rsbac_printk(KERN_DEBUG
00660 "mac_auto_write(): pid %u/%.15s: curr_categories %s over target categories %s, no auto, write_down or trusted -> NOT_GRANTED!\n",
00661 current->pid, current->comm,
00662 tmp,
00663 tmp2);
00664 rsbac_kfree(tmp2);
00665 }
00666 rsbac_kfree(tmp);
00667 }
00668 }
00669 #endif
00670 return(NOT_GRANTED);
00671 }
00672 }
00673 }
00674 }
00675
00676
00677
00678
00679
00680 if( set_level
00681 && ( mac_auto_used_level
00682 || raise_object_level
00683 )
00684 )
00685 {
00686 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
00687 {
00688 char * target_type_name;
00689 char * target_id_name;
00690
00691 target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00692 if(target_type_name)
00693 {
00694 #ifdef CONFIG_RSBAC_LOG_FULL_PATH
00695 target_id_name
00696 = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
00697
00698 #else
00699 target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
00700
00701 #endif
00702 if(target_id_name)
00703 {
00704 get_target_name(target_type_name, target, target_id_name, tid);
00705
00706 if(mac_auto_used_level)
00707 {
00708 rsbac_printk(KERN_INFO
00709 "mac_auto_write(): Changing process %u (%.15s, owner %u) current level from %u to %u for %s %s\n",
00710 pid,
00711 current->comm,
00712 current->uid,
00713 curr_level,
00714 target_sec_level,
00715 target_type_name,
00716 target_id_name);
00717 }
00718 else
00719 {
00720 rsbac_printk(KERN_INFO
00721 "mac_auto_write(): Process %u (%.15s, owner %u): Raising object level from %u to %u for %s %s\n",
00722 pid,
00723 current->comm,
00724 current->uid,
00725 target_sec_level,
00726 curr_level,
00727 target_type_name,
00728 target_id_name);
00729 }
00730 rsbac_kfree(target_id_name);
00731 }
00732 rsbac_kfree(target_type_name);
00733 }
00734 }
00735 #endif
00736 if(mac_auto_used_level)
00737 {
00738 i_tid.process = pid;
00739 attr_val1.current_sec_level = target_sec_level;
00740 if (rsbac_get_attr(MAC,
00741 T_PROCESS,
00742 i_tid,
00743 A_min_write_open,
00744 &attr_val2,
00745 TRUE))
00746 {
00747 rsbac_ds_get_error("mac_auto_write", A_none);
00748 return(NOT_GRANTED);
00749 }
00750 if(attr_val1.min_write_open < attr_val2.min_write_open)
00751 {
00752 if (rsbac_set_attr(MAC,
00753 T_PROCESS,
00754 i_tid,
00755 A_min_write_open,
00756 attr_val1))
00757 {
00758 rsbac_ds_set_error("mac_auto_write", A_none);
00759 return(NOT_GRANTED);
00760 }
00761 }
00762 if (rsbac_set_attr(MAC,
00763 T_PROCESS,
00764 i_tid,
00765 A_current_sec_level,
00766 attr_val1))
00767 {
00768 rsbac_ds_set_error("mac_auto_write", A_none);
00769 return(NOT_GRANTED);
00770 }
00771 }
00772 else
00773 {
00774 attr_val1.security_level = curr_level;
00775 if (rsbac_set_attr(MAC,
00776 target,
00777 tid,
00778 A_security_level,
00779 attr_val1))
00780 {
00781 rsbac_ds_set_error("mac_auto_write", A_none);
00782 return(NOT_GRANTED);
00783 }
00784 }
00785 }
00786
00787
00788 if( set_level
00789 && ( mac_auto_used_cat
00790 || raise_object_cat
00791 )
00792 )
00793 {
00794 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
00795 {
00796 char * target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00797 if(target_type_name)
00798 {
00799 char * target_id_name;
00800
00801 #ifdef CONFIG_RSBAC_LOG_FULL_PATH
00802 target_id_name
00803 = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
00804
00805 #else
00806 target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
00807
00808 #endif
00809 if(target_id_name)
00810 {
00811 char * tmp1 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00812 if(tmp1)
00813 {
00814 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00815 if(tmp2)
00816 {
00817 get_target_name(target_type_name, target, target_id_name, tid);
00818
00819 if(mac_auto_used_cat)
00820 {
00821 rsbac_printk(KERN_INFO
00822 "mac_auto_write(): Changing process %u (%.15s, owner %u) current categories from %s to %s for %s %s\n",
00823 pid,
00824 current->comm,
00825 current->uid,
00826 u64tostrmac(tmp1, curr_categories),
00827 u64tostrmac(tmp2, target_categories),
00828 target_type_name,
00829 target_id_name);
00830 }
00831 else
00832 {
00833 rsbac_printk(KERN_INFO
00834 "mac_auto_write(): Process %u (%.15s, owner %u): raising current categories from %s to %s for %s %s\n",
00835 pid,
00836 current->comm,
00837 current->uid,
00838 u64tostrmac(tmp2, target_categories),
00839 u64tostrmac(tmp1, curr_categories),
00840 target_type_name,
00841 target_id_name);
00842 }
00843 rsbac_kfree(tmp2);
00844 }
00845 rsbac_kfree(tmp1);
00846 }
00847 rsbac_kfree(target_id_name);
00848 }
00849 rsbac_kfree(target_type_name);
00850 }
00851 }
00852 #endif
00853 if(mac_auto_used_cat)
00854 {
00855 i_tid.process = pid;
00856 attr_val1.mac_categories = target_categories;
00857 if (rsbac_get_attr(MAC,
00858 T_PROCESS,
00859 i_tid,
00860 A_min_write_categories,
00861 &attr_val2,
00862 TRUE))
00863 {
00864 rsbac_ds_get_error("mac_auto_write", A_none);
00865 return(NOT_GRANTED);
00866 }
00867 if((attr_val1.mac_categories & attr_val2.mac_categories)
00868 != attr_val2.mac_categories
00869 )
00870 {
00871 if (rsbac_set_attr(MAC,
00872 T_PROCESS,
00873 i_tid,
00874 A_min_write_categories,
00875 attr_val1))
00876 {
00877 rsbac_ds_set_error("mac_auto_write", A_none);
00878 return(NOT_GRANTED);
00879 }
00880 }
00881 if (rsbac_set_attr(MAC,
00882 T_PROCESS,
00883 i_tid,
00884 A_mac_curr_categories,
00885 attr_val1))
00886 {
00887 rsbac_ds_set_error("mac_auto_write", A_none);
00888 return(NOT_GRANTED);
00889 }
00890 }
00891 else
00892 {
00893 attr_val1.mac_categories = curr_categories;
00894 if (rsbac_set_attr(MAC,
00895 target,
00896 tid,
00897 A_mac_categories,
00898 attr_val1))
00899 {
00900 rsbac_ds_set_error("mac_auto_write", A_none);
00901 return(NOT_GRANTED);
00902 }
00903 }
00904 }
00905
00906
00907 return(GRANTED);
00908 }
00909
00910 static enum rsbac_adf_req_ret_t
00911 auto_write( rsbac_pid_t pid,
00912 enum rsbac_target_t target,
00913 union rsbac_target_id_t tid,
00914 rsbac_boolean_t set_level)
00915 {
00916 return auto_write_attr(pid,
00917 target,
00918 tid,
00919 A_security_level,
00920 A_mac_categories,
00921 set_level);
00922 }
00923
00924
00925
00926
00927 static enum rsbac_adf_req_ret_t
00928 auto_read_attr ( rsbac_pid_t pid,
00929 enum rsbac_target_t target,
00930 union rsbac_target_id_t tid,
00931 enum rsbac_attribute_t t_level_attr,
00932 enum rsbac_attribute_t t_cat_attr,
00933 rsbac_boolean_t set_level)
00934 {
00935 rsbac_security_level_t curr_level;
00936 rsbac_mac_category_vector_t curr_categories;
00937 rsbac_security_level_t target_sec_level;
00938 rsbac_mac_category_vector_t target_categories;
00939 union rsbac_target_id_t i_tid;
00940 union rsbac_attribute_value_t attr_val1;
00941 union rsbac_attribute_value_t attr_val2;
00942 rsbac_mac_process_flags_t flags;
00943 rsbac_boolean_t mac_auto_used_level = FALSE;
00944 rsbac_boolean_t mac_auto_used_cat = FALSE;
00945 rsbac_boolean_t set_level_level = FALSE;
00946 rsbac_boolean_t set_level_cat = FALSE;
00947
00948
00949 i_tid.process = pid;
00950 if (rsbac_get_attr(MAC,
00951 T_PROCESS,
00952 i_tid,
00953 A_mac_process_flags,
00954 &attr_val1,
00955 FALSE))
00956 {
00957 rsbac_ds_get_error("mac_auto_read", A_none);
00958 return(NOT_GRANTED);
00959 }
00960 flags = attr_val1.mac_process_flags;
00961 if(flags & MAC_override)
00962 return GRANTED;
00963
00964
00965 if (rsbac_get_attr(MAC,
00966 T_PROCESS,
00967 i_tid,
00968 A_current_sec_level,
00969 &attr_val1,
00970 FALSE))
00971 {
00972 rsbac_ds_get_error("mac_auto_read", A_none);
00973 return(NOT_GRANTED);
00974 }
00975 curr_level = attr_val1.security_level;
00976
00977 if (rsbac_get_attr(MAC,
00978 T_PROCESS,
00979 i_tid,
00980 A_mac_curr_categories,
00981 &attr_val1,
00982 FALSE))
00983 {
00984 rsbac_ds_get_error("mac_auto_read", A_none);
00985 return(NOT_GRANTED);
00986 }
00987 curr_categories = attr_val1.mac_categories;
00988
00989 if (rsbac_get_attr(MAC,
00990 target,
00991 tid,
00992 t_level_attr,
00993 &attr_val1,
00994 TRUE))
00995 {
00996 rsbac_ds_get_error("mac_auto_read", A_none);
00997 return(NOT_GRANTED);
00998 }
00999 target_sec_level = attr_val1.security_level;
01000
01001 if (rsbac_get_attr(MAC,
01002 target,
01003 tid,
01004 t_cat_attr,
01005 &attr_val1,
01006 TRUE))
01007 {
01008 rsbac_ds_get_error("mac_auto_read", A_none);
01009 return(NOT_GRANTED);
01010 }
01011 target_categories = attr_val1.mac_categories;
01012
01013 if(target_sec_level > curr_level)
01014 {
01015 if (rsbac_get_attr(MAC,
01016 T_PROCESS,
01017 i_tid,
01018 A_security_level,
01019 &attr_val1,
01020 FALSE))
01021 {
01022 rsbac_ds_get_error("mac_auto_read", A_none);
01023 return(NOT_GRANTED);
01024 }
01025 if(attr_val1.security_level < target_sec_level)
01026 {
01027 #ifdef CONFIG_RSBAC_DEBUG
01028 if(rsbac_debug_adf_mac)
01029 {
01030 rsbac_printk(KERN_DEBUG
01031 "mac_auto_read(): pid %u/%.15s: security_level %u under target_sec_level %u, no override -> NOT_GRANTED!\n",
01032 current->pid, current->comm,
01033 attr_val1.security_level, target_sec_level);
01034 }
01035 #endif
01036 return(NOT_GRANTED);
01037 }
01038
01039 if(flags & MAC_auto)
01040 {
01041
01042 if (rsbac_get_attr(MAC,
01043 T_PROCESS,
01044 i_tid,
01045 A_min_write_open,
01046 &attr_val1,
01047 FALSE))
01048 {
01049 rsbac_ds_get_error("mac_auto_read", A_none);
01050 return(NOT_GRANTED);
01051 }
01052 if(attr_val1.security_level < target_sec_level)
01053 {
01054 if( !(flags & MAC_read_up)
01055 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01056 && !(flags & MAC_trusted)
01057 #endif
01058 )
01059 {
01060
01061 switch(target)
01062 {
01063 case T_FILE:
01064 case T_DIR:
01065 case T_FIFO:
01066 case T_SYMLINK:
01067 if (rsbac_get_attr(MAC,
01068 target,
01069 tid,
01070 A_mac_file_flags,
01071 &attr_val1,
01072 TRUE))
01073 {
01074 rsbac_ds_get_error("mac_auto_read", A_none);
01075 return(NOT_GRANTED);
01076 }
01077 if( (attr_val1.mac_file_flags & MAC_read_up)
01078 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01079 || (attr_val1.mac_file_flags & MAC_trusted)
01080 #endif
01081 )
01082 {
01083 break;
01084 }
01085
01086
01087 default:
01088 #ifdef CONFIG_RSBAC_DEBUG
01089 if(rsbac_debug_adf_mac)
01090 {
01091 rsbac_printk(KERN_DEBUG
01092 "mac_auto_read(): pid %u/%.15s: min_write_open %u under target_sec_level %u, no read_up or trusted -> NOT_GRANTED!\n",
01093 current->pid, current->comm,
01094 attr_val1.security_level, target_sec_level);
01095 }
01096 #endif
01097 return(NOT_GRANTED);
01098 }
01099 }
01100 }
01101 else
01102 {
01103 mac_auto_used_level = TRUE;
01104 set_level_level = TRUE;
01105 }
01106 }
01107 else
01108 {
01109 if( !(flags & MAC_read_up)
01110 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01111 && !(flags & MAC_trusted)
01112 #endif
01113 )
01114 {
01115
01116 switch(target)
01117 {
01118 case T_FILE:
01119 case T_DIR:
01120 case T_FIFO:
01121 case T_SYMLINK:
01122 if (rsbac_get_attr(MAC,
01123 target,
01124 tid,
01125 A_mac_file_flags,
01126 &attr_val1,
01127 TRUE))
01128 {
01129 rsbac_ds_get_error("mac_auto_read", A_none);
01130 return(NOT_GRANTED);
01131 }
01132 if( (attr_val1.mac_file_flags & MAC_read_up)
01133 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01134 || (attr_val1.mac_file_flags & MAC_trusted)
01135 #endif
01136 )
01137 {
01138 break;
01139 }
01140
01141
01142 default:
01143 #ifdef CONFIG_RSBAC_DEBUG
01144 if(rsbac_debug_adf_mac)
01145 {
01146 rsbac_printk(KERN_DEBUG
01147 "mac_auto_read(): pid %u/%.15s: current level %u under target_sec_level %u, no auto, read_up or trusted -> NOT_GRANTED!\n",
01148 current->pid, current->comm,
01149 curr_level, target_sec_level);
01150 }
01151 #endif
01152 return(NOT_GRANTED);
01153 }
01154 }
01155 }
01156 }
01157 else
01158 if(target_sec_level < curr_level)
01159 {
01160 if(flags & MAC_auto)
01161 {
01162 mac_auto_used_level = TRUE;
01163 }
01164 }
01165 if((target_categories & curr_categories) != target_categories)
01166 {
01167 if (rsbac_get_attr(MAC,
01168 T_PROCESS,
01169 i_tid,
01170 A_mac_categories,
01171 &attr_val1,
01172 FALSE))
01173 {
01174 rsbac_ds_get_error("mac_auto_read", A_none);
01175 return(NOT_GRANTED);
01176 }
01177 if((target_categories & attr_val1.mac_categories) != target_categories)
01178 {
01179 #ifdef CONFIG_RSBAC_DEBUG
01180 if(rsbac_debug_adf_mac)
01181 {
01182 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01183
01184 if(tmp)
01185 {
01186 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01187
01188 if(tmp2)
01189 {
01190 u64tostrmac(tmp, attr_val1.mac_categories);
01191 u64tostrmac(tmp2, target_categories);
01192 rsbac_printk(KERN_DEBUG
01193 "mac_auto_write(): pid %u/%.15s: max_categories %s under target categories %s, no override -> NOT_GRANTED!\n",
01194 current->pid, current->comm,
01195 tmp,
01196 tmp2);
01197 rsbac_kfree(tmp2);
01198 }
01199 rsbac_kfree(tmp);
01200 }
01201 }
01202 #endif
01203 return(NOT_GRANTED);
01204 }
01205
01206 if(flags & MAC_auto)
01207 {
01208
01209 if (rsbac_get_attr(MAC,
01210 T_PROCESS,
01211 i_tid,
01212 A_min_write_categories,
01213 &attr_val1,
01214 FALSE))
01215 {
01216 rsbac_ds_get_error("mac_auto_read", A_none);
01217 return(NOT_GRANTED);
01218 }
01219 if((target_categories & attr_val1.mac_categories) != target_categories)
01220 {
01221 if( !(flags & MAC_read_up)
01222 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01223 && !(flags & MAC_trusted)
01224 #endif
01225 )
01226 {
01227
01228 switch(target)
01229 {
01230 case T_FILE:
01231 case T_DIR:
01232 case T_FIFO:
01233 case T_SYMLINK:
01234 if (rsbac_get_attr(MAC,
01235 target,
01236 tid,
01237 A_mac_file_flags,
01238 &attr_val1,
01239 TRUE))
01240 {
01241 rsbac_ds_get_error("mac_auto_read", A_none);
01242 return(NOT_GRANTED);
01243 }
01244 if( (attr_val1.mac_file_flags & MAC_read_up)
01245 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01246 || (attr_val1.mac_file_flags & MAC_trusted)
01247 #endif
01248 )
01249 {
01250 break;
01251 }
01252
01253
01254 default:
01255 #ifdef CONFIG_RSBAC_DEBUG
01256 if(rsbac_debug_adf_mac)
01257 {
01258 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01259
01260 if(tmp)
01261 {
01262 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01263
01264 if(tmp2)
01265 {
01266 u64tostrmac(tmp, attr_val1.mac_categories);
01267 u64tostrmac(tmp2, target_categories);
01268 rsbac_printk(KERN_DEBUG
01269 "mac_auto_write(): pid %u/%.15s: min_write_categories %s under target categories %s, no read_up or trusted with read option -> NOT_GRANTED!\n",
01270 current->pid, current->comm,
01271 tmp,
01272 tmp2);
01273 rsbac_kfree(tmp2);
01274 }
01275 rsbac_kfree(tmp);
01276 }
01277 }
01278 #endif
01279 return(NOT_GRANTED);
01280 }
01281 }
01282 }
01283 else
01284 {
01285 mac_auto_used_cat = TRUE;
01286 set_level_cat = TRUE;
01287 }
01288 }
01289 else
01290 {
01291 if( !(flags & MAC_read_up)
01292 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01293 && !(flags & MAC_trusted)
01294 #endif
01295 )
01296 {
01297
01298 switch(target)
01299 {
01300 case T_FILE:
01301 case T_DIR:
01302 case T_FIFO:
01303 case T_SYMLINK:
01304 if (rsbac_get_attr(MAC,
01305 target,
01306 tid,
01307 A_mac_file_flags,
01308 &attr_val1,
01309 TRUE))
01310 {
01311 rsbac_ds_get_error("mac_auto_read", A_none);
01312 return(NOT_GRANTED);
01313 }
01314 if( (attr_val1.mac_file_flags & MAC_read_up)
01315 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01316 || (attr_val1.mac_file_flags & MAC_trusted)
01317 #endif
01318 )
01319 {
01320 break;
01321 }
01322
01323
01324 default:
01325 #ifdef CONFIG_RSBAC_DEBUG
01326 if(rsbac_debug_adf_mac)
01327 {
01328 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01329
01330 if(tmp)
01331 {
01332 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01333
01334 if(tmp2)
01335 {
01336 u64tostrmac(tmp, curr_categories);
01337 u64tostrmac(tmp2, target_categories);
01338 rsbac_printk(KERN_DEBUG
01339 "mac_auto_write(): pid %u/%.15s: curr_categories %s under target categories %s, no auto, read_up or trusted with read option -> NOT_GRANTED!\n",
01340 current->pid, current->comm,
01341 tmp,
01342 tmp2);
01343 rsbac_kfree(tmp2);
01344 }
01345 rsbac_kfree(tmp);
01346 }
01347 }
01348 #endif
01349 return(NOT_GRANTED);
01350 }
01351 }
01352 }
01353 }
01354 else
01355 if((target_categories & curr_categories) != curr_categories)
01356 {
01357 if(flags & MAC_auto)
01358 {
01359 mac_auto_used_level = TRUE;
01360 }
01361 }
01362
01363
01364
01365
01366
01367 if(set_level && mac_auto_used_level)
01368 {
01369 i_tid.process = pid;
01370 attr_val1.current_sec_level = target_sec_level;
01371 if(set_level_level)
01372 {
01373 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
01374 char * target_type_name;
01375 char * target_id_name;
01376
01377 target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01378 if(target_type_name)
01379 {
01380 #ifdef CONFIG_RSBAC_LOG_FULL_PATH
01381 target_id_name
01382 = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
01383
01384 #else
01385 target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
01386
01387 #endif
01388 if(target_id_name)
01389 {
01390 get_target_name(target_type_name, target, target_id_name, tid);
01391
01392 rsbac_printk(KERN_INFO
01393 "mac_auto_read(): Changing process %u (%.15s, owner %u) current level from %u to %u for %s %s\n",
01394 pid,
01395 current->comm,
01396 current->uid,
01397 curr_level,
01398 target_sec_level,
01399 target_type_name,
01400 target_id_name);
01401 rsbac_kfree(target_id_name);
01402 }
01403 rsbac_kfree(target_type_name);
01404 }
01405 #endif
01406 if(rsbac_set_attr(MAC,
01407 T_PROCESS,
01408 i_tid,
01409 A_current_sec_level,
01410 attr_val1))
01411 {
01412 rsbac_ds_set_error("mac_auto_read", A_none);
01413 return(NOT_GRANTED);
01414 }
01415 }
01416 if (rsbac_get_attr(MAC,
01417 T_PROCESS,
01418 i_tid,
01419 A_max_read_open,
01420 &attr_val2,
01421 TRUE))
01422 {
01423 rsbac_ds_get_error("mac_auto_read", A_none);
01424 return(NOT_GRANTED);
01425 }
01426 if(attr_val1.max_read_open > attr_val2.max_read_open)
01427 {
01428 if (rsbac_set_attr(MAC,
01429 T_PROCESS,
01430 i_tid,
01431 A_max_read_open,
01432 attr_val1))
01433 {
01434 rsbac_ds_set_error("mac_auto_read", A_none);
01435 return(NOT_GRANTED);
01436 }
01437 }
01438 }
01439
01440
01441 if(set_level && mac_auto_used_cat)
01442 {
01443 i_tid.process = pid;
01444 attr_val1.mac_categories = target_categories;
01445 if(set_level_cat)
01446 {
01447 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
01448 char * target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01449 if(target_type_name)
01450 {
01451 char * target_id_name;
01452
01453 #ifdef CONFIG_RSBAC_LOG_FULL_PATH
01454 target_id_name
01455 = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
01456
01457 #else
01458 target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
01459
01460 #endif
01461 if(target_id_name)
01462 {
01463 char * tmp1 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01464 if(tmp1)
01465 {
01466 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01467 if(tmp2)
01468 {
01469 get_target_name(target_type_name, target, target_id_name, tid);
01470
01471 rsbac_printk(KERN_INFO
01472 "mac_auto_read(): Changing process %u (15%s, owner %u) current categories from %s to %s for %s %s\n",
01473 pid,
01474 current->comm,
01475 current->uid,
01476 u64tostrmac(tmp1, curr_categories),
01477 u64tostrmac(tmp2, target_categories),
01478 target_type_name,
01479 target_id_name);
01480 rsbac_kfree(tmp2);
01481 }
01482 rsbac_kfree(tmp1);
01483 }
01484 rsbac_kfree(target_id_name);
01485 }
01486 rsbac_kfree(target_type_name);
01487 }
01488 #endif
01489 if(rsbac_set_attr(MAC,
01490 T_PROCESS,
01491 i_tid,
01492 A_mac_curr_categories,
01493 attr_val1))
01494 {
01495 rsbac_ds_set_error("mac_auto_read", A_none);
01496 return(NOT_GRANTED);
01497 }
01498 }
01499 if (rsbac_get_attr(MAC,
01500 T_PROCESS,
01501 i_tid,
01502 A_max_read_categories,
01503 &attr_val2,
01504 TRUE))
01505 {
01506 rsbac_ds_get_error("mac_auto_read", A_none);
01507 return(NOT_GRANTED);
01508 }
01509 if((attr_val1.mac_categories & attr_val2.mac_categories)
01510 != attr_val1.mac_categories
01511 )
01512 {
01513 if (rsbac_set_attr(MAC,
01514 T_PROCESS,
01515 i_tid,
01516 A_max_read_categories,
01517 attr_val1))
01518 {
01519 rsbac_ds_set_error("mac_auto_read", A_none);
01520 return(NOT_GRANTED);
01521 }
01522 }
01523 }
01524
01525
01526 return(GRANTED);
01527 }
01528
01529 static enum rsbac_adf_req_ret_t
01530 auto_read( rsbac_pid_t pid,
01531 enum rsbac_target_t target,
01532 union rsbac_target_id_t tid,
01533 rsbac_boolean_t set_level)
01534 {
01535 return auto_read_attr(pid,
01536 target,
01537 tid,
01538 A_security_level,
01539 A_mac_categories,
01540 set_level);
01541 }
01542
01543
01544
01545
01546
01547 static enum rsbac_adf_req_ret_t
01548 auto_read_write_attr( rsbac_pid_t pid,
01549 enum rsbac_target_t target,
01550 union rsbac_target_id_t tid,
01551 enum rsbac_attribute_t t_level_attr,
01552 enum rsbac_attribute_t t_cat_attr,
01553 rsbac_boolean_t set_level)
01554 {
01555 rsbac_security_level_t curr_level;
01556 rsbac_mac_category_vector_t curr_categories;
01557 rsbac_security_level_t target_sec_level;
01558 rsbac_mac_category_vector_t target_categories;
01559 union rsbac_target_id_t i_tid;
01560 union rsbac_attribute_value_t attr_val1;
01561 union rsbac_attribute_value_t attr_val2;
01562 rsbac_mac_process_flags_t flags;
01563 rsbac_boolean_t mac_auto_used_level = FALSE;
01564 rsbac_boolean_t mac_auto_used_cat = FALSE;
01565 rsbac_boolean_t raise_object_level = FALSE;
01566 rsbac_boolean_t raise_object_cat = FALSE;
01567
01568
01569 i_tid.process = pid;
01570 if (rsbac_get_attr(MAC,
01571 T_PROCESS,
01572 i_tid,
01573 A_mac_process_flags,
01574 &attr_val1,
01575 FALSE))
01576 {
01577 rsbac_ds_get_error("mac_auto_read_write", A_none);
01578 return(NOT_GRANTED);
01579 }
01580 flags = attr_val1.mac_process_flags;
01581 if(flags & MAC_override)
01582 return GRANTED;
01583
01584
01585 if (rsbac_get_attr(MAC,
01586 T_PROCESS,
01587 i_tid,
01588 A_current_sec_level,
01589 &attr_val1,
01590 FALSE))
01591 {
01592 rsbac_ds_get_error("mac_auto_read_write", A_none);
01593 return(NOT_GRANTED);
01594 }
01595 curr_level = attr_val1.security_level;
01596
01597 if (rsbac_get_attr(MAC,
01598 T_PROCESS,
01599 i_tid,
01600 A_mac_curr_categories,
01601 &attr_val1,
01602 FALSE))
01603 {
01604 rsbac_ds_get_error("mac_auto_read_write", A_none);
01605 return(NOT_GRANTED);
01606 }
01607 curr_categories = attr_val1.mac_categories;
01608
01609 if (rsbac_get_attr(MAC,
01610 target,
01611 tid,
01612 t_level_attr,
01613 &attr_val1,
01614 TRUE))
01615 {
01616 rsbac_ds_get_error("mac_auto_read_write", A_none);
01617 return(NOT_GRANTED);
01618 }
01619 target_sec_level = attr_val1.security_level;
01620
01621 if (rsbac_get_attr(MAC,
01622 target,
01623 tid,
01624 t_cat_attr,
01625 &attr_val1,
01626 TRUE))
01627 {
01628 rsbac_ds_get_error("mac_auto_read_write", A_none);
01629 return(NOT_GRANTED);
01630 }
01631 target_categories = attr_val1.mac_categories;
01632
01633 if(target_sec_level > curr_level)
01634 {
01635 if (rsbac_get_attr(MAC,
01636 T_PROCESS,
01637 i_tid,
01638 A_security_level,
01639 &attr_val1,
01640 FALSE))
01641 {
01642 rsbac_ds_get_error("mac_auto_read_write", A_none);
01643 return(NOT_GRANTED);
01644 }
01645 if(attr_val1.security_level < target_sec_level)
01646 {
01647 #ifdef CONFIG_RSBAC_DEBUG
01648 if(rsbac_debug_adf_mac)
01649 {
01650 rsbac_printk(KERN_DEBUG
01651 "mac_auto_read_write(): pid %u/%.15s: security_level %u under target_sec_level %u, no override -> NOT_GRANTED!\n",
01652 current->pid, current->comm,
01653 attr_val1.security_level, target_sec_level);
01654 }
01655 #endif
01656 return(NOT_GRANTED);
01657 }
01658
01659
01660 if(flags & MAC_auto)
01661 {
01662
01663 if (rsbac_get_attr(MAC,
01664 T_PROCESS,
01665 i_tid,
01666 A_min_write_open,
01667 &attr_val1,
01668 FALSE))
01669 {
01670 rsbac_ds_get_error("mac_auto_read_write", A_none);
01671 return(NOT_GRANTED);
01672 }
01673 if(attr_val1.security_level < target_sec_level)
01674 {
01675 if( !((flags & MAC_write_up) && (flags & MAC_read_up))
01676 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01677 && !(flags & MAC_trusted)
01678 #endif
01679 )
01680 {
01681
01682 switch(target)
01683 {
01684 case T_FILE:
01685 case T_DIR:
01686 case T_FIFO:
01687 case T_SYMLINK:
01688 if (rsbac_get_attr(MAC,
01689 target,
01690 tid,
01691 A_mac_file_flags,
01692 &attr_val1,
01693 TRUE))
01694 {
01695 rsbac_ds_get_error("mac_auto_read_write", A_none);
01696 return(NOT_GRANTED);
01697 }
01698 if( ( (attr_val1.mac_file_flags & MAC_write_up)
01699 && (attr_val1.mac_file_flags & MAC_read_up)
01700 )
01701 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01702 || (flags & MAC_trusted)
01703 #endif
01704 )
01705 {
01706 break;
01707 }
01708
01709
01710 default:
01711 #ifdef CONFIG_RSBAC_DEBUG
01712 if(rsbac_debug_adf_mac)
01713 {
01714 rsbac_printk(KERN_DEBUG
01715 "mac_auto_read_write(): pid %u/%.15s: min_write_open %u under target_sec_level %u, no read_up or trusted -> NOT_GRANTED!\n",
01716 current->pid, current->comm,
01717 attr_val1.security_level, target_sec_level);
01718 }
01719 #endif
01720 return(NOT_GRANTED);
01721 }
01722 }
01723 }
01724 else
01725 mac_auto_used_level = TRUE;
01726 }
01727 else
01728 {
01729 if( !((flags & MAC_write_up) && (flags & MAC_read_up))
01730 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01731 && !(flags & MAC_trusted)
01732 #endif
01733 )
01734 {
01735
01736 switch(target)
01737 {
01738 case T_FILE:
01739 case T_DIR:
01740 case T_FIFO:
01741 case T_SYMLINK:
01742 if (rsbac_get_attr(MAC,
01743 target,
01744 tid,
01745 A_mac_file_flags,
01746 &attr_val1,
01747 TRUE))
01748 {
01749 rsbac_ds_get_error("mac_auto_read_write", A_none);
01750 return(NOT_GRANTED);
01751 }
01752 if( ( (attr_val1.mac_file_flags & MAC_write_up)
01753 && (attr_val1.mac_file_flags & MAC_read_up)
01754 )
01755 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01756 || (flags & MAC_trusted)
01757 #endif
01758 )
01759 {
01760 break;
01761 }
01762
01763
01764 default:
01765 #ifdef CONFIG_RSBAC_DEBUG
01766 if(rsbac_debug_adf_mac)
01767 {
01768 rsbac_printk(KERN_DEBUG
01769 "mac_auto_read_write(): pid %u/%.15s: current level %u under target_sec_level %u, no auto, (write_up && read_up) or trusted -> NOT_GRANTED!\n",
01770 current->pid, current->comm,
01771 curr_level, target_sec_level);
01772 }
01773 #endif
01774 return(NOT_GRANTED);
01775 }
01776 }
01777 }
01778 }
01779 else
01780 if(target_sec_level < curr_level)
01781 {
01782 if (rsbac_get_attr(MAC,
01783 T_PROCESS,
01784 i_tid,
01785 A_min_security_level,
01786 &attr_val1,
01787 FALSE))
01788 {
01789 rsbac_ds_get_error("mac_auto_read_write", A_none);
01790 return(NOT_GRANTED);
01791 }
01792 if(attr_val1.security_level > target_sec_level)
01793 {
01794 #ifdef CONFIG_RSBAC_DEBUG
01795 if(rsbac_debug_adf_mac)
01796 {
01797 rsbac_printk(KERN_DEBUG
01798 "mac_auto_read_write(): pid %u/%.15s: min_security_level %u over target_sec_level %u, no override -> NOT_GRANTED!\n",
01799 current->pid, current->comm,
01800 attr_val1.security_level, target_sec_level);
01801 }
01802 #endif
01803 return(NOT_GRANTED);
01804 }
01805
01806 if(flags & MAC_auto)
01807 {
01808
01809 if (rsbac_get_attr(MAC,
01810 T_PROCESS,
01811 i_tid,
01812 A_max_read_open,
01813 &attr_val1,
01814 FALSE))
01815 {
01816 rsbac_ds_get_error("mac_auto_read_write", A_none);
01817 return(NOT_GRANTED);
01818 }
01819 if(attr_val1.security_level > target_sec_level)
01820 {
01821 if( !(flags & MAC_write_down)
01822 && !(flags & MAC_trusted)
01823 )
01824 {
01825
01826 switch(target)
01827 {
01828 case T_FILE:
01829 case T_DIR:
01830 case T_FIFO:
01831 case T_SYMLINK:
01832 if (rsbac_get_attr(MAC,
01833 target,
01834 tid,
01835 A_mac_file_flags,
01836 &attr_val1,
01837 TRUE))
01838 {
01839 rsbac_ds_get_error("mac_auto_read_write", A_none);
01840 return(NOT_GRANTED);
01841 }
01842 if( (attr_val1.mac_file_flags & MAC_write_down)
01843 || (attr_val1.mac_file_flags & MAC_trusted)
01844 )
01845 {
01846 if(attr_val1.mac_file_flags & MAC_auto)
01847 {
01848 raise_object_level = TRUE;
01849 }
01850 break;
01851 }
01852
01853
01854 default:
01855 #ifdef CONFIG_RSBAC_DEBUG
01856 if(rsbac_debug_adf_mac)
01857 {
01858 rsbac_printk(KERN_DEBUG
01859 "mac_auto_read_write(): pid %u/%.15s: max_read_open %u over target_sec_level %u, no write_down or trusted -> NOT_GRANTED!\n",
01860 current->pid, current->comm,
01861 attr_val1.security_level, target_sec_level);
01862 }
01863 #endif
01864 return(NOT_GRANTED);
01865 }
01866 }
01867 }
01868 else
01869 mac_auto_used_level = TRUE;
01870 }
01871 else
01872 {
01873 if( !(flags & MAC_write_down)
01874 && !(flags & MAC_trusted)
01875 )
01876 {
01877
01878 switch(target)
01879 {
01880 case T_FILE:
01881 case T_DIR:
01882 case T_FIFO:
01883 case T_SYMLINK:
01884 if (rsbac_get_attr(MAC,
01885 target,
01886 tid,
01887 A_mac_file_flags,
01888 &attr_val1,
01889 TRUE))
01890 {
01891 rsbac_ds_get_error("mac_auto_read_write", A_none);
01892 return(NOT_GRANTED);
01893 }
01894 if( (attr_val1.mac_file_flags & MAC_write_down)
01895 || (attr_val1.mac_file_flags & MAC_trusted)
01896 )
01897 {
01898 if(attr_val1.mac_file_flags & MAC_auto)
01899 {
01900 raise_object_level = TRUE;
01901 }
01902 break;
01903 }
01904
01905
01906 default:
01907 #ifdef CONFIG_RSBAC_DEBUG
01908 if(rsbac_debug_adf_mac)
01909 {
01910 rsbac_printk(KERN_DEBUG
01911 "mac_auto_read_write(): pid %u/%.15s: current security_level %u over target_sec_level %u, no auto, write_down or trusted -> NOT_GRANTED!\n",
01912 current->pid, current->comm,
01913 curr_level, target_sec_level);
01914 }
01915 #endif
01916 return(NOT_GRANTED);
01917 }
01918 }
01919 }
01920 }
01921 if((target_categories & curr_categories) != target_categories)
01922 {
01923 if (rsbac_get_attr(MAC,
01924 T_PROCESS,
01925 i_tid,
01926 A_mac_categories,
01927 &attr_val1,
01928 FALSE))
01929 {
01930 rsbac_ds_get_error("mac_auto_read_write", A_none);
01931 return(NOT_GRANTED);
01932 }
01933 if((target_categories & attr_val1.mac_categories) != target_categories)
01934 {
01935 #ifdef CONFIG_RSBAC_DEBUG
01936 if(rsbac_debug_adf_mac)
01937 {
01938 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01939
01940 if(tmp)
01941 {
01942 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01943
01944 if(tmp2)
01945 {
01946 u64tostrmac(tmp, attr_val1.mac_categories);
01947 u64tostrmac(tmp2, target_categories);
01948 rsbac_printk(KERN_DEBUG
01949 "mac_auto_read_write(): pid %u/%.15s: max_categories %s under target categories %s, no override -> NOT_GRANTED!\n",
01950 current->pid, current->comm,
01951 tmp,
01952 tmp2);
01953 rsbac_kfree(tmp2);
01954 }
01955 rsbac_kfree(tmp);
01956 }
01957 }
01958 #endif
01959 return(NOT_GRANTED);
01960 }
01961
01962
01963 if(flags & MAC_auto)
01964 {
01965
01966 if (rsbac_get_attr(MAC,
01967 T_PROCESS,
01968 i_tid,
01969 A_min_write_categories,
01970 &attr_val1,
01971 FALSE))
01972 {
01973 rsbac_ds_get_error("mac_auto_read_write", A_none);
01974 return(NOT_GRANTED);
01975 }
01976 if((target_categories & attr_val1.mac_categories) != target_categories)
01977 {
01978 if( !((flags & MAC_write_up) && (flags & MAC_read_up))
01979 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
01980 && !(flags & MAC_trusted)
01981 #endif
01982 )
01983 {
01984
01985 switch(target)
01986 {
01987 case T_FILE:
01988 case T_DIR:
01989 case T_FIFO:
01990 case T_SYMLINK:
01991 if (rsbac_get_attr(MAC,
01992 target,
01993 tid,
01994 A_mac_file_flags,
01995 &attr_val1,
01996 TRUE))
01997 {
01998 rsbac_ds_get_error("mac_auto_read_write", A_none);
01999 return(NOT_GRANTED);
02000 }
02001 if( ( (attr_val1.mac_file_flags & MAC_write_up)
02002 && (attr_val1.mac_file_flags & MAC_read_up)
02003 )
02004 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
02005 || (flags & MAC_trusted)
02006 #endif
02007 )
02008 {
02009 break;
02010 }
02011
02012
02013 default:
02014 #ifdef CONFIG_RSBAC_DEBUG
02015 if(rsbac_debug_adf_mac)
02016 {
02017 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02018
02019 if(tmp)
02020 {
02021 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02022
02023 if(tmp2)
02024 {
02025 u64tostrmac(tmp, attr_val1.mac_categories);
02026 u64tostrmac(tmp2, target_categories);
02027 rsbac_printk(KERN_DEBUG
02028 "mac_auto_read_write(): pid %u/%.15s: min_write_categories %s under target categories %s, no (read_up and write_up) or trusted with read option -> NOT_GRANTED!\n",
02029 current->pid, current->comm,
02030 tmp,
02031 tmp2);
02032 rsbac_kfree(tmp2);
02033 }
02034 rsbac_kfree(tmp);
02035 }
02036 }
02037 #endif
02038 return(NOT_GRANTED);
02039 }
02040 }
02041 }
02042 else
02043 mac_auto_used_cat = TRUE;
02044 }
02045 else
02046 {
02047 if( !((flags & MAC_write_up) && (flags & MAC_read_up))
02048 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
02049 && !(flags & MAC_trusted)
02050 #endif
02051 )
02052 {
02053
02054 switch(target)
02055 {
02056 case T_FILE:
02057 case T_DIR:
02058 case T_FIFO:
02059 case T_SYMLINK:
02060 if (rsbac_get_attr(MAC,
02061 target,
02062 tid,
02063 A_mac_file_flags,
02064 &attr_val1,
02065 TRUE))
02066 {
02067 rsbac_ds_get_error("mac_auto_read_write", A_none);
02068 return(NOT_GRANTED);
02069 }
02070 if( ( (attr_val1.mac_file_flags & MAC_write_up)
02071 && (attr_val1.mac_file_flags & MAC_read_up)
02072 )
02073 #ifdef CONFIG_RSBAC_MAC_TRUSTED_READ
02074 || (flags & MAC_trusted)
02075 #endif
02076 )
02077 {
02078 break;
02079 }
02080
02081
02082 default:
02083 #ifdef CONFIG_RSBAC_DEBUG
02084 if(rsbac_debug_adf_mac)
02085 {
02086 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02087
02088 if(tmp)
02089 {
02090 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02091
02092 if(tmp2)
02093 {
02094 u64tostrmac(tmp, curr_categories);
02095 u64tostrmac(tmp2, target_categories);
02096 rsbac_printk(KERN_DEBUG
02097 "mac_auto_read_write(): pid %u/%.15s: curr_categories %s under target categories %s, no auto, (read_up and write_up) or trusted -> NOT_GRANTED!\n",
02098 current->pid, current->comm,
02099 tmp,
02100 tmp2);
02101 rsbac_kfree(tmp2);
02102 }
02103 rsbac_kfree(tmp);
02104 }
02105 }
02106 #endif
02107 return(NOT_GRANTED);
02108 }
02109 }
02110 }
02111 }
02112 else
02113 if((target_categories & curr_categories) != curr_categories)
02114 {
02115 if (rsbac_get_attr(MAC,
02116 T_PROCESS,
02117 i_tid,
02118 A_mac_min_categories,
02119 &attr_val1,
02120 FALSE))
02121 {
02122 rsbac_ds_get_error("mac_auto_read_write", A_none);
02123 return(NOT_GRANTED);
02124 }
02125 if((target_categories & attr_val1.mac_categories) != attr_val1.mac_categories)
02126 {
02127 #ifdef CONFIG_RSBAC_DEBUG
02128 if(rsbac_debug_adf_mac)
02129 {
02130 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02131
02132 if(tmp)
02133 {
02134 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02135
02136 if(tmp2)
02137 {
02138 u64tostrmac(tmp, attr_val1.mac_categories);
02139 u64tostrmac(tmp2, target_categories);
02140 rsbac_printk(KERN_DEBUG
02141 "mac_auto_read_write(): pid %u/%.15s: min_categories %s over target categories %s, no override -> NOT_GRANTED!\n",
02142 current->pid, current->comm,
02143 tmp,
02144 tmp2);
02145 rsbac_kfree(tmp2);
02146 }
02147 rsbac_kfree(tmp);
02148 }
02149 }
02150 #endif
02151 return(NOT_GRANTED);
02152 }
02153
02154 if(flags & MAC_auto)
02155 {
02156
02157 if (rsbac_get_attr(MAC,
02158 T_PROCESS,
02159 i_tid,
02160 A_max_read_categories,
02161 &attr_val1,
02162 FALSE))
02163 {
02164 rsbac_ds_get_error("mac_auto_read_write", A_none);
02165 return(NOT_GRANTED);
02166 }
02167 if((target_categories & attr_val1.mac_categories) != attr_val1.mac_categories)
02168 {
02169 if( !(flags & MAC_write_down)
02170 && !(flags & MAC_trusted)
02171 )
02172 {
02173
02174 switch(target)
02175 {
02176 case T_FILE:
02177 case T_DIR:
02178 case T_FIFO:
02179 case T_SYMLINK:
02180 if (rsbac_get_attr(MAC,
02181 target,
02182 tid,
02183 A_mac_file_flags,
02184 &attr_val1,
02185 TRUE))
02186 {
02187 rsbac_ds_get_error("mac_auto_read_write", A_none);
02188 return(NOT_GRANTED);
02189 }
02190 if( (attr_val1.mac_file_flags & MAC_write_down)
02191 || (attr_val1.mac_file_flags & MAC_trusted)
02192 )
02193 {
02194 if(attr_val1.mac_file_flags & MAC_auto)
02195 {
02196 raise_object_cat = TRUE;
02197 }
02198 break;
02199 }
02200
02201
02202 default:
02203 #ifdef CONFIG_RSBAC_DEBUG
02204 if(rsbac_debug_adf_mac)
02205 {
02206 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02207
02208 if(tmp)
02209 {
02210 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02211
02212 if(tmp2)
02213 {
02214 u64tostrmac(tmp, attr_val1.mac_categories);
02215 u64tostrmac(tmp2, target_categories);
02216 rsbac_printk(KERN_DEBUG
02217 "mac_auto_read_write(): pid %u/%.15s: max_read_categories %s over target categories %s, no write_down or trusted -> NOT_GRANTED!\n",
02218 current->pid, current->comm,
02219 tmp,
02220 tmp2);
02221 rsbac_kfree(tmp2);
02222 }
02223 rsbac_kfree(tmp);
02224 }
02225 }
02226 #endif
02227 return(NOT_GRANTED);
02228 }
02229 }
02230 }
02231 else
02232 mac_auto_used_cat = TRUE;
02233 }
02234 else
02235 {
02236 if( !(flags & MAC_write_down)
02237 && !(flags & MAC_trusted)
02238 )
02239 {
02240
02241 switch(target)
02242 {
02243 case T_FILE:
02244 case T_DIR:
02245 case T_FIFO:
02246 case T_SYMLINK:
02247 if (rsbac_get_attr(MAC,
02248 target,
02249 tid,
02250 A_mac_file_flags,
02251 &attr_val1,
02252 TRUE))
02253 {
02254 rsbac_ds_get_error("mac_auto_read_write", A_none);
02255 return(NOT_GRANTED);
02256 }
02257 if( (attr_val1.mac_file_flags & MAC_write_down)
02258 || (attr_val1.mac_file_flags & MAC_trusted)
02259 )
02260 {
02261 if(attr_val1.mac_file_flags & MAC_auto)
02262 {
02263 raise_object_cat = TRUE;
02264 }
02265 break;
02266 }
02267
02268
02269 default:
02270 #ifdef CONFIG_RSBAC_DEBUG
02271 if(rsbac_debug_adf_mac)
02272 {
02273 char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02274
02275 if(tmp)
02276 {
02277 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02278
02279 if(tmp2)
02280 {
02281 u64tostrmac(tmp, curr_categories);
02282 u64tostrmac(tmp2, target_categories);
02283 rsbac_printk(KERN_DEBUG
02284 "mac_auto_read_write(): pid %u/%.15s: curr_categories %s over target categories %s, no auto, write_down or trusted -> NOT_GRANTED!\n",
02285 current->pid, current->comm,
02286 tmp,
02287 tmp2);
02288 rsbac_kfree(tmp2);
02289 }
02290 rsbac_kfree(tmp);
02291 }
02292 }
02293 #endif
02294 return(NOT_GRANTED);
02295 }
02296 }
02297 }
02298 }
02299
02300
02301
02302
02303
02304 if( set_level
02305 && ( mac_auto_used_level
02306 || raise_object_level
02307 )
02308 )
02309 {
02310 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
02311 {
02312 char * target_type_name;
02313 char * target_id_name;
02314
02315 target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02316 if(target_type_name)
02317 {
02318 #ifdef CONFIG_RSBAC_LOG_FULL_PATH
02319 target_id_name
02320 = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
02321
02322 #else
02323 target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
02324
02325 #endif
02326 if(target_id_name)
02327 {
02328 get_target_name(target_type_name, target, target_id_name, tid);
02329
02330 if(mac_auto_used_level)
02331 {
02332 rsbac_printk(KERN_INFO
02333 "mac_auto_read_write(): Changing process %u (%.15s, owner %u) current level from %u to %u for %s %s\n",
02334 pid,
02335 current->comm,
02336 current->uid,
02337 curr_level,
02338 target_sec_level,
02339 target_type_name,
02340 target_id_name);
02341 }
02342 else
02343 {
02344 rsbac_printk(KERN_INFO
02345 "mac_auto_read_write(): Process %u (%.15s, owner %u): Raising object level from %u to %u for %s %s\n",
02346 pid,
02347 current->comm,
02348 current->uid,
02349 target_sec_level,
02350 curr_level,
02351 target_type_name,
02352 target_id_name);
02353 }
02354 rsbac_kfree(target_id_name);
02355 }
02356 rsbac_kfree(target_type_name);
02357 }
02358 }
02359 #endif
02360 if(mac_auto_used_level)
02361 {
02362 i_tid.process = pid;
02363 attr_val1.current_sec_level = target_sec_level;
02364 if (rsbac_get_attr(MAC,
02365 T_PROCESS,
02366 i_tid,
02367 A_min_write_open,
02368 &attr_val2,
02369 TRUE))
02370 {
02371 rsbac_ds_get_error("mac_auto_read_write", A_none);
02372 return(NOT_GRANTED);
02373 }
02374 if(attr_val1.min_write_open < attr_val2.min_write_open)
02375 {
02376 if (rsbac_set_attr(MAC,
02377 T_PROCESS,
02378 i_tid,
02379 A_min_write_open,
02380 attr_val1))
02381 {
02382 rsbac_ds_set_error("mac_auto_read_write", A_none);
02383 return(NOT_GRANTED);
02384 }
02385 }
02386 if (rsbac_get_attr(MAC,
02387 T_PROCESS,
02388 i_tid,
02389 A_max_read_open,
02390 &attr_val2,
02391 TRUE))
02392 {
02393 rsbac_ds_get_error("mac_auto_read_write", A_none);
02394 return(NOT_GRANTED);
02395 }
02396 if(attr_val1.max_read_open > attr_val2.max_read_open)
02397 {
02398 if (rsbac_set_attr(MAC,
02399 T_PROCESS,
02400 i_tid,
02401 A_max_read_open,
02402 attr_val1))
02403 {
02404 rsbac_ds_set_error("mac_auto_read_write", A_none);
02405 return(NOT_GRANTED);
02406 }
02407 }
02408 if (rsbac_set_attr(MAC,
02409 T_PROCESS,
02410 i_tid,
02411 A_current_sec_level,
02412 attr_val1))
02413 {
02414 rsbac_ds_set_error("mac_auto_read_write", A_none);
02415 return(NOT_GRANTED);
02416 }
02417 }
02418 else
02419 {
02420 attr_val1.security_level = curr_level;
02421 if (rsbac_set_attr(MAC,
02422 target,
02423 tid,
02424 A_security_level,
02425 attr_val1))
02426 {
02427 rsbac_ds_set_error("mac_auto_read_write", A_none);
02428 return(NOT_GRANTED);
02429 }
02430 }
02431 }
02432
02433
02434 if( set_level
02435 && ( mac_auto_used_cat
02436 || raise_object_cat
02437 )
02438 )
02439 {
02440 #ifdef CONFIG_RSBAC_MAC_LOG_LEVEL_CHANGE
02441 {
02442 char * target_type_name = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02443 if(target_type_name)
02444 {
02445 char * target_id_name;
02446
02447 #ifdef CONFIG_RSBAC_LOG_FULL_PATH
02448 target_id_name
02449 = rsbac_kmalloc(CONFIG_RSBAC_MAX_PATH_LEN + RSBAC_MAXNAMELEN);
02450
02451 #else
02452 target_id_name = rsbac_kmalloc(2 * RSBAC_MAXNAMELEN);
02453
02454 #endif
02455 if(target_id_name)
02456 {
02457 char * tmp1 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02458 if(tmp1)
02459 {
02460 char * tmp2 = rsbac_kmalloc(RSBAC_MAXNAMELEN);
02461 if(tmp2)
02462 {
02463 get_target_name(target_type_name, target, target_id_name, tid);
02464
02465 if(mac_auto_used_cat)
02466 {
02467 rsbac_printk(KERN_INFO
02468 "mac_auto_read_write(): Changing process %u (%.15s, owner %u) current categories from %s to %s for %s %s\n",
02469 pid,
02470 current->comm,
02471 current->uid,
02472 u64tostrmac(tmp1, curr_categories),
02473 u64tostrmac(tmp2, target_categories),
02474 target_type_name,
02475 target_id_name);
02476 }
02477 else
02478 {
02479 rsbac_printk(KERN_INFO
02480 "mac_auto_read_write(): Process %u (%.15s, owner %u): raising current categories from %s to %s for %s %s\n",
02481 pid,
02482 current->comm,
02483 current->uid,
02484 u64tostrmac(tmp2, target_categories),
02485 u64tostrmac(tmp1, curr_categories),
02486 target_type_name,
02487 target_id_name);
02488 }
02489 rsbac_kfree(tmp2);
02490 }
02491 rsbac_kfree(tmp1);
02492 }
02493 rsbac_kfree(target_id_name);
02494 }
02495 rsbac_kfree(target_type_name);
02496 }
02497 }
02498 #endif
02499 if(mac_auto_used_cat)
02500 {
02501 i_tid.process = pid;
02502 attr_val1.mac_categories = target_categories;
02503 if (rsbac_get_attr(MAC,
02504 T_PROCESS,
02505 i_tid,
02506 A_min_write_categories,
02507 &attr_val2,
02508 TRUE))
02509 {
02510 rsbac_ds_set_error("mac_auto_read_write", A_none);
02511 return(NOT_GRANTED);
02512 }
02513 if((attr_val1.mac_categories & attr_val2.mac_categories)
02514 != attr_val2.mac_categories
02515 )
02516 {
02517 if (rsbac_set_attr(MAC,
02518 T_PROCESS,
02519 i_tid,
02520 A_min_write_categories,
02521 attr_val1))
02522 {
02523 rsbac_ds_set_error("mac_auto_read_write", A_none);
02524 return(NOT_GRANTED);
02525 }
02526 }
02527 if (rsbac_get_attr(MAC,
02528 T_PROCESS,
02529 i_tid,
02530 A_max_read_categories,
02531 &attr_val2,
02532 TRUE))
02533 {
02534 rsbac_ds_get_error("mac_auto_read_write", A_none);
02535 return(NOT_GRANTED);
02536 }
02537 if((attr_val1.mac_categories & attr_val2.mac_categories)
02538 != attr_val1.mac_categories
02539 )
02540 {
02541 if (rsbac_set_attr(MAC,
02542 T_PROCESS,
02543 i_tid,
02544 A_max_read_categories,
02545 attr_val1))
02546 {
02547 rsbac_ds_set_error("mac_auto_read_write", A_none);
02548 return(NOT_GRANTED);
02549 }
02550 }
02551 if (rsbac_set_attr(MAC,
02552 T_PROCESS,
02553 i_tid,
02554 A_mac_curr_categories,
02555 attr_val1))
02556 {
02557 rsbac_ds_set_error("mac_auto_read_write", A_none);
02558 return(NOT_GRANTED);
02559 }
02560 }
02561 else
02562 {
02563 attr_val1.mac_categories = curr_categories;
02564 if (rsbac_set_attr(MAC,
02565 target,
02566 tid,
02567 A_mac_categories,
02568 attr_val1))
02569 {
02570 rsbac_ds_set_error("mac_auto_read_write", A_none);
02571 return(NOT_GRANTED);
02572 }
02573 }
02574 }
02575
02576
02577 return(GRANTED);
02578 }
02579
02580 static enum rsbac_adf_req_ret_t
02581 auto_read_write( rsbac_pid_t pid,
02582 enum rsbac_target_t target,
02583 union rsbac_target_id_t tid,
02584 rsbac_boolean_t set_level)
02585 {
02586 return auto_read_write_attr(pid,
02587 target,
02588 tid,
02589 A_security_level,
02590 A_mac_categories,
02591 set_level);
02592 }
02593
02594
02595
02596
02597
02598 enum rsbac_adf_req_ret_t
02599 rsbac_adf_request_mac (enum rsbac_adf_request_t request,
02600 rsbac_pid_t caller_pid,
02601 enum rsbac_target_t target,
02602 union rsbac_target_id_t tid,
02603 enum rsbac_attribute_t attr,
02604 union rsbac_attribute_value_t attr_val,
02605 rsbac_uid_t owner)
02606 {
02607 enum rsbac_adf_req_ret_t result = DO_NOT_CARE;
02608 union rsbac_target_id_t i_tid;
02609 union rsbac_attribute_value_t i_attr_val1;
02610 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
02611 union rsbac_attribute_value_t i_attr_val2;
02612 #endif
02613
02614 switch (request)
02615 {
02616 case R_ADD_TO_KERNEL:
02617 switch(target)
02618 {
02619 case T_FILE:
02620 case T_DEV:
02621 case T_NONE:
02622
02623 return mac_check_role(owner, SR_administrator);
02624
02625
02626 default: return(DO_NOT_CARE);
02627 }
02628
02629 case R_ALTER:
02630
02631 if (target == T_IPC)
02632 {
02633
02634 return(auto_write(caller_pid,
02635 target,
02636 tid,
02637 FALSE));
02638 }
02639 else
02640
02641 return (DO_NOT_CARE);
02642 break;
02643
02644 case R_APPEND_OPEN:
02645 switch(target)
02646 {
02647 case T_FILE:
02648 case T_FIFO:
02649
02650 return(auto_write(caller_pid,
02651 target,
02652 tid,
02653 FALSE));
02654 break;
02655 case T_IPC:
02656
02657 return(auto_write(caller_pid,
02658 target,
02659 tid,
02660 FALSE));
02661 break;
02662 case T_DEV:
02663
02664 if (rsbac_get_attr(MAC,
02665 T_DEV,
02666 tid,
02667 A_mac_check,
02668 &i_attr_val1,
02669 FALSE))
02670 {
02671 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
02672 return(NOT_GRANTED);
02673 }
02674 if(!i_attr_val1.mac_check)
02675 return(DO_NOT_CARE);
02676
02677 return(auto_write(caller_pid,
02678 target,
02679 tid,
02680 FALSE));
02681 break;
02682
02683 default: return(DO_NOT_CARE);
02684 }
02685
02686 case R_CHANGE_GROUP:
02687 switch(target)
02688 {
02689 case T_FILE:
02690 case T_DIR:
02691 case T_FIFO:
02692 case T_SYMLINK:
02693
02694 return(auto_write(caller_pid,
02695 target,
02696 tid,
02697 FALSE));
02698 case T_IPC:
02699
02700 return(auto_write(caller_pid,
02701 target,
02702 tid,
02703 FALSE));
02704
02705 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
02706 case T_USER:
02707
02708 return mac_check_role(owner, SR_security_officer);
02709 #endif
02710
02711
02712 default: return(DO_NOT_CARE);
02713 }
02714
02715 case R_CHANGE_OWNER:
02716 switch(target)
02717 {
02718 case T_FILE:
02719 case T_DIR:
02720 case T_FIFO:
02721 case T_SYMLINK:
02722
02723 return(auto_write(caller_pid,
02724 target,
02725 tid,
02726 FALSE));
02727
02728 case T_IPC:
02729 return(auto_write(caller_pid,
02730 target,
02731 tid,
02732 FALSE));
02733
02734
02735 default:
02736 return(DO_NOT_CARE);
02737 }
02738
02739 case R_CHDIR:
02740 switch(target)
02741 {
02742 case T_DIR:
02743
02744 return(auto_read(caller_pid,
02745 target,
02746 tid,
02747 FALSE));
02748 break;
02749
02750 default: return(DO_NOT_CARE);
02751 }
02752
02753 case R_CLONE:
02754 if (target == T_PROCESS)
02755 return(GRANTED);
02756 else
02757 return(DO_NOT_CARE);
02758
02759 case R_CREATE:
02760 switch(target)
02761 {
02762
02763 case T_DIR:
02764 #ifdef CONFIG_RSBAC_MAC_LIGHT
02765 return GRANTED;
02766 #else
02767
02768
02769 return(auto_write(caller_pid,
02770 target,
02771 tid,
02772 FALSE));
02773 #endif
02774 break;
02775
02776 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
02777 case T_NETTEMP:
02778 return mac_check_role(owner, SR_security_officer);
02779
02780 case T_NETOBJ:
02781
02782 return(auto_write_attr(caller_pid,
02783 target,
02784 tid,
02785 A_local_sec_level,
02786 A_local_mac_categories,
02787 FALSE));
02788 #endif
02789
02790 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
02791 case T_USER:
02792 case T_GROUP:
02793
02794 return mac_check_role(owner, SR_security_officer);
02795 #endif
02796
02797 default: return(DO_NOT_CARE);
02798 }
02799
02800 case R_DELETE:
02801 switch(target)
02802 {
02803 case T_FILE:
02804 case T_DIR:
02805 case T_FIFO:
02806 case T_SYMLINK:
02807
02808 return(auto_write(caller_pid,
02809 target,
02810 tid,
02811 FALSE));
02812 break;
02813 case T_IPC:
02814
02815 return(auto_write(caller_pid,
02816 target,
02817 tid,
02818 FALSE));
02819 break;
02820
02821 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
02822 case T_NETTEMP:
02823 return mac_check_role(owner, SR_security_officer);
02824 #endif
02825 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
02826 case T_USER:
02827 case T_GROUP:
02828
02829 return mac_check_role(owner, SR_security_officer);
02830 #endif
02831
02832
02833 default: return(DO_NOT_CARE);
02834 }
02835
02836 case R_EXECUTE:
02837 case R_MAP_EXEC:
02838 switch(target)
02839 {
02840 case T_FILE:
02841
02842 return(auto_read(caller_pid,
02843 target,
02844 tid,
02845 FALSE));
02846
02847
02848 default:
02849 return(DO_NOT_CARE);
02850 }
02851
02852 case R_GET_PERMISSIONS_DATA:
02853 switch(target)
02854 {
02855 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
02856 case T_USER:
02857 case T_GROUP:
02858
02859 return mac_check_role(owner, SR_security_officer);
02860 #endif
02861 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
02862 case T_NETOBJ:
02863
02864 return(auto_read_attr(caller_pid,
02865 target,
02866 tid,
02867 A_local_sec_level,
02868 A_local_mac_categories,
02869 FALSE));
02870 #endif
02871
02872 default:
02873 return(DO_NOT_CARE);
02874 }
02875
02876 case R_GET_STATUS_DATA:
02877 switch(target)
02878 {
02879 case T_SCD:
02880
02881 if (tid.scd != ST_rsbaclog)
02882 return(GRANTED);
02883
02884 if(mac_check_role(owner, SR_security_officer) == NOT_GRANTED)
02885 return mac_check_role(owner, SR_auditor);
02886 else
02887 return GRANTED;
02888
02889 case T_PROCESS:
02890
02891 return(auto_read_attr(caller_pid,
02892 target,
02893 tid,
02894 A_current_sec_level,
02895 A_mac_curr_categories,
02896 FALSE));
02897
02898 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
02899 case T_NETOBJ:
02900
02901 return(auto_read_attr(caller_pid,
02902 target,
02903 tid,
02904 A_local_sec_level,
02905 A_local_mac_categories,
02906 FALSE));
02907 #endif
02908
02909 default:
02910 return(DO_NOT_CARE);
02911 }
02912
02913 case R_LINK_HARD:
02914 switch(target)
02915 {
02916 case T_FILE:
02917 case T_FIFO:
02918 case T_SYMLINK:
02919
02920 return(auto_write(caller_pid,
02921 target,
02922 tid,
02923 FALSE));
02924 break;
02925
02926 default: return(DO_NOT_CARE);
02927 }
02928
02929 case R_MODIFY_ACCESS_DATA:
02930 switch(target)
02931 {
02932 case T_FILE:
02933 case T_DIR:
02934 case T_FIFO:
02935 case T_SYMLINK:
02936
02937 return(auto_write(caller_pid,
02938 target,
02939 tid,
02940 FALSE));
02941 break;
02942
02943 default: return(DO_NOT_CARE);
02944 }
02945
02946 case R_MODIFY_ATTRIBUTE:
02947 switch(attr)
02948 {
02949 case A_security_level:
02950 case A_initial_security_level:
02951 case A_local_sec_level:
02952 case A_remote_sec_level:
02953 case A_min_security_level:
02954 case A_mac_categories:
02955 case A_mac_initial_categories:
02956 case A_local_mac_categories:
02957 case A_remote_mac_categories:
02958 case A_mac_min_categories:
02959 case A_mac_user_flags:
02960 case A_mac_process_flags:
02961 case A_mac_file_flags:
02962 case A_system_role:
02963 case A_mac_role:
02964 case A_current_sec_level:
02965 case A_mac_curr_categories:
02966 case A_min_write_open:
02967 case A_max_read_open:
02968 case A_min_write_categories:
02969 case A_max_read_categories:
02970 case A_mac_check:
02971 case A_mac_auto:
02972 case A_mac_prop_trusted:
02973 case A_symlink_add_mac_level:
02974 #ifdef CONFIG_RSBAC_MAC_GEN_PROT
02975 case A_pseudo:
02976 case A_log_array_low:
02977 case A_log_array_high:
02978 case A_local_log_array_low:
02979 case A_local_log_array_high:
02980 case A_remote_log_array_low:
02981 case A_remote_log_array_high:
02982 case A_log_program_based:
02983 case A_log_user_based:
02984 case A_symlink_add_remote_ip:
02985 case A_symlink_add_uid:
02986 case A_linux_dac_disable:
02987 case A_fake_root_uid:
02988 case A_audit_uid:
02989 case A_auid_exempt:
02990 case A_remote_ip:
02991 case A_kernel_thread:
02992 #endif
02993 #ifdef CONFIG_RSBAC_MAC_AUTH_PROT
02994 case A_auth_may_setuid:
02995 case A_auth_may_set_cap:
02996 case A_auth_start_uid:
02997 case A_auth_start_euid:
02998 case A_auth_start_gid:
02999 case A_auth_start_egid:
03000 case A_auth_program_file:
03001 case A_auth_learn:
03002 case A_auth_add_f_cap:
03003 case A_auth_remove_f_cap:
03004 case A_auth_last_auth:
03005 #endif
03006
03007 case A_none:
03008
03009 return mac_check_role(owner, SR_security_officer);
03010
03011 default:
03012 return(DO_NOT_CARE);
03013 }
03014
03015 case R_MODIFY_PERMISSIONS_DATA:
03016 switch(target)
03017 {
03018 case T_FILE:
03019 case T_DIR:
03020 case T_FIFO:
03021 case T_SYMLINK:
03022 case T_IPC:
03023
03024 return(auto_write(caller_pid,
03025 target,
03026 tid,
03027 FALSE));
03028 break;
03029
03030 case T_SCD:
03031 #ifdef CONFIG_RSBAC_USER_MOD_IOPERM
03032 if(tid.scd == ST_ioports)
03033 return GRANTED;
03034 #endif
03035
03036 i_tid.user = owner;
03037 if (rsbac_get_attr(MAC,
03038 T_USER,
03039 i_tid,
03040 A_mac_role,
03041 &i_attr_val1,
03042 TRUE))
03043 {
03044 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03045 return(NOT_GRANTED);
03046 }
03047
03048 if (i_attr_val1.system_role == SR_security_officer)
03049 return(GRANTED);
03050
03051 if ( (i_attr_val1.system_role == SR_administrator)
03052 && (tid.scd == ST_ioports) )
03053 return(GRANTED);
03054 else
03055 return(NOT_GRANTED);
03056
03057 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
03058 case T_NETOBJ:
03059
03060 return(auto_write_attr(caller_pid,
03061 target,
03062 tid,
03063 A_local_sec_level,
03064 A_local_mac_categories,
03065 FALSE));
03066 #endif
03067
03068 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03069 case T_USER:
03070 case T_GROUP:
03071
03072 return mac_check_role(owner, SR_security_officer);
03073 #endif
03074 #ifdef CONFIG_RSBAC_ALLOW_DAC_DISABLE
03075
03076 case T_NONE:
03077
03078 i_tid.user = owner;
03079 if (rsbac_get_attr(MAC,
03080 T_USER,
03081 i_tid,
03082 A_mac_role,
03083 &i_attr_val1,
03084 TRUE))
03085 {
03086 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03087 return(NOT_GRANTED);
03088 }
03089
03090 if (i_attr_val1.system_role == SR_security_officer)
03091 return(GRANTED);
03092 else
03093 return(NOT_GRANTED);
03094 #endif
03095
03096
03097 default: return(DO_NOT_CARE);
03098 }
03099
03100 case R_MODIFY_SYSTEM_DATA:
03101 switch(target)
03102 {
03103 case T_SCD:
03104
03105 if (tid.scd == ST_rlimit)
03106 return(GRANTED);
03107
03108 i_tid.user = owner;
03109 if (rsbac_get_attr(MAC,
03110 T_USER,
03111 i_tid,
03112 A_mac_role,
03113 &i_attr_val1,
03114 TRUE))
03115 {
03116 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03117 return(NOT_GRANTED);
03118 }
03119
03120 if(tid.scd == ST_rsbaclog)
03121 {
03122 if ( (i_attr_val1.system_role == SR_security_officer)
03123 || (i_attr_val1.system_role == SR_auditor)
03124 )
03125 return(GRANTED);
03126 else
03127 return(NOT_GRANTED);
03128 }
03129
03130 if(tid.scd == ST_rsbac_remote_log)
03131 {
03132 if ( (i_attr_val1.system_role == SR_security_officer)
03133 )
03134 return(GRANTED);
03135 else
03136 return(NOT_GRANTED);
03137 }
03138
03139 if(tid.scd == ST_rsbac)
03140 {
03141 if ( (i_attr_val1.system_role == SR_security_officer)
03142 || (i_attr_val1.system_role == SR_administrator)
03143 )
03144 return(GRANTED);
03145 else
03146 return(NOT_GRANTED);
03147 }
03148
03149 if (i_attr_val1.system_role == SR_administrator)
03150 return(GRANTED);
03151 else
03152 return(NOT_GRANTED);
03153
03154 case T_DEV:
03155 if(tid.dev.type == D_block)
03156 return mac_check_role(owner, SR_administrator);
03157 else
03158 return DO_NOT_CARE;
03159
03160 case T_PROCESS:
03161
03162 return(auto_write_attr(caller_pid,
03163 target,
03164 tid,
03165 A_current_sec_level,
03166 A_mac_curr_categories,
03167 FALSE));
03168
03169 #ifdef CONFIG_RSBAC_MAC_NET_DEV_PROT
03170 case T_NETDEV:
03171 return mac_check_role(owner, SR_administrator);
03172 #endif
03173 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
03174 case T_NETOBJ:
03175
03176 return(auto_write_attr(caller_pid,
03177 target,
03178 tid,
03179 A_local_sec_level,
03180 A_local_mac_categories,
03181 FALSE));
03182 #endif
03183
03184
03185 default: return(DO_NOT_CARE);
03186 }
03187
03188 case R_MOUNT:
03189 switch(target)
03190 {
03191 case T_FILE:
03192 case T_DIR:
03193 case T_DEV:
03194
03195 #ifndef CONFIG_RSBAC_MAC_LIGHT
03196 if(mac_check_role(owner, SR_administrator) == NOT_GRANTED)
03197 return(NOT_GRANTED);
03198 #endif
03199
03200
03201 if( (target == T_DEV)
03202 && (attr == A_mode)
03203 && (attr_val.mode & MS_RDONLY))
03204 return(auto_read(caller_pid,
03205 target,
03206 tid,
03207 FALSE));
03208 else
03209 return(auto_read_write(caller_pid,
03210 target,
03211 tid,
03212 FALSE));
03213
03214
03215 default: return(DO_NOT_CARE);
03216 }
03217
03218 case R_READ:
03219 switch(target)
03220 {
03221 case T_DIR:
03222 #ifdef CONFIG_RSBAC_RW
03223 case T_IPC:
03224 case T_FILE:
03225 case T_FIFO:
03226 #endif
03227
03228 return(auto_read(caller_pid,
03229 target,
03230 tid,
03231 FALSE));
03232 break;
03233
03234 #ifdef CONFIG_RSBAC_RW
03235 case T_DEV:
03236
03237 if (rsbac_get_attr(MAC,
03238 T_DEV,
03239 tid,
03240 A_mac_check,
03241 &i_attr_val1,
03242 FALSE))
03243 {
03244 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03245 return(NOT_GRANTED);
03246 }
03247 if(!i_attr_val1.mac_check)
03248 return(DO_NOT_CARE);
03249
03250 return(auto_read(caller_pid,
03251 target,
03252 tid,
03253 FALSE));
03254 break;
03255 #endif
03256
03257 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03258 case T_NETTEMP:
03259 if(mac_check_role(owner, SR_security_officer) == GRANTED)
03260 return GRANTED;
03261 return mac_check_role(owner, SR_administrator);
03262
03263 case T_NETOBJ:
03264
03265 return(auto_read_attr(caller_pid,
03266 target,
03267 tid,
03268 A_remote_sec_level,
03269 A_remote_mac_categories,
03270 FALSE));
03271 #endif
03272
03273 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03274 case T_USER:
03275 case T_GROUP:
03276
03277 if(mac_check_role(owner, SR_security_officer) == GRANTED)
03278 return GRANTED;
03279 else
03280 return mac_check_role(owner, SR_administrator);
03281 #endif
03282
03283 default: return(DO_NOT_CARE);
03284 }
03285
03286
03287 case R_READ_ATTRIBUTE:
03288 switch(attr)
03289 {
03290 case A_owner:
03291 case A_security_level:
03292 case A_local_sec_level:
03293 case A_remote_sec_level:
03294 case A_min_security_level:
03295 case A_mac_categories:
03296 case A_local_mac_categories:
03297 case A_remote_mac_categories:
03298 case A_mac_min_categories:
03299 case A_pseudo:
03300 case A_system_role:
03301 case A_mac_role:
03302 case A_current_sec_level:
03303 case A_min_write_open:
03304 case A_max_read_open:
03305 case A_mac_user_flags:
03306 case A_mac_process_flags:
03307 case A_mac_check:
03308 case A_mac_auto:
03309 case A_mac_prop_trusted:
03310 case A_mac_file_flags:
03311 case A_initial_security_level:
03312 case A_mac_initial_categories:
03313 case A_symlink_add_mac_level:
03314 #ifdef CONFIG_RSBAC_MAC_GEN_PROT
03315 case A_log_array_low:
03316 case A_log_array_high:
03317 case A_log_program_based:
03318 case A_log_user_based:
03319 case A_symlink_add_remote_ip:
03320 case A_symlink_add_uid:
03321 case A_fake_root_uid:
03322 case A_audit_uid:
03323 case A_auid_exempt:
03324 case A_remote_ip:
03325 case A_kernel_thread:
03326 #endif
03327 #ifdef CONFIG_RSBAC_MAC_AUTH_PROT
03328 case A_auth_may_setuid:
03329 case A_auth_may_set_cap:
03330 case A_auth_start_uid:
03331 case A_auth_start_euid:
03332 case A_auth_start_gid:
03333 case A_auth_start_egid:
03334 case A_auth_program_file:
03335 case A_auth_learn:
03336 case A_auth_last_auth:
03337 #endif
03338
03339 if(mac_check_role(owner, SR_security_officer) == GRANTED)
03340 return GRANTED;
03341 else
03342 return mac_check_role(owner, SR_administrator);
03343
03344 default:
03345 return(DO_NOT_CARE);
03346 }
03347
03348 case R_READ_OPEN:
03349 switch(target)
03350 {
03351 case T_FILE:
03352 case T_DIR:
03353 case T_FIFO:
03354 case T_IPC:
03355
03356 return(auto_read(caller_pid,
03357 target,
03358 tid,
03359 FALSE));
03360 break;
03361 case T_DEV:
03362
03363 if (rsbac_get_attr(MAC,
03364 T_DEV,
03365 tid,
03366 A_mac_check,
03367 &i_attr_val1,
03368 FALSE))
03369 {
03370 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03371 return(NOT_GRANTED);
03372 }
03373 if(!i_attr_val1.mac_check)
03374 return(DO_NOT_CARE);
03375
03376 return(auto_read(caller_pid,
03377 target,
03378 tid,
03379 FALSE));
03380 break;
03381
03382 default: return(DO_NOT_CARE);
03383 }
03384
03385 case R_READ_WRITE_OPEN:
03386 switch(target)
03387 {
03388 case T_FILE:
03389 case T_FIFO:
03390 case T_IPC:
03391
03392 return(auto_read_write(caller_pid,
03393 target,
03394 tid,
03395 FALSE));
03396
03397 case T_DEV:
03398
03399 if (rsbac_get_attr(MAC,
03400 T_DEV,
03401 tid,
03402 A_mac_check,
03403 &i_attr_val1,
03404 FALSE))
03405 {
03406 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03407 return(NOT_GRANTED);
03408 }
03409 if(!i_attr_val1.mac_check)
03410 return(DO_NOT_CARE);
03411
03412 return(auto_read_write(caller_pid,
03413 target,
03414 tid,
03415 FALSE));
03416
03417
03418 default: return(DO_NOT_CARE);
03419 }
03420
03421 case R_REMOVE_FROM_KERNEL:
03422 switch(target)
03423 {
03424 case T_FILE:
03425 case T_DEV:
03426 case T_NONE:
03427
03428 return mac_check_role(owner, SR_administrator);
03429
03430
03431 default: return(DO_NOT_CARE);
03432 }
03433
03434 case R_SHUTDOWN:
03435 switch(target)
03436 {
03437 case T_NONE:
03438
03439 return mac_check_role(owner, SR_administrator);
03440
03441
03442 default: return(DO_NOT_CARE);
03443 }
03444
03445 case R_RENAME:
03446 switch(target)
03447 {
03448 case T_FILE:
03449 case T_DIR:
03450 case T_FIFO:
03451 case T_SYMLINK:
03452
03453 result = auto_write(caller_pid,
03454 target,
03455 tid,
03456 FALSE);
03457
03458
03459 if( ( (result == GRANTED)
03460 || (result == DO_NOT_CARE)
03461 )
03462 && ( (attr != A_new_dir_dentry_p)
03463 || (attr_val.new_dir_dentry_p != tid.file.dentry_p->d_parent)
03464 )
03465 )
03466 {
03467 if (rsbac_get_attr(MAC,
03468 target,
03469 tid,
03470 A_security_level,
03471 &i_attr_val1,
03472 TRUE))
03473 {
03474 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03475 return(NOT_GRANTED);
03476 }
03477 if(rsbac_set_attr(MAC,
03478 target,
03479 tid,
03480 A_security_level,
03481 i_attr_val1))
03482 {
03483 rsbac_ds_set_error("rsbac_adf_request_mac", A_none);
03484 return(NOT_GRANTED);
03485 }
03486 if (rsbac_get_attr(MAC,
03487 target,
03488 tid,
03489 A_mac_categories,
03490 &i_attr_val1,
03491 TRUE))
03492 {
03493 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03494 return(NOT_GRANTED);
03495 }
03496 if(rsbac_set_attr(MAC,
03497 target,
03498 tid,
03499 A_mac_categories,
03500 i_attr_val1))
03501 {
03502 rsbac_ds_set_error("rsbac_adf_request_mac", A_none);
03503 return(NOT_GRANTED);
03504 }
03505 }
03506 return result;
03507 break;
03508 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03509 case T_USER:
03510 case T_GROUP:
03511
03512 return mac_check_role(owner, SR_security_officer);
03513 #endif
03514
03515 default: return(DO_NOT_CARE);
03516 }
03517
03518
03519 case R_SEARCH:
03520 switch(target)
03521 {
03522 case T_DIR:
03523 case T_SYMLINK:
03524
03525 return(auto_read(caller_pid,
03526 target,
03527 tid,
03528 FALSE));
03529 break;
03530
03531 default: return(DO_NOT_CARE);
03532 }
03533
03534 case R_SEND_SIGNAL:
03535 switch(target)
03536 {
03537 case T_PROCESS:
03538
03539 return(auto_write_attr(caller_pid,
03540 target,
03541 tid,
03542 A_current_sec_level,
03543 A_mac_curr_categories,
03544 FALSE));
03545
03546
03547 default:
03548 return(DO_NOT_CARE);
03549 }
03550
03551
03552
03553 case R_SWITCH_LOG:
03554 switch(target)
03555 {
03556 case T_NONE:
03557
03558 return mac_check_role(owner, SR_security_officer);
03559
03560
03561 default: return(DO_NOT_CARE);
03562 }
03563
03564 case R_SWITCH_MODULE:
03565 switch(target)
03566 {
03567 case T_NONE:
03568
03569 if(attr != A_switch_target)
03570 return(UNDEFINED);
03571
03572 if( (attr_val.switch_target != MAC)
03573 #ifdef CONFIG_RSBAC_MAC_AUTH_PROT
03574 && (attr_val.switch_target != AUTH)
03575 #endif
03576 #ifdef CONFIG_RSBAC_SOFTMODE
03577 && (attr_val.switch_target != SOFTMODE)
03578 #endif
03579 #ifdef CONFIG_RSBAC_FREEZE
03580 && (attr_val.switch_target != FREEZE)
03581 #endif
03582 )
03583 return(DO_NOT_CARE);
03584
03585 return mac_check_role(owner, SR_security_officer);
03586
03587
03588 default: return(DO_NOT_CARE);
03589 }
03590
03591
03592 case R_TERMINATE:
03593 if (target == T_PROCESS)
03594 return(DO_NOT_CARE);
03595 else
03596 return(DO_NOT_CARE);
03597
03598 case R_TRACE:
03599 switch(target)
03600 {
03601 case T_PROCESS:
03602
03603 return(auto_read_write_attr(caller_pid,
03604 target,
03605 tid,
03606 A_current_sec_level,
03607 A_mac_curr_categories,
03608 FALSE));
03609
03610
03611 default:
03612 return(DO_NOT_CARE);
03613 }
03614
03615 case R_TRUNCATE:
03616 switch(target)
03617 {
03618 case T_FILE:
03619
03620 return(auto_write(caller_pid,
03621 target,
03622 tid,
03623 FALSE));
03624 break;
03625
03626 default: return(DO_NOT_CARE);
03627 }
03628
03629 case R_UMOUNT:
03630 switch(target)
03631 {
03632 case T_FILE:
03633 case T_DIR:
03634 case T_DEV:
03635 #ifdef CONFIG_RSBAC_MAC_LIGHT
03636 return(GRANTED);
03637 #else
03638 return mac_check_role(owner, SR_administrator);
03639 #endif
03640
03641 default: return(DO_NOT_CARE);
03642 }
03643
03644 case R_WRITE:
03645 switch(target)
03646 {
03647 case T_DIR:
03648 case T_IPC:
03649 #ifdef CONFIG_RSBAC_RW
03650 case T_FILE:
03651 case T_FIFO:
03652 #endif
03653
03654
03655 return(auto_write(caller_pid,
03656 target,
03657 tid,
03658 FALSE));
03659
03660
03661 #ifdef CONFIG_RSBAC_RW
03662 case T_DEV:
03663
03664 if (rsbac_get_attr(MAC,
03665 T_DEV,
03666 tid,
03667 A_mac_check,
03668 &i_attr_val1,
03669 FALSE))
03670 {
03671 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03672 return(NOT_GRANTED);
03673 }
03674 if(!i_attr_val1.mac_check)
03675 return(DO_NOT_CARE);
03676
03677 return(auto_write(caller_pid,
03678 target,
03679 tid,
03680 FALSE));
03681 break;
03682 #endif
03683
03684 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03685 case T_NETTEMP:
03686 return mac_check_role(owner, SR_security_officer);
03687
03688 case T_NETOBJ:
03689
03690 if (rsbac_get_attr(MAC,
03691 target,
03692 tid,
03693 A_remote_sec_level,
03694 &i_attr_val1,
03695 TRUE))
03696 {
03697 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03698 return(NOT_GRANTED);
03699 }
03700 if (rsbac_get_attr(MAC,
03701 target,
03702 tid,
03703 A_remote_mac_categories,
03704 &i_attr_val2,
03705 TRUE))
03706 {
03707 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03708 return(NOT_GRANTED);
03709 }
03710
03711 return(auto_write_attr(caller_pid,
03712 target,
03713 tid,
03714 A_remote_sec_level,
03715 A_remote_mac_categories,
03716 FALSE));
03717 #endif
03718
03719 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03720 case T_USER:
03721 case T_GROUP:
03722
03723 return mac_check_role(owner, SR_security_officer);
03724 #endif
03725
03726 default: return(DO_NOT_CARE);
03727 }
03728
03729 case R_WRITE_OPEN:
03730 switch(target)
03731 {
03732 case T_FILE:
03733 case T_FIFO:
03734 case T_IPC:
03735
03736 return(auto_write(caller_pid,
03737 target,
03738 tid,
03739 FALSE));
03740 break;
03741 case T_DEV:
03742
03743 if (rsbac_get_attr(MAC,
03744 T_DEV,
03745 tid,
03746 A_mac_check,
03747 &i_attr_val1,
03748 FALSE))
03749 {
03750 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03751 return(NOT_GRANTED);
03752 }
03753 if(!i_attr_val1.mac_check)
03754 return(DO_NOT_CARE);
03755
03756 return(auto_write(caller_pid,
03757 target,
03758 tid,
03759 FALSE));
03760
03761
03762 default: return(DO_NOT_CARE);
03763 }
03764
03765 case R_SEND:
03766 switch(target)
03767 {
03768 case T_DEV:
03769
03770 if (rsbac_get_attr(MAC,
03771 T_DEV,
03772 tid,
03773 A_mac_check,
03774 &i_attr_val1,
03775 FALSE))
03776 {
03777 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03778 return(NOT_GRANTED);
03779 }
03780 if(!i_attr_val1.mac_check)
03781 return(DO_NOT_CARE);
03782
03783 return(auto_write(caller_pid,
03784 target,
03785 tid,
03786 FALSE));
03787
03788 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03789 case T_NETOBJ:
03790
03791 return(auto_read_write_attr(caller_pid,
03792 target,
03793 tid,
03794 A_remote_sec_level,
03795 A_remote_mac_categories,
03796 FALSE));
03797
03798 #endif
03799
03800 default: return(DO_NOT_CARE);
03801 }
03802
03803 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03804 case R_BIND:
03805 case R_LISTEN:
03806 switch(target)
03807 {
03808 case T_NETOBJ:
03809
03810 return(auto_read_write_attr(caller_pid,
03811 target,
03812 tid,
03813 A_local_sec_level,
03814 A_local_mac_categories,
03815 FALSE));
03816
03817
03818 default: return(DO_NOT_CARE);
03819 }
03820
03821 case R_ACCEPT:
03822 case R_CONNECT:
03823 case R_RECEIVE:
03824 switch(target)
03825 {
03826 case T_NETOBJ:
03827
03828 return(auto_read_write_attr(caller_pid,
03829 target,
03830 tid,
03831 A_remote_sec_level,
03832 A_remote_mac_categories,
03833 FALSE));
03834
03835
03836 default: return(DO_NOT_CARE);
03837 }
03838 #endif
03839
03840
03841 default: return DO_NOT_CARE;
03842 }
03843
03844 return(result);
03845 }
03846
03847
03848
03849
03850
03851
03852
03853
03854
03855
03856
03857
03858
03859 int rsbac_adf_set_attr_mac(
03860 enum rsbac_adf_request_t request,
03861 rsbac_pid_t caller_pid,
03862 enum rsbac_target_t target,
03863 union rsbac_target_id_t tid,
03864 enum rsbac_target_t new_target,
03865 union rsbac_target_id_t new_tid,
03866 enum rsbac_attribute_t attr,
03867 union rsbac_attribute_value_t attr_val,
03868 rsbac_uid_t owner)
03869 {
03870 enum rsbac_adf_req_ret_t result = DO_NOT_CARE;
03871 union rsbac_target_id_t i_tid;
03872 union rsbac_attribute_value_t i_attr_val1;
03873 union rsbac_attribute_value_t i_attr_val2;
03874 union rsbac_attribute_value_t i_attr_val3;
03875 union rsbac_attribute_value_t i_attr_val4;
03876 union rsbac_attribute_value_t i_attr_val5;
03877 union rsbac_attribute_value_t i_attr_val6;
03878 union rsbac_attribute_value_t i_attr_val7;
03879 union rsbac_attribute_value_t i_attr_val8;
03880 union rsbac_attribute_value_t i_attr_val9;
03881 rsbac_boolean_t inherit;
03882
03883 switch (request)
03884 {
03885 case R_APPEND_OPEN:
03886 switch(target)
03887 {
03888 case T_FILE:
03889 case T_FIFO:
03890 case T_IPC:
03891
03892 if( (target == T_FILE)
03893 || (target == T_FIFO)
03894 )
03895 inherit = TRUE;
03896 else
03897 inherit = FALSE;
03898 if (rsbac_get_attr(MAC,
03899 target,
03900 tid,
03901 A_security_level,
03902 &i_attr_val1,
03903 inherit))
03904 {
03905 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03906 return(-RSBAC_EREADFAILED);
03907 }
03908 if (rsbac_get_attr(MAC,
03909 target,
03910 tid,
03911 A_mac_categories,
03912 &i_attr_val2,
03913 inherit))
03914 {
03915 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03916 return(-RSBAC_EREADFAILED);
03917 }
03918
03919 result = auto_write(caller_pid,
03920 target,
03921 tid,
03922 TRUE);
03923 if ((result == GRANTED) || (result == DO_NOT_CARE))
03924 return(0);
03925 else
03926 return(-RSBAC_EDECISIONMISMATCH);
03927 break;
03928 case T_DEV:
03929
03930 if (rsbac_get_attr(MAC,
03931 T_DEV,
03932 tid,
03933 A_mac_check,
03934 &i_attr_val1,
03935 FALSE))
03936 {
03937 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03938 return(-RSBAC_EREADFAILED);
03939 }
03940 if(!i_attr_val1.mac_check)
03941 return(0);
03942
03943 result = auto_write(caller_pid,
03944 target,
03945 tid,
03946 TRUE);
03947 if ((result == GRANTED) || (result == DO_NOT_CARE))
03948 return(0);
03949 else
03950 return(-RSBAC_EDECISIONMISMATCH);
03951 break;
03952
03953 default: return(0);
03954 }
03955
03956 case R_CHANGE_OWNER:
03957 switch(target)
03958 {
03959
03960
03961 case T_PROCESS:
03962
03963 if (attr != A_owner)
03964 return(-RSBAC_EINVALIDATTR);
03965
03966
03967 i_tid.user = attr_val.owner;
03968 if (rsbac_get_attr(MAC,
03969 T_USER,
03970 i_tid,
03971 A_security_level,
03972 &i_attr_val2,
03973 TRUE))
03974 {
03975 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03976 return(-RSBAC_EREADFAILED);
03977 }
03978 if (rsbac_get_attr(MAC,
03979 T_USER,
03980 i_tid,
03981 A_mac_categories,
03982 &i_attr_val3,
03983 TRUE))
03984 {
03985 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03986 return(-RSBAC_EREADFAILED);
03987 }
03988
03989 if (rsbac_set_attr(MAC,
03990 T_PROCESS,
03991 tid,
03992 A_security_level,
03993 i_attr_val2))
03994 {
03995 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
03996 return(-RSBAC_EWRITEFAILED);
03997 }
03998 if (rsbac_set_attr(MAC,
03999 T_PROCESS,
04000 tid,
04001 A_mac_categories,
04002 i_attr_val3))
04003 {
04004 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04005 return(-RSBAC_EWRITEFAILED);
04006 }
04007
04008 if (rsbac_get_attr(MAC,
04009 T_PROCESS,
04010 tid,
04011 A_min_write_open,
04012 &i_attr_val4,
04013 TRUE))
04014 {
04015 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04016 return(-RSBAC_EREADFAILED);
04017 }
04018 if (rsbac_get_attr(MAC,
04019 T_PROCESS,
04020 tid,
04021 A_min_write_categories,
04022 &i_attr_val5,
04023 TRUE))
04024 {
04025 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04026 return(-RSBAC_EREADFAILED);
04027 }
04028
04029 if(i_attr_val2.security_level < i_attr_val4.min_write_open)
04030 {
04031 i_attr_val4.min_write_open = i_attr_val2.security_level;
04032 if(rsbac_set_attr(MAC,
04033 T_PROCESS,
04034 tid,
04035 A_min_write_open,
04036 i_attr_val4))
04037 {
04038 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04039 return(-RSBAC_EWRITEFAILED);
04040 }
04041 }
04042
04043
04044 if ((i_attr_val3.mac_categories & i_attr_val5.mac_categories)
04045 != i_attr_val5.mac_categories)
04046 {
04047 i_attr_val5.mac_categories &= i_attr_val3.mac_categories;
04048 if(rsbac_set_attr(MAC,
04049 T_PROCESS,
04050 tid,
04051 A_min_write_categories,
04052 i_attr_val5))
04053 {
04054 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04055 return(-RSBAC_EWRITEFAILED);
04056 }
04057 }
04058
04059
04060
04061 i_tid.user = attr_val.owner;
04062 if (rsbac_get_attr(MAC,
04063 T_USER,
04064 i_tid,
04065 A_initial_security_level,
04066 &i_attr_val6,
04067 TRUE))
04068 {
04069 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04070 return(-RSBAC_EREADFAILED);
04071 }
04072 if (rsbac_set_attr(MAC,
04073 T_PROCESS,
04074 tid,
04075 A_initial_security_level,
04076 i_attr_val6))
04077 {
04078 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04079 return(-RSBAC_EWRITEFAILED);
04080 }
04081 #if 0
04082
04083 if(i_attr_val6.security_level > i_attr_val4.min_write_open)
04084 i_attr_val6.security_level = i_attr_val4.min_write_open;
04085 #endif
04086 if (rsbac_get_attr(MAC,
04087 T_USER,
04088 i_tid,
04089 A_mac_initial_categories,
04090 &i_attr_val7,
04091 TRUE))
04092 {
04093 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04094 return(-RSBAC_EREADFAILED);
04095 }
04096 if (rsbac_set_attr(MAC,
04097 T_PROCESS,
04098 tid,
04099 A_mac_initial_categories,
04100 i_attr_val7))
04101 {
04102 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04103 return(-RSBAC_EWRITEFAILED);
04104 }
04105 #if 0
04106
04107 if((i_attr_val7.mac_categories & i_attr_val5.mac_categories) != i_attr_val7.mac_categories)
04108 i_attr_val7.mac_categories &= i_attr_val5.mac_categories;
04109 #endif
04110
04111 i_tid.user = attr_val.owner;
04112 if (rsbac_get_attr(MAC,
04113 T_USER,
04114 i_tid,
04115 A_min_security_level,
04116 &i_attr_val8,
04117 TRUE))
04118 {
04119 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04120 return(-RSBAC_EREADFAILED);
04121 }
04122 if (rsbac_get_attr(MAC,
04123 T_USER,
04124 i_tid,
04125 A_mac_min_categories,
04126 &i_attr_val9,
04127 TRUE))
04128 {
04129 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04130 return(-RSBAC_EREADFAILED);
04131 }
04132
04133
04134 if (rsbac_set_attr(MAC,
04135 T_PROCESS,
04136 tid,
04137 A_min_security_level,
04138 i_attr_val8))
04139 {
04140 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04141 return(-RSBAC_EWRITEFAILED);
04142 }
04143 if (rsbac_set_attr(MAC,
04144 T_PROCESS,
04145 tid,
04146 A_mac_min_categories,
04147 i_attr_val9))
04148 {
04149 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04150 return(-RSBAC_EWRITEFAILED);
04151 }
04152
04153 if (rsbac_get_attr(MAC,
04154 T_PROCESS,
04155 tid,
04156 A_max_read_open,
04157 &i_attr_val4,
04158 TRUE))
04159 {
04160 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04161 return(-RSBAC_EREADFAILED);
04162 }
04163 if (rsbac_get_attr(MAC,
04164 T_PROCESS,
04165 tid,
04166 A_max_read_categories,
04167 &i_attr_val5,
04168 TRUE))
04169 {
04170 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04171 return(-RSBAC_EREADFAILED);
04172 }
04173
04174 if (i_attr_val8.security_level > i_attr_val4.max_read_open)
04175 {
04176 i_attr_val4.max_read_open = i_attr_val8.security_level;
04177 if(rsbac_set_attr(MAC,
04178 T_PROCESS,
04179 tid,
04180 A_max_read_open,
04181 i_attr_val4))
04182 {
04183 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04184 return(-RSBAC_EWRITEFAILED);
04185 }
04186 }
04187 #if 0
04188
04189 if(i_attr_val6.security_level < i_attr_val4.max_read_open)
04190 i_attr_val6.security_level = i_attr_val4.max_read_open;
04191 #endif
04192
04193 if(i_attr_val6.security_level > i_attr_val2.security_level)
04194 i_attr_val6.security_level = i_attr_val2.security_level;
04195 else
04196 if(i_attr_val6.security_level < i_attr_val8.security_level)
04197 i_attr_val6.security_level = i_attr_val8.security_level;
04198 if(rsbac_set_attr(MAC,
04199 T_PROCESS,
04200 tid,
04201 A_current_sec_level,
04202 i_attr_val6))
04203 {
04204 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04205 return(-RSBAC_EWRITEFAILED);
04206 }
04207
04208
04209
04210
04211 if ((i_attr_val9.mac_categories & i_attr_val5.mac_categories)
04212 != i_attr_val9.mac_categories)
04213 {
04214 i_attr_val5.mac_categories |= i_attr_val9.mac_categories;
04215 if(rsbac_set_attr(MAC,
04216 T_PROCESS,
04217 tid,
04218 A_max_read_categories,
04219 i_attr_val5))
04220 {
04221 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04222 return(-RSBAC_EWRITEFAILED);
04223 }
04224 }
04225 #if 0
04226
04227 if((i_attr_val7.mac_categories & i_attr_val5.mac_categories) != i_attr_val5.mac_categories)
04228 i_attr_val7.mac_categories |= i_attr_val5.mac_categories;
04229 #endif
04230
04231 if((i_attr_val7.mac_categories & i_attr_val3.mac_categories) != i_attr_val7.mac_categories)
04232 i_attr_val7.mac_categories &= i_attr_val3.mac_categories;
04233 else
04234 if((i_attr_val7.mac_categories & i_attr_val9.mac_categories) != i_attr_val9.mac_categories)
04235 i_attr_val7.mac_categories |= i_attr_val9.mac_categories;
04236 if(rsbac_set_attr(MAC,
04237 T_PROCESS,
04238 tid,
04239 A_mac_curr_categories,
04240 i_attr_val7))
04241 {
04242 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04243 return(-RSBAC_EWRITEFAILED);
04244 }
04245
04246
04247 i_tid.user = attr_val.owner;
04248 if (rsbac_get_attr(MAC,
04249 T_USER,
04250 i_tid,
04251 A_mac_user_flags,
04252 &i_attr_val3,
04253 TRUE))
04254 {
04255 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04256 return(-RSBAC_EREADFAILED);
04257 }
04258 i_attr_val1.mac_process_flags = i_attr_val3.mac_user_flags;
04259
04260 if (rsbac_get_attr(MAC,
04261 T_PROCESS,
04262 tid,
04263 A_mac_process_flags,
04264 &i_attr_val2,
04265 TRUE))
04266 {
04267 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04268 return(-RSBAC_EREADFAILED);
04269 }
04270 if( (i_attr_val2.mac_process_flags & MAC_program_auto)
04271 && (i_attr_val3.mac_user_flags & MAC_allow_auto)
04272 )
04273 i_attr_val1.mac_process_flags |= MAC_auto;
04274
04275 i_attr_val1.mac_process_flags &= RSBAC_MAC_P_FLAGS;
04276
04277 if(!(i_attr_val1.mac_process_flags & MAC_trusted))
04278 {
04279 if(rsbac_mac_p_truset_member(caller_pid, attr_val.owner))
04280 i_attr_val1.mac_process_flags |= MAC_trusted;
04281 }
04282
04283 if (rsbac_set_attr(MAC,
04284 T_PROCESS,
04285 tid,
04286 A_mac_process_flags,
04287 i_attr_val1))
04288 {
04289 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04290 return(-RSBAC_EWRITEFAILED);
04291 }
04292
04293 return(0);
04294
04295
04296 default:
04297 return(0);
04298 }
04299
04300 case R_CLONE:
04301 if (target == T_PROCESS)
04302 {
04303
04304 i_attr_val1.owner = owner;
04305
04306 if (rsbac_get_attr(MAC,
04307 T_PROCESS,
04308 tid,
04309 A_security_level,
04310 &i_attr_val2,
04311 FALSE))
04312 {
04313 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04314 return(-RSBAC_EREADFAILED);
04315 }
04316
04317 if (rsbac_get_attr(MAC,
04318 T_PROCESS,
04319 tid,
04320 A_current_sec_level,
04321 &i_attr_val3,
04322 FALSE))
04323 {
04324 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04325 return(-RSBAC_EREADFAILED);
04326 }
04327
04328 if (rsbac_get_attr(MAC,
04329 T_PROCESS,
04330 tid,
04331 A_min_write_open,
04332 &i_attr_val4,
04333 FALSE))
04334 {
04335 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04336 return(-RSBAC_EREADFAILED);
04337 }
04338
04339 if (rsbac_get_attr(MAC,
04340 T_PROCESS,
04341 tid,
04342 A_max_read_open,
04343 &i_attr_val5,
04344 FALSE))
04345 {
04346 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04347 return(-RSBAC_EREADFAILED);
04348 }
04349
04350 if (rsbac_get_attr(MAC,
04351 T_PROCESS,
04352 tid,
04353 A_mac_process_flags,
04354 &i_attr_val7,
04355 FALSE))
04356 {
04357 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04358 return(-RSBAC_EREADFAILED);
04359 }
04360
04361 #ifdef CONFIG_RSBAC_USE_RSBAC_OWNER
04362
04363 if (rsbac_set_attr(MAC,
04364 T_PROCESS,
04365 new_tid,
04366 A_owner,
04367 i_attr_val1))
04368 {
04369 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04370 return(-RSBAC_EWRITEFAILED);
04371 }
04372 #endif
04373
04374 if (rsbac_set_attr(MAC,
04375 T_PROCESS,
04376 new_tid,
04377 A_security_level,
04378 i_attr_val2))
04379 {
04380 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04381 return(-RSBAC_EWRITEFAILED);
04382 }
04383
04384 if (rsbac_set_attr(MAC,
04385 T_PROCESS,
04386 new_tid,
04387 A_current_sec_level,
04388 i_attr_val3))
04389 {
04390 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04391 return(-RSBAC_EWRITEFAILED);
04392 }
04393
04394 if (rsbac_set_attr(MAC,
04395 T_PROCESS,
04396 new_tid,
04397 A_min_write_open,
04398 i_attr_val4))
04399 {
04400 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04401 return(-RSBAC_EWRITEFAILED);
04402 }
04403
04404 if (rsbac_set_attr(MAC,
04405 T_PROCESS,
04406 new_tid,
04407 A_max_read_open,
04408 i_attr_val5))
04409 {
04410 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04411 return(-RSBAC_EWRITEFAILED);
04412 }
04413
04414 if (rsbac_set_attr(MAC,
04415 T_PROCESS,
04416 new_tid,
04417 A_mac_process_flags,
04418 i_attr_val7))
04419 {
04420 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04421 return(-RSBAC_EWRITEFAILED);
04422 }
04423
04424
04425 if (rsbac_get_attr(MAC,
04426 T_PROCESS,
04427 tid,
04428 A_mac_categories,
04429 &i_attr_val2,
04430 FALSE))
04431 {
04432 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04433 return(-RSBAC_EREADFAILED);
04434 }
04435
04436 if (rsbac_get_attr(MAC,
04437 T_PROCESS,
04438 tid,
04439 A_mac_curr_categories,
04440 &i_attr_val3,
04441 FALSE))
04442 {
04443 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04444 return(-RSBAC_EREADFAILED);
04445 }
04446
04447 if (rsbac_get_attr(MAC,
04448 T_PROCESS,
04449 tid,
04450 A_min_write_categories,
04451 &i_attr_val4,
04452 FALSE))
04453 {
04454 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04455 return(-RSBAC_EREADFAILED);
04456 }
04457
04458 if (rsbac_get_attr(MAC,
04459 T_PROCESS,
04460 tid,
04461 A_max_read_categories,
04462 &i_attr_val5,
04463 FALSE))
04464 {
04465 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04466 return(-RSBAC_EREADFAILED);
04467 }
04468
04469 if (rsbac_get_attr(MAC,
04470 T_PROCESS,
04471 tid,
04472 A_initial_security_level,
04473 &i_attr_val6,
04474 FALSE))
04475 {
04476 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04477 return(-RSBAC_EREADFAILED);
04478 }
04479
04480 if (rsbac_get_attr(MAC,
04481 T_PROCESS,
04482 tid,
04483 A_mac_initial_categories,
04484 &i_attr_val7,
04485 FALSE))
04486 {
04487 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04488 return(-RSBAC_EREADFAILED);
04489 }
04490
04491 if (rsbac_set_attr(MAC,
04492 T_PROCESS,
04493 new_tid,
04494 A_mac_categories,
04495 i_attr_val2))
04496 {
04497 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04498 return(-RSBAC_EWRITEFAILED);
04499 }
04500
04501 if (rsbac_set_attr(MAC,
04502 T_PROCESS,
04503 new_tid,
04504 A_mac_curr_categories,
04505 i_attr_val3))
04506 {
04507 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04508 return(-RSBAC_EWRITEFAILED);
04509 }
04510
04511 if (rsbac_set_attr(MAC,
04512 T_PROCESS,
04513 new_tid,
04514 A_min_write_categories,
04515 i_attr_val4))
04516 {
04517 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04518 return(-RSBAC_EWRITEFAILED);
04519 }
04520
04521 if (rsbac_set_attr(MAC,
04522 T_PROCESS,
04523 new_tid,
04524 A_max_read_categories,
04525 i_attr_val5))
04526 {
04527 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04528 return(-RSBAC_EWRITEFAILED);
04529 }
04530
04531 if (rsbac_set_attr(MAC,
04532 T_PROCESS,
04533 new_tid,
04534 A_initial_security_level,
04535 i_attr_val6))
04536 {
04537 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04538 return(-RSBAC_EWRITEFAILED);
04539 }
04540
04541 if (rsbac_set_attr(MAC,
04542 T_PROCESS,
04543 new_tid,
04544 A_mac_initial_categories,
04545 i_attr_val7))
04546 {
04547 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04548 return(-RSBAC_EWRITEFAILED);
04549 }
04550
04551 if (rsbac_get_attr(MAC,
04552 T_PROCESS,
04553 tid,
04554 A_min_security_level,
04555 &i_attr_val2,
04556 FALSE))
04557 {
04558 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04559 return(-RSBAC_EREADFAILED);
04560 }
04561 if (rsbac_get_attr(MAC,
04562 T_PROCESS,
04563 tid,
04564 A_mac_min_categories,
04565 &i_attr_val3,
04566 FALSE))
04567 {
04568 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04569 return(-RSBAC_EREADFAILED);
04570 }
04571
04572 if (rsbac_set_attr(MAC,
04573 T_PROCESS,
04574 new_tid,
04575 A_min_security_level,
04576 i_attr_val2))
04577 {
04578 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04579 return(-RSBAC_EWRITEFAILED);
04580 }
04581
04582 if (rsbac_set_attr(MAC,
04583 T_PROCESS,
04584 new_tid,
04585 A_mac_min_categories,
04586 i_attr_val3))
04587 {
04588 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04589 return(-RSBAC_EWRITEFAILED);
04590 }
04591 if (rsbac_mac_copy_pp_truset(tid.process, new_tid.process))
04592 {
04593 rsbac_printk(KERN_WARNING
04594 "rsbac_adf_set_attr_mac(): rsbac_mac_copy_pp_truset() returned error!\n");
04595 return(-RSBAC_EWRITEFAILED);
04596 }
04597 return(0);
04598 }
04599 else
04600 return(0);
04601
04602 case R_CREATE:
04603 switch(target)
04604 {
04605
04606 case T_DIR:
04607
04608
04609
04610
04611 #ifndef CONFIG_RSBAC_MAC_LIGHT
04612 result = auto_write(caller_pid,
04613 target,
04614 tid,
04615 FALSE);
04616 if ((result != GRANTED) && (result != DO_NOT_CARE))
04617 return(-RSBAC_EDECISIONMISMATCH);
04618 #endif
04619
04620 if (rsbac_get_attr(MAC,
04621 T_DIR,
04622 tid,
04623 A_security_level,
04624 &i_attr_val1,
04625 TRUE))
04626 {
04627 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04628 return(-RSBAC_EREADFAILED);
04629 }
04630 if (rsbac_get_attr(MAC,
04631 T_DIR,
04632 tid,
04633 A_mac_categories,
04634 &i_attr_val2,
04635 TRUE))
04636 {
04637 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04638 return(-RSBAC_EREADFAILED);
04639 }
04640
04641 i_tid.process = caller_pid;
04642 if (rsbac_get_attr(MAC,
04643 T_PROCESS,
04644 i_tid,
04645 A_current_sec_level,
04646 &i_attr_val3,
04647 FALSE))
04648 {
04649 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04650 return(-RSBAC_EREADFAILED);
04651 }
04652 #ifdef CONFIG_RSBAC_MAC_SMART_INHERIT
04653
04654 if(i_attr_val3.security_level != i_attr_val1.security_level)
04655 #endif
04656
04657 if (rsbac_set_attr(MAC,
04658 new_target,
04659 new_tid,
04660 A_security_level,
04661 i_attr_val3))
04662 {
04663 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04664 return(-RSBAC_EWRITEFAILED);
04665 }
04666
04667 if (rsbac_get_attr(MAC,
04668 T_PROCESS,
04669 i_tid,
04670 A_mac_curr_categories,
04671 &i_attr_val3,
04672 FALSE))
04673 {
04674 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04675 return(-RSBAC_EREADFAILED);
04676 }
04677 #ifdef CONFIG_RSBAC_MAC_SMART_INHERIT
04678
04679 if(i_attr_val3.mac_categories != i_attr_val2.mac_categories)
04680 #endif
04681
04682 if (rsbac_set_attr(MAC,
04683 new_target,
04684 new_tid,
04685 A_mac_categories,
04686 i_attr_val3))
04687 {
04688 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04689 return(-RSBAC_EWRITEFAILED);
04690 }
04691 return(0);
04692 break;
04693
04694 case T_IPC:
04695 i_tid.process = caller_pid;
04696
04697 if (rsbac_get_attr(MAC,
04698 T_PROCESS,
04699 i_tid,
04700 A_current_sec_level,
04701 &i_attr_val1,
04702 FALSE))
04703 {
04704 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04705 return(-RSBAC_EREADFAILED);
04706 }
04707
04708 if (rsbac_set_attr(MAC,
04709 T_IPC,
04710 tid,
04711 A_security_level,
04712 i_attr_val1))
04713 {
04714 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04715 return(-RSBAC_EWRITEFAILED);
04716 }
04717
04718 if (rsbac_get_attr(MAC,
04719 T_PROCESS,
04720 i_tid,
04721 A_mac_curr_categories,
04722 &i_attr_val1,
04723 FALSE))
04724 {
04725 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04726 return(-RSBAC_EREADFAILED);
04727 }
04728
04729 if (rsbac_set_attr(MAC,
04730 T_IPC,
04731 tid,
04732 A_mac_categories,
04733 i_attr_val1))
04734 {
04735 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04736 return(-RSBAC_EWRITEFAILED);
04737 }
04738 return(0);
04739 break;
04740
04741 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
04742 case T_NETOBJ:
04743 i_tid.process = caller_pid;
04744
04745 if (rsbac_get_attr(MAC,
04746 T_PROCESS,
04747 i_tid,
04748 A_current_sec_level,
04749 &i_attr_val1,
04750 FALSE))
04751 {
04752 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04753 return(-RSBAC_EREADFAILED);
04754 }
04755
04756 if (rsbac_set_attr(MAC,
04757 target,
04758 tid,
04759 A_local_sec_level,
04760 i_attr_val1))
04761 {
04762 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04763 return(-RSBAC_EWRITEFAILED);
04764 }
04765
04766 if (rsbac_get_attr(MAC,
04767 T_PROCESS,
04768 i_tid,
04769 A_mac_curr_categories,
04770 &i_attr_val1,
04771 FALSE))
04772 {
04773 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04774 return(-RSBAC_EREADFAILED);
04775 }
04776
04777 if (rsbac_set_attr(MAC,
04778 target,
04779 tid,
04780 A_local_mac_categories,
04781 i_attr_val1))
04782 {
04783 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04784 return(-RSBAC_EWRITEFAILED);
04785 }
04786 return(0);
04787 break;
04788 #endif
04789
04790
04791 default:
04792 return(0);
04793 }
04794
04795
04796 case R_DELETE:
04797 switch(target)
04798 {
04799 case T_FILE:
04800 case T_DIR:
04801 case T_FIFO:
04802 case T_SYMLINK:
04803 case T_IPC:
04804
04805
04806
04807 result = auto_write(caller_pid,
04808 target,
04809 tid,
04810 FALSE);
04811 if ((result != GRANTED) && (result != DO_NOT_CARE))
04812 return(-RSBAC_EDECISIONMISMATCH);
04813 else
04814 return(0);
04815
04816 default:
04817 return(0);
04818 }
04819
04820 case R_EXECUTE:
04821 switch(target)
04822 {
04823 case T_FILE:
04824
04825 if (rsbac_mac_copy_fp_truset(tid.file, caller_pid))
04826 {
04827 rsbac_printk(KERN_WARNING
04828 "rsbac_adf_set_attr_mac(): rsbac_mac_copy_fp_truset() returned error!\n");
04829 return(-RSBAC_EWRITEFAILED);
04830 }
04831
04832 result = auto_read(caller_pid,
04833 target,
04834 tid,
04835 TRUE);
04836 if ((result != GRANTED) && (result != DO_NOT_CARE))
04837 return(-RSBAC_EDECISIONMISMATCH);
04838
04839
04840
04841 i_tid.process = caller_pid;
04842
04843 #ifdef CONFIG_RSBAC_MAC_RESET_CURR
04844
04845 if (rsbac_get_attr(MAC,
04846 T_PROCESS,
04847 i_tid,
04848 A_initial_security_level,
04849 &i_attr_val1,
04850 TRUE))
04851 {
04852 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04853 return(-RSBAC_EREADFAILED);
04854 }
04855 if (rsbac_get_attr(MAC,
04856 T_PROCESS,
04857 i_tid,
04858 A_mac_initial_categories,
04859 &i_attr_val2,
04860 TRUE))
04861 {
04862 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04863 return(-RSBAC_EREADFAILED);
04864 }
04865 if (rsbac_set_attr(MAC,
04866 T_PROCESS,
04867 i_tid,
04868 A_current_sec_level,
04869 i_attr_val1))
04870 {
04871 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04872 return(-RSBAC_EWRITEFAILED);
04873 }
04874 if (rsbac_set_attr(MAC,
04875 T_PROCESS,
04876 i_tid,
04877 A_mac_curr_categories,
04878 i_attr_val2))
04879 {
04880 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04881 return(-RSBAC_EWRITEFAILED);
04882 }
04883 #endif
04884 #if 0
04885
04886 if (rsbac_get_attr(MAC,
04887 T_PROCESS,
04888 i_tid,
04889 A_security_level,
04890 &i_attr_val1,
04891 TRUE))
04892 {
04893 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04894 return(-RSBAC_EREADFAILED);
04895 }
04896 #endif
04897 i_attr_val1.min_write_open = SL_max;
04898 if (rsbac_set_attr(MAC,
04899 T_PROCESS,
04900 i_tid,
04901 A_min_write_open,
04902 i_attr_val1))
04903 {
04904 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04905 return(-RSBAC_EWRITEFAILED);
04906 }
04907 #if 0
04908
04909 if (rsbac_get_attr(MAC,
04910 T_PROCESS,
04911 i_tid,
04912 A_mac_categories,
04913 &i_attr_val2,
04914 TRUE))
04915 {
04916 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04917 return(-RSBAC_EREADFAILED);
04918 }
04919 #endif
04920 i_attr_val2.mac_categories = RSBAC_MAC_MAX_CAT_VECTOR;
04921 if (rsbac_set_attr(MAC,
04922 T_PROCESS,
04923 i_tid,
04924 A_min_write_categories,
04925 i_attr_val2))
04926 {
04927 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04928 return(-RSBAC_EWRITEFAILED);
04929 }
04930
04931 #if 0
04932
04933 if (rsbac_get_attr(MAC,
04934 T_PROCESS,
04935 i_tid,
04936 A_min_security_level,
04937 &i_attr_val1,
04938 TRUE))
04939 {
04940 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04941 return(-RSBAC_EREADFAILED);
04942 }
04943 if (rsbac_get_attr(MAC,
04944 T_PROCESS,
04945 i_tid,
04946 A_mac_min_categories,
04947 &i_attr_val2,
04948 TRUE))
04949 {
04950 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04951 return(-RSBAC_EREADFAILED);
04952 }
04953 #endif
04954 i_attr_val1.max_read_open = SL_min;
04955 i_attr_val2.mac_categories = RSBAC_MAC_MIN_CAT_VECTOR;
04956 if (rsbac_set_attr(MAC,
04957 T_PROCESS,
04958 i_tid,
04959 A_max_read_open,
04960 i_attr_val1))
04961 {
04962 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04963 return(-RSBAC_EWRITEFAILED);
04964 }
04965
04966 if (rsbac_set_attr(MAC,
04967 T_PROCESS,
04968 i_tid,
04969 A_max_read_categories,
04970 i_attr_val2))
04971 {
04972 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04973 return(-RSBAC_EWRITEFAILED);
04974 }
04975
04976 if (rsbac_get_attr(MAC,
04977 T_PROCESS,
04978 i_tid,
04979 A_mac_process_flags,
04980 &i_attr_val1,
04981 TRUE))
04982 {
04983 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04984 return(-RSBAC_EREADFAILED);
04985 }
04986 if (rsbac_get_attr(MAC,
04987 target,
04988 tid,
04989 A_mac_auto,
04990 &i_attr_val2,
04991 TRUE))
04992 {
04993 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04994 return(-RSBAC_EREADFAILED);
04995 }
04996 if(i_attr_val2.mac_auto)
04997 {
04998 i_attr_val1.mac_process_flags |= MAC_program_auto;
04999 i_tid.user = owner;
05000 if (rsbac_get_attr(MAC,
05001 T_USER,
05002 i_tid,
05003 A_mac_user_flags,
05004 &i_attr_val2,
05005 TRUE))
05006 {
05007 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05008 return(-RSBAC_EREADFAILED);
05009 }
05010 if(i_attr_val2.mac_user_flags & MAC_allow_auto)
05011 i_attr_val1.mac_process_flags |= MAC_auto;
05012 else
05013 i_attr_val1.mac_process_flags &= ~MAC_auto;
05014 i_tid.process = caller_pid;
05015 }
05016 else
05017 {
05018 i_attr_val1.mac_process_flags &= ~MAC_program_auto;
05019 i_attr_val1.mac_process_flags &= ~MAC_auto;
05020 }
05021 if (rsbac_get_attr(MAC,
05022 T_FILE,
05023 tid,
05024 A_mac_prop_trusted,
05025 &i_attr_val3,
05026 TRUE))
05027 {
05028 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05029 return(-RSBAC_EREADFAILED);
05030 }
05031 if( !(i_attr_val3.mac_prop_trusted)
05032 || !(i_attr_val1.mac_process_flags & MAC_trusted)
05033 )
05034 {
05035 if(rsbac_mac_p_truset_member(caller_pid, owner))
05036 i_attr_val1.mac_process_flags |= MAC_trusted;
05037 else
05038 {
05039 i_tid.user = owner;
05040 if (rsbac_get_attr(MAC,
05041 T_USER,
05042 i_tid,
05043 A_mac_user_flags,
05044 &i_attr_val2,
05045 TRUE))
05046 {
05047 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05048 return(-RSBAC_EREADFAILED);
05049 }
05050 if(i_attr_val2.mac_user_flags & MAC_trusted)
05051 i_attr_val1.mac_process_flags |= MAC_trusted;
05052 else
05053 i_attr_val1.mac_process_flags &= ~MAC_trusted;
05054 i_tid.process = caller_pid;
05055 }
05056 }
05057 if (rsbac_set_attr(MAC,
05058 T_PROCESS,
05059 i_tid,
05060 A_mac_process_flags,
05061 i_attr_val1))
05062 {
05063 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
05064 return(-RSBAC_EWRITEFAILED);
05065 }
05066 return(0);
05067
05068
05069 default:
05070 return(0);
05071 }
05072
05073 case R_MOUNT:
05074 switch(target)
05075 {
05076 case T_DIR:
05077 case T_DEV:
05078
05079 if( (target == T_DEV)
05080 && (attr == A_mode)
05081 && (attr_val.mode & MS_RDONLY))
05082 result = auto_read(caller_pid,
05083 target,
05084 tid,
05085 TRUE);
05086 else
05087 result = auto_read_write(caller_pid,
05088 target,
05089 tid,
05090 TRUE);
05091 if ((result != GRANTED) && (result != DO_NOT_CARE))
05092 return(-RSBAC_EDECISIONMISMATCH);
05093 else
05094 return(0);
05095
05096
05097 default:
05098 return(0);
05099 }
05100
05101 case R_READ:
05102 switch(target)
05103 {
05104 case T_DIR:
05105 #ifdef CONFIG_RSBAC_RW
05106 case T_FILE:
05107 case T_FIFO:
05108 case T_IPC:
05109 #endif
05110
05111 result = auto_read(caller_pid,
05112 target,
05113 tid,
05114 TRUE);
05115 if ((result != GRANTED) && (result != DO_NOT_CARE))
05116 return(-RSBAC_EDECISIONMISMATCH);
05117 return(0);
05118
05119 #ifdef CONFIG_RSBAC_RW
05120 case T_DEV:
05121
05122 if (rsbac_get_attr(MAC,
05123 T_DEV,
05124 tid,
05125 A_mac_check,
05126 &i_attr_val1,
05127 FALSE))
05128 {
05129 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05130 return(-RSBAC_EREADFAILED);
05131 }
05132 if(!i_attr_val1.mac_check)
05133 return(0);
05134
05135 result = auto_read(caller_pid,
05136 target,
05137 tid,
05138 TRUE);
05139 if ((result != GRANTED) && (result != DO_NOT_CARE))
05140 return(-RSBAC_EDECISIONMISMATCH);
05141 return(0);
05142 #endif
05143
05144 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
05145 case T_NETOBJ:
05146
05147 result = auto_read_attr(caller_pid,
05148 target,
05149 tid,
05150 A_remote_sec_level,
05151 A_remote_mac_categories,
05152 TRUE);
05153 if ((result != GRANTED) && (result != DO_NOT_CARE))
05154 return(-RSBAC_EDECISIONMISMATCH);
05155 return(0);
05156 #endif
05157
05158
05159 default:
05160 return(0);
05161 }
05162
05163 case R_READ_OPEN:
05164 switch(target)
05165 {
05166 case T_FILE:
05167 case T_DIR:
05168 case T_FIFO:
05169 case T_IPC:
05170
05171 result = auto_read(caller_pid,
05172 target,
05173 tid,
05174 TRUE);
05175 if ((result != GRANTED) && (result != DO_NOT_CARE))
05176 return(-RSBAC_EDECISIONMISMATCH);
05177 return(0);
05178
05179 case T_DEV:
05180
05181 if (rsbac_get_attr(MAC,
05182 T_DEV,
05183 tid,
05184 A_mac_check,
05185 &i_attr_val1,
05186 FALSE))
05187 {
05188 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05189 return(-RSBAC_EREADFAILED);
05190 }
05191 if(!i_attr_val1.mac_check)
05192 return(0);
05193
05194 result = auto_read(caller_pid,
05195 target,
05196 tid,
05197 TRUE);
05198 if ((result != GRANTED) && (result != DO_NOT_CARE))
05199 return(-RSBAC_EDECISIONMISMATCH);
05200 return(0);
05201
05202
05203 default:
05204 return(0);
05205 }
05206
05207 case R_READ_WRITE_OPEN:
05208 switch(target)
05209 {
05210 case T_FILE:
05211 case T_FIFO:
05212 case T_IPC:
05213
05214 result = auto_read_write(caller_pid,
05215 target,
05216 tid,
05217 TRUE);
05218 if ((result != GRANTED) && (result != DO_NOT_CARE))
05219 return(-RSBAC_EDECISIONMISMATCH);
05220 return(0);
05221
05222 case T_DEV:
05223
05224 if (rsbac_get_attr(MAC,
05225 T_DEV,
05226 tid,
05227 A_mac_check,
05228 &i_attr_val1,
05229 FALSE))
05230 {
05231 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05232 return(-RSBAC_EREADFAILED);
05233 }
05234 if(!i_attr_val1.mac_check)
05235 return(0);
05236
05237 result = auto_read_write(caller_pid,
05238 target,
05239 tid,
05240 TRUE);
05241 if ((result != GRANTED) && (result != DO_NOT_CARE))
05242 return(-RSBAC_EDECISIONMISMATCH);
05243 return(0);
05244
05245 default:
05246 return(0);
05247 }
05248
05249 case R_SEARCH:
05250 switch(target)
05251 {
05252 case T_DIR:
05253 case T_SYMLINK:
05254
05255 result = auto_read(caller_pid,
05256 target,
05257 tid,
05258 TRUE);
05259 if ((result != GRANTED) && (result != DO_NOT_CARE))
05260 return(-RSBAC_EDECISIONMISMATCH);
05261 return(0);
05262
05263 default:
05264 return(0);
05265 }
05266
05267 case R_TRACE:
05268 switch(target)
05269 {
05270 case T_PROCESS:
05271
05272 result = auto_read_write_attr(caller_pid,
05273 target,
05274 tid,
05275 A_current_sec_level,
05276 A_mac_curr_categories,
05277 TRUE);
05278 if ((result != GRANTED) && (result != DO_NOT_CARE))
05279 return(-RSBAC_EDECISIONMISMATCH);
05280 return(0);
05281
05282
05283 default:
05284 return(0);
05285 }
05286
05287 case R_WRITE:
05288 case R_WRITE_OPEN:
05289 switch(target)
05290 {
05291 case T_FILE:
05292 case T_FIFO:
05293 case T_IPC:
05294
05295 result = auto_write(caller_pid,
05296 target,
05297 tid,
05298 TRUE);
05299 if ((result != GRANTED) && (result != DO_NOT_CARE))
05300 return(-RSBAC_EDECISIONMISMATCH);
05301 return(0);
05302
05303 case T_DEV:
05304
05305 if (rsbac_get_attr(MAC,
05306 T_DEV,
05307 tid,
05308 A_mac_check,
05309 &i_attr_val1,
05310 FALSE))
05311 {
05312 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05313 return(-RSBAC_EREADFAILED);
05314 }
05315 if(!i_attr_val1.mac_check)
05316 return(0);
05317
05318 result = auto_write(caller_pid,
05319 target,
05320 tid,
05321 TRUE);
05322 if ((result != GRANTED) && (result != DO_NOT_CARE))
05323 return(-RSBAC_EDECISIONMISMATCH);
05324 return(0);
05325
05326 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
05327 case T_NETOBJ:
05328
05329 result = auto_write_attr(caller_pid,
05330 target,
05331 tid,
05332 A_remote_sec_level,
05333 A_remote_mac_categories,
05334 TRUE);
05335 if ((result != GRANTED) && (result != DO_NOT_CARE))
05336 return(-RSBAC_EDECISIONMISMATCH);
05337 return(0);
05338 #endif
05339
05340
05341 default:
05342 return(0);
05343 }
05344
05345 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
05346 case R_BIND:
05347 case R_LISTEN:
05348 switch(target)
05349 {
05350 case T_NETOBJ:
05351
05352 result = auto_write_attr(caller_pid,
05353 target,
05354 tid,
05355 A_local_sec_level,
05356 A_local_mac_categories,
05357 TRUE);
05358 if ((result != GRANTED) && (result != DO_NOT_CARE))
05359 return(-RSBAC_EDECISIONMISMATCH);
05360 return(0);
05361
05362
05363 default:
05364 return(0);
05365 }
05366
05367 case R_ACCEPT:
05368 case R_CONNECT:
05369 case R_SEND:
05370 case R_RECEIVE:
05371 switch(target)
05372 {
05373 case T_NETOBJ:
05374
05375 result = auto_write_attr(caller_pid,
05376 target,
05377 tid,
05378 A_remote_sec_level,
05379 A_remote_mac_categories,
05380 TRUE);
05381 if ((result != GRANTED) && (result != DO_NOT_CARE))
05382 return(-RSBAC_EDECISIONMISMATCH);
05383 return(0);
05384
05385
05386 default:
05387 return(0);
05388 }
05389 #endif
05390
05391
05392 default: return(0);
05393 }
05394
05395 return(0);
05396 }
05397
05398