ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] RSBAC RC-redirect
@ 2001-05-07 15:48 Stanislav Ievlev
  0 siblings, 0 replies; only message in thread
From: Stanislav Ievlev @ 2001-05-07 15:48 UTC (permalink / raw)
  To: devel, rsbac

[-- Attachment #1: Type: text/plain, Size: 894 bytes --]

Привет всем!

Патчик для желающих поиздеваться над ядром.

Это есть прибомбас к RSBAC, который позволяет делать перенаправление при 
просмотре файлов.

Работает следующим образом:

1. Надо всять ядро 2.4.3 и последний develop'ерский RSBAC.
2. Прикрутить указанный патчик
3. Создать каталог (например dirofile)
4. В нем создать файлы с именами  0,1,2,.... (трех вполне достаточно)
5. Выставить на каталог аттрибут rc_initial_role с волшебным значением 99

.......................

6. Каталог "превратиться" в файл
7. При просмотре "файла" dirofile под разными RC-ролями будет появляться 
разное содержимое - то есть реально открываться файлы dirofile/<номер 
RC-роли>


Ну как?  Вот что можно творить с ядром когда есть исходники!

В общем-то это давно существует и называется "скрытые каталоги" то ли в 
SCO, то ли вдругом крутом UNIX'e.

------------------------------------
Станислав Иевлев


[-- Attachment #2: dirofile-0.2.patch --]
[-- Type: text/plain, Size: 7056 bytes --]

diff -Naur linux.orig/fs/namei.c linux/fs/namei.c
--- linux.orig/fs/namei.c	Mon May  7 18:29:02 2001
+++ linux/fs/namei.c	Mon May  7 18:00:04 2001
@@ -35,6 +35,7 @@
 #ifdef CONFIG_RSBAC
 #include <rsbac/adf.h>
 #include <rsbac/fs.h>
+#include <rsbac/aci.h>
 #endif
 
 #define ACC_MODE(x) ("\000\004\002\006"[(x)&O_ACCMODE])
@@ -1189,6 +1190,21 @@
         union rsbac_target_id_t       rsbac_target_id;
         union rsbac_target_id_t       rsbac_new_target_id;
         union rsbac_attribute_value_t rsbac_attribute_value;
+
+        union rsbac_target_id_t       redir_rsbac_target_id;
+        union rsbac_attribute_value_t redir_rsbac_attribute_value;
+	
+//read after redirection
+redir_again:	
+//	printk(KERN_EMERG "f:%s\n",pathname);
+	acc_mode=0;
+	error=0;
+	inode=NULL;
+	dentry=NULL;
+	dir=NULL;
+	count=0;
+
+	
         #endif
 
 	acc_mode = ACC_MODE(flag);
@@ -1415,6 +1431,38 @@
                 goto exit;
               }
           }
+	  
+	//we check only directories
+	if (S_ISDIR(inode->i_mode)){
+            if (rsbac_get_attr(T_DIR,
+                              rsbac_target_id,
+                              A_rc_initial_role,
+                              &redir_rsbac_attribute_value,
+                              TRUE))
+    	    {
+                      printk(KERN_WARNING "open_namei(): rsbac_get_attr() returned error!\n");
+            }
+	    
+	    if (redir_rsbac_attribute_value.rc_initial_role==99)
+	    {
+	    //get process' RC-role
+	      redir_rsbac_target_id.process = current->pid;
+                  if (rsbac_get_attr(T_PROCESS,
+                                          redir_rsbac_target_id,
+                                          A_rc_role,
+                                          &redir_rsbac_attribute_value,
+                                          FALSE))
+                    {
+                      printk(KERN_WARNING "open_namei(): rsbac_get_attr() returned error!\n");
+                    }
+		    
+		sprintf(pathname,"%s/%u",pathname,redir_rsbac_attribute_value.rc_role);
+		goto redir_again;
+		
+		printk(KERN_EMERG "open_namei:new pathname %s\n",pathname);
+	    }
+	}
+	
         #endif /* CONFIG_RSBAC */
 
 	if (flag & O_TRUNC) {
diff -Naur linux.orig/fs/open.c linux/fs/open.c
--- linux.orig/fs/open.c	Mon May  7 18:29:02 2001
+++ linux/fs/open.c	Mon May  7 18:35:52 2001
@@ -583,6 +583,23 @@
             error = -EPERM;
             goto dput_and_out;
           }
+	  
+	  //we check only directories
+            if (rsbac_get_attr(T_DIR,
+                              rsbac_target_id,
+                              A_rc_initial_role,
+                              &rsbac_attribute_value,
+                              TRUE))
+                {
+                  printk(KERN_WARNING "sys_chdir(): rsbac_get_attr() returned error!\n");
+                }
+		    
+	    //printk(KERN_EMERG "sys_chdir:%u\n",rsbac_attribute_value.rc_initial_role);
+		    
+		if (rsbac_attribute_value.rc_initial_role==99){
+		    error = -ENOTDIR;
+		    goto dput_and_out;
+		}
         #endif
 
 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
