Skip site navigation (1)Skip section navigation (2)
Date:      7 Dec 2000 11:16:03 -0000
From:      venglin@freebsd.lublin.pl
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/23352: [SECURITY] buffer overflow in opieftpd
Message-ID:  <20001207111603.61676.qmail@riget.scene.pl>
Resent-Message-ID: <200012071120.eB7BK5t24681@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         23352
>Category:       bin
>Synopsis:       [SECURITY] buffer overflow in opieftpd
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Dec 07 03:20:01 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     Przemyslaw Frasunek
>Release:        FreeBSD 4.2-STABLE i386
>Organization:
ISMEDIA
>Environment:

	FreeBSD 4.2-STABLE as of 5th December 2000.

>Description:

	ftpd_popen() from opieftpd contains buffer overflow. opieftpd is not
	compiled by default.

>How-To-Repeat:

	N/A

>Fix:

--- popen.c.bak	Thu Dec  7 12:11:24 2000
+++ popen.c	Thu Dec  7 12:18:04 2000
@@ -82,10 +82,13 @@
 #include <string.h>
 #endif /* HAVE_STRING_H */
 
 #include "opie.h"
 
+#define MAXUSRARGS	100
+#define MAXGLOBARGS	1000
+
 char **ftpglob __P((register char *));
 char **copyblk __P((char **));
 VOIDRET blkfree __P((char **));
 
 /*
@@ -101,34 +104,36 @@
 FILE *ftpd_popen FUNCTION((program, type), char *program AND char *type)
 {
   char *cp;
   FILE *iop;
   int argc, gargc, pdes[2];
-  char **pop, *argv[100], *gargv[1000], *vv[2];
+  char **pop, *argv[MAXUSRARGS], *gargv[MAXGLOBARGS], *vv[2];
 
   if ((*type != 'r' && *type != 'w') || type[1])
     return (NULL);
 
   if (pipe(pdes) < 0)
     return (NULL);
 
   /* break up string into pieces */
-  for (argc = 0, cp = program;; cp = NULL)
+  for (argc = 0, cp = program; argc < MAXUSRARGS-1; cp = NULL) {
     if (!(argv[argc++] = strtok(cp, " \t\n")))
       break;
+  }
+  argv[argc - 1] = NULL;
 
   /* glob each piece */
   gargv[0] = argv[0];
-  for (gargc = argc = 1; argv[argc]; argc++) {
+  for (gargc = argc = 1; argv[argc] && gargc < (MAXGLOBARGS-1); argc++) {
     if (!(pop = (char **) ftpglob(argv[argc]))) {
       /* globbing failed */
       vv[0] = argv[argc];
       vv[1] = NULL;
       pop = (char **) copyblk(vv);
     }
     argv[argc] = (char *) pop;	/* save to free later */
-    while (*pop && gargc < 1000)
+    while (*pop && gargc < MAXGLOBARGS-1)
       gargv[gargc++] = *pop++;
   }
   gargv[gargc] = NULL;
 
   iop = NULL;

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




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