#include <linux/string.h>
#include <rsbac/aci.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/stat.h>
#include <linux/smp_lock.h>
#include <linux/syscalls.h>
#include <rsbac/pm_types.h>
#include <rsbac/pm.h>
#include <rsbac/pm_getname.h>
#include <rsbac/error.h>
#include <rsbac/debug.h>
#include <rsbac/helpers.h>
#include <rsbac/adf.h>
#include <rsbac/adf_main.h>
#include <linux/namei.h>
#include <linux/file.h>
#include <linux/mount.h>
Go to the source code of this file.
Functions | |
static int | pm_get_file (const char *name, enum rsbac_target_t *target_p, union rsbac_target_id_t *tid_p) |
int | rsbac_pm (rsbac_list_ta_number_t ta_number, enum rsbac_pm_function_type_t function, union rsbac_pm_function_param_t param, rsbac_pm_tkt_id_t tkt) |
int | rsbac_pm_change_current_task (rsbac_pm_task_id_t task) |
int | rsbac_pm_create_file (const char *filename, int mode, rsbac_pm_object_class_id_t object_class) |
|
Definition at line 49 of file pm_syscalls.c. References D_block, D_char, rsbac_target_id_t::dev, rsbac_dev_desc_t::major, rsbac_dev_desc_t::minor, RSBAC_EINVALIDTARGET, T_DEV, T_FIFO, T_FILE, and rsbac_dev_desc_t::type. Referenced by rsbac_pm(). 00052 { 00053 int error = 0; 00054 struct dentry * dentry_p; 00055 struct nameidata nd; 00056 00057 /* get file dentry */ 00058 if ((error = user_path_walk(name, &nd))) 00059 { 00060 #ifdef CONFIG_RSBAC_DEBUG 00061 if (rsbac_debug_aef_pm) 00062 printk(KERN_DEBUG "pm_get_file(): call to user_path_walk() returned %i\n", error); 00063 #endif 00064 return(-RSBAC_EINVALIDTARGET); 00065 } 00066 dentry_p = nd.dentry; 00067 if (!dentry_p->d_inode) 00068 { 00069 #ifdef CONFIG_RSBAC_DEBUG 00070 if (rsbac_debug_aef_pm) 00071 printk(KERN_DEBUG 00072 "pm_get_file(): file not found\n"); 00073 #endif 00074 return(-RSBAC_EINVALIDTARGET); 00075 } 00076 if(S_ISREG(dentry_p->d_inode->i_mode)) 00077 { 00078 /* copy device and inode */ 00079 tid_p->file.device = dentry_p->d_sb->s_dev; 00080 tid_p->file.inode = dentry_p->d_inode->i_ino; 00081 tid_p->file.dentry_p = dentry_p; 00082 *target_p = T_FILE; 00083 } 00084 else if(S_ISFIFO(dentry_p->d_inode->i_mode)) 00085 { 00086 /* copy device and inode */ 00087 tid_p->file.device = dentry_p->d_sb->s_dev; 00088 tid_p->file.inode = dentry_p->d_inode->i_ino; 00089 tid_p->file.dentry_p = dentry_p; 00090 *target_p = T_FIFO; 00091 } 00092 else if(S_ISBLK(dentry_p->d_inode->i_mode)) 00093 { 00094 /* copy dev data */ 00095 tid_p->dev.type = D_block; 00096 tid_p->dev.major = RSBAC_MAJOR(dentry_p->d_inode->i_rdev); 00097 tid_p->dev.minor = RSBAC_MINOR(dentry_p->d_inode->i_rdev); 00098 *target_p = T_DEV; 00099 } 00100 else if(S_ISCHR(dentry_p->d_inode->i_mode)) 00101 { 00102 /* copy dev data */ 00103 tid_p->dev.type = D_char; 00104 tid_p->dev.major = RSBAC_MAJOR(dentry_p->d_inode->i_rdev); 00105 tid_p->dev.minor = RSBAC_MINOR(dentry_p->d_inode->i_rdev); 00106 *target_p = T_DEV; 00107 } 00108 else 00109 error = -RSBAC_EINVALIDTARGET; 00110 /* and free inode */ 00111 dput(dentry_p); 00112 /* return */ 00113 return(error); 00114 }
|
|
Definition at line 124 of file pm_syscalls.c. References A_auth_may_set_cap, A_auth_may_setuid, A_pm_object_class, A_pm_object_type, A_pm_role, A_pm_task_set, A_pm_tp, rsbac_pm_delete_na_t::accesses, rsbac_pm_add_na_t::accesses, rsbac_pm_function_param_t::add_authorized_task, rsbac_pm_tkt_function_param_t::add_authorized_task, rsbac_pm_function_param_t::add_authorized_tp, rsbac_pm_tkt_function_param_t::add_authorized_tp, rsbac_pm_function_param_t::add_consent, rsbac_pm_tkt_function_param_t::add_consent, rsbac_pm_function_param_t::add_na, rsbac_pm_tkt_function_param_t::add_na, rsbac_pm_function_param_t::add_object_class, rsbac_pm_tkt_function_param_t::add_object_class, rsbac_pm_function_param_t::add_purpose, rsbac_pm_tkt_function_param_t::add_purpose, rsbac_pm_function_param_t::add_responsible_user, rsbac_pm_tkt_function_param_t::add_responsible_user, rsbac_pm_function_param_t::add_task, rsbac_pm_tkt_function_param_t::add_task, AUTH, rsbac_attribute_value_t::auth_may_set_cap, rsbac_attribute_value_t::auth_may_setuid, rsbac_pm_function_param_t::create_ticket, rsbac_pm_function_param_t::create_tp, rsbac_pm_add_purpose_t::def_class, rsbac_pm_function_param_t::delete_authorized_task, rsbac_pm_tkt_function_param_t::delete_authorized_task, rsbac_pm_function_param_t::delete_authorized_tp, rsbac_pm_tkt_function_param_t::delete_authorized_tp, rsbac_pm_function_param_t::delete_consent, rsbac_pm_tkt_function_param_t::delete_consent, rsbac_pm_function_param_t::delete_na, rsbac_pm_tkt_function_param_t::delete_na, rsbac_pm_function_param_t::delete_object_class, rsbac_pm_tkt_function_param_t::delete_object_class, rsbac_pm_function_param_t::delete_purpose, rsbac_pm_tkt_function_param_t::delete_purpose, rsbac_pm_function_param_t::delete_responsible_user, rsbac_pm_tkt_function_param_t::delete_responsible_user, rsbac_pm_function_param_t::delete_task, rsbac_pm_tkt_function_param_t::delete_task, rsbac_pm_function_param_t::delete_tp, rsbac_pm_function_param_t::delete_user_aci, rsbac_pm_tkt_function_param_t::delete_user_aci, rsbac_target_id_t::dev, rsbac_target_id_t::dummy, FALSE, rsbac_pm_set_tp_t::filename, rsbac_pm_set_auth_may_set_cap_t::filename, rsbac_pm_set_auth_may_setuid_t::filename, rsbac_pm_set_device_object_type_t::filename, rsbac_pm_set_object_class_t::filename, rsbac_pm_delete_consent_t::filename, rsbac_pm_add_consent_t::filename, rsbac_pm_create_ticket_t::function_param, rsbac_pm_create_ticket_t::function_type, get_pm_function_type_name(), rsbac_pm_delete_tp_t::id, rsbac_pm_create_tp_t::id, rsbac_pm_delete_purpose_t::id, rsbac_pm_add_purpose_t::id, rsbac_pm_delete_object_class_t::id, rsbac_pm_delete_task_t::id, rsbac_pm_add_task_t::id, rsbac_pm_delete_user_aci_t::id, rsbac_pm_add_object_class_t::id, rsbac_pm_create_ticket_t::id, rsbac_dev_desc_t::major, rsbac_dev_desc_t::minor, rsbac_pm_delete_na_t::object_class, rsbac_pm_add_na_t::object_class, rsbac_pm_set_device_object_type_t::object_class, rsbac_pm_set_object_class_t::object_class, rsbac_pm_set_device_object_type_t::object_type, PF_add_authorized_task, PF_add_authorized_tp, PF_add_consent, PF_add_na, PF_add_object_class, PF_add_purpose, PF_add_responsible_user, PF_add_task, PF_create_ticket, PF_create_tp, PF_delete_authorized_task, PF_delete_authorized_tp, PF_delete_consent, PF_delete_na, PF_delete_object_class, PF_delete_purpose, PF_delete_responsible_user, PF_delete_task, PF_delete_tp, PF_delete_user_aci, PF_set_auth_may_set_cap, PF_set_auth_may_setuid, PF_set_device_object_type, PF_set_object_class, PF_set_role, PF_set_tp, PF_switch_auth, PF_switch_pm, PM, pm_get_file(), rsbac_attribute_value_t::pm_object_class, rsbac_attribute_value_t::pm_object_type, rsbac_attribute_value_t::pm_role, rsbac_attribute_value_t::pm_task_set, rsbac_attribute_value_t::pm_tp, PO_non_personal_data, PO_none, PO_personal_data, PO_TP, rsbac_pm_add_object_class_t::pp_list_p, PR_data_protection_officer, PR_security_officer, PR_tp_manager, PTF_add_authorized_task, PTF_add_authorized_tp, PTF_add_consent, PTF_add_na, PTF_add_object_class, PTF_add_purpose, PTF_add_responsible_user, PTF_add_task, PTF_delete_authorized_task, PTF_delete_authorized_tp, PTF_delete_consent, PTF_delete_na, PTF_delete_object_class, PTF_delete_purpose, PTF_delete_responsible_user, PTF_delete_task, PTF_delete_user_aci, PTF_set_auth_may_set_cap, PTF_set_auth_may_setuid, PTF_set_device_object_type, PTF_set_object_class, PTF_set_role, PTF_switch_auth, PTF_switch_pm, rsbac_pm_add_task_t::purpose, rsbac_pm_delete_consent_t::purpose, rsbac_pm_add_consent_t::purpose, R_MODIFY_ATTRIBUTE, R_SWITCH_MODULE, rsbac_pm_set_role_t::role, rsbac_adf_request_int(), RSBAC_EEXISTS, RSBAC_EINVALIDREQUEST, RSBAC_EINVALIDTARGET, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_ENOTINITIALIZED, RSBAC_EPERM, RSBAC_EREADFAILED, RSBAC_EWRITEFAILED, rsbac_is_initialized(), rsbac_pm_add_target(), rsbac_pm_add_to_set(), rsbac_pm_clear_set(), rsbac_pm_create_set(), RSBAC_PM_DEV_OBJECT_CLASS_ID, rsbac_pm_exists(), rsbac_pm_get_all_data(), rsbac_pm_get_data(), RSBAC_PM_IPC_OBJECT_CLASS_ID, rsbac_pm_remove_from_set(), rsbac_pm_remove_set(), rsbac_pm_remove_target(), RSBAC_PM_ROOT_TASK_SET_ID, rsbac_pm_set_data(), rsbac_pm_set_member(), rsbac_ta_get_attr(), rsbac_ta_remove_target(), rsbac_ta_set_attr(), rsbac_pm_function_param_t::set_auth_may_set_cap, rsbac_pm_tkt_function_param_t::set_auth_may_set_cap, rsbac_pm_function_param_t::set_auth_may_setuid, rsbac_pm_tkt_function_param_t::set_auth_may_setuid, rsbac_pm_function_param_t::set_device_object_type, rsbac_pm_tkt_function_param_t::set_device_object_type, rsbac_pm_function_param_t::set_object_class, rsbac_pm_tkt_function_param_t::set_object_class, rsbac_pm_function_param_t::set_role, rsbac_pm_tkt_function_param_t::set_role, rsbac_pm_function_param_t::set_tp, rsbac_pm_function_param_t::switch_auth, rsbac_pm_tkt_function_param_t::switch_auth, rsbac_pm_function_param_t::switch_pm, rsbac_pm_tkt_function_param_t::switch_pm, T_DEV, T_FIFO, T_FILE, T_NONE, T_USER, rsbac_pm_delete_responsible_user_t::task, rsbac_pm_add_responsible_user_t::task, rsbac_pm_delete_authorized_tp_t::task, rsbac_pm_add_authorized_tp_t::task, rsbac_pm_delete_na_t::task, rsbac_pm_add_na_t::task, rsbac_pm_add_authorized_task_t::task, rsbac_pm_delete_authorized_task_t::task, rsbac_pm_set_tp_t::tp, rsbac_pm_delete_authorized_tp_t::tp, rsbac_pm_add_authorized_tp_t::tp, rsbac_pm_delete_na_t::tp, rsbac_pm_add_na_t::tp, TRUE, rsbac_dev_desc_t::type, rsbac_pm_delete_authorized_task_t::user, rsbac_pm_add_authorized_task_t::user, rsbac_pm_set_role_t::user, rsbac_pm_delete_responsible_user_t::user, rsbac_pm_add_responsible_user_t::user, rsbac_target_id_t::user, rsbac_pm_create_ticket_t::valid_for, rsbac_pm_switch_pm_t::value, rsbac_pm_set_auth_may_set_cap_t::value, and rsbac_pm_set_auth_may_setuid_t::value. Referenced by sys_rsbac_pm(). 00129 { 00130 union rsbac_pm_all_data_value_t all_data; 00131 enum rsbac_target_t target; 00132 union rsbac_target_id_t tid; 00133 union rsbac_attribute_value_t attr_val; 00134 union rsbac_pm_target_id_t pm_tid; 00135 union rsbac_pm_target_id_t pm_tid2; 00136 union rsbac_pm_data_value_t data_val; 00137 int error = 0; 00138 rsbac_uid_t owner; 00139 enum rsbac_pm_role_t role; 00140 struct rsbac_pm_purpose_list_item_t pp_set; 00141 union rsbac_pm_set_id_t pm_set_id; 00142 union rsbac_pm_set_member_t pm_set_member; 00143 union rsbac_pm_tkt_internal_function_param_t tkt_i_function_param; 00144 struct rsbac_fs_file_t file; 00145 struct rsbac_dev_desc_t dev; 00146 char tmp[80]; 00147 rsbac_boolean_t class_exists = FALSE; 00148 00149 /* No processing possible before init (called at boot time) */ 00150 if (!rsbac_is_initialized()) 00151 return(-RSBAC_ENOTINITIALIZED); 00152 00153 get_pm_function_type_name(tmp,function); 00154 #ifdef CONFIG_RSBAC_DEBUG 00155 if(rsbac_debug_ds_pm) 00156 printk(KERN_DEBUG 00157 "rsbac_pm(): called for function %s (No.%i)\n", 00158 tmp,function); 00159 #endif 00160 /* Getting basic information about caller */ 00161 /* only useful for real process, not idle or init */ 00162 if (current->pid > 1) 00163 owner = current->uid; 00164 else /* caller_pid <= 1 -> kernel or init are always owned by root */ 00165 owner = 0; 00166 00167 /* getting owner's pm_role from rsbac system */ 00168 tid.user = owner; 00169 error = rsbac_ta_get_attr(ta_number,PM,T_USER,tid,A_pm_role,&attr_val,TRUE); 00170 if (error) 00171 { 00172 printk(KERN_WARNING 00173 "rsbac_pm(): rsbac_get_attr() for pm_role returned error %i", 00174 error); 00175 return(-RSBAC_EREADFAILED); /* something weird happened */ 00176 } 00177 role = attr_val.pm_role; 00178 00179 switch(function) 00180 { 00181 case PF_create_ticket: 00182 /* check, whether this ticket id already exists */ 00183 pm_tid.tkt = param.create_ticket.id; 00184 if(rsbac_pm_exists(ta_number, 00185 PMT_TKT, 00186 pm_tid)) 00187 return(-RSBAC_EEXISTS); 00188 00189 /* Check caller's pm_role, if needed, get file id for filename from */ 00190 /* param.x.filename, and copy params to tkt_internal_func_params. */ 00191 /* This part depends on the function the ticket shall be for. */ 00192 switch(param.create_ticket.function_type) 00193 { 00194 case PTF_add_na: 00195 if(role != PR_data_protection_officer) 00196 return(-RSBAC_EPERM); 00197 tkt_i_function_param.add_na 00198 = param.create_ticket.function_param.add_na; 00199 break; 00200 00201 case PTF_delete_na: 00202 if(role != PR_data_protection_officer) 00203 return(-RSBAC_EPERM); 00204 tkt_i_function_param.delete_na 00205 = param.create_ticket.function_param.delete_na; 00206 break; 00207 00208 case PTF_add_task: 00209 if(role != PR_data_protection_officer) 00210 return(-RSBAC_EPERM); 00211 tkt_i_function_param.add_task 00212 = param.create_ticket.function_param.add_task; 00213 break; 00214 00215 case PTF_delete_task: 00216 if(role != PR_data_protection_officer) 00217 return(-RSBAC_EPERM); 00218 tkt_i_function_param.delete_task 00219 = param.create_ticket.function_param.delete_task; 00220 break; 00221 00222 case PTF_add_object_class: 00223 if(role != PR_data_protection_officer) 00224 return(-RSBAC_EPERM); 00225 /* class-id 0, IPC and DEV are used internally, reject */ 00226 if( !param.create_ticket.function_param.add_object_class.id 00227 || (param.create_ticket.function_param.add_object_class.id 00228 == RSBAC_PM_IPC_OBJECT_CLASS_ID) 00229 || (param.create_ticket.function_param.add_object_class.id 00230 == RSBAC_PM_DEV_OBJECT_CLASS_ID)) 00231 { 00232 printk(KERN_DEBUG 00233 "rsbac_pm(): add_object_class: reserved class-id 0, %u or %u requested!\n", 00234 RSBAC_PM_IPC_OBJECT_CLASS_ID, 00235 RSBAC_PM_DEV_OBJECT_CLASS_ID); 00236 return(-RSBAC_EINVALIDVALUE); 00237 } 00238 /* copy class-id */ 00239 tkt_i_function_param.tkt_add_object_class.id 00240 = param.create_ticket.function_param.add_object_class.id; 00241 /* init pp_set-id for this ticket to 0 */ 00242 tkt_i_function_param.tkt_add_object_class.pp_set 00243 = 0; 00244 /* get purposes from user space and add them to set */ 00245 if(param.create_ticket.function_param.add_object_class.pp_list_p) 00246 { 00247 #ifdef CONFIG_RSBAC_DEBUG 00248 if(rsbac_debug_ds_pm) 00249 printk(KERN_DEBUG 00250 "rsbac_pm(): getting pp_list from user space\n"); 00251 #endif 00252 /* set a unique pp_set-id for this ticket (negative tkt-id) */ 00253 pm_set_id.pp_set = -param.create_ticket.id; 00254 if((error = rsbac_pm_create_set(ta_number,PS_PP,pm_set_id))) 00255 { 00256 printk(KERN_WARNING 00257 "rsbac_pm(): rsbac_pm_create_set() for PP returned error %i", 00258 error); 00259 return(-RSBAC_EWRITEFAILED); 00260 } 00261 rsbac_get_user((u_char *) &pp_set, 00262 (u_char *) param.create_ticket.function_param.add_object_class.pp_list_p, 00263 sizeof(pp_set)); 00264 pm_set_member.pp = pp_set.id; 00265 if((error = rsbac_pm_add_to_set(ta_number,PS_PP,pm_set_id,pm_set_member))) 00266 { 00267 printk(KERN_WARNING 00268 "rsbac_pm(): rsbac_pm_add_to_set() for PP returned error %i", 00269 error); 00270 rsbac_pm_remove_set(ta_number,PS_PP,pm_set_id); 00271 return(-RSBAC_EWRITEFAILED); 00272 } 00273 00274 while(pp_set.next) 00275 { 00276 rsbac_get_user((u_char *) &pp_set, 00277 (u_char *) pp_set.next, 00278 sizeof(pp_set)); 00279 pm_set_member.pp = pp_set.id; 00280 if((error = rsbac_pm_add_to_set(ta_number,PS_PP,pm_set_id,pm_set_member))) 00281 { 00282 printk(KERN_WARNING 00283 "rsbac_pm(): rsbac_pm_add_to_set() for PP returned error %i", 00284 error); 00285 rsbac_pm_remove_set(ta_number,PS_PP,pm_set_id); 00286 return(-RSBAC_EWRITEFAILED); 00287 } 00288 } 00289 tkt_i_function_param.tkt_add_object_class.pp_set 00290 = -param.create_ticket.id; 00291 } 00292 break; 00293 00294 case PTF_delete_object_class: 00295 if(role != PR_data_protection_officer) 00296 return(-RSBAC_EPERM); 00297 tkt_i_function_param.delete_object_class 00298 = param.create_ticket.function_param.delete_object_class; 00299 break; 00300 00301 case PTF_add_authorized_tp: 00302 if(role != PR_data_protection_officer) 00303 return(-RSBAC_EPERM); 00304 tkt_i_function_param.add_authorized_tp 00305 = param.create_ticket.function_param.add_authorized_tp; 00306 break; 00307 00308 case PTF_delete_authorized_tp: 00309 if(role != PR_data_protection_officer) 00310 return(-RSBAC_EPERM); 00311 tkt_i_function_param.delete_authorized_tp 00312 = param.create_ticket.function_param.delete_authorized_tp; 00313 break; 00314 00315 case PTF_add_consent: 00316 if(role != PR_data_protection_officer) 00317 return(-RSBAC_EPERM); 00318 /* get file id */ 00319 if ((error = pm_get_file(param.create_ticket.function_param.add_consent.filename, 00320 &target, 00321 &tid))) 00322 { 00323 #ifdef CONFIG_RSBAC_DEBUG 00324 if (rsbac_debug_aef_pm) 00325 printk(KERN_DEBUG 00326 "rsbac_pm(): call to pm_get_file() returned error %i\n", 00327 error); 00328 #endif 00329 return(-RSBAC_EINVALIDTARGET); 00330 } 00331 /* target must be file */ 00332 if(target != T_FILE) 00333 return(-RSBAC_EINVALIDTARGET); 00334 tkt_i_function_param.tkt_add_consent.file = tid.file; 00335 tkt_i_function_param.tkt_add_consent.purpose 00336 = param.create_ticket.function_param.add_consent.purpose; 00337 break; 00338 00339 case PTF_delete_consent: 00340 if(role != PR_data_protection_officer) 00341 return(-RSBAC_EPERM); 00342 /* get file id */ 00343 if ((error = pm_get_file(param.create_ticket.function_param.delete_consent.filename, 00344 &target, 00345 &tid))) 00346 { 00347 #ifdef CONFIG_RSBAC_DEBUG 00348 if (rsbac_debug_aef_pm) 00349 printk(KERN_DEBUG 00350 "rsbac_pm(): call to pm_get_file() returned error %i\n", 00351 error); 00352 #endif 00353 return(-RSBAC_EINVALIDTARGET); 00354 } 00355 /* target must be file */ 00356 if(target != T_FILE) 00357 return(-RSBAC_EINVALIDTARGET); 00358 tkt_i_function_param.tkt_delete_consent.file = tid.file; 00359 tkt_i_function_param.tkt_delete_consent.purpose 00360 = param.create_ticket.function_param.delete_consent.purpose; 00361 break; 00362 00363 case PTF_add_purpose: 00364 if(role != PR_data_protection_officer) 00365 return(-RSBAC_EPERM); 00366 tkt_i_function_param.add_purpose 00367 = param.create_ticket.function_param.add_purpose; 00368 break; 00369 00370 case PTF_delete_purpose: 00371 if(role != PR_data_protection_officer) 00372 return(-RSBAC_EPERM); 00373 tkt_i_function_param.delete_purpose 00374 = param.create_ticket.function_param.delete_purpose; 00375 break; 00376 00377 case PTF_add_responsible_user: 00378 if(role != PR_data_protection_officer) 00379 return(-RSBAC_EPERM); 00380 tkt_i_function_param.add_responsible_user 00381 = param.create_ticket.function_param.add_responsible_user; 00382 break; 00383 00384 case PTF_delete_responsible_user: 00385 if(role != PR_data_protection_officer) 00386 return(-RSBAC_EPERM); 00387 tkt_i_function_param.delete_responsible_user 00388 = param.create_ticket.function_param.delete_responsible_user; 00389 break; 00390 00391 case PTF_delete_user_aci: 00392 if(role != PR_data_protection_officer) 00393 return(-RSBAC_EPERM); 00394 tkt_i_function_param.delete_user_aci.id 00395 = param.create_ticket.function_param.delete_user_aci.id; 00396 break; 00397 00398 case PTF_set_role: 00399 if(role != PR_data_protection_officer) 00400 return(-RSBAC_EPERM); 00401 tkt_i_function_param.set_role 00402 = param.create_ticket.function_param.set_role; 00403 break; 00404 00405 case PTF_set_object_class: 00406 if(role != PR_data_protection_officer) 00407 return(-RSBAC_EPERM); 00408 /* get file id */ 00409 if ((error = pm_get_file(param.create_ticket.function_param.set_object_class.filename, 00410 &target, 00411 &tid))) 00412 { 00413 #ifdef CONFIG_RSBAC_DEBUG 00414 if (rsbac_debug_aef_pm) 00415 printk(KERN_DEBUG 00416 "rsbac_pm(): call to pm_get_file() returned error %i\n", 00417 error); 00418 #endif 00419 return(-RSBAC_EINVALIDTARGET); 00420 } 00421 /* target must be file */ 00422 if( (target != T_FILE) 00423 && (target != T_FIFO) 00424 ) 00425 return(-RSBAC_EINVALIDTARGET); 00426 tkt_i_function_param.tkt_set_object_class.file = tid.file; 00427 tkt_i_function_param.tkt_set_object_class.object_class 00428 = param.create_ticket.function_param.set_object_class.object_class; 00429 break; 00430 00431 #ifdef CONFIG_RSBAC_SWITCH_PM 00432 case PTF_switch_pm: 00433 if(role != PR_data_protection_officer) 00434 return(-RSBAC_EPERM); 00435 tkt_i_function_param.switch_pm 00436 = param.create_ticket.function_param.switch_pm; 00437 break; 00438 #endif 00439 #ifdef CONFIG_RSBAC_SWITCH_AUTH 00440 case PTF_switch_auth: 00441 if(role != PR_data_protection_officer) 00442 return(-RSBAC_EPERM); 00443 tkt_i_function_param.switch_auth 00444 = param.create_ticket.function_param.switch_auth; 00445 break; 00446 #endif 00447 00448 case PTF_set_device_object_type: 00449 if(role != PR_data_protection_officer) 00450 return(-RSBAC_EPERM); 00451 /* get file id */ 00452 if ((error = pm_get_file(param.create_ticket.function_param.set_device_object_type.filename, 00453 &target, 00454 &tid))) 00455 { 00456 #ifdef CONFIG_RSBAC_DEBUG 00457 if (rsbac_debug_aef_pm) 00458 printk(KERN_DEBUG 00459 "rsbac_pm(): call to pm_get_file() returned error %i\n", 00460 error); 00461 #endif 00462 return(-RSBAC_EINVALIDTARGET); 00463 } 00464 /* target must be dev */ 00465 if(target != T_DEV) 00466 return(-RSBAC_EINVALIDTARGET); 00467 tkt_i_function_param.tkt_set_device_object_type.dev = tid.dev; 00468 tkt_i_function_param.tkt_set_device_object_type.object_type 00469 = param.create_ticket.function_param.set_device_object_type.object_type; 00470 tkt_i_function_param.tkt_set_device_object_type.object_class 00471 = param.create_ticket.function_param.set_device_object_type.object_class; 00472 break; 00473 00474 case PTF_set_auth_may_setuid: 00475 if(role != PR_data_protection_officer) 00476 return(-RSBAC_EPERM); 00477 /* get file id */ 00478 if ((error = pm_get_file(param.create_ticket.function_param.set_auth_may_setuid.filename, 00479 &target, 00480 &tid))) 00481 { 00482 #ifdef CONFIG_RSBAC_DEBUG 00483 if (rsbac_debug_aef_pm) 00484 printk(KERN_DEBUG 00485 "rsbac_pm(): call to pm_get_file() returned error %i\n", 00486 error); 00487 #endif 00488 return(-RSBAC_EINVALIDTARGET); 00489 } 00490 /* target must be file */ 00491 if(target != T_FILE) 00492 return(-RSBAC_EINVALIDTARGET); 00493 tkt_i_function_param.tkt_set_auth_may_setuid.file = tid.file; 00494 tkt_i_function_param.tkt_set_auth_may_setuid.value 00495 = param.create_ticket.function_param.set_auth_may_setuid.value; 00496 break; 00497 00498 case PTF_set_auth_may_set_cap: 00499 if(role != PR_data_protection_officer) 00500 return(-RSBAC_EPERM); 00501 /* get file id */ 00502 if ((error = pm_get_file(param.create_ticket.function_param.set_auth_may_set_cap.filename, 00503 &target, 00504 &tid))) 00505 { 00506 #ifdef CONFIG_RSBAC_DEBUG 00507 if (rsbac_debug_aef_pm) 00508 printk(KERN_DEBUG 00509 "rsbac_pm(): call to pm_get_file() returned error %i\n", 00510 error); 00511 #endif 00512 return(-RSBAC_EINVALIDTARGET); 00513 } 00514 /* target must be dev */ 00515 if(target != T_FILE) 00516 return(-RSBAC_EINVALIDTARGET); 00517 tkt_i_function_param.tkt_set_auth_may_set_cap.file = tid.file; 00518 tkt_i_function_param.tkt_set_auth_may_set_cap.value 00519 = param.create_ticket.function_param.set_auth_may_set_cap.value; 00520 break; 00521 00522 case PTF_add_authorized_task: 00523 case PTF_delete_authorized_task: 00524 /* copy parameters */ 00525 if(param.create_ticket.function_type 00526 == PTF_add_authorized_task) 00527 { 00528 tkt_i_function_param.add_authorized_task 00529 = param.create_ticket.function_param.add_authorized_task; 00530 } 00531 else 00532 { 00533 tkt_i_function_param.delete_authorized_task 00534 = param.create_ticket.function_param.delete_authorized_task; 00535 } 00536 /* DPOs are OK */ 00537 if(role == PR_data_protection_officer) 00538 break; 00539 /* if not DPO: */ 00540 /* is process owner responsible user for target task? */ 00541 /* get ru_set_id for target task */ 00542 if(param.create_ticket.function_type 00543 == PTF_add_authorized_task) 00544 { 00545 pm_tid.task 00546 = param.create_ticket.function_param.add_authorized_task.task; 00547 } 00548 else 00549 { 00550 pm_tid.task 00551 = param.create_ticket.function_param.delete_authorized_task.task; 00552 } 00553 if((error = rsbac_pm_get_data(ta_number, 00554 PMT_TASK, 00555 pm_tid, 00556 PD_ru_set, 00557 &data_val))) 00558 return(-RSBAC_EREADFAILED); 00559 /* if ru_set is 0, there is no responsible user -> error */ 00560 if(!data_val.ru_set) 00561 return(-RSBAC_EPERM); 00562 /* check, whether owner is responsible user for this task */ 00563 pm_set_id.ru_set = data_val.ru_set; 00564 pm_set_member.ru = owner; 00565 if(!rsbac_pm_set_member(ta_number,PS_RU,pm_set_id,pm_set_member)) 00566 { 00567 /* illegal issuer -> delete ticket */ 00568 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 00569 return(-RSBAC_EPERM); 00570 } 00571 /* OK, test passed */ 00572 break; 00573 00574 default: 00575 /* anything else should never be issued */ 00576 return(-RSBAC_EINVALIDVALUE); 00577 } 00578 00579 /* all checks passed -> add ticket */ 00580 all_data.tkt.id = param.create_ticket.id; 00581 all_data.tkt.issuer = owner; 00582 all_data.tkt.function_type = param.create_ticket.function_type; 00583 all_data.tkt.function_param = tkt_i_function_param; 00584 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) 00585 { 00586 struct timespec now = CURRENT_TIME; 00587 00588 all_data.tkt.valid_until = param.create_ticket.valid_for 00589 + now.tv_sec; 00590 } 00591 #else 00592 all_data.tkt.valid_until = param.create_ticket.valid_for 00593 + CURRENT_TIME; 00594 #endif 00595 error = rsbac_pm_add_target(ta_number, 00596 PMT_TKT, 00597 all_data); 00598 if(error && (param.create_ticket.function_type == PTF_add_object_class)) 00599 { 00600 rsbac_pm_remove_set(ta_number,PS_PP,pm_set_id); 00601 } 00602 return(error); 00603 /* end of create_ticket */ 00604 00605 case PF_add_na: 00606 if(role != PR_security_officer) 00607 return(-RSBAC_EPERM); 00608 /* get ticket data, deny, if not found */ 00609 pm_tid.tkt = tkt; 00610 if((error = rsbac_pm_get_all_data(ta_number, 00611 PMT_TKT, 00612 pm_tid, 00613 &all_data))) 00614 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 00615 if( (error != -RSBAC_EINVALIDTARGET) 00616 && (error != -RSBAC_ENOTFOUND) 00617 ) 00618 printk(KERN_WARNING 00619 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 00620 error); 00621 return(-RSBAC_EPERM); /* execution denied */ 00622 } 00623 /* check ticket entries */ 00624 if( (all_data.tkt.function_type != PTF_add_na) 00625 || (all_data.tkt.function_param.add_na.task 00626 != param.add_na.task) 00627 || (all_data.tkt.function_param.add_na.object_class 00628 != param.add_na.object_class) 00629 || (all_data.tkt.function_param.add_na.tp 00630 != param.add_na.tp) 00631 || (all_data.tkt.function_param.add_na.accesses 00632 != param.add_na.accesses) ) 00633 return(-RSBAC_EPERM); 00634 00635 /* check, whether task exists */ 00636 pm_tid2.task = param.add_na.task; 00637 if(!rsbac_pm_exists(ta_number, 00638 PMT_TASK, 00639 pm_tid2)) 00640 return(-RSBAC_EINVALIDVALUE); 00641 /* check, whether class exists (not for IPC, DEV and NIL) */ 00642 if( param.add_na.object_class 00643 && (param.add_na.object_class != RSBAC_PM_IPC_OBJECT_CLASS_ID) 00644 && (param.add_na.object_class != RSBAC_PM_DEV_OBJECT_CLASS_ID)) 00645 { 00646 pm_tid2.object_class = param.add_na.object_class; 00647 if(!rsbac_pm_exists(ta_number, 00648 PMT_CLASS, 00649 pm_tid2)) 00650 return(-RSBAC_EINVALIDVALUE); 00651 } 00652 /* check, whether tp exists */ 00653 pm_tid2.tp = param.add_na.tp; 00654 if(!rsbac_pm_exists(ta_number, 00655 PMT_TP, 00656 pm_tid2)) 00657 return(-RSBAC_EINVALIDVALUE); 00658 00659 /* get ticket issuer role */ 00660 tid.user = all_data.tkt.issuer; 00661 if((error = rsbac_ta_get_attr(ta_number, 00662 PM, 00663 T_USER, 00664 tid, 00665 A_pm_role, 00666 &attr_val, 00667 TRUE))) 00668 { 00669 printk(KERN_WARNING 00670 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 00671 error); 00672 return(-RSBAC_EREADFAILED); /* execution denied */ 00673 } 00674 00675 if(attr_val.pm_role != PR_data_protection_officer) 00676 { 00677 /* illegal issuer -> remove target */ 00678 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 00679 return(-RSBAC_EPERM); 00680 } 00681 00682 /* OK, all checks done. Now change data. */ 00683 /* First remove ticket to prevent repeated calls. */ 00684 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 00685 00686 /* check: lookup NA accesses for this id */ 00687 pm_tid.na.task = param.add_na.task; 00688 pm_tid.na.object_class = param.add_na.object_class; 00689 pm_tid.na.tp = param.add_na.tp; 00690 error = rsbac_pm_get_data(ta_number, 00691 PMT_NA, 00692 pm_tid, 00693 PD_accesses, 00694 &data_val); 00695 switch(error) 00696 { /* if 0 -> found -> set accesses to new value */ 00697 case 0: 00698 data_val.accesses = param.add_na.accesses; 00699 rsbac_pm_set_data(ta_number, 00700 PMT_NA, 00701 pm_tid, 00702 PD_accesses, 00703 data_val); 00704 return(0); 00705 00706 /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found -> add */ 00707 case -RSBAC_EINVALIDTARGET: 00708 case -RSBAC_ENOTFOUND: 00709 all_data.na.task = param.add_na.task; 00710 all_data.na.object_class = param.add_na.object_class; 00711 all_data.na.tp = param.add_na.tp; 00712 all_data.na.accesses = param.add_na.accesses; 00713 if((error = rsbac_pm_add_target(ta_number, 00714 PMT_NA, 00715 all_data))) 00716 { 00717 printk(KERN_WARNING 00718 "rsbac_pm(): rsbac_pm_add_target() for NA returned error %i", 00719 error); 00720 return(error); /* execution failed */ 00721 } 00722 return(0); 00723 00724 default: 00725 printk(KERN_WARNING 00726 "rsbac_pm(): rsbac_pm_get_data() for NA/accesses returned error %i", 00727 error); 00728 return(-RSBAC_EREADFAILED); /* execution failed */ 00729 } 00730 00731 case PF_delete_na: 00732 if(role != PR_security_officer) 00733 return(-RSBAC_EPERM); 00734 00735 /* get ticket data, deny, if not found */ 00736 pm_tid.tkt = tkt; 00737 if((error = rsbac_pm_get_all_data(ta_number, 00738 PMT_TKT, 00739 pm_tid, 00740 &all_data))) 00741 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 00742 if( (error != -RSBAC_EINVALIDTARGET) 00743 && (error != -RSBAC_ENOTFOUND) 00744 ) 00745 printk(KERN_WARNING 00746 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 00747 error); 00748 return(-RSBAC_EPERM); /* execution denied */ 00749 } 00750 /* check ticket entries */ 00751 if( (all_data.tkt.function_type != PTF_delete_na) 00752 || (all_data.tkt.function_param.delete_na.task 00753 != param.delete_na.task) 00754 || (all_data.tkt.function_param.delete_na.object_class 00755 != param.delete_na.object_class) 00756 || (all_data.tkt.function_param.delete_na.tp 00757 != param.delete_na.tp) 00758 || (all_data.tkt.function_param.delete_na.accesses 00759 != param.delete_na.accesses) ) 00760 return(-RSBAC_EPERM); 00761 00762 /* get ticket issuer role */ 00763 tid.user = all_data.tkt.issuer; 00764 if((error = rsbac_ta_get_attr(ta_number, 00765 PM, 00766 T_USER, 00767 tid, 00768 A_pm_role, 00769 &attr_val, 00770 TRUE))) 00771 { 00772 printk(KERN_WARNING 00773 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 00774 error); 00775 return(-RSBAC_EREADFAILED); /* execution denied */ 00776 } 00777 00778 if(attr_val.pm_role != PR_data_protection_officer) 00779 { 00780 /* illegal issuer -> remove target */ 00781 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 00782 return(-RSBAC_EPERM); 00783 } 00784 00785 /* OK, all checks done. Now change data. */ 00786 /* First remove ticket to prevent repeated calls. */ 00787 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 00788 /* remove NA */ 00789 pm_tid.na.task = param.delete_na.task; 00790 pm_tid.na.object_class = param.delete_na.object_class; 00791 pm_tid.na.tp = param.delete_na.tp; 00792 return(rsbac_pm_remove_target(ta_number, 00793 PMT_NA, 00794 pm_tid)); 00795 00796 case PF_add_task: 00797 /* task-id 0 is used internally, reject */ 00798 if(!param.add_task.id) 00799 return(-RSBAC_EINVALIDVALUE); 00800 /* purpose-id 0 is invalid, reject */ 00801 if(!param.add_task.purpose) 00802 return(-RSBAC_EINVALIDVALUE); 00803 00804 if(role != PR_security_officer) 00805 return(-RSBAC_EPERM); 00806 /* get ticket data, deny, if not found */ 00807 pm_tid.tkt = tkt; 00808 if((error = rsbac_pm_get_all_data(ta_number, 00809 PMT_TKT, 00810 pm_tid, 00811 &all_data))) 00812 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 00813 if( (error != -RSBAC_EINVALIDTARGET) 00814 && (error != -RSBAC_ENOTFOUND) 00815 ) 00816 printk(KERN_WARNING 00817 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 00818 error); 00819 return(-RSBAC_EPERM); /* execution denied */ 00820 } 00821 /* check ticket entries */ 00822 if( (all_data.tkt.function_type != PTF_add_task) 00823 || (all_data.tkt.function_param.add_task.id 00824 != param.add_task.id) 00825 || (all_data.tkt.function_param.add_task.purpose 00826 != param.add_task.purpose) ) 00827 return(-RSBAC_EPERM); 00828 00829 /* check, whether purpose exists */ 00830 pm_tid2.pp = param.add_task.purpose; 00831 if(!rsbac_pm_exists(ta_number, 00832 PMT_PP, 00833 pm_tid2)) 00834 return(-RSBAC_EINVALIDVALUE); 00835 00836 /* get ticket issuer role */ 00837 tid.user = all_data.tkt.issuer; 00838 if((error = rsbac_ta_get_attr(ta_number, 00839 PM, 00840 T_USER, 00841 tid, 00842 A_pm_role, 00843 &attr_val, 00844 TRUE))) 00845 { 00846 printk(KERN_WARNING 00847 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 00848 error); 00849 return(-RSBAC_EREADFAILED); /* execution denied */ 00850 } 00851 00852 if(attr_val.pm_role != PR_data_protection_officer) 00853 { 00854 /* illegal issuer -> remove target */ 00855 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 00856 return(-RSBAC_EPERM); 00857 } 00858 00859 /* OK, all checks done. Now change data. */ 00860 /* First remove ticket to prevent repeated calls. */ 00861 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 00862 00863 /* try to add task */ 00864 all_data.task.id = param.add_task.id; 00865 all_data.task.purpose = param.add_task.purpose; 00866 all_data.task.tp_set = 0; 00867 all_data.task.ru_set = 0; 00868 return(rsbac_pm_add_target(ta_number, 00869 PMT_TASK, 00870 all_data)); 00871 00872 case PF_delete_task: 00873 /* task-id 0 is used internally, reject */ 00874 if(!param.add_task.id) 00875 return(-RSBAC_EINVALIDVALUE); 00876 if(role != PR_security_officer) 00877 return(-RSBAC_EPERM); 00878 /* get ticket data, deny, if not found */ 00879 pm_tid.tkt = tkt; 00880 if((error = rsbac_pm_get_all_data(ta_number, 00881 PMT_TKT, 00882 pm_tid, 00883 &all_data))) 00884 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 00885 if( (error != -RSBAC_EINVALIDTARGET) 00886 && (error != -RSBAC_ENOTFOUND) 00887 ) 00888 printk(KERN_WARNING 00889 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 00890 error); 00891 return(-RSBAC_EPERM); /* execution denied */ 00892 } 00893 /* check ticket entries */ 00894 if( (all_data.tkt.function_type != PTF_delete_task) 00895 || (all_data.tkt.function_param.delete_task.id 00896 != param.delete_task.id) ) 00897 return(-RSBAC_EPERM); 00898 00899 /* get ticket issuer role */ 00900 tid.user = all_data.tkt.issuer; 00901 if((error = rsbac_ta_get_attr(ta_number, 00902 PM, 00903 T_USER, 00904 tid, 00905 A_pm_role, 00906 &attr_val, 00907 TRUE))) 00908 { 00909 printk(KERN_WARNING 00910 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 00911 error); 00912 return(-RSBAC_EREADFAILED); /* execution denied */ 00913 } 00914 00915 if(attr_val.pm_role != PR_data_protection_officer) 00916 { 00917 /* illegal issuer -> remove target */ 00918 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 00919 return(-RSBAC_EPERM); 00920 } 00921 00922 /* OK, all checks done. Now change data. */ 00923 /* First remove ticket to prevent repeated calls. */ 00924 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 00925 00926 /* try to delete task */ 00927 pm_tid.task = param.delete_task.id; 00928 return(rsbac_pm_remove_target(ta_number, 00929 PMT_TASK, 00930 pm_tid)); 00931 00932 case PF_add_object_class: 00933 /* class-id 0/NIL, IPC and DEV are used internally, reject */ 00934 if( !param.add_object_class.id 00935 || (param.add_object_class.id == RSBAC_PM_IPC_OBJECT_CLASS_ID) 00936 || (param.add_object_class.id == RSBAC_PM_DEV_OBJECT_CLASS_ID)) 00937 { 00938 printk(KERN_DEBUG 00939 "rsbac_pm(): add_object_class: reserved class-id 0, %u or %u requested!\n", 00940 RSBAC_PM_IPC_OBJECT_CLASS_ID, 00941 RSBAC_PM_DEV_OBJECT_CLASS_ID); 00942 return(-RSBAC_EINVALIDVALUE); 00943 } 00944 if(role != PR_security_officer) 00945 return(-RSBAC_EPERM); 00946 /* get ticket data, deny, if not found */ 00947 pm_tid.tkt = tkt; 00948 if((error = rsbac_pm_get_all_data(ta_number, 00949 PMT_TKT, 00950 pm_tid, 00951 &all_data))) 00952 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 00953 if( (error != -RSBAC_EINVALIDTARGET) 00954 && (error != -RSBAC_ENOTFOUND) 00955 ) 00956 printk(KERN_WARNING 00957 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 00958 error); 00959 return(-RSBAC_EPERM); /* execution denied */ 00960 } 00961 /* check ticket entries */ 00962 if( (all_data.tkt.function_type != PTF_add_object_class) 00963 || (all_data.tkt.function_param.tkt_add_object_class.id 00964 != param.add_object_class.id) ) 00965 return(-RSBAC_EPERM); 00966 /* get ticket issuer role */ 00967 tid.user = all_data.tkt.issuer; 00968 if((error = rsbac_ta_get_attr(ta_number, 00969 PM, 00970 T_USER, 00971 tid, 00972 A_pm_role, 00973 &attr_val, 00974 TRUE))) 00975 { 00976 printk(KERN_WARNING 00977 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 00978 error); 00979 return(-RSBAC_EREADFAILED); /* execution denied */ 00980 } 00981 00982 if(attr_val.pm_role != PR_data_protection_officer) 00983 { 00984 /* illegal issuer -> remove target */ 00985 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 00986 return(-RSBAC_EPERM); 00987 } 00988 00989 /* check purposes in ticket against those provided */ 00990 if(param.add_object_class.pp_list_p) 00991 { 00992 if(!all_data.tkt.function_param.tkt_add_object_class.pp_set) 00993 { 00994 printk(KERN_DEBUG 00995 "rsbac_pm(): add_object_class: no purpose in tkt\n"); 00996 return(-RSBAC_EINVALIDVALUE); 00997 } 00998 pm_set_id.pp_set = all_data.tkt.function_param.tkt_add_object_class.pp_set; 00999 rsbac_get_user((u_char *) &pp_set, 01000 (u_char *) param.add_object_class.pp_list_p, 01001 sizeof(pp_set)); 01002 pm_set_member.pp = pp_set.id; 01003 if(!rsbac_pm_set_member(ta_number,PS_PP,pm_set_id,pm_set_member)) 01004 { 01005 printk(KERN_DEBUG 01006 "rsbac_pm(): add_object_class: first purpose-id %i not in tkt-set\n", 01007 pp_set.id); 01008 return(-RSBAC_EINVALIDVALUE); 01009 } 01010 01011 while(pp_set.next) 01012 { 01013 rsbac_get_user((u_char *) &pp_set, 01014 (u_char *) pp_set.next, 01015 sizeof(pp_set)); 01016 pm_set_member.pp = pp_set.id; 01017 if(!rsbac_pm_set_member(ta_number,PS_PP,pm_set_id,pm_set_member)) 01018 { 01019 printk(KERN_DEBUG 01020 "rsbac_pm(): add_object_class: purpose-id %i not in tkt-set\n", 01021 pp_set.id); 01022 return(-RSBAC_EINVALIDVALUE); 01023 } 01024 } 01025 } 01026 01027 /* OK, all checks done. Now change data. */ 01028 /* First remove ticket to prevent repeated */ 01029 /* calls and memory waste. */ 01030 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01031 01032 /* check, whether class exists */ 01033 pm_tid.object_class = param.add_object_class.id; 01034 class_exists = rsbac_pm_exists(ta_number,PMT_CLASS, pm_tid); 01035 if(!class_exists) 01036 { 01037 /* try to add class */ 01038 all_data.object_class.id = param.add_object_class.id; 01039 all_data.object_class.pp_set = 0; 01040 if((error = rsbac_pm_add_target(ta_number, 01041 PMT_CLASS, 01042 all_data))) 01043 return(error); 01044 } 01045 01046 /* get purposes from user space and add them to set */ 01047 if(param.add_object_class.pp_list_p) 01048 { 01049 pm_set_id.pp_set = param.add_object_class.id; 01050 if(!class_exists) 01051 { 01052 if(rsbac_pm_create_set(ta_number,PS_PP,pm_set_id)) 01053 return(-RSBAC_EWRITEFAILED); 01054 } 01055 else 01056 { 01057 if(rsbac_pm_clear_set(ta_number,PS_PP,pm_set_id)) 01058 return(-RSBAC_EWRITEFAILED); 01059 } 01060 01061 rsbac_get_user((u_char *) &pp_set, 01062 (u_char *) param.add_object_class.pp_list_p, 01063 sizeof(pp_set)); 01064 pm_set_member.pp = pp_set.id; 01065 if(rsbac_pm_add_to_set(ta_number,PS_PP,pm_set_id,pm_set_member)) 01066 { 01067 printk(KERN_DEBUG 01068 "rsbac_pm(): add_object_class: could not add first purpose-id %i to pp_set\n", 01069 pp_set.id); 01070 return(-RSBAC_EWRITEFAILED); 01071 } 01072 01073 while(pp_set.next) 01074 { 01075 rsbac_get_user((u_char *) &pp_set, 01076 (u_char *) pp_set.next, 01077 sizeof(pp_set)); 01078 pm_set_member.pp = pp_set.id; 01079 if(rsbac_pm_add_to_set(ta_number,PS_PP,pm_set_id,pm_set_member)) 01080 { 01081 printk(KERN_DEBUG 01082 "rsbac_pm(): add_object_class: could not add purpose-id %i to pp_set\n", 01083 pp_set.id); 01084 return(-RSBAC_EWRITEFAILED); 01085 } 01086 } 01087 /* notify class item of its pp_set_id */ 01088 pm_tid.object_class = param.add_object_class.id; 01089 data_val.pp_set = param.add_object_class.id; 01090 if((error = rsbac_pm_set_data(ta_number, 01091 PMT_CLASS, 01092 pm_tid, 01093 PD_pp_set, 01094 data_val))) 01095 { 01096 printk(KERN_DEBUG 01097 "rsbac_pm(): add_object_class: could not set pp_set_id for class\n"); 01098 return(-RSBAC_EWRITEFAILED); 01099 } 01100 } 01101 /* ready */ 01102 return(0); 01103 01104 case PF_delete_object_class: 01105 /* class-id 0/NIL, IPC and DEV are used internally, reject */ 01106 if( !param.delete_object_class.id 01107 || (param.delete_object_class.id == RSBAC_PM_IPC_OBJECT_CLASS_ID) 01108 || (param.delete_object_class.id == RSBAC_PM_DEV_OBJECT_CLASS_ID)) 01109 return(-RSBAC_EINVALIDVALUE); 01110 if(role != PR_security_officer) 01111 return(-RSBAC_EPERM); 01112 /* get ticket data, deny, if not found */ 01113 pm_tid.tkt = tkt; 01114 if((error = rsbac_pm_get_all_data(ta_number, 01115 PMT_TKT, 01116 pm_tid, 01117 &all_data))) 01118 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01119 if( (error != -RSBAC_EINVALIDTARGET) 01120 && (error != -RSBAC_ENOTFOUND) 01121 ) 01122 printk(KERN_WARNING 01123 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01124 error); 01125 return(-RSBAC_EPERM); /* execution denied */ 01126 } 01127 /* check ticket entries */ 01128 if( (all_data.tkt.function_type != PTF_delete_object_class) 01129 || (all_data.tkt.function_param.delete_object_class.id 01130 != param.delete_object_class.id) ) 01131 return(-RSBAC_EPERM); 01132 /* get ticket issuer role */ 01133 tid.user = all_data.tkt.issuer; 01134 if((error = rsbac_ta_get_attr(ta_number, 01135 PM, 01136 T_USER, 01137 tid, 01138 A_pm_role, 01139 &attr_val, 01140 TRUE))) 01141 { 01142 printk(KERN_WARNING 01143 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01144 error); 01145 return(-RSBAC_EREADFAILED); /* execution denied */ 01146 } 01147 01148 if(attr_val.pm_role != PR_data_protection_officer) 01149 { 01150 /* illegal issuer -> remove target */ 01151 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01152 return(-RSBAC_EPERM); 01153 } 01154 01155 /* OK, all checks done. Now change data. */ 01156 /* First remove ticket to prevent repeated calls. */ 01157 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01158 01159 /* try to delete class */ 01160 pm_tid.object_class = param.delete_object_class.id; 01161 return(rsbac_pm_remove_target(ta_number, 01162 PMT_CLASS, 01163 pm_tid)); 01164 01165 case PF_add_authorized_tp: 01166 /* task-id 0 and tp-id 0 are used internally, reject */ 01167 if(!param.add_authorized_tp.task || !param.add_authorized_tp.tp) 01168 return(-RSBAC_EINVALIDVALUE); 01169 if(role != PR_security_officer) 01170 return(-RSBAC_EPERM); 01171 01172 /* get ticket data, deny, if not found */ 01173 pm_tid.tkt = tkt; 01174 if((error = rsbac_pm_get_all_data(ta_number, 01175 PMT_TKT, 01176 pm_tid, 01177 &all_data))) 01178 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01179 if( (error != -RSBAC_EINVALIDTARGET) 01180 && (error != -RSBAC_ENOTFOUND) 01181 ) 01182 printk(KERN_WARNING 01183 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01184 error); 01185 return(-RSBAC_EPERM); /* execution denied */ 01186 } 01187 /* check ticket entries */ 01188 if( (all_data.tkt.function_type != PTF_add_authorized_tp) 01189 || (all_data.tkt.function_param.add_authorized_tp.task 01190 != param.add_authorized_tp.task) 01191 || (all_data.tkt.function_param.add_authorized_tp.tp 01192 != param.add_authorized_tp.tp) ) 01193 return(-RSBAC_EPERM); 01194 01195 /* check, whether task exists */ 01196 pm_tid2.task = param.add_authorized_tp.task; 01197 if(!rsbac_pm_exists(ta_number, 01198 PMT_TASK, 01199 pm_tid2)) 01200 return(-RSBAC_EINVALIDVALUE); 01201 /* check, whether tp exists */ 01202 pm_tid2.tp = param.add_authorized_tp.tp; 01203 if(!rsbac_pm_exists(ta_number, 01204 PMT_TP, 01205 pm_tid2)) 01206 return(-RSBAC_EINVALIDVALUE); 01207 01208 /* get ticket issuer role */ 01209 tid.user = all_data.tkt.issuer; 01210 if((error = rsbac_ta_get_attr(ta_number, 01211 PM, 01212 T_USER, 01213 tid, 01214 A_pm_role, 01215 &attr_val, 01216 TRUE))) 01217 { 01218 printk(KERN_WARNING 01219 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01220 error); 01221 return(-RSBAC_EREADFAILED); /* execution denied */ 01222 } 01223 01224 if(attr_val.pm_role != PR_data_protection_officer) 01225 { 01226 /* illegal issuer -> remove target */ 01227 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01228 return(-RSBAC_EPERM); 01229 } 01230 01231 /* OK, all checks done. Now change data. */ 01232 /* First remove ticket to prevent repeated calls. */ 01233 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01234 01235 /* try to add tp to tp_set of task */ 01236 /* lookup tp_set_id for this task */ 01237 pm_tid.task = param.add_authorized_tp.task; 01238 if((error = rsbac_pm_get_data(ta_number, 01239 PMT_TASK, 01240 pm_tid, 01241 PD_tp_set, 01242 &data_val))) 01243 return(-RSBAC_EREADFAILED); 01244 /* if tp_set is 0, it must be created and notified to task-data */ 01245 if(!data_val.tp_set) 01246 { 01247 pm_set_id.tp_set = param.add_authorized_tp.task; 01248 if((error = rsbac_pm_create_set(ta_number, 01249 PS_TP, 01250 pm_set_id))) 01251 return(error); 01252 data_val.tp_set = param.add_authorized_tp.task; 01253 if((error = rsbac_pm_set_data(ta_number, 01254 PMT_TASK, 01255 pm_tid, 01256 PD_tp_set, 01257 data_val))) 01258 return(-RSBAC_EWRITEFAILED); 01259 } 01260 01261 /* now that we know the set exists, try to add tp to it */ 01262 pm_set_id.tp_set = data_val.tp_set; 01263 pm_set_member.tp = param.add_authorized_tp.tp; 01264 if(rsbac_pm_add_to_set(ta_number,PS_TP,pm_set_id,pm_set_member)) 01265 return(-RSBAC_EWRITEFAILED); 01266 else 01267 /* ready */ 01268 return(0); 01269 01270 case PF_delete_authorized_tp: 01271 /* task-id 0 and tp-id 0 are used internally, reject */ 01272 if(!param.delete_authorized_tp.task || !param.delete_authorized_tp.tp) 01273 return(-RSBAC_EINVALIDVALUE); 01274 if(role != PR_security_officer) 01275 return(-RSBAC_EPERM); 01276 01277 /* get ticket data, deny, if not found */ 01278 pm_tid.tkt = tkt; 01279 if((error = rsbac_pm_get_all_data(ta_number, 01280 PMT_TKT, 01281 pm_tid, 01282 &all_data))) 01283 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01284 if( (error != -RSBAC_EINVALIDTARGET) 01285 && (error != -RSBAC_ENOTFOUND) 01286 ) 01287 printk(KERN_WARNING 01288 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01289 error); 01290 return(-RSBAC_EPERM); /* execution denied */ 01291 } 01292 /* check ticket entries */ 01293 if( (all_data.tkt.function_type != PTF_delete_authorized_tp) 01294 || (all_data.tkt.function_param.delete_authorized_tp.task 01295 != param.delete_authorized_tp.task) 01296 || (all_data.tkt.function_param.delete_authorized_tp.tp 01297 != param.delete_authorized_tp.tp) ) 01298 return(-RSBAC_EPERM); 01299 01300 /* get ticket issuer role */ 01301 tid.user = all_data.tkt.issuer; 01302 if((error = rsbac_ta_get_attr(ta_number, 01303 PM, 01304 T_USER, 01305 tid, 01306 A_pm_role, 01307 &attr_val, 01308 TRUE))) 01309 { 01310 printk(KERN_WARNING 01311 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01312 error); 01313 return(-RSBAC_EREADFAILED); /* execution denied */ 01314 } 01315 01316 if(attr_val.pm_role != PR_data_protection_officer) 01317 { 01318 /* illegal issuer -> remove target */ 01319 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01320 return(-RSBAC_EPERM); 01321 } 01322 01323 /* OK, all checks done. Now change data. */ 01324 /* First remove ticket to prevent repeated calls. */ 01325 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01326 01327 /* try to remove tp from tp_set of task */ 01328 /* lookup tp_set_id for this task */ 01329 pm_tid.task = param.delete_authorized_tp.task; 01330 if((error = rsbac_pm_get_data(ta_number, 01331 PMT_TASK, 01332 pm_tid, 01333 PD_tp_set, 01334 &data_val))) 01335 return(-RSBAC_EREADFAILED); 01336 /* if tp_set is 0, there are no tps to delete -> return */ 01337 if(!data_val.tp_set) 01338 return(-RSBAC_EINVALIDVALUE); 01339 01340 /* now that we know the set exists, try to remove tp from it */ 01341 pm_set_id.tp_set = data_val.tp_set; 01342 pm_set_member.tp = param.delete_authorized_tp.tp; 01343 if(rsbac_pm_remove_from_set(ta_number,PS_TP,pm_set_id,pm_set_member)) 01344 return(-RSBAC_EWRITEFAILED); 01345 else 01346 /* ready */ 01347 return(0); 01348 01349 case PF_add_consent: 01350 /* purpose_id 0 is used internally, reject */ 01351 if(!param.add_consent.purpose) 01352 return(-RSBAC_EINVALIDVALUE); 01353 if(role != PR_security_officer) 01354 return(-RSBAC_EPERM); 01355 01356 /* get ticket data, deny, if not found */ 01357 pm_tid.tkt = tkt; 01358 if((error = rsbac_pm_get_all_data(ta_number, 01359 PMT_TKT, 01360 pm_tid, 01361 &all_data))) 01362 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01363 if( (error != -RSBAC_EINVALIDTARGET) 01364 && (error != -RSBAC_ENOTFOUND) 01365 ) 01366 printk(KERN_WARNING 01367 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01368 error); 01369 return(-RSBAC_EPERM); /* execution denied */ 01370 } 01371 /* get file id */ 01372 if ((error = pm_get_file(param.add_consent.filename, &target, &tid)) < 0) 01373 { 01374 #ifdef CONFIG_RSBAC_DEBUG 01375 if (rsbac_debug_aef_pm) 01376 printk(KERN_DEBUG 01377 "rsbac_pm(): call to pm_get_file() returned error %i\n", 01378 error); 01379 #endif 01380 return(-RSBAC_EINVALIDTARGET); 01381 } 01382 /* target must be file */ 01383 if(target != T_FILE) 01384 return(-RSBAC_EINVALIDTARGET); 01385 /* check ticket entries */ 01386 if( (all_data.tkt.function_type != PTF_add_consent) 01387 || (RSBAC_MAJOR(all_data.tkt.function_param.tkt_add_consent.file.device) 01388 != RSBAC_MAJOR(tid.file.device)) 01389 || (RSBAC_MINOR(all_data.tkt.function_param.tkt_add_consent.file.device) 01390 != RSBAC_MINOR(tid.file.device)) 01391 || (all_data.tkt.function_param.tkt_add_consent.file.inode 01392 != tid.file.inode) 01393 || (all_data.tkt.function_param.tkt_add_consent.purpose 01394 != param.add_consent.purpose) ) 01395 return(-RSBAC_EPERM); 01396 file = tid.file; 01397 /* check, whether purpose exists */ 01398 pm_tid2.pp = param.add_consent.purpose; 01399 if(!rsbac_pm_exists(ta_number, 01400 PMT_PP, 01401 pm_tid2)) 01402 return(-RSBAC_EINVALIDVALUE); 01403 01404 /* get ticket issuer role */ 01405 tid.user = all_data.tkt.issuer; 01406 if((error = rsbac_ta_get_attr(ta_number, 01407 PM, 01408 T_USER, 01409 tid, 01410 A_pm_role, 01411 &attr_val, 01412 TRUE))) 01413 { 01414 printk(KERN_WARNING 01415 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01416 error); 01417 return(-RSBAC_EREADFAILED); /* execution denied */ 01418 } 01419 01420 if(attr_val.pm_role != PR_data_protection_officer) 01421 { 01422 /* illegal issuer -> remove target */ 01423 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01424 return(-RSBAC_EPERM); 01425 } 01426 01427 /* OK, all checks done. Now change data. */ 01428 /* First remove ticket to prevent repeated calls. */ 01429 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01430 01431 /* check, whether this consent exists */ 01432 pm_tid.cs.file = file; 01433 pm_tid.cs.purpose = param.add_consent.purpose; 01434 if(rsbac_pm_exists(ta_number, 01435 PMT_CS, 01436 pm_tid)) 01437 return(-RSBAC_EEXISTS); 01438 /* consent does not exist, try to add it */ 01439 all_data.cs.file = file; 01440 all_data.cs.purpose = param.add_consent.purpose; 01441 return(rsbac_pm_add_target(ta_number,PMT_CS,all_data)); 01442 01443 case PF_delete_consent: 01444 /* purpose_id 0 is used internally, reject */ 01445 if(!param.delete_consent.purpose) 01446 return(-RSBAC_EINVALIDVALUE); 01447 if(role != PR_security_officer) 01448 return(-RSBAC_EPERM); 01449 01450 /* get ticket data, deny, if not found */ 01451 pm_tid.tkt = tkt; 01452 if((error = rsbac_pm_get_all_data(ta_number, 01453 PMT_TKT, 01454 pm_tid, 01455 &all_data))) 01456 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01457 if( (error != -RSBAC_EINVALIDTARGET) 01458 && (error != -RSBAC_ENOTFOUND) 01459 ) 01460 printk(KERN_WARNING 01461 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01462 error); 01463 return(-RSBAC_EPERM); /* execution denied */ 01464 } 01465 /* get file id */ 01466 if ((error = pm_get_file(param.add_consent.filename, &target, &tid)) < 0) 01467 { 01468 #ifdef CONFIG_RSBAC_DEBUG 01469 if (rsbac_debug_aef_pm) 01470 printk(KERN_DEBUG 01471 "rsbac_pm(): call to pm_get_file() returned error %i\n", 01472 error); 01473 #endif 01474 return(-RSBAC_EINVALIDTARGET); 01475 } 01476 /* target must be file */ 01477 if(target != T_FILE) 01478 return(-RSBAC_EINVALIDTARGET); 01479 file=tid.file; 01480 /* check ticket entries */ 01481 if( (all_data.tkt.function_type != PTF_delete_consent) 01482 || (RSBAC_MAJOR(all_data.tkt.function_param.tkt_delete_consent.file.device) 01483 != RSBAC_MAJOR(file.device)) 01484 || (RSBAC_MINOR(all_data.tkt.function_param.tkt_delete_consent.file.device) 01485 != RSBAC_MINOR(file.device)) 01486 || (all_data.tkt.function_param.tkt_delete_consent.file.inode 01487 != file.inode) 01488 || (all_data.tkt.function_param.tkt_delete_consent.purpose 01489 != param.delete_consent.purpose) ) 01490 return(-RSBAC_EPERM); 01491 01492 /* get ticket issuer role */ 01493 tid.user = all_data.tkt.issuer; 01494 if((error = rsbac_ta_get_attr(ta_number, 01495 PM, 01496 T_USER, 01497 tid, 01498 A_pm_role, 01499 &attr_val, 01500 TRUE))) 01501 { 01502 printk(KERN_WARNING 01503 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01504 error); 01505 return(-RSBAC_EREADFAILED); /* execution denied */ 01506 } 01507 01508 if(attr_val.pm_role != PR_data_protection_officer) 01509 { 01510 /* illegal issuer -> remove target */ 01511 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01512 return(-RSBAC_EPERM); 01513 } 01514 01515 /* OK, all checks done. Now change data. */ 01516 /* First remove ticket to prevent repeated calls. */ 01517 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01518 01519 /* try to delete this consent */ 01520 pm_tid.cs.file = file; 01521 pm_tid.cs.purpose = param.delete_consent.purpose; 01522 return(rsbac_pm_remove_target(ta_number, 01523 PMT_CS, 01524 pm_tid)); 01525 01526 case PF_add_purpose: 01527 /* purpose_id 0, classes 0, IPC and DEV are used internally, reject */ 01528 if( !param.add_purpose.id 01529 || !param.add_purpose.def_class 01530 || (param.add_purpose.def_class 01531 == RSBAC_PM_IPC_OBJECT_CLASS_ID) 01532 || (param.add_purpose.def_class 01533 == RSBAC_PM_DEV_OBJECT_CLASS_ID) ) 01534 return(-RSBAC_EINVALIDVALUE); 01535 if(role != PR_security_officer) 01536 return(-RSBAC_EPERM); 01537 01538 /* get ticket data, deny, if not found */ 01539 pm_tid.tkt = tkt; 01540 if((error = rsbac_pm_get_all_data(ta_number, 01541 PMT_TKT, 01542 pm_tid, 01543 &all_data))) 01544 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01545 if( (error != -RSBAC_EINVALIDTARGET) 01546 && (error != -RSBAC_ENOTFOUND) 01547 ) 01548 printk(KERN_WARNING 01549 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01550 error); 01551 return(-RSBAC_EPERM); /* execution denied */ 01552 } 01553 /* check ticket entries */ 01554 if( (all_data.tkt.function_type != PTF_add_purpose) 01555 || (all_data.tkt.function_param.add_purpose.id 01556 != param.add_purpose.id) 01557 || (all_data.tkt.function_param.add_purpose.def_class 01558 != param.add_purpose.def_class) ) 01559 return(-RSBAC_EPERM); 01560 01561 /* get ticket issuer role */ 01562 tid.user = all_data.tkt.issuer; 01563 if((error = rsbac_ta_get_attr(ta_number, 01564 PM, 01565 T_USER, 01566 tid, 01567 A_pm_role, 01568 &attr_val, 01569 TRUE))) 01570 { 01571 printk(KERN_WARNING 01572 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01573 error); 01574 return(-RSBAC_EREADFAILED); /* execution denied */ 01575 } 01576 01577 if(attr_val.pm_role != PR_data_protection_officer) 01578 { 01579 /* illegal issuer -> remove target */ 01580 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01581 return(-RSBAC_EPERM); 01582 } 01583 01584 /* OK, all checks done. Now change data. */ 01585 /* First remove ticket to prevent repeated calls. */ 01586 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01587 01588 /* if def_class does not exist, try to create it */ 01589 pm_tid.object_class = param.add_purpose.def_class; 01590 if(!rsbac_pm_exists(ta_number, 01591 PMT_CLASS, 01592 pm_tid)) 01593 { 01594 /* try to add class */ 01595 all_data.object_class.id = param.add_purpose.def_class; 01596 all_data.object_class.pp_set = 0; 01597 if((error = rsbac_pm_add_target(ta_number, 01598 PMT_CLASS, 01599 all_data))) 01600 return(error); 01601 } 01602 01603 /* try to add purpose */ 01604 all_data.pp.id = param.add_purpose.id; 01605 all_data.pp.def_class = param.add_purpose.def_class; 01606 if((error = rsbac_pm_add_target(ta_number, 01607 PMT_PP, 01608 all_data))) 01609 return(error); 01610 01611 /* add purpose to purpose-set of class */ 01612 /* lookup pp_set_id for this class */ 01613 pm_tid.object_class = param.add_purpose.def_class; 01614 if((error = rsbac_pm_get_data(ta_number, 01615 PMT_CLASS, 01616 pm_tid, 01617 PD_pp_set, 01618 &data_val))) 01619 return(-RSBAC_EREADFAILED); 01620 /* if no pp-set: create it and set it in class structure */ 01621 if(!data_val.pp_set) 01622 { 01623 pm_set_id.pp_set = param.add_purpose.def_class; 01624 if(rsbac_pm_create_set(ta_number,PS_PP,pm_set_id)) 01625 return(-RSBAC_EWRITEFAILED); 01626 data_val.pp_set = param.add_purpose.def_class; 01627 if((error = rsbac_pm_set_data(ta_number, 01628 PMT_CLASS, 01629 pm_tid, 01630 PD_pp_set, 01631 data_val))) 01632 return(-RSBAC_EWRITEFAILED); 01633 } 01634 /* now that we know the set exists, try to add purpose to it */ 01635 pm_set_id.pp_set = data_val.pp_set; 01636 pm_set_member.pp = param.add_purpose.id; 01637 if(rsbac_pm_add_to_set(ta_number,PS_PP,pm_set_id,pm_set_member)) 01638 return(-RSBAC_EWRITEFAILED); 01639 else 01640 /* ready */ 01641 return(0); 01642 01643 case PF_delete_purpose: 01644 /* purpose_id 0 is used internally, reject */ 01645 if(!param.delete_purpose.id) 01646 return(-RSBAC_EINVALIDVALUE); 01647 if(role != PR_security_officer) 01648 return(-RSBAC_EPERM); 01649 01650 /* get ticket data, deny, if not found */ 01651 pm_tid.tkt = tkt; 01652 if((error = rsbac_pm_get_all_data(ta_number, 01653 PMT_TKT, 01654 pm_tid, 01655 &all_data))) 01656 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01657 if( (error != -RSBAC_EINVALIDTARGET) 01658 && (error != -RSBAC_ENOTFOUND) 01659 ) 01660 printk(KERN_WARNING 01661 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01662 error); 01663 return(-RSBAC_EPERM); /* execution denied */ 01664 } 01665 /* check ticket entries */ 01666 if( (all_data.tkt.function_type != PTF_delete_purpose) 01667 || (all_data.tkt.function_param.delete_purpose.id 01668 != param.delete_purpose.id) ) 01669 return(-RSBAC_EPERM); 01670 01671 /* get ticket issuer role */ 01672 tid.user = all_data.tkt.issuer; 01673 if((error = rsbac_ta_get_attr(ta_number, 01674 PM, 01675 T_USER, 01676 tid, 01677 A_pm_role, 01678 &attr_val, 01679 TRUE))) 01680 { 01681 printk(KERN_WARNING 01682 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01683 error); 01684 return(-RSBAC_EREADFAILED); /* execution denied */ 01685 } 01686 01687 if(attr_val.pm_role != PR_data_protection_officer) 01688 { 01689 /* illegal issuer -> delete ticket */ 01690 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01691 return(-RSBAC_EPERM); 01692 } 01693 01694 /* OK, all checks done. Now change data. */ 01695 /* First remove ticket to prevent repeated calls. */ 01696 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01697 01698 /* try to delete this purpose */ 01699 pm_tid.pp = param.delete_purpose.id; 01700 return(rsbac_pm_remove_target(ta_number, 01701 PMT_PP, 01702 pm_tid)); 01703 01704 case PF_add_responsible_user: 01705 /* task_id 0 is used internally, reject */ 01706 if(!param.add_responsible_user.task) 01707 return(-RSBAC_EINVALIDVALUE); 01708 if(role != PR_security_officer) 01709 return(-RSBAC_EPERM); 01710 01711 /* get ticket data, deny, if not found */ 01712 pm_tid.tkt = tkt; 01713 if((error = rsbac_pm_get_all_data(ta_number, 01714 PMT_TKT, 01715 pm_tid, 01716 &all_data))) 01717 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01718 if( (error != -RSBAC_EINVALIDTARGET) 01719 && (error != -RSBAC_ENOTFOUND) 01720 ) 01721 printk(KERN_WARNING 01722 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01723 error); 01724 return(-RSBAC_EPERM); /* execution denied */ 01725 } 01726 /* check ticket entries */ 01727 if( (all_data.tkt.function_type != PTF_add_responsible_user) 01728 || (all_data.tkt.function_param.add_responsible_user.user 01729 != param.add_responsible_user.user) 01730 || (all_data.tkt.function_param.add_responsible_user.task 01731 != param.add_responsible_user.task) ) 01732 return(-RSBAC_EPERM); 01733 01734 /* check, whether task exists */ 01735 pm_tid2.task = param.add_responsible_user.task; 01736 if(!rsbac_pm_exists(ta_number, 01737 PMT_TASK, 01738 pm_tid2)) 01739 return(-RSBAC_EINVALIDVALUE); 01740 01741 /* get ticket issuer role */ 01742 tid.user = all_data.tkt.issuer; 01743 if((error = rsbac_ta_get_attr(ta_number, 01744 PM, 01745 T_USER, 01746 tid, 01747 A_pm_role, 01748 &attr_val, 01749 TRUE))) 01750 { 01751 printk(KERN_WARNING 01752 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01753 error); 01754 return(-RSBAC_EREADFAILED); /* execution denied */ 01755 } 01756 01757 if(attr_val.pm_role != PR_data_protection_officer) 01758 { 01759 /* illegal issuer -> delete ticket */ 01760 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01761 return(-RSBAC_EPERM); 01762 } 01763 01764 /* OK, all checks done. Now change data. */ 01765 /* First remove ticket to prevent repeated calls. */ 01766 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01767 01768 /* try to add user to ru_set of task */ 01769 01770 /* lookup ru_set_id for this task */ 01771 pm_tid.task = param.add_responsible_user.task; 01772 if((error = rsbac_pm_get_data(ta_number, 01773 PMT_TASK, 01774 pm_tid, 01775 PD_ru_set, 01776 &data_val))) 01777 return(-RSBAC_EREADFAILED); 01778 /* if ru_set is 0, it must be created and notified to task-data */ 01779 if(!data_val.ru_set) 01780 { 01781 pm_set_id.ru_set = param.add_responsible_user.task; 01782 if((error = rsbac_pm_create_set(ta_number, 01783 PS_RU, 01784 pm_set_id))) 01785 return(error); 01786 data_val.ru_set = param.add_responsible_user.task; 01787 if((error = rsbac_pm_set_data(ta_number, 01788 PMT_TASK, 01789 pm_tid, 01790 PD_ru_set, 01791 data_val))) 01792 return(-RSBAC_EWRITEFAILED); 01793 } 01794 01795 /* now that we know the set exists, try to add ru to it */ 01796 pm_set_id.ru_set = data_val.ru_set; 01797 pm_set_member.ru = param.add_responsible_user.user; 01798 if(rsbac_pm_add_to_set(ta_number,PS_RU,pm_set_id,pm_set_member)) 01799 return(-RSBAC_EWRITEFAILED); 01800 else 01801 /* ready */ 01802 return(0); 01803 01804 case PF_delete_responsible_user: 01805 /* task_id 0 is used internally, reject */ 01806 if(!param.delete_responsible_user.task) 01807 return(-RSBAC_EINVALIDVALUE); 01808 if(role != PR_security_officer) 01809 return(-RSBAC_EPERM); 01810 01811 /* get ticket data, deny, if not found */ 01812 pm_tid.tkt = tkt; 01813 if((error = rsbac_pm_get_all_data(ta_number, 01814 PMT_TKT, 01815 pm_tid, 01816 &all_data))) 01817 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01818 if( (error != -RSBAC_EINVALIDTARGET) 01819 && (error != -RSBAC_ENOTFOUND) 01820 ) 01821 printk(KERN_WARNING 01822 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01823 error); 01824 return(-RSBAC_EPERM); /* execution denied */ 01825 } 01826 /* check ticket entries */ 01827 if( (all_data.tkt.function_type != PTF_delete_responsible_user) 01828 || (all_data.tkt.function_param.delete_responsible_user.user 01829 != param.delete_responsible_user.user) 01830 || (all_data.tkt.function_param.delete_responsible_user.task 01831 != param.delete_responsible_user.task) ) 01832 return(-RSBAC_EPERM); 01833 01834 /* get ticket issuer role */ 01835 tid.user = all_data.tkt.issuer; 01836 if((error = rsbac_ta_get_attr(ta_number, 01837 PM, 01838 T_USER, 01839 tid, 01840 A_pm_role, 01841 &attr_val, 01842 TRUE))) 01843 { 01844 printk(KERN_WARNING 01845 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01846 error); 01847 return(-RSBAC_EREADFAILED); /* execution denied */ 01848 } 01849 01850 if(attr_val.pm_role != PR_data_protection_officer) 01851 { 01852 /* illegal issuer -> delete ticket */ 01853 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01854 return(-RSBAC_EPERM); 01855 } 01856 01857 /* OK, all checks done. Now change data. */ 01858 /* First remove ticket to prevent repeated calls. */ 01859 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01860 /* try to add user to ru_set of task */ 01861 /* lookup ru_set_id for this task */ 01862 pm_tid.task = param.delete_responsible_user.task; 01863 if((error = rsbac_pm_get_data(ta_number, 01864 PMT_TASK, 01865 pm_tid, 01866 PD_ru_set, 01867 &data_val))) 01868 return(-RSBAC_EREADFAILED); 01869 /* if ru_set is 0, there is nothing to delete */ 01870 if(!data_val.ru_set) 01871 return(-RSBAC_EINVALIDVALUE); 01872 01873 /* now that we know the set exists, try to remove ru from it */ 01874 pm_set_id.ru_set = data_val.ru_set; 01875 pm_set_member.ru = param.delete_responsible_user.user; 01876 if(rsbac_pm_remove_from_set(ta_number,PS_RU,pm_set_id,pm_set_member)) 01877 return(-RSBAC_EWRITEFAILED); 01878 else 01879 /* ready */ 01880 return(0); 01881 01882 case PF_delete_user_aci: 01883 if(role != PR_security_officer) 01884 return(-RSBAC_EPERM); 01885 01886 /* get ticket data, deny, if not found */ 01887 pm_tid.tkt = tkt; 01888 if((error = rsbac_pm_get_all_data(ta_number, 01889 PMT_TKT, 01890 pm_tid, 01891 &all_data))) 01892 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01893 if( (error != -RSBAC_EINVALIDTARGET) 01894 && (error != -RSBAC_ENOTFOUND) 01895 ) 01896 printk(KERN_WARNING 01897 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01898 error); 01899 return(-RSBAC_EPERM); /* execution denied */ 01900 } 01901 /* check ticket entries */ 01902 if( (all_data.tkt.function_type != PTF_delete_user_aci) 01903 || (all_data.tkt.function_param.delete_user_aci.id 01904 != param.delete_user_aci.id) ) 01905 return(-RSBAC_EPERM); 01906 01907 /* get ticket issuer role */ 01908 tid.user = all_data.tkt.issuer; 01909 if((error = rsbac_ta_get_attr(ta_number, 01910 PM, 01911 T_USER, 01912 tid, 01913 A_pm_role, 01914 &attr_val, 01915 TRUE))) 01916 { 01917 printk(KERN_WARNING 01918 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01919 error); 01920 return(-RSBAC_EREADFAILED); /* execution denied */ 01921 } 01922 01923 if(attr_val.pm_role != PR_data_protection_officer) 01924 { 01925 /* illegal issuer -> delete ticket */ 01926 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01927 return(-RSBAC_EPERM); 01928 } 01929 01930 /* OK, all checks done. Now remove aci. */ 01931 /* First remove ticket to prevent repeated calls. */ 01932 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01933 tid.user = param.delete_user_aci.id; 01934 rsbac_ta_remove_target(ta_number,T_USER,tid); 01935 return(0); 01936 01937 case PF_set_role: 01938 if(role != PR_security_officer) 01939 return(-RSBAC_EPERM); 01940 01941 /* get ticket data, deny, if not found */ 01942 pm_tid.tkt = tkt; 01943 if((error = rsbac_pm_get_all_data(ta_number, 01944 PMT_TKT, 01945 pm_tid, 01946 &all_data))) 01947 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 01948 if( (error != -RSBAC_EINVALIDTARGET) 01949 && (error != -RSBAC_ENOTFOUND) 01950 ) 01951 printk(KERN_WARNING 01952 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 01953 error); 01954 return(-RSBAC_EPERM); /* execution denied */ 01955 } 01956 /* check ticket entries */ 01957 if( (all_data.tkt.function_type != PTF_set_role) 01958 || (all_data.tkt.function_param.set_role.user 01959 != param.set_role.user) 01960 || (all_data.tkt.function_param.set_role.role 01961 != param.set_role.role) ) 01962 return(-RSBAC_EPERM); 01963 01964 /* get ticket issuer role */ 01965 tid.user = all_data.tkt.issuer; 01966 if((error = rsbac_ta_get_attr(ta_number, 01967 PM, 01968 T_USER, 01969 tid, 01970 A_pm_role, 01971 &attr_val, 01972 TRUE))) 01973 { 01974 printk(KERN_WARNING 01975 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 01976 error); 01977 return(-RSBAC_EREADFAILED); /* execution denied */ 01978 } 01979 01980 if(attr_val.pm_role != PR_data_protection_officer) 01981 { 01982 /* illegal issuer -> delete ticket */ 01983 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01984 return(-RSBAC_EPERM); 01985 } 01986 01987 /* OK, all checks done. Now change data. */ 01988 /* First remove ticket to prevent repeated calls. */ 01989 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 01990 01991 /* try to set role */ 01992 tid.user = param.set_role.user; 01993 attr_val.pm_role = param.set_role.role; 01994 return(rsbac_ta_set_attr(ta_number, 01995 PM, 01996 T_USER, 01997 tid, 01998 A_pm_role, 01999 attr_val)); 02000 02001 case PF_set_object_class: 02002 if(role != PR_security_officer) 02003 return(-RSBAC_EPERM); 02004 02005 /* get ticket data, deny, if not found */ 02006 pm_tid.tkt = tkt; 02007 if((error = rsbac_pm_get_all_data(ta_number, 02008 PMT_TKT, 02009 pm_tid, 02010 &all_data))) 02011 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 02012 if( (error != -RSBAC_EINVALIDTARGET) 02013 && (error != -RSBAC_ENOTFOUND) 02014 ) 02015 printk(KERN_WARNING 02016 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 02017 error); 02018 return(-RSBAC_EPERM); /* execution denied */ 02019 } 02020 /* get file id */ 02021 if ((error = pm_get_file(param.set_object_class.filename, &target, &tid)) < 0) 02022 { 02023 #ifdef CONFIG_RSBAC_DEBUG 02024 if (rsbac_debug_aef_pm) 02025 printk(KERN_DEBUG 02026 "rsbac_pm(): call to pm_get_file() returned error %i\n", 02027 error); 02028 #endif 02029 return(-RSBAC_EINVALIDTARGET); 02030 } 02031 /* target must be file */ 02032 if( (target != T_FILE) 02033 && (target != T_FIFO) 02034 ) 02035 return(-RSBAC_EINVALIDTARGET); 02036 file=tid.file; 02037 /* check ticket entries */ 02038 if( (all_data.tkt.function_type != PTF_set_object_class) 02039 || (RSBAC_MAJOR(all_data.tkt.function_param.tkt_set_object_class.file.device) 02040 != RSBAC_MAJOR(file.device)) 02041 || (RSBAC_MINOR(all_data.tkt.function_param.tkt_set_object_class.file.device) 02042 != RSBAC_MINOR(file.device)) 02043 || (all_data.tkt.function_param.tkt_set_object_class.file.inode 02044 != file.inode) 02045 || (all_data.tkt.function_param.tkt_set_object_class.object_class 02046 != param.set_object_class.object_class) ) 02047 return(-RSBAC_EPERM); 02048 02049 /* get ticket issuer role */ 02050 tid.user = all_data.tkt.issuer; 02051 if((error = rsbac_ta_get_attr(ta_number, 02052 PM, 02053 T_USER, 02054 tid, 02055 A_pm_role, 02056 &attr_val, 02057 TRUE))) 02058 { 02059 printk(KERN_WARNING 02060 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 02061 error); 02062 return(-RSBAC_EREADFAILED); /* execution denied */ 02063 } 02064 02065 if(attr_val.pm_role != PR_data_protection_officer) 02066 { 02067 /* illegal issuer -> delete ticket */ 02068 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02069 return(-RSBAC_EPERM); 02070 } 02071 02072 /* get old pm_object_type */ 02073 tid.file = file; 02074 if((error = rsbac_ta_get_attr(ta_number, 02075 PM, 02076 target, 02077 tid, 02078 A_pm_object_type, 02079 &attr_val, 02080 FALSE))) 02081 { 02082 printk(KERN_WARNING 02083 "rsbac_pm(): rsbac_get_attr() for FILE/FIFO/pm_object_type returned error %i", 02084 error); 02085 return(-RSBAC_EREADFAILED); /* execution denied */ 02086 } 02087 02088 switch(attr_val.pm_object_type) 02089 { 02090 case PO_personal_data: 02091 case PO_none: 02092 case PO_non_personal_data: 02093 break; 02094 default: 02095 return(-RSBAC_EPERM); 02096 } 02097 02098 /* OK, all checks done. Now change data. */ 02099 /* First remove ticket to prevent repeated calls. */ 02100 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02101 02102 /* set new pm_object_type */ 02103 if(param.set_object_class.object_class) 02104 attr_val.pm_object_type = PO_personal_data; 02105 else 02106 attr_val.pm_object_type = PO_non_personal_data; 02107 if((error = rsbac_ta_set_attr(ta_number, 02108 PM, 02109 target, 02110 tid, 02111 A_pm_object_type, 02112 attr_val))) 02113 { 02114 printk(KERN_WARNING 02115 "rsbac_pm(): rsbac_set_attr() for FILE/pm_object_type returned error %i", 02116 error); 02117 return(-RSBAC_EWRITEFAILED); 02118 } 02119 /* set new pm_object_class */ 02120 attr_val.pm_object_class = param.set_object_class.object_class; 02121 if((error = rsbac_ta_set_attr(ta_number, 02122 PM, 02123 target, 02124 tid, 02125 A_pm_object_class, 02126 attr_val))) 02127 { 02128 printk(KERN_WARNING 02129 "rsbac_pm(): rsbac_set_attr() for FILE/pm_object_type returned error %i", 02130 error); 02131 return(-RSBAC_EWRITEFAILED); 02132 } 02133 /* ready */ 02134 return(0); 02135 02136 #ifdef CONFIG_RSBAC_SWITCH_PM 02137 case PF_switch_pm: 02138 /* only values 0 and 1 are allowed */ 02139 if(param.switch_pm.value && (param.switch_pm.value != 1)) 02140 return(-RSBAC_EINVALIDVALUE); 02141 if(role != PR_security_officer) 02142 return(-RSBAC_EPERM); 02143 02144 /* get ticket data, deny, if not found */ 02145 pm_tid.tkt = tkt; 02146 if((error = rsbac_pm_get_all_data(ta_number, 02147 PMT_TKT, 02148 pm_tid, 02149 &all_data))) 02150 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 02151 if( (error != -RSBAC_EINVALIDTARGET) 02152 && (error != -RSBAC_ENOTFOUND) 02153 ) 02154 printk(KERN_WARNING 02155 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 02156 error); 02157 return(-RSBAC_EPERM); /* execution denied */ 02158 } 02159 /* check ticket entries */ 02160 if( (all_data.tkt.function_type != PTF_switch_pm) 02161 || (all_data.tkt.function_param.switch_pm.value 02162 != param.switch_pm.value)) 02163 return(-RSBAC_EPERM); 02164 02165 /* get ticket issuer role */ 02166 tid.user = all_data.tkt.issuer; 02167 if((error = rsbac_ta_get_attr(ta_number, 02168 PM, 02169 T_USER, 02170 tid, 02171 A_pm_role, 02172 &attr_val, 02173 TRUE))) 02174 { 02175 printk(KERN_WARNING 02176 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 02177 error); 02178 return(-RSBAC_EREADFAILED); /* execution denied */ 02179 } 02180 02181 if(attr_val.pm_role != PR_data_protection_officer) 02182 { 02183 /* illegal issuer -> delete ticket */ 02184 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02185 return(-RSBAC_EPERM); 02186 } 02187 02188 /* OK, all checks done. Now change data. */ 02189 /* First remove ticket to prevent repeated calls. */ 02190 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02191 02192 /* switch pm-module */ 02193 printk(KERN_WARNING "sys_rsbac_switch(): switching RSBAC module PM (No. %i) to %i!\n", 02194 PM, param.switch_pm.value); 02195 rsbac_switch_pm = param.switch_pm.value; 02196 return(0); 02197 02198 #endif 02199 #ifdef CONFIG_RSBAC_SWITCH_AUTH 02200 case PF_switch_auth: 02201 /* only values 0 and 1 are allowed */ 02202 if(param.switch_auth.value && (param.switch_auth.value != 1)) 02203 return(-RSBAC_EINVALIDVALUE); 02204 if(role != PR_security_officer) 02205 return(-RSBAC_EPERM); 02206 02207 /* get ticket data, deny, if not found */ 02208 pm_tid.tkt = tkt; 02209 if((error = rsbac_pm_get_all_data(ta_number, 02210 PMT_TKT, 02211 pm_tid, 02212 &all_data))) 02213 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 02214 if( (error != -RSBAC_EINVALIDTARGET) 02215 && (error != -RSBAC_ENOTFOUND) 02216 ) 02217 printk(KERN_WARNING 02218 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 02219 error); 02220 return(-RSBAC_EPERM); /* execution denied */ 02221 } 02222 /* check ticket entries */ 02223 if( (all_data.tkt.function_type != PTF_switch_auth) 02224 || (all_data.tkt.function_param.switch_auth.value 02225 != param.switch_auth.value)) 02226 return(-RSBAC_EPERM); 02227 02228 /* get ticket issuer role */ 02229 tid.user = all_data.tkt.issuer; 02230 if((error = rsbac_ta_get_attr(ta_number, 02231 PM, 02232 T_USER, 02233 tid, 02234 A_pm_role, 02235 &attr_val, 02236 TRUE))) 02237 { 02238 printk(KERN_WARNING 02239 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 02240 error); 02241 return(-RSBAC_EREADFAILED); /* execution denied */ 02242 } 02243 02244 if(attr_val.pm_role != PR_data_protection_officer) 02245 { 02246 /* illegal issuer -> delete ticket */ 02247 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02248 return(-RSBAC_EPERM); 02249 } 02250 02251 /* OK, all own checks done. Call ADF for other modules. */ 02252 #ifdef CONFIG_RSBAC_DEBUG 02253 if (rsbac_debug_aef_pm) 02254 printk(KERN_DEBUG "rsbac_pm(): calling ADF int\n"); 02255 #endif 02256 tid.dummy = 0; 02257 attr_val.switch_target = AUTH; 02258 if (!rsbac_adf_request_int(R_SWITCH_MODULE, 02259 current->pid, 02260 T_NONE, 02261 &tid, 02262 A_switch_target, 02263 &attr_val, 02264 PM)) 02265 { 02266 return -EPERM; 02267 } 02268 02269 /* First remove ticket to prevent repeated calls. */ 02270 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02271 02272 /* switch auth module */ 02273 printk(KERN_WARNING "sys_rsbac_pm/switch(): switching RSBAC module AUTH (No. %i) to %i!\n", 02274 AUTH, param.switch_auth.value); 02275 rsbac_switch_auth = param.switch_auth.value; 02276 return(0); 02277 #endif /* SWITCH_AUTH */ 02278 02279 case PF_set_device_object_type: 02280 if(role != PR_security_officer) 02281 return(-RSBAC_EPERM); 02282 02283 /* get ticket data, deny, if not found */ 02284 pm_tid.tkt = tkt; 02285 if((error = rsbac_pm_get_all_data(ta_number, 02286 PMT_TKT, 02287 pm_tid, 02288 &all_data))) 02289 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 02290 if( (error != -RSBAC_EINVALIDTARGET) 02291 && (error != -RSBAC_ENOTFOUND) 02292 ) 02293 printk(KERN_WARNING 02294 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 02295 error); 02296 return(-RSBAC_EPERM); /* execution denied */ 02297 } 02298 /* get file id */ 02299 if ((error = pm_get_file(param.set_device_object_type.filename, &target, &tid)) < 0) 02300 { 02301 #ifdef CONFIG_RSBAC_DEBUG 02302 if (rsbac_debug_aef_pm) 02303 printk(KERN_DEBUG 02304 "rsbac_pm(): call to pm_get_file() returned error %i\n", 02305 error); 02306 #endif 02307 return(-RSBAC_EINVALIDTARGET); 02308 } 02309 /* target must be dev */ 02310 if(target != T_DEV) 02311 return(-RSBAC_EINVALIDTARGET); 02312 dev=tid.dev; 02313 /* check ticket entries */ 02314 if( (all_data.tkt.function_type != PTF_set_device_object_type) 02315 || (all_data.tkt.function_param.tkt_set_device_object_type.dev.type 02316 != dev.type) 02317 || (all_data.tkt.function_param.tkt_set_device_object_type.dev.major 02318 != dev.major) 02319 || (all_data.tkt.function_param.tkt_set_device_object_type.dev.minor 02320 != dev.minor) 02321 || (all_data.tkt.function_param.tkt_set_device_object_type.object_type 02322 != param.set_device_object_type.object_type) 02323 || (all_data.tkt.function_param.tkt_set_device_object_type.object_class 02324 != param.set_device_object_type.object_class) ) 02325 return(-RSBAC_EPERM); 02326 02327 /* get ticket issuer role */ 02328 tid.user = all_data.tkt.issuer; 02329 if((error = rsbac_ta_get_attr(ta_number, 02330 PM, 02331 T_USER, 02332 tid, 02333 A_pm_role, 02334 &attr_val, 02335 TRUE))) 02336 { 02337 printk(KERN_WARNING 02338 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 02339 error); 02340 return(-RSBAC_EREADFAILED); /* execution denied */ 02341 } 02342 02343 if(attr_val.pm_role != PR_data_protection_officer) 02344 { 02345 /* illegal issuer -> delete ticket */ 02346 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02347 return(-RSBAC_EPERM); 02348 } 02349 02350 switch(param.set_device_object_type.object_type) 02351 { 02352 case PO_personal_data: 02353 case PO_none: 02354 case PO_TP: 02355 case PO_non_personal_data: 02356 break; 02357 default: 02358 return(-RSBAC_EINVALIDVALUE); 02359 } 02360 02361 /* OK, all checks done. Now change data. */ 02362 /* First remove ticket to prevent repeated calls. */ 02363 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02364 02365 /* set new pm_object_type */ 02366 tid.dev = dev; 02367 attr_val.pm_object_type = param.set_device_object_type.object_type; 02368 if((error = rsbac_ta_set_attr(ta_number, 02369 PM, 02370 T_DEV, 02371 tid, 02372 A_pm_object_type, 02373 attr_val))) 02374 { 02375 printk(KERN_WARNING 02376 "rsbac_pm(): rsbac_set_attr() for DEV/pm_object_type returned error %i", 02377 error); 02378 return(-RSBAC_EWRITEFAILED); 02379 } 02380 /* set new pm_object_class */ 02381 attr_val.pm_object_class = param.set_device_object_type.object_class; 02382 if((error = rsbac_ta_set_attr(ta_number, 02383 PM, 02384 T_DEV, 02385 tid, 02386 A_pm_object_class, 02387 attr_val))) 02388 { 02389 printk(KERN_WARNING 02390 "rsbac_pm(): rsbac_set_attr() for DEV/pm_object_class returned error %i", 02391 error); 02392 return(-RSBAC_EWRITEFAILED); 02393 } 02394 /* ready */ 02395 return(0); 02396 02397 case PF_set_auth_may_setuid: 02398 if(role != PR_security_officer) 02399 return(-RSBAC_EPERM); 02400 02401 /* get ticket data, deny, if not found */ 02402 pm_tid.tkt = tkt; 02403 if((error = rsbac_pm_get_all_data(ta_number, 02404 PMT_TKT, 02405 pm_tid, 02406 &all_data))) 02407 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 02408 if( (error != -RSBAC_EINVALIDTARGET) 02409 && (error != -RSBAC_ENOTFOUND) 02410 ) 02411 printk(KERN_WARNING 02412 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 02413 error); 02414 return(-RSBAC_EPERM); /* execution denied */ 02415 } 02416 /* get file id */ 02417 if ((error = pm_get_file(param.set_auth_may_setuid.filename, &target, &tid)) < 0) 02418 { 02419 #ifdef CONFIG_RSBAC_DEBUG 02420 if (rsbac_debug_aef_pm) 02421 printk(KERN_DEBUG 02422 "rsbac_pm(): call to pm_get_file() returned error %i\n", 02423 error); 02424 #endif 02425 return(-RSBAC_EINVALIDTARGET); 02426 } 02427 /* target must be file */ 02428 if( (target != T_FILE) 02429 && (target != T_FIFO) 02430 ) 02431 return(-RSBAC_EINVALIDTARGET); 02432 file=tid.file; 02433 /* check ticket entries */ 02434 if( (all_data.tkt.function_type != PTF_set_auth_may_setuid) 02435 || (RSBAC_MAJOR(all_data.tkt.function_param.tkt_set_auth_may_setuid.file.device) 02436 != RSBAC_MAJOR(file.device)) 02437 || (RSBAC_MINOR(all_data.tkt.function_param.tkt_set_auth_may_setuid.file.device) 02438 != RSBAC_MINOR(file.device)) 02439 || (all_data.tkt.function_param.tkt_set_auth_may_setuid.file.inode 02440 != file.inode) 02441 || (all_data.tkt.function_param.tkt_set_auth_may_setuid.value 02442 != param.set_auth_may_setuid.value) 02443 ) 02444 return(-RSBAC_EPERM); 02445 02446 /* get ticket issuer role */ 02447 tid.user = all_data.tkt.issuer; 02448 if((error = rsbac_ta_get_attr(ta_number, 02449 PM, 02450 T_USER, 02451 tid, 02452 A_pm_role, 02453 &attr_val, 02454 TRUE))) 02455 { 02456 printk(KERN_WARNING 02457 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 02458 error); 02459 return(-RSBAC_EREADFAILED); /* execution denied */ 02460 } 02461 02462 if(attr_val.pm_role != PR_data_protection_officer) 02463 { 02464 /* illegal issuer -> delete ticket */ 02465 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02466 return(-RSBAC_EPERM); 02467 } 02468 02469 switch(param.set_auth_may_setuid.value) 02470 { 02471 case FALSE: 02472 case TRUE: 02473 break; 02474 default: 02475 return(-RSBAC_EINVALIDVALUE); 02476 } 02477 /* OK, all own checks done. Call ADF for other modules. */ 02478 #ifdef CONFIG_RSBAC_DEBUG 02479 if (rsbac_debug_aef_pm) 02480 printk(KERN_DEBUG "rsbac_pm(): calling ADF int\n"); 02481 #endif 02482 tid.file = file; 02483 attr_val.auth_may_setuid = param.set_auth_may_setuid.value; 02484 if (!rsbac_adf_request_int(R_MODIFY_ATTRIBUTE, 02485 current->pid, 02486 T_FILE, 02487 &tid, 02488 A_auth_may_setuid, 02489 &attr_val, 02490 PM)) 02491 { 02492 return -EPERM; 02493 } 02494 02495 /* OK, all checks done. Now change data. */ 02496 /* First remove ticket to prevent repeated calls. */ 02497 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02498 02499 /* set new auth_may_setuid */ 02500 if((error = rsbac_ta_set_attr(ta_number, 02501 AUTH, 02502 T_FILE, 02503 tid, 02504 A_auth_may_setuid, 02505 attr_val))) 02506 { 02507 printk(KERN_WARNING 02508 "rsbac_pm(): rsbac_set_attr() for FILE/auth_may_setuid returned error %i", 02509 error); 02510 return(-RSBAC_EWRITEFAILED); 02511 } 02512 /* ready */ 02513 return(0); 02514 02515 case PF_set_auth_may_set_cap: 02516 if(role != PR_security_officer) 02517 return(-RSBAC_EPERM); 02518 02519 /* get ticket data, deny, if not found */ 02520 pm_tid.tkt = tkt; 02521 if((error = rsbac_pm_get_all_data(ta_number, 02522 PMT_TKT, 02523 pm_tid, 02524 &all_data))) 02525 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 02526 if( (error != -RSBAC_EINVALIDTARGET) 02527 && (error != -RSBAC_ENOTFOUND) 02528 ) 02529 printk(KERN_WARNING 02530 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 02531 error); 02532 return(-RSBAC_EPERM); /* execution denied */ 02533 } 02534 /* get file id */ 02535 if ((error = pm_get_file(param.set_auth_may_set_cap.filename, &target, &tid)) < 0) 02536 { 02537 #ifdef CONFIG_RSBAC_DEBUG 02538 if (rsbac_debug_aef_pm) 02539 printk(KERN_DEBUG 02540 "rsbac_pm(): call to pm_get_file() returned error %i\n", 02541 error); 02542 #endif 02543 return(-RSBAC_EINVALIDTARGET); 02544 } 02545 /* target must be file */ 02546 if(target != T_FILE) 02547 return(-RSBAC_EINVALIDTARGET); 02548 file=tid.file; 02549 /* check ticket entries */ 02550 if( (all_data.tkt.function_type != PTF_set_auth_may_set_cap) 02551 || (RSBAC_MAJOR(all_data.tkt.function_param.tkt_set_auth_may_set_cap.file.device) 02552 != RSBAC_MAJOR(file.device)) 02553 || (RSBAC_MINOR(all_data.tkt.function_param.tkt_set_auth_may_set_cap.file.device) 02554 != RSBAC_MINOR(file.device)) 02555 || (all_data.tkt.function_param.tkt_set_auth_may_set_cap.file.inode 02556 != file.inode) 02557 || (all_data.tkt.function_param.tkt_set_auth_may_set_cap.value 02558 != param.set_auth_may_set_cap.value) 02559 ) 02560 return(-RSBAC_EPERM); 02561 02562 /* get ticket issuer role */ 02563 tid.user = all_data.tkt.issuer; 02564 if((error = rsbac_ta_get_attr(ta_number, 02565 PM, 02566 T_USER, 02567 tid, 02568 A_pm_role, 02569 &attr_val, 02570 TRUE))) 02571 { 02572 printk(KERN_WARNING 02573 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 02574 error); 02575 return(-RSBAC_EREADFAILED); /* execution denied */ 02576 } 02577 02578 if(attr_val.pm_role != PR_data_protection_officer) 02579 { 02580 /* illegal issuer -> delete ticket */ 02581 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02582 return(-RSBAC_EPERM); 02583 } 02584 02585 switch(param.set_auth_may_set_cap.value) 02586 { 02587 case FALSE: 02588 case TRUE: 02589 break; 02590 default: 02591 return(-RSBAC_EINVALIDVALUE); 02592 } 02593 /* OK, all own checks done. Call ADF for other modules. */ 02594 #ifdef CONFIG_RSBAC_DEBUG 02595 if (rsbac_debug_aef_pm) 02596 printk(KERN_DEBUG "rsbac_pm(): calling ADF int\n"); 02597 #endif 02598 tid.file = file; 02599 attr_val.auth_may_set_cap = param.set_auth_may_set_cap.value; 02600 if (!rsbac_adf_request_int(R_MODIFY_ATTRIBUTE, 02601 current->pid, 02602 T_FILE, 02603 &tid, 02604 A_auth_may_set_cap, 02605 &attr_val, 02606 PM)) 02607 { 02608 return -EPERM; 02609 } 02610 02611 /* OK, all checks done. Now change data. */ 02612 /* First remove ticket to prevent repeated calls. */ 02613 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02614 02615 /* set new auth_may_set_cap */ 02616 if((error = rsbac_ta_set_attr(ta_number, 02617 AUTH, 02618 T_FILE, 02619 tid, 02620 A_auth_may_set_cap, 02621 attr_val))) 02622 { 02623 printk(KERN_WARNING 02624 "rsbac_pm(): rsbac_set_attr() for FILE/auth_may_set_cap returned error %i", 02625 error); 02626 return(-RSBAC_EWRITEFAILED); 02627 } 02628 /* ready */ 02629 return(0); 02630 02631 02632 /************/ 02633 02634 case PF_add_authorized_task: 02635 /* task_id 0 is used internally, reject */ 02636 if(!param.add_authorized_task.task) 02637 return(-RSBAC_EINVALIDVALUE); 02638 if(role != PR_security_officer) 02639 { 02640 #ifdef CONFIG_RSBAC_DEBUG 02641 if(rsbac_debug_aef_pm) 02642 printk(KERN_DEBUG 02643 "rsbac_pm(): caller of add_authorized_task is not SO\n"); 02644 #endif 02645 return(-RSBAC_EPERM); 02646 } 02647 02648 /* get ticket data, deny, if not found */ 02649 pm_tid.tkt = tkt; 02650 if((error = rsbac_pm_get_all_data(ta_number, 02651 PMT_TKT, 02652 pm_tid, 02653 &all_data))) 02654 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 02655 if( (error != -RSBAC_EINVALIDTARGET) 02656 && (error != -RSBAC_ENOTFOUND) 02657 ) 02658 printk(KERN_WARNING 02659 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i\n", 02660 error); 02661 return(-RSBAC_EPERM); /* execution denied */ 02662 } 02663 /* check ticket entries */ 02664 if( (all_data.tkt.function_type != PTF_add_authorized_task) 02665 || (all_data.tkt.function_param.add_authorized_task.user 02666 != param.add_authorized_task.user) 02667 || (all_data.tkt.function_param.add_authorized_task.task 02668 != param.add_authorized_task.task) ) 02669 { 02670 #ifdef CONFIG_RSBAC_DEBUG 02671 if(rsbac_debug_aef_pm) 02672 { 02673 printk(KERN_DEBUG 02674 "rsbac_pm(): calling add_authorized_task with invalid ticket\n"); 02675 printk(KERN_DEBUG 02676 "rsbac_pm(): tkt-task: %i, tkt-user: %i, call-task: %i, call-user: %i\n", 02677 all_data.tkt.function_param.add_authorized_task.user, 02678 all_data.tkt.function_param.add_authorized_task.task, 02679 param.add_authorized_task.task, 02680 param.add_authorized_task.user); 02681 } 02682 #endif 02683 return(-RSBAC_EPERM); 02684 } 02685 02686 /* check, whether task exists */ 02687 pm_tid2.task = param.add_authorized_task.task; 02688 if(!rsbac_pm_exists(ta_number, 02689 PMT_TASK, 02690 pm_tid2)) 02691 { 02692 #ifdef CONFIG_RSBAC_DEBUG 02693 if(rsbac_debug_aef_pm) 02694 printk(KERN_DEBUG 02695 "rsbac_pm(): calling add_authorized_task with invalid task id\n"); 02696 #endif 02697 return(-RSBAC_EINVALIDVALUE); 02698 } 02699 02700 /* get ticket issuer role */ 02701 tid.user = all_data.tkt.issuer; 02702 if((error = rsbac_ta_get_attr(ta_number, 02703 PM, 02704 T_USER, 02705 tid, 02706 A_pm_role, 02707 &attr_val, 02708 TRUE))) 02709 { 02710 printk(KERN_WARNING 02711 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i\n", 02712 error); 02713 return(-RSBAC_EREADFAILED); /* execution denied */ 02714 } 02715 02716 if(attr_val.pm_role != PR_data_protection_officer) 02717 { /* no dpo? -> responsible user? */ 02718 /* get ru_set_id for this task */ 02719 pm_tid.task = param.add_authorized_task.task; 02720 if((error = rsbac_pm_get_data(ta_number, 02721 PMT_TASK, 02722 pm_tid, 02723 PD_ru_set, 02724 &data_val))) 02725 return(-RSBAC_EREADFAILED); 02726 /* if ru_set is 0, there is no responsible user -> error */ 02727 if(!data_val.ru_set) 02728 { 02729 /* illegal issuer -> delete ticket */ 02730 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02731 #ifdef CONFIG_RSBAC_DEBUG 02732 if(rsbac_debug_aef_pm) 02733 printk(KERN_DEBUG 02734 "rsbac_pm(): calling add_authorized_task with invalid ticket issuer (no set)\n"); 02735 #endif 02736 return(-RSBAC_EPERM); 02737 } 02738 /* check, whether issuer is responsible user for this task */ 02739 pm_set_id.ru_set = data_val.ru_set; 02740 pm_set_member.ru = all_data.tkt.issuer; 02741 if(!rsbac_pm_set_member(ta_number,PS_RU,pm_set_id,pm_set_member)) 02742 { 02743 /* illegal issuer -> delete ticket */ 02744 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02745 #ifdef CONFIG_RSBAC_DEBUG 02746 if(rsbac_debug_aef_pm) 02747 printk(KERN_DEBUG 02748 "rsbac_pm(): calling add_authorized_task with invalid ticket issuer\n"); 02749 #endif 02750 return(-RSBAC_EPERM); 02751 } 02752 } 02753 02754 /* OK, all checks done. Now change data. */ 02755 /* First remove ticket to prevent repeated calls. */ 02756 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02757 /* try to add task to task_set of user */ 02758 /* lookup task_set_id for this user */ 02759 tid.user = param.add_authorized_task.user; 02760 if((error = rsbac_ta_get_attr(ta_number, 02761 PM, 02762 T_USER, 02763 tid, 02764 A_pm_task_set, 02765 &attr_val, 02766 FALSE))) 02767 return(-RSBAC_EREADFAILED); 02768 /* if pm_task_set is 0, it must be created and notified to task-data */ 02769 if(!attr_val.pm_task_set) 02770 { /* set task_set_id to user-id */ 02771 pm_set_id.task_set = param.add_authorized_task.user; 02772 /* 0 is reserved -> take another one for root */ 02773 if(!pm_set_id.task_set) 02774 pm_set_id.task_set = RSBAC_PM_ROOT_TASK_SET_ID; 02775 if((error = rsbac_pm_create_set(ta_number, 02776 PS_TASK, 02777 pm_set_id))) 02778 return(error); 02779 attr_val.pm_task_set = pm_set_id.task_set; 02780 if((error = rsbac_ta_set_attr(ta_number, 02781 PM, 02782 T_USER, 02783 tid, 02784 A_pm_task_set, 02785 attr_val))) 02786 return(-RSBAC_EWRITEFAILED); 02787 } 02788 02789 /* now that we know the set exists, try to add task to it */ 02790 pm_set_id.task_set = attr_val.pm_task_set; 02791 pm_set_member.task = param.add_authorized_task.task; 02792 if(rsbac_pm_add_to_set(ta_number,PS_TASK,pm_set_id,pm_set_member)) 02793 return(-RSBAC_EWRITEFAILED); 02794 else 02795 /* ready */ 02796 return(0); 02797 02798 case PF_delete_authorized_task: 02799 /* task_id 0 is used internally, reject */ 02800 if(!param.delete_authorized_task.task) 02801 return(-RSBAC_EINVALIDVALUE); 02802 if(role != PR_security_officer) 02803 return(-RSBAC_EPERM); 02804 02805 /* get ticket data, deny, if not found */ 02806 pm_tid.tkt = tkt; 02807 if((error = rsbac_pm_get_all_data(ta_number, 02808 PMT_TKT, 02809 pm_tid, 02810 &all_data))) 02811 { /* returns error -RSBAC_EINVALIDTARGET (old ds) or ENOTFOUND, if not found */ 02812 if( (error != -RSBAC_EINVALIDTARGET) 02813 && (error != -RSBAC_ENOTFOUND) 02814 ) 02815 printk(KERN_WARNING 02816 "rsbac_pm(): rsbac_pm_get_all_data() for ticket returned error %i", 02817 error); 02818 return(-RSBAC_EPERM); /* execution denied */ 02819 } 02820 /* check ticket entries */ 02821 if( (all_data.tkt.function_type != PTF_delete_authorized_task) 02822 || (all_data.tkt.function_param.delete_authorized_task.user 02823 != param.delete_authorized_task.user) 02824 || (all_data.tkt.function_param.delete_authorized_task.task 02825 != param.delete_authorized_task.task) ) 02826 return(-RSBAC_EPERM); 02827 02828 /* get ticket issuer role */ 02829 tid.user = all_data.tkt.issuer; 02830 if((error = rsbac_ta_get_attr(ta_number, 02831 PM, 02832 T_USER, 02833 tid, 02834 A_pm_role, 02835 &attr_val, 02836 TRUE))) 02837 { 02838 printk(KERN_WARNING 02839 "rsbac_pm(): rsbac_get_attr() for USER/pm_role returned error %i", 02840 error); 02841 return(-RSBAC_EREADFAILED); /* execution denied */ 02842 } 02843 02844 if(attr_val.pm_role != PR_data_protection_officer) 02845 { 02846 /* illegal issuer -> delete ticket */ 02847 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02848 return(-RSBAC_EPERM); 02849 } 02850 02851 /* OK, all checks done. Now change data. */ 02852 /* First remove ticket to prevent repeated calls. */ 02853 rsbac_pm_remove_target(ta_number,PMT_TKT,pm_tid); 02854 /* try to remove task from task_set of user */ 02855 /* lookup task_set_id for this user */ 02856 tid.user = param.delete_authorized_task.user; 02857 if((error = rsbac_ta_get_attr(ta_number, 02858 PM, 02859 T_USER, 02860 tid, 02861 A_pm_task_set, 02862 &attr_val, 02863 FALSE))) 02864 return(-RSBAC_EREADFAILED); 02865 /* if pm_task_set is 0, there is no task to be deleted -> error */ 02866 if(!attr_val.pm_task_set) 02867 return(-RSBAC_EINVALIDVALUE); 02868 02869 /* now that we know the set exists, try to remove task from it */ 02870 pm_set_id.task_set = attr_val.pm_task_set; 02871 pm_set_member.task = param.delete_authorized_tp.task; 02872 if(rsbac_pm_remove_from_set(ta_number,PS_TASK,pm_set_id,pm_set_member)) 02873 return(-RSBAC_EWRITEFAILED); 02874 else 02875 /* ready */ 02876 return(0); 02877 02878 02879 /************/ 02880 02881 case PF_create_tp: 02882 /* tp_id 0 is used internally, reject */ 02883 if(!param.create_tp.id) 02884 return(-RSBAC_EINVALIDVALUE); 02885 if(role != PR_tp_manager) 02886 return(-RSBAC_EPERM); 02887 02888 /* OK, all checks done. Now change data. */ 02889 /* try to add tp */ 02890 all_data.tp.id = param.create_tp.id; 02891 return(rsbac_pm_add_target(ta_number,PMT_TP,all_data)); 02892 02893 case PF_delete_tp: 02894 /* tp_id 0 is used internally, reject */ 02895 if(!param.delete_tp.id) 02896 return(-RSBAC_EINVALIDVALUE); 02897 if(role != PR_tp_manager) 02898 return(-RSBAC_EPERM); 02899 02900 /* OK, all checks done. Now change data. */ 02901 02902 /* try to delete tp */ 02903 pm_tid.tp = param.delete_tp.id; 02904 return(rsbac_pm_remove_target(ta_number,PMT_TP,pm_tid)); 02905 02906 case PF_set_tp: 02907 /* tp_id 0 means set to non-tp, do NOT reject here */ 02908 if(role != PR_tp_manager) 02909 return(-RSBAC_EPERM); 02910 02911 /* if tp != 0, check, whether it is valid */ 02912 if(param.set_tp.tp) 02913 { 02914 pm_tid.tp = param.set_tp.tp; 02915 if(!rsbac_pm_exists(ta_number,PMT_TP,pm_tid)) 02916 return(-RSBAC_EINVALIDVALUE); 02917 } 02918 02919 /* get file id */ 02920 if ((error = pm_get_file(param.set_tp.filename, 02921 &target, 02922 &tid))) 02923 { 02924 #ifdef CONFIG_RSBAC_DEBUG 02925 if (rsbac_debug_aef_pm) 02926 printk(KERN_DEBUG 02927 "rsbac_pm(): call to pm_get_file() returned error %i\n", 02928 error); 02929 #endif 02930 return(-RSBAC_EINVALIDTARGET); 02931 } 02932 /* target must be file */ 02933 if(target != T_FILE) 02934 return(-RSBAC_EINVALIDTARGET); 02935 file=tid.file; 02936 /* get old object_type */ 02937 if (rsbac_ta_get_attr(ta_number, 02938 PM, 02939 T_FILE, 02940 tid, 02941 A_pm_object_type, 02942 &attr_val, 02943 FALSE)) 02944 { 02945 printk(KERN_WARNING "rsbac_pm(): rsbac_get_attr() returned error!\n"); 02946 return(-RSBAC_EREADFAILED); 02947 } 02948 /* if old OT is not to be changed here -> do not allow */ 02949 if( (attr_val.pm_object_type != PO_TP) 02950 && (attr_val.pm_object_type != PO_none) 02951 && (attr_val.pm_object_type != PO_non_personal_data)) 02952 return(-RSBAC_EINVALIDTARGET); 02953 02954 /* OK, all checks done. Now change data. */ 02955 /* try to set OT*/ 02956 if(param.set_tp.tp) 02957 attr_val.pm_object_type = PO_TP; 02958 else 02959 attr_val.pm_object_type = PO_none; 02960 if(rsbac_ta_set_attr(ta_number, 02961 PM, 02962 T_FILE, 02963 tid, 02964 A_pm_object_type, 02965 attr_val)) 02966 { 02967 printk(KERN_WARNING "rsbac_pm(): rsbac_set_attr() returned error!\n"); 02968 return(-RSBAC_EWRITEFAILED); 02969 } 02970 /* try to set tp-id*/ 02971 attr_val.pm_tp = param.set_tp.tp; 02972 if (rsbac_ta_set_attr(ta_number, 02973 PM, 02974 T_FILE, 02975 tid, 02976 A_pm_tp, 02977 attr_val)) 02978 { 02979 printk(KERN_WARNING "rsbac_pm(): rsbac_set_attr() returned error!\n"); 02980 return(-RSBAC_EWRITEFAILED); 02981 } 02982 return(0); 02983 02984 /************/ 02985 02986 default: 02987 return(-RSBAC_EINVALIDREQUEST); 02988 } 02989 } /* end of rsbac_pm() */
|
|
Definition at line 2993 of file pm_syscalls.c. References A_pm_current_task, A_pm_task_set, A_pm_tp, FALSE, rsbac_attribute_value_t::owner, PM, rsbac_attribute_value_t::pm_current_task, rsbac_attribute_value_t::pm_task_set, rsbac_attribute_value_t::pm_tp, rsbac_target_id_t::process, RSBAC_EINVALIDVALUE, RSBAC_ENOTINITIALIZED, RSBAC_EPERM, RSBAC_EREADFAILED, RSBAC_EWRITEFAILED, rsbac_get_attr, rsbac_is_initialized(), rsbac_pm_set_member(), rsbac_set_attr, T_PROCESS, T_USER, and rsbac_target_id_t::user. Referenced by sys_rsbac_pm_change_current_task(). 02994 { 02995 union rsbac_target_id_t tid; 02996 union rsbac_attribute_value_t attr_val; 02997 int error = 0; 02998 rsbac_uid_t owner; 02999 union rsbac_pm_set_id_t pm_set_id; 03000 union rsbac_pm_set_member_t pm_set_member; 03001 03002 /* No processing possible before init (called at boot time) */ 03003 if (!rsbac_is_initialized()) 03004 return(-RSBAC_ENOTINITIALIZED); 03005 03006 if(!task) 03007 return(-RSBAC_EINVALIDVALUE); 03008 #ifdef CONFIG_RSBAC_DEBUG 03009 if (rsbac_debug_aef_pm) 03010 printk(KERN_DEBUG 03011 "rsbac_pm_change_current_task(): called for task %i!\n", 03012 task); 03013 #endif 03014 /* getting current_tp of calling process from rsbac system */ 03015 tid.process = current->pid; 03016 if((error = rsbac_get_attr(PM,T_PROCESS, 03017 tid, 03018 A_pm_tp, 03019 &attr_val, 03020 FALSE))) 03021 { 03022 printk(KERN_WARNING 03023 "rsbac_pm_change_current_task(): rsbac_get_attr() for pm_tp returned error %i", 03024 error); 03025 return(-RSBAC_EREADFAILED); /* something weird happened */ 03026 } 03027 /* changing current_task for a tp is forbidden -> error */ 03028 if(attr_val.pm_tp) 03029 { 03030 #ifdef CONFIG_RSBAC_DEBUG 03031 if(rsbac_debug_adf_pm) 03032 printk(KERN_DEBUG 03033 "rsbac_pm_change_current_task(): tried to change current_task for tp-process\n"); 03034 #endif 03035 return(-RSBAC_EPERM); 03036 } 03037 03038 /* Getting basic information about caller */ 03039 /* only useful for real process, not idle or init */ 03040 if (current->pid > 1) 03041 owner = current->uid; 03042 else /* caller_pid <= 1 -> kernel or init are always owned by root */ 03043 owner = 0; 03044 03045 /* getting owner's task_set_id (authorized tasks) from rsbac system */ 03046 tid.user = owner; 03047 if((error = rsbac_get_attr(PM,T_USER, 03048 tid, 03049 A_pm_task_set, 03050 &attr_val, 03051 FALSE))) 03052 { 03053 printk(KERN_WARNING 03054 "rsbac_pm_change_current_task(): rsbac_get_attr() for pm_task_set returned error %i", 03055 error); 03056 return(-RSBAC_EREADFAILED); /* something weird happened */ 03057 } 03058 03059 /* if there is no set of authorized tasks for owner: deny */ 03060 if(!attr_val.pm_task_set) 03061 { 03062 #ifdef CONFIG_RSBAC_DEBUG 03063 if(rsbac_debug_adf_pm) 03064 printk(KERN_DEBUG 03065 "rsbac_pm_change_current_task(): process owner has no authorized task\n"); 03066 #endif 03067 return(-RSBAC_EPERM); 03068 } 03069 03070 /* check, whether owner is authorized for this task */ 03071 pm_set_id.task_set = attr_val.pm_task_set; 03072 pm_set_member.task = task; 03073 if(!rsbac_pm_set_member(0,PS_TASK,pm_set_id,pm_set_member)) 03074 { 03075 #ifdef CONFIG_RSBAC_DEBUG 03076 if(rsbac_debug_adf_pm) 03077 printk(KERN_DEBUG 03078 "rsbac_pm_change_current_task(): process owner is not authorized for task\n"); 03079 #endif 03080 return(-RSBAC_EPERM); 03081 } 03082 03083 /* OK, checks are passed. Change current_task for process. */ 03084 tid.process = current->pid; 03085 attr_val.pm_current_task = task; 03086 if((error = rsbac_set_attr(PM,T_PROCESS, 03087 tid, 03088 A_pm_current_task, 03089 attr_val))) 03090 { 03091 printk(KERN_WARNING 03092 "rsbac_pm_change_current_task(): rsbac_set_attr() for pm_current_task returned error %i", 03093 error); 03094 return(-RSBAC_EWRITEFAILED); /* something weird happened */ 03095 } 03096 return(0); 03097 }
|
|
Definition at line 3099 of file pm_syscalls.c. References A_pm_current_task, A_pm_object_class, A_pm_tp, FALSE, PM, rsbac_attribute_value_t::pm_current_task, rsbac_attribute_value_t::pm_object_class, rsbac_attribute_value_t::pm_tp, rsbac_target_id_t::process, RSBAC_EINVALIDTARGET, RSBAC_EINVALIDVALUE, RSBAC_ENOTFOUND, RSBAC_EPERM, RSBAC_EREADFAILED, rsbac_get_attr, RSBAC_PM_A_CREATE, RSBAC_PM_DEV_OBJECT_CLASS_ID, rsbac_pm_exists(), rsbac_pm_get_data(), RSBAC_PM_IPC_OBJECT_CLASS_ID, rsbac_pm_set_member(), rsbac_set_attr, T_FILE, and T_PROCESS. Referenced by sys_rsbac_pm_create_file(). 03102 { 03103 union rsbac_target_id_t tid; 03104 union rsbac_attribute_value_t attr_val; 03105 union rsbac_attribute_value_t attr_val2; 03106 union rsbac_pm_target_id_t pm_tid; 03107 union rsbac_pm_data_value_t data_val; 03108 union rsbac_pm_data_value_t data_val2; 03109 int error = 0; 03110 union rsbac_pm_set_id_t pm_set_id; 03111 union rsbac_pm_set_member_t pm_set_member; 03112 03113 #ifdef CONFIG_RSBAC_DEBUG 03114 if (rsbac_debug_aef_pm) 03115 printk(KERN_DEBUG 03116 "sys_rsbac_pm_create_file(): called with class %i, mode %o!\n", 03117 object_class, mode); 03118 #endif 03119 /* do not allow IPC or DEV class */ 03120 if( (object_class == RSBAC_PM_IPC_OBJECT_CLASS_ID) 03121 || (object_class == RSBAC_PM_DEV_OBJECT_CLASS_ID)) 03122 { 03123 #ifdef CONFIG_RSBAC_DEBUG 03124 if(rsbac_debug_adf_pm) 03125 printk(KERN_DEBUG 03126 "rsbac_pm_create_file(): Class-ID is IPC or DEV\n"); 03127 #endif 03128 return(-RSBAC_EINVALIDVALUE); 03129 } 03130 03131 /* is mode for regular file? */ 03132 if(mode & ~S_IRWXUGO) 03133 { 03134 #ifdef CONFIG_RSBAC_DEBUG 03135 if(rsbac_debug_adf_pm) 03136 printk(KERN_DEBUG 03137 "rsbac_pm_create_file(): illegal creation mode\n"); 03138 #endif 03139 return(-RSBAC_EINVALIDVALUE); 03140 } 03141 03142 /* does class exist (NIL always exists)? */ 03143 if(object_class) 03144 { 03145 pm_tid.object_class = object_class; 03146 if(!rsbac_pm_exists(0, 03147 PMT_CLASS, 03148 pm_tid)) 03149 { 03150 #ifdef CONFIG_RSBAC_DEBUG 03151 if(rsbac_debug_adf_pm) 03152 printk(KERN_DEBUG 03153 "rsbac_pm_create_file(): non-existent class\n"); 03154 #endif 03155 return(-RSBAC_EINVALIDVALUE); 03156 } 03157 } 03158 03159 /* getting current_task of calling process from rsbac system */ 03160 tid.process = current->pid; 03161 if((error = rsbac_get_attr(PM,T_PROCESS, 03162 tid, 03163 A_pm_current_task, 03164 &attr_val, 03165 FALSE))) 03166 { 03167 printk(KERN_WARNING 03168 "rsbac_pm_create_file(): rsbac_get_attr() for pm_current_task returned error %i", 03169 error); 03170 return(-RSBAC_EREADFAILED); /* something weird happened */ 03171 } 03172 03173 /* getting current_tp of calling process from rsbac system */ 03174 if((error = rsbac_get_attr(PM,T_PROCESS, 03175 tid, 03176 A_pm_tp, 03177 &attr_val2, 03178 FALSE))) 03179 { 03180 printk(KERN_WARNING 03181 "rsbac_pm_create_file(): rsbac_get_attr() for pm_tp returned error %i", 03182 error); 03183 return(-RSBAC_EREADFAILED); /* something weird happened */ 03184 } 03185 03186 /* getting neccessary accesses for task, class, tp from PM-data */ 03187 pm_tid.na.task = attr_val.pm_current_task; 03188 pm_tid.na.object_class = object_class; 03189 pm_tid.na.tp = attr_val2.pm_tp; 03190 if((error = rsbac_pm_get_data(0, 03191 PMT_NA, 03192 pm_tid, 03193 PD_accesses, 03194 &data_val))) 03195 { 03196 if( (error != -RSBAC_EINVALIDTARGET) 03197 && (error != -RSBAC_ENOTFOUND) 03198 ) 03199 printk(KERN_WARNING 03200 "rsbac_pm_create_file(): rsbac_pm_get_data() for NA/accesses returned error %i", 03201 error); 03202 #ifdef CONFIG_RSBAC_DEBUG 03203 else if(rsbac_debug_adf_pm) 03204 printk(KERN_DEBUG 03205 "rsbac_pm_create_file(): NA/accesses (%i,%i,%i) not found\n", 03206 pm_tid.na.task, object_class, pm_tid.na.tp); 03207 #endif 03208 return(-RSBAC_EPERM); /* deny */ 03209 } 03210 03211 /* is create necessary? if not -> error */ 03212 if(!(data_val.accesses & RSBAC_PM_A_CREATE)) 03213 { 03214 #ifdef CONFIG_RSBAC_DEBUG 03215 if(rsbac_debug_adf_pm) 03216 printk(KERN_DEBUG 03217 "rsbac_pm_create_file(): create is not necessary\n"); 03218 #endif 03219 return(-RSBAC_EPERM); 03220 } 03221 03222 /* get purpose for current_task */ 03223 pm_tid.task = attr_val.pm_current_task; 03224 if((error = rsbac_pm_get_data(0, 03225 PMT_TASK, 03226 pm_tid, 03227 PD_purpose, 03228 &data_val))) 03229 { 03230 if( (error != -RSBAC_EINVALIDTARGET) 03231 && (error != -RSBAC_ENOTFOUND) 03232 ) 03233 printk(KERN_WARNING 03234 "rsbac_pm_create_file(): rsbac_get_data() for TASK/purpose returned error %i", 03235 error); 03236 return(-RSBAC_EPERM); /* deny */ 03237 } 03238 03239 /* further checks only, if there is a purpose defined */ 03240 if(data_val.purpose) 03241 { 03242 /* get purpose_set_id for class */ 03243 pm_tid.object_class = object_class; 03244 if((error = rsbac_pm_get_data(0, 03245 PMT_CLASS, 03246 pm_tid, 03247 PD_pp_set, 03248 &data_val2))) 03249 { 03250 if( (error == -RSBAC_EINVALIDTARGET) 03251 || (error == -RSBAC_ENOTFOUND) 03252 ) 03253 { 03254 #ifdef CONFIG_RSBAC_DEBUG 03255 if(rsbac_debug_adf_pm) 03256 printk(KERN_DEBUG 03257 "rsbac_pm_create_file(): non-existent class\n"); 03258 #endif 03259 return(-RSBAC_EINVALIDVALUE); 03260 } 03261 printk(KERN_WARNING 03262 "rsbac_pm_create_file(): rsbac_get_data() for TASK/purpose returned error %i", 03263 error); 03264 return(-RSBAC_EREADFAILED); /* deny */ 03265 } 03266 /* if there is no purpose set for this class, deny */ 03267 if(!data_val2.pp_set) 03268 { 03269 #ifdef CONFIG_RSBAC_DEBUG 03270 if(rsbac_debug_adf_pm) 03271 printk(KERN_DEBUG 03272 "rsbac_pm_create_file(): current_task has purpose, class not\n"); 03273 #endif 03274 return(-RSBAC_EPERM); 03275 } 03276 03277 /* last check: is our task's purpose in the set of purposes for our class? */ 03278 pm_set_id.pp_set = data_val2.pp_set; 03279 pm_set_member.pp = data_val.purpose; 03280 if(!rsbac_pm_set_member(0,PS_PP,pm_set_id,pm_set_member)) 03281 /* our task's purpose does not match with class purposes -> deny */ 03282 { 03283 #ifdef CONFIG_RSBAC_DEBUG 03284 if(rsbac_debug_adf_pm) 03285 printk(KERN_DEBUG 03286 "rsbac_pm_create_file(): purpose of current_task is not in purpose set of class\n"); 03287 #endif 03288 return(-RSBAC_EPERM); 03289 } 03290 } 03291 03292 /* try to create object using standard syscalls, leading to general rsbac */ 03293 /* checks via ADF-Request */ 03294 /* we are not using sys_creat(), because alpha kernels don't know it */ 03295 lock_kernel(); 03296 error = sys_open(filename, O_CREAT | O_WRONLY | O_TRUNC, mode); 03297 unlock_kernel(); 03298 if (error < 0) 03299 return(error); 03300 03301 /* setting class for new object */ 03302 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) 03303 rcu_read_lock(); 03304 tid.file.device = current->files->fdt->fd[error]->f_vfsmnt->mnt_sb->s_dev; 03305 tid.file.inode = current->files->fdt->fd[error]->f_dentry->d_inode->i_ino; 03306 tid.file.dentry_p = current->files->fdt->fd[error]->f_dentry; 03307 rcu_read_unlock(); 03308 #else 03309 tid.file.device = current->files->fd[error]->f_dentry->d_inode->i_dev; 03310 tid.file.inode = current->files->fd[error]->f_dentry->d_inode->i_ino; 03311 tid.file.dentry_p = current->files->fd[error]->f_dentry; 03312 #endif 03313 attr_val.pm_object_class = object_class; 03314 if(rsbac_set_attr(PM,T_FILE, 03315 tid, 03316 A_pm_object_class, 03317 attr_val)) 03318 { 03319 printk(KERN_WARNING 03320 "rsbac_pm_create_file(): rsbac_set_attr() for pm_object_class returned error"); 03321 } 03322 return(error); 03323 }
|