@@ -642,6 +659,21 @@
                 error = -EPERM;
               }
           }
+	  
+            if (rsbac_get_attr(T_DIR,
+                              rsbac_target_id,
+                              A_rc_initial_role,
+                              &rsbac_attribute_value,
+                              TRUE))
+                {
+                  printk(KERN_WARNING "sys_fchdir(): rsbac_get_attr() returned error!\n");
+                }
+		    
+	    //printk(KERN_EMERG "sys_fchdir:%u\n",rsbac_attribute_value.rc_initial_role);
+		    
+		if (rsbac_attribute_value.rc_initial_role==99){
+		    error = -ENOTDIR;
+		}
         #endif
 
 	if (!error)
diff -Naur linux.orig/fs/stat.c linux/fs/stat.c
--- linux.orig/fs/stat.c	Mon May  7 18:29:02 2001
+++ linux/fs/stat.c	Mon May  7 17:28:56 2001
@@ -15,6 +15,7 @@
 /* RSBAC */
 #ifdef CONFIG_RSBAC
 #include <rsbac/adf.h>
+#include <rsbac/aci.h>
 #endif
 
 /*
@@ -74,6 +75,8 @@
 {
 	struct stat tmp;
 	unsigned int blocks, indirect;
+	
+
 
 	memset(&tmp, 0, sizeof(tmp));
 	tmp.st_dev = kdev_t_to_nr(inode->i_dev);
@@ -247,6 +250,7 @@
                       {
                         error = -EPERM;
                       }
+		      
                   }
                 #endif
 
@@ -698,7 +702,30 @@
 
 		if (!error)
 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
+		/* RSBAC */
+    		#ifdef CONFIG_RSBAC
+		//we check only directories
+    		if (S_ISDIR(nd.dentry->d_inode->i_mode)){
+        	    if (rsbac_get_attr(T_DIR,
+                                  rsbac_target_id,
+                                  A_rc_initial_role,
+                                  &rsbac_attribute_value,
+                                  TRUE))
+                    {
+                      printk(KERN_WARNING "sys_stat64(): rsbac_get_attr() returned error!\n");
+                    }
+		    
+		    //printk(KERN_EMERG "sys_stat64:%u\n",rsbac_attribute_value.rc_initial_role);
+		    
+		    if (rsbac_attribute_value.rc_initial_role==99){
+			statbuf->st_mode=(nd.dentry->d_inode->i_mode&0777)|S_IFREG;
+		    }
+
+		}
+    		#endif
+
 		path_release(&nd);
+		
 	}
 	return error;
 }
@@ -758,6 +785,28 @@
 
 		if (!error)
 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
+			
+		/* RSBAC */
+    		#ifdef CONFIG_RSBAC
+		//we check only directories
+    		if (S_ISDIR(nd.dentry->d_inode->i_mode)){
+        	    if (rsbac_get_attr(T_DIR,
+                                  rsbac_target_id,
+                                  A_rc_initial_role,
+                                  &rsbac_attribute_value,
+                                  TRUE))
+                    {
+                      printk(KERN_WARNING "sys_stat64(): rsbac_get_attr() returned error!\n");
+                    }
+		    
+		    //printk(KERN_EMERG "sys_lstat64:%u\n",rsbac_attribute_value.rc_initial_role);
+		    
+		    if (rsbac_attribute_value.rc_initial_role==99){
+			statbuf->st_mode=(nd.dentry->d_inode->i_mode&0777)|S_IFREG;
+		    }
+		}
+    		#endif
+
 		path_release(&nd);
 	}
 	return error;
@@ -834,6 +883,29 @@
 
 		if (!err)
 			err = cp_new_stat64(dentry->d_inode, statbuf);
+			
+		/* RSBAC */
+    		#ifdef CONFIG_RSBAC
+		//we check only directories
+    		if (S_ISDIR(dentry->d_inode->i_mode)){
+        	    if (rsbac_get_attr(T_DIR,
+                                  rsbac_target_id,
+                                  A_rc_initial_role,
+                                  &rsbac_attribute_value,
+                                  TRUE))
+                    {
+                      printk(KERN_WARNING "sys_stat64(): rsbac_get_attr() returned error!\n");
+                    }
+		    
+		    //printk(KERN_EMERG "sys_lstat64:%u\n",rsbac_attribute_value.rc_initial_role);
+		    
+		    if (rsbac_attribute_value.rc_initial_role==99){
+			statbuf->st_mode=(dentry->d_inode->i_mode&0777)|S_IFREG;
+		    }
+		}
+    		#endif
+	
+			
 		fput(f);
 	}
 	return err;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2001-05-07 15:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-05-07 15:48 [devel] RSBAC RC-redirect Stanislav Ievlev

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