Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Apr 1995 10:00:48 -0500 (CDT)
From:      Mike Pritchard <pritc003@maroon.tc.umn.edu>
To:        freebsd-hackers@FreeBSD.org
Subject:   atrun fix
Message-ID:  <199504111500.KAA01076@mpp.com>

next in thread | raw e-mail | index | archive | help
Here is a fix for the atrun security hole.  When sending mail, atrun
will switch ids to that of the user running the at job.  This will 
prevent the user from spoofing sendmail any more than they could from a 
login shell.  I also fixed it so that it correctly sets up the users groups
before running the at job or sending mail to the user.  It also now requires 
that the user be present in the password file before allowing the 
job to execute.

One other functional change is that mail will no longer be sent to
"root" if atrun can't figure out who to send mail to.  This is a side
effect of requiring that the user be present in the password file.

-Mike


*** orig/atrun.c	Tue Apr 11 08:29:43 1995
--- ./atrun.c	Tue Apr 11 09:47:51 1995
***************
*** 74,83 ****
  }
  
  static void
! run_file(filename, uid, gid)
  	const char *filename;
  	uid_t uid;
- 	gid_t gid;
  {
  	/*
  	 * Run a file by by spawning off a process which redirects I/O,
--- 74,82 ----
  }
  
  static void
! run_file(filename, uid)
  	const char *filename;
  	uid_t uid;
  {
  	/*
  	 * Run a file by by spawning off a process which redirects I/O,
***************
*** 125,138 ****
  
  	fcntl(fd_in, F_SETFD, fflags & ~FD_CLOEXEC);
  
  	if (fscanf(stream, "#! /bin/sh\n# mail %8s %d", mailbuf, &send_mail) == 2) {
  		mailname = mailbuf;
  	} else {
! 		pentry = getpwuid(uid);
! 		if (pentry == NULL)
! 			mailname = "root";
! 		else
! 			mailname = pentry->pw_name;
  	}
  	fclose(stream);
  	if (chdir(_PATH_ATSPOOL) < 0)
--- 124,135 ----
  
  	fcntl(fd_in, F_SETFD, fflags & ~FD_CLOEXEC);
  
+ 	if ((pentry = getpwuid(uid)) == NULL)
+ 		perr("Unable to determine login name for job");
  	if (fscanf(stream, "#! /bin/sh\n# mail %8s %d", mailbuf, &send_mail) == 2) {
  		mailname = mailbuf;
  	} else {
! 		mailname = pentry->pw_name;
  	}
  	fclose(stream);
  	if (chdir(_PATH_ATSPOOL) < 0)
***************
*** 193,199 ****
  		    if (queue > 'b')
  			nice(queue - 'b');
  
! 		if (setgid(gid) < 0)
  			perr("Cannot change group");
  
  		if (setuid(uid) < 0)
--- 190,198 ----
  		    if (queue > 'b')
  			nice(queue - 'b');
  
! 		if (initgroups(pentry->pw_name, pentry->pw_gid) < 0)
! 			perr("Cannot initialize group list");
! 		if (setgid(pentry->pw_gid) < 0)
  			perr("Cannot change group");
  
  		if (setuid(uid) < 0)
***************
*** 221,229 ****
--- 220,238 ----
  			if (open(filename, O_RDONLY) != STDIN_FILENO)
  				perr("Cannot reopen output file");
  
+ 			PRIV_START
+ 
+ 			if (initgroups(pentry->pw_name, pentry->pw_gid) < 0)
+ 				perr("Cannot initialize group list");
+ 			if (setgid(pentry->pw_gid) < 0)
+ 				perr("Cannot change group");
+ 			if (setuid(uid) < 0)
+ 				perr("Cannot set user id");
  			execl(_PATH_SENDMAIL, _PATH_SENDMAIL, mailname,
  			    (char *) NULL);
  			perr("Exec failed");
+ 
+ 			PRIV_END
  		}
  		waitpid(pid, (int *) NULL, 0);
  	}
***************
*** 315,321 ****
  
  			PRIV_END
  
! 			run_file(dirent->d_name, buf.st_uid, buf.st_gid);
  		}
  		/* Delete older files */
  		if (older && !(S_IXUSR & buf.st_mode) &&
--- 324,330 ----
  
  			PRIV_END
  
! 			run_file(dirent->d_name, buf.st_uid);
  		}
  		/* Delete older files */
  		if (older && !(S_IXUSR & buf.st_mode) &&



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199504111500.KAA01076>