From: Stanislav Ievlev <inger@altlinux.ru>
To: devel@altlinux.ru, ab@altlinux.ru
Subject: [devel] RSBAC. Dynamic RC Switching
Date: Mon, 18 Jun 2001 16:20:28 +0400
Message-ID: <3B2DF20C.6040601@altlinux.ru> (raw)
[-- Attachment #1: Type: text/plain, Size: 1299 bytes --]
Были разговоры о возможности динамического изменения ролей процессами
(это требуется например apache)
Вот первый вариант.
Ранеепри попытке смены роли у процесса проверялось:
1.) Есть ли право на изменение?( Право R_MODIFY_ATTRIBUTE - Type Comp
Process/General Process)
1.1) Если есть, то состоит ли назначаемая роль в списке Assign Roles у
назначающей роли? Если да, то можно.
2. )Является данная роль администрирующей? Если да, то можно
3. )Если ничего не проходит - нельзя.
Добавляется следующая возможность:
1.2.) Если производится смена роли у процесса (и только у процесса) и
процесс меняет роль у себя (и только у себя) и если новая роль числится
в списке Assign Roles - то можно.
----------------------
Прилагается тестовый пример (чтобы процесс мог прочитать свою роль -
необходимо включить право READ_ATTRIBUTE вType Comp Process/General
Process) - собирается с "CFLAGS = -I/usr/src/linux/include -DCONFIG_RSBAC"
Проверяется:
a)установка допустимой роли
b)установка недопустимой проли
c)установка роли на недопустимый процесс.
------------------------
Прилагается патч к последнему RSBAC'чному ядру. Патчится функция
rsbac_adf_request_rc в районе проверки "R_MODIFY_ATTRIBUTE:/case A_rc_role:"
----------------------------------
Удачных исследований.
Станислав Иевлев.
[-- Attachment #2: test.c --]
[-- Type: text/plain, Size: 2731 bytes --]
#include <stdio.h>
#include <stdlib.h>
#include <rsbac/types.h>
#include <rsbac/rc_data_structures.h>
#include <rsbac/getname.h>
#include <rsbac/rc_getname.h>
#include <rsbac/syscalls.h>
#include <rsbac/error.h>
#include <rsbac/helpers.h>
main()
{
int res,parent_pid,child_pid;
int new_role=4,old_role,wrong_role=0;
union rsbac_attribute_value_t value;
union rsbac_target_id_t tid;
enum rsbac_attribute_t attr;
/*get current process's role ID*/
parent_pid=getpid();
tid.process=parent_pid;
res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
old_role=value.u_char_dummy;
printf("%i My RC Role: %u\n",res,value.u_char_dummy);
/*try to set new role*/
value.dummy=new_role;
res=rsbac_set_attr(T_PROCESS,&tid,A_rc_role,&value);
printf("Setting new role %u to process - (GRANTED)\n",value);
/*get current process role ID*/
res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
printf("%i My RC Role: %u\n",res,value.u_char_dummy);
/*try to set wrong role*/
value.dummy=wrong_role;
res=rsbac_set_attr(T_PROCESS,&tid,A_rc_role,&value);
printf("Setting new role %u to process - (NOT GRANTED)\n",value);
/*get current process role ID*/
res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
printf("%i My RC Role: %u\n",res,value.u_char_dummy);
/*try to set previous role*/
value.dummy=old_role;
res=rsbac_set_attr(T_PROCESS,&tid,A_rc_role,&value);
printf("Setting previos role %u to process - (GRANTED)\n",value);
/*get current process role ID*/
res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
printf("%i My RC Role: %u\n",res,value.u_char_dummy);
if(fork()==0)
{
child_pid=getpid();
/*this is a child process*/
printf("child pid: %u parent pid: %u\n",child_pid,parent_pid);
/*get current settings*/
tid.process=child_pid;
res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
printf("%i Child RC Role: %u\n",res,value.u_char_dummy);
/*try to set new role to father*/
tid.process=parent_pid;
value.dummy=new_role;
res=rsbac_set_attr(T_PROCESS,&tid,A_rc_role,&value);
printf("Setting new role %u to Father - (NOT GRANTED)\n",value);
/*get current process role ID*/
res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
printf("%i Parent RC Role: %u\n",res,value.u_char_dummy);
/*try to set own new role */
tid.process=child_pid;
value.dummy=new_role;
res=rsbac_set_attr(T_PROCESS,&tid,A_rc_role,&value);
printf("Setting own new role %u - (GRANTED)\n",value);
/*get current process role ID*/
res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
printf("%i Child RC Role: %u\n",res,value.u_char_dummy);
}else{
wait(&res);
}
}
[-- Attachment #3: rsbac-rcswitch.patch --]
[-- Type: text/plain, Size: 730 bytes --]
--- linux/rsbac/adf/rc/rc_main.c.orig Fri Apr 27 17:09:34 2001
+++ linux/rsbac/adf/rc/rc_main.c Mon Jun 18 14:41:24 2001
@@ -981,6 +981,12 @@
if (!(err=rsbac_rc_test_assign_roles(target, tid, attr, attr_val.rc_role)))
return(GRANTED);
}
+ /*New checks for Dynamic Role Switching*/
+ if ( (target==T_PROCESS)&&(tid.process==caller_pid) )
+ {
+ if (!(err=rsbac_rc_test_assign_roles(target, tid, attr, attr_val.rc_role)))
+ return(GRANTED);
+ }
/* Classical admin_type check */
if (rsbac_rc_test_role_admin(TRUE))
return(NOT_GRANTED);
next reply other threads:[~2001-06-18 12:20 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-06-18 12:20 Stanislav Ievlev [this message]
2001-06-18 13:57 ` Alexander Bokovoy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3B2DF20C.6040601@altlinux.ru \
--to=inger@altlinux.ru \
--cc=ab@altlinux.ru \
--cc=devel@altlinux.ru \
--cc=devel@linux.iplabs.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
ALT Linux Team development discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
public-inbox-index devel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git