Package: at
Version: 3.1.10.2
Severity: important

The following patch enables SE Linux support in atd.  I have given this
severity important because there is a theoretical possibility of a
security hole related to this.  But in the default and supported
configurations there is no problem as SE Linux does not constrain
regular users (IE contexts that can run the "at" client).

To avoid any potential problems I would like to see this included in Lenny.

diff -ru at-3.1.10.2.bak/Makefile.in at-3.1.10.2/Makefile.in
--- at-3.1.10.2.bak/Makefile.in 2005-08-29 18:08:28.000000000 +1000
+++ at-3.1.10.2/Makefile.in     2009-01-02 16:16:05.000000000 +1100
@@ -27,6 +27,7 @@
 YACC           = @YACC@
 LEX            = @LEX@
 LEXLIB         = @LEXLIB@
+SELINUXLIB     = @SELINUXLIB@
 
 CC             = @CC@
 CFLAGS                 = @CFLAGS@
@@ -73,7 +74,7 @@
        $(LN_S) -f at atrm
 
 atd: $(RUNOBJECTS)
-       $(CC) $(CFLAGS) -o atd $(RUNOBJECTS) $(LIBS) $(PAMLIB)
+       $(CC) $(CFLAGS) -o atd $(RUNOBJECTS) $(LIBS) $(PAMLIB) $(SELINUXLIB)
 
 y.tab.c y.tab.h: parsetime.y
        $(YACC) -d parsetime.y
diff -ru at-3.1.10.2.bak/atd.c at-3.1.10.2/atd.c
--- at-3.1.10.2.bak/atd.c       2005-08-31 09:42:56.000000000 +1000
+++ at-3.1.10.2/atd.c   2009-01-02 16:46:01.000000000 +1100
@@ -74,6 +74,14 @@
 #include <syslog.h>
 #endif
 
+#ifdef WITH_SELINUX
+#include <selinux/selinux.h>
+#include <selinux/get_context_list.h>
+int selinux_enabled=0;
+#include <selinux/flask.h>
+#include <selinux/av_permissions.h>
+#endif
+
 /* Local headers */
 
 #include "privs.h"
@@ -438,6 +446,76 @@
 
            chdir("/");
 
