Date: Thu, 13 Apr 1995 15:17:00 +0300 (GMT+0300) From: adam <adam@math.tau.ac.il> To: freebsd-security@FreeBSD.org Subject: Re: cvs commit: src/usr.sbin/cron/cron do_command.c Message-ID: <199504131217.PAA21237@lune.math.tau.ac.il> In-Reply-To: <199504122010.PAA03812@mpp.com> from "Mike Pritchard" at Apr 12, 95 03:10:12 pm
index | next in thread | previous in thread | raw e-mail
> > Modified: usr.sbin/cron/cron do_command.c
> > Log:
> > Close MAILTO security hole
> I took a look at your fix, and the security hole is still there. Simply
> checking if the first character of the MAILTO variable is a '-' isn't
> enough, since I could simply prefix the MAILTO variable with a space (or
> lots of them or whatever). I can also add additional arguments,
> which with sendmail isn't a problem, but what if the administrator chooses
> to edit cron/config.h and use a different mail delivery program?
> Then who knows how those extra arguments are going to be used.
The cron in question is vixie-cron-3.0. I emailed Paul Vixie around
the time I posted the hole in Thomas Koenig's atrun, and also included
a patch. Since that cron hasn't been updated for quite some time, and
is probably not at the top of his list, it's taking a while, though
I'm only guessing (and it hasn't really been such a long while).
My suggestion is not to run Sendmail as root. If you want, you can
``verify'' MAILTO, but IMHO, such a fix is begging to fail, because
you need to start studying Sendmail and seeing what wrongs it can do
running as root. Like, the obvious fix of searching for ``-'' fails
for people who mail ``cron-people''.
Running sendmail as the user seems to work fine, including From: headers
and everything.
Well, it's out... so here's my patch. safe_p() is a slight modification
of something Paul Vixie wrote.
*** do_command.c.orig Sun Apr 9 18:29:18 1995
--- do_command.c Sun Apr 9 19:47:34 1995
***************
*** 33,38 ****
--- 33,39 ----
static void child_process __P((entry *, user *)),
do_univ __P((user *));
+ static int safe_p __P((const char *));
void
do_command(e, u)
***************
*** 360,365 ****
--- 361,369 ----
* up the mail command and subjects and stuff...
*/
+ if (!safe_p(mailto))
+ log_it(usernm, getpid(), "UNSAFE", mailto);
+
if (mailto) {
register char **env;
auto char mailcmd[MAX_COMMAND];
***************
*** 368,373 ****
--- 372,383 ----
(void) gethostname(hostname, MAXHOSTNAMELEN);
(void) sprintf(mailcmd, MAILARGS, MAILCMD, mailto);
+ setgid(e->gid);
+ #if defined (BSD)
+ initgroups(env_get("LOGNAME", e->envp), e->gid);
+ #endif
+ setuid(e->uid);
+
if (!(mail = cron_popen(mailcmd, "w"))) {
perror(MAILCMD);
(void) _exit(ERROR_EXIT);
***************
*** 462,467 ****
--- 472,492 ----
}
}
+ static int
+ safe_p(s)
+ register const char *s;
+ {
+ static const char safe_delim[] = "@!:%-_.";
+ register char ch;
+
+ while ((ch = *s++) != '\0') {
+ if (isascii(ch) && isprint(ch) &&
+ (isalnum(ch) || strchr(safe_delim, ch)))
+ continue;
+ return (FALSE);
+ }
+ return (TRUE);
+ }
static void
do_univ(u)
adam?
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199504131217.PAA21237>
