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 #endif
02992 #ifdef CONFIG_RSBAC_MAC_AUTH_PROT
02993 case A_auth_may_setuid:
02994 case A_auth_may_set_cap:
02995 case A_auth_start_uid:
02996 case A_auth_start_euid:
02997 case A_auth_start_gid:
02998 case A_auth_start_egid:
02999 case A_auth_program_file:
03000 case A_auth_learn:
03001 case A_auth_add_f_cap:
03002 case A_auth_remove_f_cap:
03003 case A_auth_last_auth:
03004 #endif
03005
03006 case A_none:
03007
03008 return mac_check_role(owner, SR_security_officer);
03009
03010 default:
03011 return(DO_NOT_CARE);
03012 }
03013
03014 case R_MODIFY_PERMISSIONS_DATA:
03015 switch(target)
03016 {
03017 case T_FILE:
03018 case T_DIR:
03019 case T_FIFO:
03020 case T_SYMLINK:
03021 case T_IPC:
03022
03023 return(auto_write(caller_pid,
03024 target,
03025 tid,
03026 FALSE));
03027 break;
03028
03029 case T_SCD:
03030 #ifdef CONFIG_RSBAC_USER_MOD_IOPERM
03031 if(tid.scd == ST_ioports)
03032 return GRANTED;
03033 #endif
03034
03035 i_tid.user = owner;
03036 if (rsbac_get_attr(MAC,
03037 T_USER,
03038 i_tid,
03039 A_mac_role,
03040 &i_attr_val1,
03041 TRUE))
03042 {
03043 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03044 return(NOT_GRANTED);
03045 }
03046
03047 if (i_attr_val1.system_role == SR_security_officer)
03048 return(GRANTED);
03049
03050 if ( (i_attr_val1.system_role == SR_administrator)
03051 && (tid.scd == ST_ioports) )
03052 return(GRANTED);
03053 else
03054 return(NOT_GRANTED);
03055
03056 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
03057 case T_NETOBJ:
03058
03059 return(auto_write_attr(caller_pid,
03060 target,
03061 tid,
03062 A_local_sec_level,
03063 A_local_mac_categories,
03064 FALSE));
03065 #endif
03066
03067 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03068 case T_USER:
03069 case T_GROUP:
03070
03071 return mac_check_role(owner, SR_security_officer);
03072 #endif
03073 #ifdef CONFIG_RSBAC_ALLOW_DAC_DISABLE
03074
03075 case T_NONE:
03076
03077 i_tid.user = owner;
03078 if (rsbac_get_attr(MAC,
03079 T_USER,
03080 i_tid,
03081 A_mac_role,
03082 &i_attr_val1,
03083 TRUE))
03084 {
03085 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03086 return(NOT_GRANTED);
03087 }
03088
03089 if (i_attr_val1.system_role == SR_security_officer)
03090 return(GRANTED);
03091 else
03092 return(NOT_GRANTED);
03093 #endif
03094
03095
03096 default: return(DO_NOT_CARE);
03097 }
03098
03099 case R_MODIFY_SYSTEM_DATA:
03100 switch(target)
03101 {
03102 case T_SCD:
03103
03104 if (tid.scd == ST_rlimit)
03105 return(GRANTED);
03106
03107 i_tid.user = owner;
03108 if (rsbac_get_attr(MAC,
03109 T_USER,
03110 i_tid,
03111 A_mac_role,
03112 &i_attr_val1,
03113 TRUE))
03114 {
03115 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03116 return(NOT_GRANTED);
03117 }
03118
03119 if(tid.scd == ST_rsbaclog)
03120 {
03121 if ( (i_attr_val1.system_role == SR_security_officer)
03122 || (i_attr_val1.system_role == SR_auditor)
03123 )
03124 return(GRANTED);
03125 else
03126 return(NOT_GRANTED);
03127 }
03128
03129 if(tid.scd == ST_rsbac_remote_log)
03130 {
03131 if ( (i_attr_val1.system_role == SR_security_officer)
03132 )
03133 return(GRANTED);
03134 else
03135 return(NOT_GRANTED);
03136 }
03137
03138 if(tid.scd == ST_rsbac)
03139 {
03140 if ( (i_attr_val1.system_role == SR_security_officer)
03141 || (i_attr_val1.system_role == SR_administrator)
03142 )
03143 return(GRANTED);
03144 else
03145 return(NOT_GRANTED);
03146 }
03147
03148 if (i_attr_val1.system_role == SR_administrator)
03149 return(GRANTED);
03150 else
03151 return(NOT_GRANTED);
03152
03153 case T_DEV:
03154 if(tid.dev.type == D_block)
03155 return mac_check_role(owner, SR_administrator);
03156 else
03157 return DO_NOT_CARE;
03158
03159 case T_PROCESS:
03160
03161 return(auto_write_attr(caller_pid,
03162 target,
03163 tid,
03164 A_current_sec_level,
03165 A_mac_curr_categories,
03166 FALSE));
03167
03168 #ifdef CONFIG_RSBAC_MAC_NET_DEV_PROT
03169 case T_NETDEV:
03170 return mac_check_role(owner, SR_administrator);
03171 #endif
03172 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
03173 case T_NETOBJ:
03174
03175 return(auto_write_attr(caller_pid,
03176 target,
03177 tid,
03178 A_local_sec_level,
03179 A_local_mac_categories,
03180 FALSE));
03181 #endif
03182
03183
03184 default: return(DO_NOT_CARE);
03185 }
03186
03187 case R_MOUNT:
03188 switch(target)
03189 {
03190 case T_FILE:
03191 case T_DIR:
03192 case T_DEV:
03193
03194 #ifndef CONFIG_RSBAC_MAC_LIGHT
03195 if(mac_check_role(owner, SR_administrator) == NOT_GRANTED)
03196 return(NOT_GRANTED);
03197 #endif
03198
03199
03200 if( (target == T_DEV)
03201 && (attr == A_mode)
03202 && (attr_val.mode & MS_RDONLY))
03203 return(auto_read(caller_pid,
03204 target,
03205 tid,
03206 FALSE));
03207 else
03208 return(auto_read_write(caller_pid,
03209 target,
03210 tid,
03211 FALSE));
03212
03213
03214 default: return(DO_NOT_CARE);
03215 }
03216
03217 case R_READ:
03218 switch(target)
03219 {
03220 case T_DIR:
03221 #ifdef CONFIG_RSBAC_RW
03222 case T_IPC:
03223 case T_FILE:
03224 case T_FIFO:
03225 #endif
03226
03227 return(auto_read(caller_pid,
03228 target,
03229 tid,
03230 FALSE));
03231 break;
03232
03233 #ifdef CONFIG_RSBAC_RW
03234 case T_DEV:
03235
03236 if (rsbac_get_attr(MAC,
03237 T_DEV,
03238 tid,
03239 A_mac_check,
03240 &i_attr_val1,
03241 FALSE))
03242 {
03243 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03244 return(NOT_GRANTED);
03245 }
03246 if(!i_attr_val1.mac_check)
03247 return(DO_NOT_CARE);
03248
03249 return(auto_read(caller_pid,
03250 target,
03251 tid,
03252 FALSE));
03253 break;
03254 #endif
03255
03256 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03257 case T_NETTEMP:
03258 if(mac_check_role(owner, SR_security_officer) == GRANTED)
03259 return GRANTED;
03260 return mac_check_role(owner, SR_administrator);
03261
03262 case T_NETOBJ:
03263
03264 return(auto_read_attr(caller_pid,
03265 target,
03266 tid,
03267 A_remote_sec_level,
03268 A_remote_mac_categories,
03269 FALSE));
03270 #endif
03271
03272 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03273 case T_USER:
03274 case T_GROUP:
03275
03276 if(mac_check_role(owner, SR_security_officer) == GRANTED)
03277 return GRANTED;
03278 else
03279 return mac_check_role(owner, SR_administrator);
03280 #endif
03281
03282 default: return(DO_NOT_CARE);
03283 }
03284
03285
03286 case R_READ_ATTRIBUTE:
03287 switch(attr)
03288 {
03289 case A_owner:
03290 case A_security_level:
03291 case A_local_sec_level:
03292 case A_remote_sec_level:
03293 case A_min_security_level:
03294 case A_mac_categories:
03295 case A_local_mac_categories:
03296 case A_remote_mac_categories:
03297 case A_mac_min_categories:
03298 case A_pseudo:
03299 case A_system_role:
03300 case A_mac_role:
03301 case A_current_sec_level:
03302 case A_min_write_open:
03303 case A_max_read_open:
03304 case A_mac_user_flags:
03305 case A_mac_process_flags:
03306 case A_mac_check:
03307 case A_mac_auto:
03308 case A_mac_prop_trusted:
03309 case A_mac_file_flags:
03310 case A_initial_security_level:
03311 case A_mac_initial_categories:
03312 case A_symlink_add_mac_level:
03313 #ifdef CONFIG_RSBAC_MAC_GEN_PROT
03314 case A_log_array_low:
03315 case A_log_array_high:
03316 case A_log_program_based:
03317 case A_log_user_based:
03318 case A_symlink_add_remote_ip:
03319 case A_symlink_add_uid:
03320 case A_fake_root_uid:
03321 case A_audit_uid:
03322 case A_auid_exempt:
03323 case A_remote_ip:
03324 #endif
03325 #ifdef CONFIG_RSBAC_MAC_AUTH_PROT
03326 case A_auth_may_setuid:
03327 case A_auth_may_set_cap:
03328 case A_auth_start_uid:
03329 case A_auth_start_euid:
03330 case A_auth_start_gid:
03331 case A_auth_start_egid:
03332 case A_auth_program_file:
03333 case A_auth_learn:
03334 case A_auth_last_auth:
03335 #endif
03336
03337 if(mac_check_role(owner, SR_security_officer) == GRANTED)
03338 return GRANTED;
03339 else
03340 return mac_check_role(owner, SR_administrator);
03341
03342 default:
03343 return(DO_NOT_CARE);
03344 }
03345
03346 case R_READ_OPEN:
03347 switch(target)
03348 {
03349 case T_FILE:
03350 case T_DIR:
03351 case T_FIFO:
03352 case T_IPC:
03353
03354 return(auto_read(caller_pid,
03355 target,
03356 tid,
03357 FALSE));
03358 break;
03359 case T_DEV:
03360
03361 if (rsbac_get_attr(MAC,
03362 T_DEV,
03363 tid,
03364 A_mac_check,
03365 &i_attr_val1,
03366 FALSE))
03367 {
03368 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03369 return(NOT_GRANTED);
03370 }
03371 if(!i_attr_val1.mac_check)
03372 return(DO_NOT_CARE);
03373
03374 return(auto_read(caller_pid,
03375 target,
03376 tid,
03377 FALSE));
03378 break;
03379
03380 default: return(DO_NOT_CARE);
03381 }
03382
03383 case R_READ_WRITE_OPEN:
03384 switch(target)
03385 {
03386 case T_FILE:
03387 case T_FIFO:
03388 case T_IPC:
03389
03390 return(auto_read_write(caller_pid,
03391 target,
03392 tid,
03393 FALSE));
03394
03395 case T_DEV:
03396
03397 if (rsbac_get_attr(MAC,
03398 T_DEV,
03399 tid,
03400 A_mac_check,
03401 &i_attr_val1,
03402 FALSE))
03403 {
03404 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03405 return(NOT_GRANTED);
03406 }
03407 if(!i_attr_val1.mac_check)
03408 return(DO_NOT_CARE);
03409
03410 return(auto_read_write(caller_pid,
03411 target,
03412 tid,
03413 FALSE));
03414
03415
03416 default: return(DO_NOT_CARE);
03417 }
03418
03419 case R_REMOVE_FROM_KERNEL:
03420 switch(target)
03421 {
03422 case T_FILE:
03423 case T_DEV:
03424 case T_NONE:
03425
03426 return mac_check_role(owner, SR_administrator);
03427
03428
03429 default: return(DO_NOT_CARE);
03430 }
03431
03432 case R_SHUTDOWN:
03433 switch(target)
03434 {
03435 case T_NONE:
03436
03437 return mac_check_role(owner, SR_administrator);
03438
03439
03440 default: return(DO_NOT_CARE);
03441 }
03442
03443 case R_RENAME:
03444 switch(target)
03445 {
03446 case T_FILE:
03447 case T_DIR:
03448 case T_FIFO:
03449 case T_SYMLINK:
03450
03451 result = auto_write(caller_pid,
03452 target,
03453 tid,
03454 FALSE);
03455
03456
03457 if( ( (result == GRANTED)
03458 || (result == DO_NOT_CARE)
03459 )
03460 && ( (attr != A_new_dir_dentry_p)
03461 || (attr_val.new_dir_dentry_p != tid.file.dentry_p->d_parent)
03462 )
03463 )
03464 {
03465 if (rsbac_get_attr(MAC,
03466 target,
03467 tid,
03468 A_security_level,
03469 &i_attr_val1,
03470 TRUE))
03471 {
03472 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03473 return(NOT_GRANTED);
03474 }
03475 if(rsbac_set_attr(MAC,
03476 target,
03477 tid,
03478 A_security_level,
03479 i_attr_val1))
03480 {
03481 rsbac_ds_set_error("rsbac_adf_request_mac", A_none);
03482 return(NOT_GRANTED);
03483 }
03484 if (rsbac_get_attr(MAC,
03485 target,
03486 tid,
03487 A_mac_categories,
03488 &i_attr_val1,
03489 TRUE))
03490 {
03491 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03492 return(NOT_GRANTED);
03493 }
03494 if(rsbac_set_attr(MAC,
03495 target,
03496 tid,
03497 A_mac_categories,
03498 i_attr_val1))
03499 {
03500 rsbac_ds_set_error("rsbac_adf_request_mac", A_none);
03501 return(NOT_GRANTED);
03502 }
03503 }
03504 return result;
03505 break;
03506 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03507 case T_USER:
03508 case T_GROUP:
03509
03510 return mac_check_role(owner, SR_security_officer);
03511 #endif
03512
03513 default: return(DO_NOT_CARE);
03514 }
03515
03516
03517 case R_SEARCH:
03518 switch(target)
03519 {
03520 case T_DIR:
03521 case T_SYMLINK:
03522
03523 return(auto_read(caller_pid,
03524 target,
03525 tid,
03526 FALSE));
03527 break;
03528
03529 default: return(DO_NOT_CARE);
03530 }
03531
03532 case R_SEND_SIGNAL:
03533 switch(target)
03534 {
03535 case T_PROCESS:
03536
03537 return(auto_write_attr(caller_pid,
03538 target,
03539 tid,
03540 A_current_sec_level,
03541 A_mac_curr_categories,
03542 FALSE));
03543
03544
03545 default:
03546 return(DO_NOT_CARE);
03547 }
03548
03549
03550
03551 case R_SWITCH_LOG:
03552 switch(target)
03553 {
03554 case T_NONE:
03555
03556 return mac_check_role(owner, SR_security_officer);
03557
03558
03559 default: return(DO_NOT_CARE);
03560 }
03561
03562 case R_SWITCH_MODULE:
03563 switch(target)
03564 {
03565 case T_NONE:
03566
03567 if(attr != A_switch_target)
03568 return(UNDEFINED);
03569
03570 if( (attr_val.switch_target != MAC)
03571 #ifdef CONFIG_RSBAC_MAC_AUTH_PROT
03572 && (attr_val.switch_target != AUTH)
03573 #endif
03574 #ifdef CONFIG_RSBAC_SOFTMODE
03575 && (attr_val.switch_target != SOFTMODE)
03576 #endif
03577 #ifdef CONFIG_RSBAC_FREEZE
03578 && (attr_val.switch_target != FREEZE)
03579 #endif
03580 )
03581 return(DO_NOT_CARE);
03582
03583 return mac_check_role(owner, SR_security_officer);
03584
03585
03586 default: return(DO_NOT_CARE);
03587 }
03588
03589
03590 case R_TERMINATE:
03591 if (target == T_PROCESS)
03592 return(DO_NOT_CARE);
03593 else
03594 return(DO_NOT_CARE);
03595
03596 case R_TRACE:
03597 switch(target)
03598 {
03599 case T_PROCESS:
03600
03601 return(auto_read_write_attr(caller_pid,
03602 target,
03603 tid,
03604 A_current_sec_level,
03605 A_mac_curr_categories,
03606 FALSE));
03607
03608
03609 default:
03610 return(DO_NOT_CARE);
03611 }
03612
03613 case R_TRUNCATE:
03614 switch(target)
03615 {
03616 case T_FILE:
03617
03618 return(auto_write(caller_pid,
03619 target,
03620 tid,
03621 FALSE));
03622 break;
03623
03624 default: return(DO_NOT_CARE);
03625 }
03626
03627 case R_UMOUNT:
03628 switch(target)
03629 {
03630 case T_FILE:
03631 case T_DIR:
03632 case T_DEV:
03633 #ifdef CONFIG_RSBAC_MAC_LIGHT
03634 return(GRANTED);
03635 #else
03636 return mac_check_role(owner, SR_administrator);
03637 #endif
03638
03639 default: return(DO_NOT_CARE);
03640 }
03641
03642 case R_WRITE:
03643 switch(target)
03644 {
03645 case T_DIR:
03646 case T_IPC:
03647 #ifdef CONFIG_RSBAC_RW
03648 case T_FILE:
03649 case T_FIFO:
03650 #endif
03651
03652
03653 return(auto_write(caller_pid,
03654 target,
03655 tid,
03656 FALSE));
03657
03658
03659 #ifdef CONFIG_RSBAC_RW
03660 case T_DEV:
03661
03662 if (rsbac_get_attr(MAC,
03663 T_DEV,
03664 tid,
03665 A_mac_check,
03666 &i_attr_val1,
03667 FALSE))
03668 {
03669 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03670 return(NOT_GRANTED);
03671 }
03672 if(!i_attr_val1.mac_check)
03673 return(DO_NOT_CARE);
03674
03675 return(auto_write(caller_pid,
03676 target,
03677 tid,
03678 FALSE));
03679 break;
03680 #endif
03681
03682 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03683 case T_NETTEMP:
03684 return mac_check_role(owner, SR_security_officer);
03685
03686 case T_NETOBJ:
03687
03688 if (rsbac_get_attr(MAC,
03689 target,
03690 tid,
03691 A_remote_sec_level,
03692 &i_attr_val1,
03693 TRUE))
03694 {
03695 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03696 return(NOT_GRANTED);
03697 }
03698 if (rsbac_get_attr(MAC,
03699 target,
03700 tid,
03701 A_remote_mac_categories,
03702 &i_attr_val2,
03703 TRUE))
03704 {
03705 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03706 return(NOT_GRANTED);
03707 }
03708
03709 return(auto_write_attr(caller_pid,
03710 target,
03711 tid,
03712 A_remote_sec_level,
03713 A_remote_mac_categories,
03714 FALSE));
03715 #endif
03716
03717 #if defined(CONFIG_RSBAC_MAC_UM_PROT)
03718 case T_USER:
03719 case T_GROUP:
03720
03721 return mac_check_role(owner, SR_security_officer);
03722 #endif
03723
03724 default: return(DO_NOT_CARE);
03725 }
03726
03727 case R_WRITE_OPEN:
03728 switch(target)
03729 {
03730 case T_FILE:
03731 case T_FIFO:
03732 case T_IPC:
03733
03734 return(auto_write(caller_pid,
03735 target,
03736 tid,
03737 FALSE));
03738 break;
03739 case T_DEV:
03740
03741 if (rsbac_get_attr(MAC,
03742 T_DEV,
03743 tid,
03744 A_mac_check,
03745 &i_attr_val1,
03746 FALSE))
03747 {
03748 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03749 return(NOT_GRANTED);
03750 }
03751 if(!i_attr_val1.mac_check)
03752 return(DO_NOT_CARE);
03753
03754 return(auto_write(caller_pid,
03755 target,
03756 tid,
03757 FALSE));
03758
03759
03760 default: return(DO_NOT_CARE);
03761 }
03762
03763 case R_SEND:
03764 switch(target)
03765 {
03766 case T_DEV:
03767
03768 if (rsbac_get_attr(MAC,
03769 T_DEV,
03770 tid,
03771 A_mac_check,
03772 &i_attr_val1,
03773 FALSE))
03774 {
03775 rsbac_ds_get_error("rsbac_adf_request_mac", A_none);
03776 return(NOT_GRANTED);
03777 }
03778 if(!i_attr_val1.mac_check)
03779 return(DO_NOT_CARE);
03780
03781 return(auto_write(caller_pid,
03782 target,
03783 tid,
03784 FALSE));
03785
03786 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03787 case T_NETOBJ:
03788
03789 return(auto_read_write_attr(caller_pid,
03790 target,
03791 tid,
03792 A_remote_sec_level,
03793 A_remote_mac_categories,
03794 FALSE));
03795
03796 #endif
03797
03798 default: return(DO_NOT_CARE);
03799 }
03800
03801 #if defined(CONFIG_RSBAC_MAC_NET_OBJ_PROT)
03802 case R_BIND:
03803 case R_LISTEN:
03804 switch(target)
03805 {
03806 case T_NETOBJ:
03807
03808 return(auto_read_write_attr(caller_pid,
03809 target,
03810 tid,
03811 A_local_sec_level,
03812 A_local_mac_categories,
03813 FALSE));
03814
03815
03816 default: return(DO_NOT_CARE);
03817 }
03818
03819 case R_ACCEPT:
03820 case R_CONNECT:
03821 case R_RECEIVE:
03822 switch(target)
03823 {
03824 case T_NETOBJ:
03825
03826 return(auto_read_write_attr(caller_pid,
03827 target,
03828 tid,
03829 A_remote_sec_level,
03830 A_remote_mac_categories,
03831 FALSE));
03832
03833
03834 default: return(DO_NOT_CARE);
03835 }
03836 #endif
03837
03838
03839 default: return DO_NOT_CARE;
03840 }
03841
03842 return(result);
03843 }
03844
03845
03846
03847
03848
03849
03850
03851
03852
03853
03854
03855
03856
03857 int rsbac_adf_set_attr_mac(
03858 enum rsbac_adf_request_t request,
03859 rsbac_pid_t caller_pid,
03860 enum rsbac_target_t target,
03861 union rsbac_target_id_t tid,
03862 enum rsbac_target_t new_target,
03863 union rsbac_target_id_t new_tid,
03864 enum rsbac_attribute_t attr,
03865 union rsbac_attribute_value_t attr_val,
03866 rsbac_uid_t owner)
03867 {
03868 enum rsbac_adf_req_ret_t result = DO_NOT_CARE;
03869 union rsbac_target_id_t i_tid;
03870 union rsbac_attribute_value_t i_attr_val1;
03871 union rsbac_attribute_value_t i_attr_val2;
03872 union rsbac_attribute_value_t i_attr_val3;
03873 union rsbac_attribute_value_t i_attr_val4;
03874 union rsbac_attribute_value_t i_attr_val5;
03875 union rsbac_attribute_value_t i_attr_val6;
03876 union rsbac_attribute_value_t i_attr_val7;
03877 union rsbac_attribute_value_t i_attr_val8;
03878 union rsbac_attribute_value_t i_attr_val9;
03879 rsbac_boolean_t inherit;
03880
03881 switch (request)
03882 {
03883 case R_APPEND_OPEN:
03884 switch(target)
03885 {
03886 case T_FILE:
03887 case T_FIFO:
03888 case T_IPC:
03889
03890 if( (target == T_FILE)
03891 || (target == T_FIFO)
03892 )
03893 inherit = TRUE;
03894 else
03895 inherit = FALSE;
03896 if (rsbac_get_attr(MAC,
03897 target,
03898 tid,
03899 A_security_level,
03900 &i_attr_val1,
03901 inherit))
03902 {
03903 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03904 return(-RSBAC_EREADFAILED);
03905 }
03906 if (rsbac_get_attr(MAC,
03907 target,
03908 tid,
03909 A_mac_categories,
03910 &i_attr_val2,
03911 inherit))
03912 {
03913 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03914 return(-RSBAC_EREADFAILED);
03915 }
03916
03917 result = auto_write(caller_pid,
03918 target,
03919 tid,
03920 TRUE);
03921 if ((result == GRANTED) || (result == DO_NOT_CARE))
03922 return(0);
03923 else
03924 return(-RSBAC_EDECISIONMISMATCH);
03925 break;
03926 case T_DEV:
03927
03928 if (rsbac_get_attr(MAC,
03929 T_DEV,
03930 tid,
03931 A_mac_check,
03932 &i_attr_val1,
03933 FALSE))
03934 {
03935 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03936 return(-RSBAC_EREADFAILED);
03937 }
03938 if(!i_attr_val1.mac_check)
03939 return(0);
03940
03941 result = auto_write(caller_pid,
03942 target,
03943 tid,
03944 TRUE);
03945 if ((result == GRANTED) || (result == DO_NOT_CARE))
03946 return(0);
03947 else
03948 return(-RSBAC_EDECISIONMISMATCH);
03949 break;
03950
03951 default: return(0);
03952 }
03953
03954 case R_CHANGE_OWNER:
03955 switch(target)
03956 {
03957
03958
03959 case T_PROCESS:
03960
03961 if (attr != A_owner)
03962 return(-RSBAC_EINVALIDATTR);
03963
03964
03965 i_tid.user = attr_val.owner;
03966 if (rsbac_get_attr(MAC,
03967 T_USER,
03968 i_tid,
03969 A_security_level,
03970 &i_attr_val2,
03971 TRUE))
03972 {
03973 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03974 return(-RSBAC_EREADFAILED);
03975 }
03976 if (rsbac_get_attr(MAC,
03977 T_USER,
03978 i_tid,
03979 A_mac_categories,
03980 &i_attr_val3,
03981 TRUE))
03982 {
03983 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
03984 return(-RSBAC_EREADFAILED);
03985 }
03986
03987 if (rsbac_set_attr(MAC,
03988 T_PROCESS,
03989 tid,
03990 A_security_level,
03991 i_attr_val2))
03992 {
03993 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
03994 return(-RSBAC_EWRITEFAILED);
03995 }
03996 if (rsbac_set_attr(MAC,
03997 T_PROCESS,
03998 tid,
03999 A_mac_categories,
04000 i_attr_val3))
04001 {
04002 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04003 return(-RSBAC_EWRITEFAILED);
04004 }
04005
04006 if (rsbac_get_attr(MAC,
04007 T_PROCESS,
04008 tid,
04009 A_min_write_open,
04010 &i_attr_val4,
04011 TRUE))
04012 {
04013 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04014 return(-RSBAC_EREADFAILED);
04015 }
04016 if (rsbac_get_attr(MAC,
04017 T_PROCESS,
04018 tid,
04019 A_min_write_categories,
04020 &i_attr_val5,
04021 TRUE))
04022 {
04023 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04024 return(-RSBAC_EREADFAILED);
04025 }
04026
04027 if(i_attr_val2.security_level < i_attr_val4.min_write_open)
04028 {
04029 i_attr_val4.min_write_open = i_attr_val2.security_level;
04030 if(rsbac_set_attr(MAC,
04031 T_PROCESS,
04032 tid,
04033 A_min_write_open,
04034 i_attr_val4))
04035 {
04036 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04037 return(-RSBAC_EWRITEFAILED);
04038 }
04039 }
04040
04041
04042 if ((i_attr_val3.mac_categories & i_attr_val5.mac_categories)
04043 != i_attr_val5.mac_categories)
04044 {
04045 i_attr_val5.mac_categories &= i_attr_val3.mac_categories;
04046 if(rsbac_set_attr(MAC,
04047 T_PROCESS,
04048 tid,
04049 A_min_write_categories,
04050 i_attr_val5))
04051 {
04052 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04053 return(-RSBAC_EWRITEFAILED);
04054 }
04055 }
04056
04057
04058
04059 i_tid.user = attr_val.owner;
04060 if (rsbac_get_attr(MAC,
04061 T_USER,
04062 i_tid,
04063 A_initial_security_level,
04064 &i_attr_val6,
04065 TRUE))
04066 {
04067 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04068 return(-RSBAC_EREADFAILED);
04069 }
04070 if (rsbac_set_attr(MAC,
04071 T_PROCESS,
04072 tid,
04073 A_initial_security_level,
04074 i_attr_val6))
04075 {
04076 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04077 return(-RSBAC_EWRITEFAILED);
04078 }
04079 #if 0
04080
04081 if(i_attr_val6.security_level > i_attr_val4.min_write_open)
04082 i_attr_val6.security_level = i_attr_val4.min_write_open;
04083 #endif
04084 if (rsbac_get_attr(MAC,
04085 T_USER,
04086 i_tid,
04087 A_mac_initial_categories,
04088 &i_attr_val7,
04089 TRUE))
04090 {
04091 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04092 return(-RSBAC_EREADFAILED);
04093 }
04094 if (rsbac_set_attr(MAC,
04095 T_PROCESS,
04096 tid,
04097 A_mac_initial_categories,
04098 i_attr_val7))
04099 {
04100 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04101 return(-RSBAC_EWRITEFAILED);
04102 }
04103 #if 0
04104
04105 if((i_attr_val7.mac_categories & i_attr_val5.mac_categories) != i_attr_val7.mac_categories)
04106 i_attr_val7.mac_categories &= i_attr_val5.mac_categories;
04107 #endif
04108
04109 i_tid.user = attr_val.owner;
04110 if (rsbac_get_attr(MAC,
04111 T_USER,
04112 i_tid,
04113 A_min_security_level,
04114 &i_attr_val8,
04115 TRUE))
04116 {
04117 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04118 return(-RSBAC_EREADFAILED);
04119 }
04120 if (rsbac_get_attr(MAC,
04121 T_USER,
04122 i_tid,
04123 A_mac_min_categories,
04124 &i_attr_val9,
04125 TRUE))
04126 {
04127 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04128 return(-RSBAC_EREADFAILED);
04129 }
04130
04131
04132 if (rsbac_set_attr(MAC,
04133 T_PROCESS,
04134 tid,
04135 A_min_security_level,
04136 i_attr_val8))
04137 {
04138 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04139 return(-RSBAC_EWRITEFAILED);
04140 }
04141 if (rsbac_set_attr(MAC,
04142 T_PROCESS,
04143 tid,
04144 A_mac_min_categories,
04145 i_attr_val9))
04146 {
04147 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04148 return(-RSBAC_EWRITEFAILED);
04149 }
04150
04151 if (rsbac_get_attr(MAC,
04152 T_PROCESS,
04153 tid,
04154 A_max_read_open,
04155 &i_attr_val4,
04156 TRUE))
04157 {
04158 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04159 return(-RSBAC_EREADFAILED);
04160 }
04161 if (rsbac_get_attr(MAC,
04162 T_PROCESS,
04163 tid,
04164 A_max_read_categories,
04165 &i_attr_val5,
04166 TRUE))
04167 {
04168 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04169 return(-RSBAC_EREADFAILED);
04170 }
04171
04172 if (i_attr_val8.security_level > i_attr_val4.max_read_open)
04173 {
04174 i_attr_val4.max_read_open = i_attr_val8.security_level;
04175 if(rsbac_set_attr(MAC,
04176 T_PROCESS,
04177 tid,
04178 A_max_read_open,
04179 i_attr_val4))
04180 {
04181 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04182 return(-RSBAC_EWRITEFAILED);
04183 }
04184 }
04185 #if 0
04186
04187 if(i_attr_val6.security_level < i_attr_val4.max_read_open)
04188 i_attr_val6.security_level = i_attr_val4.max_read_open;
04189 #endif
04190
04191 if(i_attr_val6.security_level > i_attr_val2.security_level)
04192 i_attr_val6.security_level = i_attr_val2.security_level;
04193 else
04194 if(i_attr_val6.security_level < i_attr_val8.security_level)
04195 i_attr_val6.security_level = i_attr_val8.security_level;
04196 if(rsbac_set_attr(MAC,
04197 T_PROCESS,
04198 tid,
04199 A_current_sec_level,
04200 i_attr_val6))
04201 {
04202 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04203 return(-RSBAC_EWRITEFAILED);
04204 }
04205
04206
04207
04208
04209 if ((i_attr_val9.mac_categories & i_attr_val5.mac_categories)
04210 != i_attr_val9.mac_categories)
04211 {
04212 i_attr_val5.mac_categories |= i_attr_val9.mac_categories;
04213 if(rsbac_set_attr(MAC,
04214 T_PROCESS,
04215 tid,
04216 A_max_read_categories,
04217 i_attr_val5))
04218 {
04219 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04220 return(-RSBAC_EWRITEFAILED);
04221 }
04222 }
04223 #if 0
04224
04225 if((i_attr_val7.mac_categories & i_attr_val5.mac_categories) != i_attr_val5.mac_categories)
04226 i_attr_val7.mac_categories |= i_attr_val5.mac_categories;
04227 #endif
04228
04229 if((i_attr_val7.mac_categories & i_attr_val3.mac_categories) != i_attr_val7.mac_categories)
04230 i_attr_val7.mac_categories &= i_attr_val3.mac_categories;
04231 else
04232 if((i_attr_val7.mac_categories & i_attr_val9.mac_categories) != i_attr_val9.mac_categories)
04233 i_attr_val7.mac_categories |= i_attr_val9.mac_categories;
04234 if(rsbac_set_attr(MAC,
04235 T_PROCESS,
04236 tid,
04237 A_mac_curr_categories,
04238 i_attr_val7))
04239 {
04240 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04241 return(-RSBAC_EWRITEFAILED);
04242 }
04243
04244
04245 i_tid.user = attr_val.owner;
04246 if (rsbac_get_attr(MAC,
04247 T_USER,
04248 i_tid,
04249 A_mac_user_flags,
04250 &i_attr_val3,
04251 TRUE))
04252 {
04253 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04254 return(-RSBAC_EREADFAILED);
04255 }
04256 i_attr_val1.mac_process_flags = i_attr_val3.mac_user_flags;
04257
04258 if (rsbac_get_attr(MAC,
04259 T_PROCESS,
04260 tid,
04261 A_mac_process_flags,
04262 &i_attr_val2,
04263 TRUE))
04264 {
04265 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04266 return(-RSBAC_EREADFAILED);
04267 }
04268 if( (i_attr_val2.mac_process_flags & MAC_program_auto)
04269 && (i_attr_val3.mac_user_flags & MAC_allow_auto)
04270 )
04271 i_attr_val1.mac_process_flags |= MAC_auto;
04272
04273 i_attr_val1.mac_process_flags &= RSBAC_MAC_P_FLAGS;
04274
04275 if(!(i_attr_val1.mac_process_flags & MAC_trusted))
04276 {
04277 if(rsbac_mac_p_truset_member(caller_pid, attr_val.owner))
04278 i_attr_val1.mac_process_flags |= MAC_trusted;
04279 }
04280
04281 if (rsbac_set_attr(MAC,
04282 T_PROCESS,
04283 tid,
04284 A_mac_process_flags,
04285 i_attr_val1))
04286 {
04287 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04288 return(-RSBAC_EWRITEFAILED);
04289 }
04290
04291 return(0);
04292
04293
04294 default:
04295 return(0);
04296 }
04297
04298 case R_CLONE:
04299 if (target == T_PROCESS)
04300 {
04301
04302 i_attr_val1.owner = owner;
04303
04304 if (rsbac_get_attr(MAC,
04305 T_PROCESS,
04306 tid,
04307 A_security_level,
04308 &i_attr_val2,
04309 FALSE))
04310 {
04311 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04312 return(-RSBAC_EREADFAILED);
04313 }
04314
04315 if (rsbac_get_attr(MAC,
04316 T_PROCESS,
04317 tid,
04318 A_current_sec_level,
04319 &i_attr_val3,
04320 FALSE))
04321 {
04322 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04323 return(-RSBAC_EREADFAILED);
04324 }
04325
04326 if (rsbac_get_attr(MAC,
04327 T_PROCESS,
04328 tid,
04329 A_min_write_open,
04330 &i_attr_val4,
04331 FALSE))
04332 {
04333 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04334 return(-RSBAC_EREADFAILED);
04335 }
04336
04337 if (rsbac_get_attr(MAC,
04338 T_PROCESS,
04339 tid,
04340 A_max_read_open,
04341 &i_attr_val5,
04342 FALSE))
04343 {
04344 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04345 return(-RSBAC_EREADFAILED);
04346 }
04347
04348 if (rsbac_get_attr(MAC,
04349 T_PROCESS,
04350 tid,
04351 A_mac_process_flags,
04352 &i_attr_val7,
04353 FALSE))
04354 {
04355 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04356 return(-RSBAC_EREADFAILED);
04357 }
04358
04359 #ifdef CONFIG_RSBAC_USE_RSBAC_OWNER
04360
04361 if (rsbac_set_attr(MAC,
04362 T_PROCESS,
04363 new_tid,
04364 A_owner,
04365 i_attr_val1))
04366 {
04367 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04368 return(-RSBAC_EWRITEFAILED);
04369 }
04370 #endif
04371
04372 if (rsbac_set_attr(MAC,
04373 T_PROCESS,
04374 new_tid,
04375 A_security_level,
04376 i_attr_val2))
04377 {
04378 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04379 return(-RSBAC_EWRITEFAILED);
04380 }
04381
04382 if (rsbac_set_attr(MAC,
04383 T_PROCESS,
04384 new_tid,
04385 A_current_sec_level,
04386 i_attr_val3))
04387 {
04388 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04389 return(-RSBAC_EWRITEFAILED);
04390 }
04391
04392 if (rsbac_set_attr(MAC,
04393 T_PROCESS,
04394 new_tid,
04395 A_min_write_open,
04396 i_attr_val4))
04397 {
04398 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04399 return(-RSBAC_EWRITEFAILED);
04400 }
04401
04402 if (rsbac_set_attr(MAC,
04403 T_PROCESS,
04404 new_tid,
04405 A_max_read_open,
04406 i_attr_val5))
04407 {
04408 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04409 return(-RSBAC_EWRITEFAILED);
04410 }
04411
04412 if (rsbac_set_attr(MAC,
04413 T_PROCESS,
04414 new_tid,
04415 A_mac_process_flags,
04416 i_attr_val7))
04417 {
04418 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04419 return(-RSBAC_EWRITEFAILED);
04420 }
04421
04422
04423 if (rsbac_get_attr(MAC,
04424 T_PROCESS,
04425 tid,
04426 A_mac_categories,
04427 &i_attr_val2,
04428 FALSE))
04429 {
04430 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04431 return(-RSBAC_EREADFAILED);
04432 }
04433
04434 if (rsbac_get_attr(MAC,
04435 T_PROCESS,
04436 tid,
04437 A_mac_curr_categories,
04438 &i_attr_val3,
04439 FALSE))
04440 {
04441 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04442 return(-RSBAC_EREADFAILED);
04443 }
04444
04445 if (rsbac_get_attr(MAC,
04446 T_PROCESS,
04447 tid,
04448 A_min_write_categories,
04449 &i_attr_val4,
04450 FALSE))
04451 {
04452 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04453 return(-RSBAC_EREADFAILED);
04454 }
04455
04456 if (rsbac_get_attr(MAC,
04457 T_PROCESS,
04458 tid,
04459 A_max_read_categories,
04460 &i_attr_val5,
04461 FALSE))
04462 {
04463 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04464 return(-RSBAC_EREADFAILED);
04465 }
04466
04467 if (rsbac_get_attr(MAC,
04468 T_PROCESS,
04469 tid,
04470 A_initial_security_level,
04471 &i_attr_val6,
04472 FALSE))
04473 {
04474 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04475 return(-RSBAC_EREADFAILED);
04476 }
04477
04478 if (rsbac_get_attr(MAC,
04479 T_PROCESS,
04480 tid,
04481 A_mac_initial_categories,
04482 &i_attr_val7,
04483 FALSE))
04484 {
04485 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04486 return(-RSBAC_EREADFAILED);
04487 }
04488
04489 if (rsbac_set_attr(MAC,
04490 T_PROCESS,
04491 new_tid,
04492 A_mac_categories,
04493 i_attr_val2))
04494 {
04495 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04496 return(-RSBAC_EWRITEFAILED);
04497 }
04498
04499 if (rsbac_set_attr(MAC,
04500 T_PROCESS,
04501 new_tid,
04502 A_mac_curr_categories,
04503 i_attr_val3))
04504 {
04505 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04506 return(-RSBAC_EWRITEFAILED);
04507 }
04508
04509 if (rsbac_set_attr(MAC,
04510 T_PROCESS,
04511 new_tid,
04512 A_min_write_categories,
04513 i_attr_val4))
04514 {
04515 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04516 return(-RSBAC_EWRITEFAILED);
04517 }
04518
04519 if (rsbac_set_attr(MAC,
04520 T_PROCESS,
04521 new_tid,
04522 A_max_read_categories,
04523 i_attr_val5))
04524 {
04525 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04526 return(-RSBAC_EWRITEFAILED);
04527 }
04528
04529 if (rsbac_set_attr(MAC,
04530 T_PROCESS,
04531 new_tid,
04532 A_initial_security_level,
04533 i_attr_val6))
04534 {
04535 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04536 return(-RSBAC_EWRITEFAILED);
04537 }
04538
04539 if (rsbac_set_attr(MAC,
04540 T_PROCESS,
04541 new_tid,
04542 A_mac_initial_categories,
04543 i_attr_val7))
04544 {
04545 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04546 return(-RSBAC_EWRITEFAILED);
04547 }
04548
04549 if (rsbac_get_attr(MAC,
04550 T_PROCESS,
04551 tid,
04552 A_min_security_level,
04553 &i_attr_val2,
04554 FALSE))
04555 {
04556 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04557 return(-RSBAC_EREADFAILED);
04558 }
04559 if (rsbac_get_attr(MAC,
04560 T_PROCESS,
04561 tid,
04562 A_mac_min_categories,
04563 &i_attr_val3,
04564 FALSE))
04565 {
04566 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04567 return(-RSBAC_EREADFAILED);
04568 }
04569
04570 if (rsbac_set_attr(MAC,
04571 T_PROCESS,
04572 new_tid,
04573 A_min_security_level,
04574 i_attr_val2))
04575 {
04576 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04577 return(-RSBAC_EWRITEFAILED);
04578 }
04579
04580 if (rsbac_set_attr(MAC,
04581 T_PROCESS,
04582 new_tid,
04583 A_mac_min_categories,
04584 i_attr_val3))
04585 {
04586 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04587 return(-RSBAC_EWRITEFAILED);
04588 }
04589 if (rsbac_mac_copy_pp_truset(tid.process, new_tid.process))
04590 {
04591 rsbac_printk(KERN_WARNING
04592 "rsbac_adf_set_attr_mac(): rsbac_mac_copy_pp_truset() returned error!\n");
04593 return(-RSBAC_EWRITEFAILED);
04594 }
04595 return(0);
04596 }
04597 else
04598 return(0);
04599
04600 case R_CREATE:
04601 switch(target)
04602 {
04603
04604 case T_DIR:
04605
04606
04607
04608
04609 #ifndef CONFIG_RSBAC_MAC_LIGHT
04610 result = auto_write(caller_pid,
04611 target,
04612 tid,
04613 FALSE);
04614 if ((result != GRANTED) && (result != DO_NOT_CARE))
04615 return(-RSBAC_EDECISIONMISMATCH);
04616 #endif
04617
04618 if (rsbac_get_attr(MAC,
04619 T_DIR,
04620 tid,
04621 A_security_level,
04622 &i_attr_val1,
04623 TRUE))
04624 {
04625 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04626 return(-RSBAC_EREADFAILED);
04627 }
04628 if (rsbac_get_attr(MAC,
04629 T_DIR,
04630 tid,
04631 A_mac_categories,
04632 &i_attr_val2,
04633 TRUE))
04634 {
04635 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04636 return(-RSBAC_EREADFAILED);
04637 }
04638
04639 i_tid.process = caller_pid;
04640 if (rsbac_get_attr(MAC,
04641 T_PROCESS,
04642 i_tid,
04643 A_current_sec_level,
04644 &i_attr_val3,
04645 FALSE))
04646 {
04647 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04648 return(-RSBAC_EREADFAILED);
04649 }
04650 #ifdef CONFIG_RSBAC_MAC_SMART_INHERIT
04651
04652 if(i_attr_val3.security_level != i_attr_val1.security_level)
04653 #endif
04654
04655 if (rsbac_set_attr(MAC,
04656 new_target,
04657 new_tid,
04658 A_security_level,
04659 i_attr_val3))
04660 {
04661 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04662 return(-RSBAC_EWRITEFAILED);
04663 }
04664
04665 if (rsbac_get_attr(MAC,
04666 T_PROCESS,
04667 i_tid,
04668 A_mac_curr_categories,
04669 &i_attr_val3,
04670 FALSE))
04671 {
04672 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04673 return(-RSBAC_EREADFAILED);
04674 }
04675 #ifdef CONFIG_RSBAC_MAC_SMART_INHERIT
04676
04677 if(i_attr_val3.mac_categories != i_attr_val2.mac_categories)
04678 #endif
04679
04680 if (rsbac_set_attr(MAC,
04681 new_target,
04682 new_tid,
04683 A_mac_categories,
04684 i_attr_val3))
04685 {
04686 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04687 return(-RSBAC_EWRITEFAILED);
04688 }
04689 return(0);
04690 break;
04691
04692 case T_IPC:
04693 i_tid.process = caller_pid;
04694
04695 if (rsbac_get_attr(MAC,
04696 T_PROCESS,
04697 i_tid,
04698 A_current_sec_level,
04699 &i_attr_val1,
04700 FALSE))
04701 {
04702 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04703 return(-RSBAC_EREADFAILED);
04704 }
04705
04706 if (rsbac_set_attr(MAC,
04707 T_IPC,
04708 tid,
04709 A_security_level,
04710 i_attr_val1))
04711 {
04712 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04713 return(-RSBAC_EWRITEFAILED);
04714 }
04715
04716 if (rsbac_get_attr(MAC,
04717 T_PROCESS,
04718 i_tid,
04719 A_mac_curr_categories,
04720 &i_attr_val1,
04721 FALSE))
04722 {
04723 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04724 return(-RSBAC_EREADFAILED);
04725 }
04726
04727 if (rsbac_set_attr(MAC,
04728 T_IPC,
04729 tid,
04730 A_mac_categories,
04731 i_attr_val1))
04732 {
04733 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04734 return(-RSBAC_EWRITEFAILED);
04735 }
04736 return(0);
04737 break;
04738
04739 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
04740 case T_NETOBJ:
04741 i_tid.process = caller_pid;
04742
04743 if (rsbac_get_attr(MAC,
04744 T_PROCESS,
04745 i_tid,
04746 A_current_sec_level,
04747 &i_attr_val1,
04748 FALSE))
04749 {
04750 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04751 return(-RSBAC_EREADFAILED);
04752 }
04753
04754 if (rsbac_set_attr(MAC,
04755 target,
04756 tid,
04757 A_local_sec_level,
04758 i_attr_val1))
04759 {
04760 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04761 return(-RSBAC_EWRITEFAILED);
04762 }
04763
04764 if (rsbac_get_attr(MAC,
04765 T_PROCESS,
04766 i_tid,
04767 A_mac_curr_categories,
04768 &i_attr_val1,
04769 FALSE))
04770 {
04771 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04772 return(-RSBAC_EREADFAILED);
04773 }
04774
04775 if (rsbac_set_attr(MAC,
04776 target,
04777 tid,
04778 A_local_mac_categories,
04779 i_attr_val1))
04780 {
04781 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04782 return(-RSBAC_EWRITEFAILED);
04783 }
04784 return(0);
04785 break;
04786 #endif
04787
04788
04789 default:
04790 return(0);
04791 }
04792
04793
04794 case R_DELETE:
04795 switch(target)
04796 {
04797 case T_FILE:
04798 case T_DIR:
04799 case T_FIFO:
04800 case T_SYMLINK:
04801 case T_IPC:
04802
04803
04804
04805 result = auto_write(caller_pid,
04806 target,
04807 tid,
04808 FALSE);
04809 if ((result != GRANTED) && (result != DO_NOT_CARE))
04810 return(-RSBAC_EDECISIONMISMATCH);
04811 else
04812 return(0);
04813
04814 default:
04815 return(0);
04816 }
04817
04818 case R_EXECUTE:
04819 switch(target)
04820 {
04821 case T_FILE:
04822
04823 if (rsbac_mac_copy_fp_truset(tid.file, caller_pid))
04824 {
04825 rsbac_printk(KERN_WARNING
04826 "rsbac_adf_set_attr_mac(): rsbac_mac_copy_fp_truset() returned error!\n");
04827 return(-RSBAC_EWRITEFAILED);
04828 }
04829
04830 result = auto_read(caller_pid,
04831 target,
04832 tid,
04833 TRUE);
04834 if ((result != GRANTED) && (result != DO_NOT_CARE))
04835 return(-RSBAC_EDECISIONMISMATCH);
04836
04837
04838
04839 i_tid.process = caller_pid;
04840
04841 #ifdef CONFIG_RSBAC_MAC_RESET_CURR
04842
04843 if (rsbac_get_attr(MAC,
04844 T_PROCESS,
04845 i_tid,
04846 A_initial_security_level,
04847 &i_attr_val1,
04848 TRUE))
04849 {
04850 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04851 return(-RSBAC_EREADFAILED);
04852 }
04853 if (rsbac_get_attr(MAC,
04854 T_PROCESS,
04855 i_tid,
04856 A_mac_initial_categories,
04857 &i_attr_val2,
04858 TRUE))
04859 {
04860 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04861 return(-RSBAC_EREADFAILED);
04862 }
04863 if (rsbac_set_attr(MAC,
04864 T_PROCESS,
04865 i_tid,
04866 A_current_sec_level,
04867 i_attr_val1))
04868 {
04869 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04870 return(-RSBAC_EWRITEFAILED);
04871 }
04872 if (rsbac_set_attr(MAC,
04873 T_PROCESS,
04874 i_tid,
04875 A_mac_curr_categories,
04876 i_attr_val2))
04877 {
04878 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04879 return(-RSBAC_EWRITEFAILED);
04880 }
04881 #endif
04882 #if 0
04883
04884 if (rsbac_get_attr(MAC,
04885 T_PROCESS,
04886 i_tid,
04887 A_security_level,
04888 &i_attr_val1,
04889 TRUE))
04890 {
04891 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04892 return(-RSBAC_EREADFAILED);
04893 }
04894 #endif
04895 i_attr_val1.min_write_open = SL_max;
04896 if (rsbac_set_attr(MAC,
04897 T_PROCESS,
04898 i_tid,
04899 A_min_write_open,
04900 i_attr_val1))
04901 {
04902 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04903 return(-RSBAC_EWRITEFAILED);
04904 }
04905 #if 0
04906
04907 if (rsbac_get_attr(MAC,
04908 T_PROCESS,
04909 i_tid,
04910 A_mac_categories,
04911 &i_attr_val2,
04912 TRUE))
04913 {
04914 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04915 return(-RSBAC_EREADFAILED);
04916 }
04917 #endif
04918 i_attr_val2.mac_categories = RSBAC_MAC_MAX_CAT_VECTOR;
04919 if (rsbac_set_attr(MAC,
04920 T_PROCESS,
04921 i_tid,
04922 A_min_write_categories,
04923 i_attr_val2))
04924 {
04925 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04926 return(-RSBAC_EWRITEFAILED);
04927 }
04928
04929 #if 0
04930
04931 if (rsbac_get_attr(MAC,
04932 T_PROCESS,
04933 i_tid,
04934 A_min_security_level,
04935 &i_attr_val1,
04936 TRUE))
04937 {
04938 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04939 return(-RSBAC_EREADFAILED);
04940 }
04941 if (rsbac_get_attr(MAC,
04942 T_PROCESS,
04943 i_tid,
04944 A_mac_min_categories,
04945 &i_attr_val2,
04946 TRUE))
04947 {
04948 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04949 return(-RSBAC_EREADFAILED);
04950 }
04951 #endif
04952 i_attr_val1.max_read_open = SL_min;
04953 i_attr_val2.mac_categories = RSBAC_MAC_MIN_CAT_VECTOR;
04954 if (rsbac_set_attr(MAC,
04955 T_PROCESS,
04956 i_tid,
04957 A_max_read_open,
04958 i_attr_val1))
04959 {
04960 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04961 return(-RSBAC_EWRITEFAILED);
04962 }
04963
04964 if (rsbac_set_attr(MAC,
04965 T_PROCESS,
04966 i_tid,
04967 A_max_read_categories,
04968 i_attr_val2))
04969 {
04970 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
04971 return(-RSBAC_EWRITEFAILED);
04972 }
04973
04974 if (rsbac_get_attr(MAC,
04975 T_PROCESS,
04976 i_tid,
04977 A_mac_process_flags,
04978 &i_attr_val1,
04979 TRUE))
04980 {
04981 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04982 return(-RSBAC_EREADFAILED);
04983 }
04984 if (rsbac_get_attr(MAC,
04985 target,
04986 tid,
04987 A_mac_auto,
04988 &i_attr_val2,
04989 TRUE))
04990 {
04991 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
04992 return(-RSBAC_EREADFAILED);
04993 }
04994 if(i_attr_val2.mac_auto)
04995 {
04996 i_attr_val1.mac_process_flags |= MAC_program_auto;
04997 i_tid.user = owner;
04998 if (rsbac_get_attr(MAC,
04999 T_USER,
05000 i_tid,
05001 A_mac_user_flags,
05002 &i_attr_val2,
05003 TRUE))
05004 {
05005 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05006 return(-RSBAC_EREADFAILED);
05007 }
05008 if(i_attr_val2.mac_user_flags & MAC_allow_auto)
05009 i_attr_val1.mac_process_flags |= MAC_auto;
05010 else
05011 i_attr_val1.mac_process_flags &= ~MAC_auto;
05012 i_tid.process = caller_pid;
05013 }
05014 else
05015 {
05016 i_attr_val1.mac_process_flags &= ~MAC_program_auto;
05017 i_attr_val1.mac_process_flags &= ~MAC_auto;
05018 }
05019 if (rsbac_get_attr(MAC,
05020 T_FILE,
05021 tid,
05022 A_mac_prop_trusted,
05023 &i_attr_val3,
05024 TRUE))
05025 {
05026 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05027 return(-RSBAC_EREADFAILED);
05028 }
05029 if( !(i_attr_val3.mac_prop_trusted)
05030 || !(i_attr_val1.mac_process_flags & MAC_trusted)
05031 )
05032 {
05033 if(rsbac_mac_p_truset_member(caller_pid, owner))
05034 i_attr_val1.mac_process_flags |= MAC_trusted;
05035 else
05036 {
05037 i_tid.user = owner;
05038 if (rsbac_get_attr(MAC,
05039 T_USER,
05040 i_tid,
05041 A_mac_user_flags,
05042 &i_attr_val2,
05043 TRUE))
05044 {
05045 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05046 return(-RSBAC_EREADFAILED);
05047 }
05048 if(i_attr_val2.mac_user_flags & MAC_trusted)
05049 i_attr_val1.mac_process_flags |= MAC_trusted;
05050 else
05051 i_attr_val1.mac_process_flags &= ~MAC_trusted;
05052 i_tid.process = caller_pid;
05053 }
05054 }
05055 if (rsbac_set_attr(MAC,
05056 T_PROCESS,
05057 i_tid,
05058 A_mac_process_flags,
05059 i_attr_val1))
05060 {
05061 rsbac_ds_set_error("rsbac_adf_set_attr_mac", A_none);
05062 return(-RSBAC_EWRITEFAILED);
05063 }
05064 return(0);
05065
05066
05067 default:
05068 return(0);
05069 }
05070
05071 case R_MOUNT:
05072 switch(target)
05073 {
05074 case T_DIR:
05075 case T_DEV:
05076
05077 if( (target == T_DEV)
05078 && (attr == A_mode)
05079 && (attr_val.mode & MS_RDONLY))
05080 result = auto_read(caller_pid,
05081 target,
05082 tid,
05083 TRUE);
05084 else
05085 result = auto_read_write(caller_pid,
05086 target,
05087 tid,
05088 TRUE);
05089 if ((result != GRANTED) && (result != DO_NOT_CARE))
05090 return(-RSBAC_EDECISIONMISMATCH);
05091 else
05092 return(0);
05093
05094
05095 default:
05096 return(0);
05097 }
05098
05099 case R_READ:
05100 switch(target)
05101 {
05102 case T_DIR:
05103 #ifdef CONFIG_RSBAC_RW
05104 case T_FILE:
05105 case T_FIFO:
05106 case T_IPC:
05107 #endif
05108
05109 result = auto_read(caller_pid,
05110 target,
05111 tid,
05112 TRUE);
05113 if ((result != GRANTED) && (result != DO_NOT_CARE))
05114 return(-RSBAC_EDECISIONMISMATCH);
05115 return(0);
05116
05117 #ifdef CONFIG_RSBAC_RW
05118 case T_DEV:
05119
05120 if (rsbac_get_attr(MAC,
05121 T_DEV,
05122 tid,
05123 A_mac_check,
05124 &i_attr_val1,
05125 FALSE))
05126 {
05127 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05128 return(-RSBAC_EREADFAILED);
05129 }
05130 if(!i_attr_val1.mac_check)
05131 return(0);
05132
05133 result = auto_read(caller_pid,
05134 target,
05135 tid,
05136 TRUE);
05137 if ((result != GRANTED) && (result != DO_NOT_CARE))
05138 return(-RSBAC_EDECISIONMISMATCH);
05139 return(0);
05140 #endif
05141
05142 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
05143 case T_NETOBJ:
05144
05145 result = auto_read_attr(caller_pid,
05146 target,
05147 tid,
05148 A_remote_sec_level,
05149 A_remote_mac_categories,
05150 TRUE);
05151 if ((result != GRANTED) && (result != DO_NOT_CARE))
05152 return(-RSBAC_EDECISIONMISMATCH);
05153 return(0);
05154 #endif
05155
05156
05157 default:
05158 return(0);
05159 }
05160
05161 case R_READ_OPEN:
05162 switch(target)
05163 {
05164 case T_FILE:
05165 case T_DIR:
05166 case T_FIFO:
05167 case T_IPC:
05168
05169 result = auto_read(caller_pid,
05170 target,
05171 tid,
05172 TRUE);
05173 if ((result != GRANTED) && (result != DO_NOT_CARE))
05174 return(-RSBAC_EDECISIONMISMATCH);
05175 return(0);
05176
05177 case T_DEV:
05178
05179 if (rsbac_get_attr(MAC,
05180 T_DEV,
05181 tid,
05182 A_mac_check,
05183 &i_attr_val1,
05184 FALSE))
05185 {
05186 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05187 return(-RSBAC_EREADFAILED);
05188 }
05189 if(!i_attr_val1.mac_check)
05190 return(0);
05191
05192 result = auto_read(caller_pid,
05193 target,
05194 tid,
05195 TRUE);
05196 if ((result != GRANTED) && (result != DO_NOT_CARE))
05197 return(-RSBAC_EDECISIONMISMATCH);
05198 return(0);
05199
05200
05201 default:
05202 return(0);
05203 }
05204
05205 case R_READ_WRITE_OPEN:
05206 switch(target)
05207 {
05208 case T_FILE:
05209 case T_FIFO:
05210 case T_IPC:
05211
05212 result = auto_read_write(caller_pid,
05213 target,
05214 tid,
05215 TRUE);
05216 if ((result != GRANTED) && (result != DO_NOT_CARE))
05217 return(-RSBAC_EDECISIONMISMATCH);
05218 return(0);
05219
05220 case T_DEV:
05221
05222 if (rsbac_get_attr(MAC,
05223 T_DEV,
05224 tid,
05225 A_mac_check,
05226 &i_attr_val1,
05227 FALSE))
05228 {
05229 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05230 return(-RSBAC_EREADFAILED);
05231 }
05232 if(!i_attr_val1.mac_check)
05233 return(0);
05234
05235 result = auto_read_write(caller_pid,
05236 target,
05237 tid,
05238 TRUE);
05239 if ((result != GRANTED) && (result != DO_NOT_CARE))
05240 return(-RSBAC_EDECISIONMISMATCH);
05241 return(0);
05242
05243 default:
05244 return(0);
05245 }
05246
05247 case R_SEARCH:
05248 switch(target)
05249 {
05250 case T_DIR:
05251 case T_SYMLINK:
05252
05253 result = auto_read(caller_pid,
05254 target,
05255 tid,
05256 TRUE);
05257 if ((result != GRANTED) && (result != DO_NOT_CARE))
05258 return(-RSBAC_EDECISIONMISMATCH);
05259 return(0);
05260
05261 default:
05262 return(0);
05263 }
05264
05265 case R_TRACE:
05266 switch(target)
05267 {
05268 case T_PROCESS:
05269
05270 result = auto_read_write_attr(caller_pid,
05271 target,
05272 tid,
05273 A_current_sec_level,
05274 A_mac_curr_categories,
05275 TRUE);
05276 if ((result != GRANTED) && (result != DO_NOT_CARE))
05277 return(-RSBAC_EDECISIONMISMATCH);
05278 return(0);
05279
05280
05281 default:
05282 return(0);
05283 }
05284
05285 case R_WRITE:
05286 case R_WRITE_OPEN:
05287 switch(target)
05288 {
05289 case T_FILE:
05290 case T_FIFO:
05291 case T_IPC:
05292
05293 result = auto_write(caller_pid,
05294 target,
05295 tid,
05296 TRUE);
05297 if ((result != GRANTED) && (result != DO_NOT_CARE))
05298 return(-RSBAC_EDECISIONMISMATCH);
05299 return(0);
05300
05301 case T_DEV:
05302
05303 if (rsbac_get_attr(MAC,
05304 T_DEV,
05305 tid,
05306 A_mac_check,
05307 &i_attr_val1,
05308 FALSE))
05309 {
05310 rsbac_ds_get_error("rsbac_adf_set_attr_mac", A_none);
05311 return(-RSBAC_EREADFAILED);
05312 }
05313 if(!i_attr_val1.mac_check)
05314 return(0);
05315
05316 result = auto_write(caller_pid,
05317 target,
05318 tid,
05319 TRUE);
05320 if ((result != GRANTED) && (result != DO_NOT_CARE))
05321 return(-RSBAC_EDECISIONMISMATCH);
05322 return(0);
05323
05324 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
05325 case T_NETOBJ:
05326
05327 result = auto_write_attr(caller_pid,
05328 target,
05329 tid,
05330 A_remote_sec_level,
05331 A_remote_mac_categories,
05332 TRUE);
05333 if ((result != GRANTED) && (result != DO_NOT_CARE))
05334 return(-RSBAC_EDECISIONMISMATCH);
05335 return(0);
05336 #endif
05337
05338
05339 default:
05340 return(0);
05341 }
05342
05343 #ifdef CONFIG_RSBAC_MAC_NET_OBJ_PROT
05344 case R_BIND:
05345 case R_LISTEN:
05346 switch(target)
05347 {
05348 case T_NETOBJ:
05349
05350 result = auto_write_attr(caller_pid,
05351 target,
05352 tid,
05353 A_local_sec_level,
05354 A_local_mac_categories,
05355 TRUE);
05356 if ((result != GRANTED) && (result != DO_NOT_CARE))
05357 return(-RSBAC_EDECISIONMISMATCH);
05358 return(0);
05359
05360
05361 default:
05362 return(0);
05363 }
05364
05365 case R_ACCEPT:
05366 case R_CONNECT:
05367 case R_SEND:
05368 case R_RECEIVE:
05369 switch(target)
05370 {
05371 case T_NETOBJ:
05372
05373 result = auto_write_attr(caller_pid,
05374 target,
05375 tid,
05376 A_remote_sec_level,
05377 A_remote_mac_categories,
05378 TRUE);
05379 if ((result != GRANTED) && (result != DO_NOT_CARE))
05380 return(-RSBAC_EDECISIONMISMATCH);
05381 return(0);
05382
05383
05384 default:
05385 return(0);
05386 }
05387 #endif
05388
05389
05390 default: return(0);
05391 }
05392
05393 return(0);
05394 }
05395
05396