* port of procps patch to acahalan procps
@ 2003-07-09 18:55 Colin Walters
[not found] ` <1057805552.751.1243.camel@cube>
0 siblings, 1 reply; 2+ messages in thread
From: Colin Walters @ 2003-07-09 18:55 UTC (permalink / raw)
To: SELinux; +Cc: albert
[-- Attachment #1: Type: text/plain, Size: 372 bytes --]
Hi,
I've ported the SELinux 2.5 procps patch to the acahalan procps; this
may be useful for other systems like Debian which also use acalahan's
procps (I think Gentoo does).
It's been lightly tested.
Albert: this is an update to the new SELinux API for Linux 2.5; the old
API is deprecated now, and will likely be obsoleted once the new API is
backported to Linux 2.4.
[-- Attachment #2: acalahan-procps.patch --]
[-- Type: text/plain, Size: 16430 bytes --]
--- procps-3.1.9.orig/Makefile
+++ procps-3.1.9/Makefile
@@ -63,9 +63,9 @@
CURSES := -I/usr/include/ncurses -lncurses
-LDFLAGS := -Wl,-warn-common
+LDFLAGS := -Wl,-warn-common -lselinux -lattr
-CFLAGS := -D_GNU_SOURCE -O2 -g3 -fno-common -ffast-math -I proc \
+CFLAGS := -D_GNU_SOURCE -DWITH_SELINUX -g -fno-common -ffast-math -I proc \
-W -Wall -Wshadow -Wcast-align -Wredundant-decls \
-Wbad-function-cast -Wcast-qual -Wwrite-strings -Waggregate-return \
# -Wpadded -Wunreachable-code -Wdisabled-optimization \
@@ -128,7 +128,7 @@
###### install
$(BINFILES) : all
- $(install) --mode a=rx --strip $(notdir $@) $@
+ $(install) --mode a=rx $(notdir $@) $@
$(MANFILES) : all
$(install) --mode a=r $(notdir $@) $@
--- procps-3.1.9.orig/proc/readproc.c
+++ procps-3.1.9/proc/readproc.c
@@ -27,8 +27,8 @@
#include <sys/types.h>
#include <sys/stat.h>
-#ifdef FLASK_LINUX
-#include <fs_secure.h>
+#ifdef WITH_SELINUX
+#include <selinux/selinux.h>
#endif
#ifdef PROF
@@ -82,6 +82,10 @@
free((void*)*p->cmdline);
if (p->environ)
free((void*)*p->environ);
+#ifdef WITH_SELINUX
+ if (p->scontext)
+ freecon(p->scontext);
+#endif
free(p);
}
@@ -519,10 +523,10 @@
static struct direct *ent; /* dirent handle */
static struct stat sb; /* stat buffer */
static char path[32], sbuf[1024]; /* bufs for stat,statm */
-#ifdef FLASK_LINUX
- security_id_t secsid;
-#endif
pid_t pid; // saved until we have a proc_t allocated for sure
+#ifdef WITH_SELINUX
+ int selinux_enabled = is_selinux_enabled();
+#endif
/* loop until a proc matching restrictions is found or no more processes */
/* I know this could be a while loop -- this way is easier to indent ;-) */
@@ -546,23 +550,18 @@
strcpy(path+6, ent->d_name); // trust /proc to not contain evil top-level entries
// snprintf(path, sizeof path, "/proc/%s", ent->d_name);
}
-#ifdef FLASK_LINUX
- if ( stat_secure(path, &sb, &secsid) == -1 ) /* no such dirent (anymore) */
-#else
if (unlikely(stat(path, &sb) == -1)) /* no such dirent (anymore) */
-#endif
goto next_proc;
if ((flags & PROC_UID) && !XinLN(uid_t, sb.st_uid, PT->uids, PT->nuid))
goto next_proc; /* not one of the requested uids */
- if (!p)
+ if (!p) {
p = xcalloc(p, sizeof *p); /* passed buf or alloced mem */
+ memset(p, 0, sizeof(p));
+ }
p->euid = sb.st_uid; /* need a way to get real uid */
-#ifdef FLASK_LINUX
- p->secsid = secsid;
-#endif
p->pid = pid;
if (flags & PROC_FILLSTAT) { /* read, parse /proc/#/stat */
@@ -571,6 +570,30 @@
stat2proc(sbuf, p); /* parse /proc/#/stat */
}
+#ifdef WITH_SELINUX
+ if (selinux_enabled) {
+ if (p->scontext) {
+ freecon(p->scontext);
+ p->scontext=NULL;
+ }
+ if (getpidcon(p->pid, &p->scontext) < 0 )
+ goto next_proc;
+
+ if (unlikely(flags & PROC_CONTEXT)) {
+ int found=0;
+ int i=0;
+ for (i=0; PT->scontexts[i]; i++) {
+ if (strcmp(p->scontext, PT->scontexts[i]) ==0) {
+ found=1;
+ break;
+ }
+ }
+ if (! found)
+ goto next_proc; /* not one of the requested CONTEXTS */
+ }
+ }
+#endif
+
if (unlikely(flags & PROC_FILLMEM)) { /* read, parse /proc/#/statm */
if (likely( file2str(path, "statm", sbuf, sizeof sbuf) != -1 ))
statm2proc(sbuf, p); /* ignore statm errors here */
@@ -630,10 +653,10 @@
static struct direct *ent; /* dirent handle */
static struct stat sb; /* stat buffer */
static char path[32], sbuf[1024]; /* bufs for stat,statm */
-#ifdef FLASK_LINUX
- security_id_t secsid;
-#endif
pid_t pid; // saved until we have a proc_t allocated for sure
+#ifdef WITH_SELINUX
+ int selinux_enabled = is_selinux_enabled();
+#endif
/* loop until a proc matching restrictions is found or no more processes */
/* I know this could be a while loop -- this way is easier to indent ;-) */
@@ -652,26 +675,30 @@
strcpy(path+6, ent->d_name); // trust /proc to not contain evil top-level entries
// snprintf(path, sizeof path, "/proc/%s", ent->d_name);
-#ifdef FLASK_LINUX
- if (stat_secure(path, &sb, &secsid) == -1) /* no such dirent (anymore) */
-#else
if (stat(path, &sb) == -1) /* no such dirent (anymore) */
-#endif
goto next_proc;
if (!p)
p = xcalloc(p, sizeof *p); /* passed buf or alloced mem */
p->euid = sb.st_uid; /* need a way to get real uid */
-#ifdef FLASK_LINUX
- p->secsid = secsid;
-#endif
p->pid = pid;
if ((file2str(path, "stat", sbuf, sizeof sbuf)) == -1)
goto next_proc; /* error reading /proc/#/stat */
stat2proc(sbuf, p); /* parse /proc/#/stat */
+#ifdef WITH_SELINUX
+ if (selinux_enabled) {
+ if (p->scontext) {
+ freecon(p->scontext);
+ p->scontext=NULL;
+ }
+ if (getpidcon(p->pid, &p->scontext) < 0 )
+ goto next_proc;
+ }
+#endif
+
if (flags & PROC_FILLMEM) { /* read, parse /proc/#/statm */
if ((file2str(path, "statm", sbuf, sizeof sbuf)) != -1 )
statm2proc(sbuf, p); /* ignore statm errors here */
@@ -755,9 +782,15 @@
}
else if (flags & PROC_PID)
PT = openproc(flags, va_arg(ap, void*)); /* assume ptr sizes same */
+#ifdef WITH_SELINUX
+ else if (flags & PROC_CONTEXT)
+ PT = openproc(flags, va_arg(ap, security_context_t*));
+#endif
else
PT = openproc(flags);
va_end(ap);
+ if (!PT)
+ return 0;
do { /* read table: */
tab = xrealloc(tab, (n+1)*sizeof(proc_t*));/* realloc as we go, using */
tab[n] = readproc_direct(PT, NULL); /* final null to terminate */
--- procps-3.1.9.orig/proc/readproc.h
+++ procps-3.1.9/proc/readproc.h
@@ -14,8 +14,8 @@
#define SIGNAL_STRING
-#ifdef FLASK_LINUX
-#include <fs_secure.h>
+#ifdef WITH_SELINUX
+#include <selinux/selinux.h>
#endif
EXTERN_C_BEGIN
@@ -136,8 +136,8 @@
tgid, /* thread group ID */
exit_signal, /* might not be SIGCHLD */
processor; /* current (or most recent?) CPU */
-#ifdef FLASK_LINUX
- security_id_t secsid;
+#ifdef WITH_SELINUX
+ security_context_t scontext;
#endif
} proc_t;
@@ -154,8 +154,8 @@
pid_t* pids; /* pids of the procs */
uid_t* uids; /* uids of procs */
int nuid; /* cannot really sentinel-terminate unsigned short[] */
-#ifdef FLASK_LINUX
- security_id_t* sids; /* SIDs of the procs */
+#ifdef WITH_SELINUX
+ security_context_t* scontexts; /* security contexts of the procs */
#endif
} PROCTAB;
@@ -218,6 +218,9 @@
/* Obsolete, consider only processes with one of the passed: */
#define PROC_PID 0x1000 /* process id numbers ( 0 terminated) */
#define PROC_UID 0x4000 /* user id numbers ( length needed ) */
+#ifdef WITH_SELINUX
+#define PROC_CONTEXT 0x8000
+#endif
// it helps to give app code a few spare bits
#define PROC_SPARE_1 0x01000000
--- procps-3.1.9.orig/ps/display.c
+++ procps-3.1.9/ps/display.c
@@ -246,7 +246,7 @@
fprintf(stderr, "Error: can not access /proc.\n");
exit(1);
}
- memset(&buf, '#', sizeof(proc_t));
+ memset(&buf, 0, sizeof(proc_t));
while(ps_readproc(ptp,&buf)){
if(want_this_proc(&buf)) show_one_proc(&buf);
if(buf.cmdline) free((void*)*buf.cmdline); // ought to reuse
--- procps-3.1.9.orig/ps/help.c
+++ procps-3.1.9/ps/help.c
@@ -35,8 +35,8 @@
"-O,O preloaded -o v virtual memory --cumulative --format --deselect\n"
"-l,l long u user-oriented --sort --tty --forest --version\n"
"-F extra full X registers --heading --no-heading\n"
-#ifdef FLASK_LINUX
-" --context --SID (Flask only)\n"
+#ifdef WITH_SELINUX
+" --context (SELinux only)\n"
#endif
" ********* misc options *********\n"
"-V,V show version L list format codes f ASCII art forest\n"
--- procps-3.1.9.orig/ps/output.c
+++ procps-3.1.9/ps/output.c
@@ -68,11 +68,9 @@
#include "../proc/escape.h"
#include "common.h"
-#ifdef FLASK_LINUX
+#ifdef WITH_SELINUX
#include <errno.h>
-#include <fs_secure.h>
-#include <ss.h>
-#define DEF_CTXTLEN 255
+#include <selinux/selinux.h>
#endif
@@ -208,6 +206,9 @@
CMP_SMALL(pcpu)
CMP_SMALL(state)
+#ifdef WITH_SELINUX
+CMP_STR(scontext)
+#endif
/* approximation to: kB of address space that could end up in swap */
static int sr_swapable(const proc_t* P, const proc_t* Q) {
@@ -957,7 +958,7 @@
/****************** FLASK security stuff **********************/
-#ifdef FLASK_LINUX
+#ifdef WITH_SELINUX
/*
* The sr_fn() calls -- for sorting -- don't return errors because
@@ -965,128 +966,26 @@
* is called, at which point the error goes onscreen.
*/
-/* as above, creates sr_secsid function */
-CMP_INT(secsid) /* FLASK security ID, **NOT** a session ID -- ugh */
-
-static int pr_secsid(char *restrict const outbuf, const proc_t *restrict const pp){
- return sprintf(outbuf, "%d", (int) pp->secsid);
-}
-
static int pr_context(char *restrict const outbuf, const proc_t *restrict const pp){
- char *ctxt; /* should be security_context_t */
- unsigned int len;
- int rv;
-
- len = DEF_CTXTLEN;
- ctxt = (char *) calloc(1, len);
- if ( ctxt != NULL )
- rv = security_sid_to_context(pp->secsid, (security_context_t) ctxt, &len);
- else
- return sprintf(outbuf, "-");
-
- if ( rv ) {
- if ( errno != ENOSPC ) {
- free(ctxt);
- return sprintf(outbuf, "-");
- } else {
- free(ctxt);
- ctxt = (char *) calloc(1, len);
- if ( ctxt != NULL ) {
- rv = security_sid_to_context(pp->secsid, (security_context_t) ctxt, &len);
- if ( rv ) {
- free(ctxt);
- return sprintf(outbuf, "-");
- } else {
- rv = sprintf(outbuf, "%s", ctxt);
- free(ctxt);
- return rv;
- }
- } else { /* calloc() failed */
- return sprintf(outbuf, "-");
- }
- }
+ if (pp->scontext) {
+ sprintf(outbuf, pp->scontext);
} else {
- rv = sprintf(outbuf, "%s", ctxt);
- free(ctxt);
- return rv;
+ sprintf(outbuf, "-");
}
}
-
static int sr_context ( const proc_t* P, const proc_t* Q ) {
- char *ctxt_P, *ctxt_Q; /* type should be security_context_t */
- unsigned int len;
- int rv;
-
- len = DEF_CTXTLEN;
- ctxt_P = (char *) calloc(1, len);
- ctxt_Q = (char *) calloc(1, len);
-
- rv = security_sid_to_context(P->secsid, (security_context_t) ctxt_P, &len);
- if ( rv ) {
- if ( errno != ENOSPC ) {
- free(ctxt_P);
- /* error should resurface during printing */
- return( 0 );
- } else {
- free(ctxt_P);
- ctxt_P = (char *) calloc(1, len);
- if ( ctxt_P != NULL ) {
- rv = security_sid_to_context(P->secsid, (security_context_t) ctxt_P, &len);
- if ( rv ) {
- free(ctxt_P);
- /* error should resurface during printing */
- return( 0 );
- }
- } else { /* calloc() failed */
- /* error should resurface during printing */
- return( 0 );
- }
- }
- }
-
- len = DEF_CTXTLEN;
-
- rv = security_sid_to_context(Q->secsid, (security_context_t) ctxt_Q, &len);
- if ( rv ) {
- if ( errno != ENOSPC ) {
- free(ctxt_P);
- free(ctxt_Q);
- /* error should resurface during printing */
- return( 0 );
- } else {
- free(ctxt_Q);
- ctxt_Q = (char *) calloc(1, len);
- if ( ctxt_Q != NULL ) {
- rv = security_sid_to_context(Q->secsid, (security_context_t) ctxt_Q, &len);
- if ( rv ) {
- free(ctxt_P);
- free(ctxt_Q);
- /* error should resurface during printing */
- return( 0 );
- }
- } else { /* calloc() failed */
- /* error should resurface during printing */
- free(ctxt_P);
- return( 0 );
- }
- }
- }
-
- rv = strcmp(ctxt_P, ctxt_Q);
-
- free(ctxt_P);
- free(ctxt_Q);
-
- return( rv );
+ if ((P->scontext==NULL) && (Q->scontext==NULL))
+ return 0;
+ if ((P->scontext==NULL) || (Q->scontext==NULL))
+ return 1;
+ return strcmp(P->scontext, Q->scontext);
}
#else
/****** dummy functions ******/
-#define pr_secsid pr_nop
-#define sr_secsid sr_nop
#define pr_context pr_nop
#define sr_context sr_nop
@@ -1274,7 +1173,7 @@
{"sched", "SCH", pr_sched, sr_sched, 3, 0, AIX, RIGHT},
{"scnt", "SCNT", pr_nop, sr_nop, 4, 0, DEC, RIGHT}, /* man page misspelling of scount? */
{"scount", "SC", pr_nop, sr_nop, 4, 0, AIX, RIGHT}, /* scnt==scount, DEC claims both */
-{"secsid", "SID", pr_secsid, sr_secsid, 6, 0, LNX, RIGHT}, /* Flask Linux */
+{"context", "CONTEXT", pr_context, sr_context,40, 0, LNX, RIGHT}, /* SE Linux */
{"sess", "SESS", pr_sess, sr_session, 5, 0, XXX, RIGHT},
{"session", "SESS", pr_sess, sr_session, 5, 0, LNX, RIGHT},
{"sgi_p", "P", pr_sgi_p, sr_nop, 1, 0, LNX, RIGHT}, /* "cpu" number */
@@ -1384,9 +1283,6 @@
{"FL5FMT", "f,state,uid,pid,ppid,pcpu,pri,nice,rss,wchan,start,time,command"}, /* Digital -fl */
-{"FLASK_context", "pid,secsid,context,command"}, /* Flask Linux context, --context */
-{"FLASK_sid", "pid,secsid,command"}, /* Flask Linux SID, --SID */
-
{"HP_", "pid,tty,time,comm"}, /* HP default */
{"HP_f", "user,pid,ppid,cpu,stime,tty,time,args"}, /* HP -f */
{"HP_fl", "flags,state,user,pid,ppid,cpu,intpri,nice,addr,sz,wchan,stime,tty,time,args"}, /* HP -fl */
@@ -1414,6 +1310,9 @@
{"RUSAGE", "minflt,majflt,nswap,inblock,oublock,msgsnd,msgrcv,nsigs,nvcsw,nivcsw"}, /* Digital -o "RUSAGE" */
{"SCHED", "user,pcpu,pri,usrpri,nice,psxpri,psr,policy,pset"}, /* Digital -o "SCHED" */
+#ifdef WITH_SELINUX
+{"SELINUX_context", "pid,context,command"}, /* SELinux Linux context, --context */
+#endif
{"SFMT", "uid,pid,cursig,sig,sigmask,sigignore,sigcatch,stat,tname,command"}, /* Digital s */
{"Std_f", "uid_hack,pid,ppid,c,stime,tname,time,cmd"}, /* new -f */
--- procps-3.1.9.orig/ps/parser.c
+++ procps-3.1.9/ps/parser.c
@@ -727,7 +727,6 @@
gnu_table_struct *found;
static const gnu_table_struct gnu_table[] = {
{"Group", &&case_Group}, /* rgid */
- {"SID", &&case_secsid},
{"User", &&case_User}, /* ruid */
{"cols", &&case_cols},
{"columns", &&case_columns},
@@ -755,7 +754,6 @@
{"pid", &&case_pid},
{"ppid", &&case_ppid},
{"rows", &&case_rows},
- {"secsid", &&case_secsid},
{"sid", &&case_sid},
{"sort", &&case_sort},
{"tty", &&case_tty},
@@ -941,13 +939,14 @@
exit(0);
return NULL;
case_context:
- trace("--context\n");
- format_flags |= FF_Fc;
+ if (is_selinux_enabled()) {
+ trace("--context\n");
+ format_flags |= FF_Fc;
+ } else {
+ fprintf(stderr,
+ "Warning: --context ignored. Requires a SELinux enabled kernel\n");
+ }
return NULL;
- case_secsid:
- trace("--secsid\n");
- format_flags |= FF_Fs;
- return NULL;
}
/*************** process trailing PIDs **********************/
--- procps-3.1.9.orig/ps/sortformat.c
+++ procps-3.1.9/ps/sortformat.c
@@ -803,9 +803,8 @@
case FF_LX: spec="OL_X"; break;
case FF_Lm: spec="OL_m"; break;
- /* These are FLASK security options. */
- case FF_Fc: spec="FLASK_context"; break;
- case FF_Fs: spec="FLASK_sid"; break;
+ /* These are SELinux security options. */
+ case FF_Fc: spec="SELINUX_context"; break;
} /* end switch(format_flags) */
--- procps-3.1.9.orig/ps/common.h
+++ procps-3.1.9/ps/common.h
@@ -103,7 +103,6 @@
#define FF_LX 0x0100 /* X */
#define FF_Lm 0x0200 /* m */ /* overloaded: threads, sort, format */
#define FF_Fc 0x0400 /* --context */ /* Flask security context format */
-#define FF_Fs 0x0800 /* --SID */ /* Flask SID format */
/* predefined format modifier flags such as: -l -f l u s -j */
#define FM_c 0x0001 /* -c */
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2003-07-11 19:14 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-07-09 18:55 port of procps patch to acahalan procps Colin Walters
[not found] ` <1057805552.751.1243.camel@cube>
2003-07-11 19:14 ` Colin Walters
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.