[3800] in bugtraq

home help back first fref pref prev next nref lref last post

Re: vixie-crontab for redhat linux

daemon@ATHENA.MIT.EDU (Erik Troan)
Mon Dec 16 11:42:33 1996

Date: 	Mon, 16 Dec 1996 10:44:01 -0500
Reply-To: Erik Troan <ewt@redhat.com>
From: Erik Troan <ewt@redhat.com>
X-To:         "Dave G." <daveg@escape.com>, paul@vix.com
To: Multiple recipients of list BUGTRAQ <BUGTRAQ@NETSPACE.ORG>
In-Reply-To:  <Pine.BSI.3.91.961215192038.25407A-100000@escape.com>

On Sun, 15 Dec 1996, Dave G. wrote:

> /* vixie crontab buffer overflow for RedHat Linux
>  *
>  * I dont think too many people know that redhat uses vixie crontab.
>  * I didn't find this, just exploited it.
>  *
>  *
>  * Dave G.
>  * <daveg@escape.com>
>  * http://www.escape.com/~daveg
>  *
>  *
>  */

Here's a quick fix that lets crontab segv instead of buffer overflowing ;-)
I think I got all of the sprintf and strcpy buffer overflows. There are still
some attacks based on overruns on data read from /etc/passwd but those would
be difficult to exploit at best.

Comments?

Erik

--- vixie-cron-3.0.1/crontab.c.ewt      Mon Dec 16 10:35:09 1996
+++ vixie-cron-3.0.1/crontab.c  Mon Dec 16 10:42:21 1996
@@ -197,7 +197,9 @@
        } else {
                if (argv[optind] != NULL) {
                        Option = opt_replace;
-                       (void) strcpy (Filename, argv[optind]);
+                       (void) strncpy (Filename, argv[optind],
+                                       sizeof(Filename - 1));
+                       Filename[sizeof(Filename) - 1] = '\0';
                } else {
                        usage("file name must be specified for replace");
                }
@@ -246,7 +248,7 @@
        int     ch;

        log_it(RealUser, Pid, "LIST", User);
-       (void) sprintf(n, CRON_TAB(User));
+       (void) snprintf(n, sizeof(n), CRON_TAB(User));
        if (!(f = fopen(n, "r"))) {
                if (errno == ENOENT)
                        fprintf(stderr, "no crontab for %s\n", User);
@@ -269,7 +271,7 @@
        char    n[MAX_FNAME];

        log_it(RealUser, Pid, "DELETE", User);
-       (void) sprintf(n, CRON_TAB(User));
+       (void) snprintf(n, sizeof(n), CRON_TAB(User));
        if (unlink(n)) {
                if (errno == ENOENT)
                        fprintf(stderr, "no crontab for %s\n", User);
@@ -301,7 +303,7 @@
        PID_T           pid, xpid;

        log_it(RealUser, Pid, "BEGIN EDIT", User);
-       (void) sprintf(n, CRON_TAB(User));
+       (void) snprintf(n, sizeof(n), CRON_TAB(User));
        if (!(f = fopen(n, "r"))) {
                if (errno != ENOENT) {
                        perror(n);
@@ -497,7 +499,7 @@
        char    **envp = env_init();

        (void) sprintf(n, "tmp.%d", Pid);
-       (void) sprintf(tn, CRON_TAB(n));
+       (void) snprintf(tn, sizeof(tn), CRON_TAB(n));
        if (!(tmp = fopen(tn, "w+"))) {
                perror(tn);
                return (-2);
@@ -585,7 +587,7 @@
                return (-2);
        }

-       (void) sprintf(n, CRON_TAB(User));
+       (void) snprintf(n, sizeof(n), CRON_TAB(User));
        if (rename(tn, n)) {
                fprintf(stderr, "%s: error renaming %s to %s\n",
                        ProgramName, tn, n);

home help back first fref pref prev next nref lref last post