+#ifdef WITH_SELINUX
+           if (selinux_enabled>0) {
+             security_context_t  file_context=NULL;
+             security_context_t *context_list=NULL;
+             security_context_t current_con=NULL;
+             int retval=0, list_count=0, i;
+             struct av_decision avd;
+             char *seuser=NULL, *level=NULL;
+
+             if (getseuserbyname(pentry->pw_name, &seuser, &level))
+               perr("getseuserbyname FAILED for %s\n", pentry->pw_name);
+
+             if(getcon(&current_con)) {
+               free(seuser);
+               free(level);
+               perr("Can't get current context");
+             }
+             list_count = get_ordered_context_list_with_level(seuser, level, 
current_con, &context_list);
+             freecon(current_con);
+             free(seuser);
+             free(level);
+             if (list_count == -1) {
+               if (security_getenforce() > 0)
+                 perr("Couldn't get security context for user %s\n", 
pentry->pw_name); 
+               else
+                 syslog(LOG_WARNING, "Couldn't get security context for user 
%s, but in permissive mode", pentry->pw_name);
+             }
+
+             /*
+              * Since crontab files are not directly executed,
+              * crond must ensure that the crontab file has
+              * a context that is appropriate for the context of
+              * the user cron job.  It performs an entrypoint
+              * permission check for this purpose.
+              */
+             if (list_count != -1) {
+               if (fgetfilecon(STDIN_FILENO, &file_context) < 0) {
+                 if (security_getenforce() > 0)
+                   perr("fgetfilecon FAILED for user %s", pentry->pw_name);
+               }
+
+               for(i = 0; i < list_count; i++) {
+                 retval = security_compute_av(context_list[i],
+                                          file_context,
+                                          SECCLASS_FILE,
+                                          FILE__ENTRYPOINT,
+                                          &avd);
+                 if (!retval && ((FILE__ENTRYPOINT & avd.allowed) == 
FILE__ENTRYPOINT))
+                   break;
+               }
+             }
+             freecon(file_context);
+             if (list_count != -1 && (retval || ((FILE__ENTRYPOINT & 
avd.allowed) != FILE__ENTRYPOINT))) {
+               if (security_getenforce()==1) 
+                 perr("Not allowed to set exec context for user %s\n", 
pentry->pw_name); 
+               else
+                 syslog(LOG_WARNING, "Not allowed to set exec context for user 
%s, but in permissive mode", pentry->pw_name); 
+             }
+
+             if ((list_count != -1 || retval) && setexeccon(context_list[i]) < 
0) {
+               if (security_getenforce()==1) {
+                 perr("Could not set exec context to %s for user %s\n", 
context_list[i], pentry->pw_name); 
+               } else {
+                 syslog(LOG_ERR, "Could not set exec context to %s for user 
%s\n", context_list[i], pentry->pw_name); 
+               }
+             }
+             freeconary(context_list);
+           }
+#endif 
+
            if (execle("/bin/sh", "sh", (char *) NULL, nenvp) != 0)
                perr("Exec failed for /bin/sh");
 
@@ -696,6 +774,9 @@
     struct passwd *pwe;
     struct group *ge;
 
+#ifdef WITH_SELINUX
+    selinux_enabled=is_selinux_enabled();
+#endif 
 /* We don't need root privileges all the time; running under uid and gid
  * daemon is fine.
  */
diff -ru at-3.1.10.2.bak/config.h.in at-3.1.10.2/config.h.in
--- at-3.1.10.2.bak/config.h.in 2005-08-05 13:16:02.000000000 +1000
+++ at-3.1.10.2/config.h.in     2009-01-02 16:15:28.000000000 +1100
@@ -82,6 +82,9 @@
 
 #undef HAVE_ATTRIBUTE_NORETURN
 
+/* Define if you are building with_selinux  */
+#undef WITH_SELINUX
+
 /* Define if you have the getcwd function.  */
 #undef HAVE_GETCWD
 
diff -ru at-3.1.10.2.bak/configure.in at-3.1.10.2/configure.in
--- at-3.1.10.2.bak/configure.in        2005-08-05 13:16:02.000000000 +1000
+++ at-3.1.10.2/configure.in    2009-01-02 16:15:01.000000000 +1100
@@ -316,4 +316,12 @@
 )
 AC_SUBST(DAEMON_GROUPNAME)
 
+AC_ARG_WITH(selinux,
+[ --with-selinux       Define to run with selinux],
+AC_DEFINE(WITH_SELINUX),
+)
+AC_CHECK_LIB(selinux, is_selinux_enabled, SELINUXLIB=-lselinux)
+AC_SUBST(SELINUXLIB)
+AC_SUBST(WITH_SELINUX)
+
 AC_OUTPUT(Makefile atrun atd.8 atrun.8 at.1 batch)
diff -ru at-3.1.10.2.bak/debian/control at-3.1.10.2/debian/control
--- at-3.1.10.2.bak/debian/control      2008-09-23 22:22:41.000000000 +1000
+++ at-3.1.10.2/debian/control  2009-01-02 16:19:35.000000000 +1100
@@ -3,7 +3,7 @@
 Priority: important
 Maintainer: Ryan Murray <rmur...@debian.org>
 Standards-Version: 3.6.2
-Build-Depends: bison, flex, libpam0g-dev, ssmtp | mail-transport-agent
+Build-Depends: bison, flex, libpam0g-dev, ssmtp | mail-transport-agent, 
libselinux1-dev
 
 Package: at
 Architecture: any
diff -ru at-3.1.10.2.bak/debian/rules at-3.1.10.2/debian/rules
--- at-3.1.10.2.bak/debian/rules        2006-01-03 18:12:56.000000000 +1100
+++ at-3.1.10.2/debian/rules    2009-01-02 16:17:52.000000000 +1100
@@ -30,7 +30,7 @@
        -test -f config.cache || PATH=/usr/sbin:$${PATH} ./configure 
--prefix=/usr \
                --with-loadavg_mx=1.5 \
                --with-jobdir=/var/spool/cron/atjobs \
-               --with-atspool=/var/spool/cron/atspool
+               --with-atspool=/var/spool/cron/atspool --with-selinux
        sed 's,/usr/lib/sendmail,/usr/sbin/sendmail,g' \
                < config.h > config.h.new
        mv -f config.h.new config.h



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to