Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Sep 2001 12:26:14 +0300
From:      Ruslan Ermilov <ru@FreeBSD.ORG>
To:        "Andrew R. Reiter" <arr@watson.org>
Cc:        freebsd-audit@FreeBSD.ORG
Subject:   Re: dungeon master patch
Message-ID:  <20010914122614.A82568@sunbay.com>
In-Reply-To: <Pine.NEB.3.96L.1010914000517.11262A-200000@fledge.watson.org>; from arr@watson.org on Fri, Sep 14, 2001 at 12:08:35AM -0400
References:  <Pine.NEB.3.96L.1010914000517.11262A-200000@fledge.watson.org>

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

On Fri, Sep 14, 2001 at 12:08:35AM -0400, Andrew R. Reiter wrote:
> hey,
> 
> I just started to go through -current (seemingly on default) s{g,u}id bins
> and their source for security vulns.  I found a few definet coding
> problems in dungeon master (setgid games ;-)), however, since you can't
> specify the config file, they are probably non-exploitable.  but, hey,
> it's being installed setgid (even if it is games), might as well use good
> coding practice.
> 
> the patch is attached, and also can be found at:
> 
At a quick glance.

> --- dm.c.orig	Thu Sep 13 22:44:25 2001
> +++ dm.c	Thu Sep 13 23:02:43 2001
> @@ -111,15 +111,16 @@
>  play(args)
>  	char **args;
>  {
> -	char pbuf[MAXPATHLEN];
> +	char pbuf[MAXPATHLEN+1];
>  
Err, the correct value is MAXPATHLEN.  Search intro(2) for more details.

> -	if (sizeof(_PATH_HIDE) + strlen(game) > sizeof(pbuf)) {
> +	if (sizeof(_PATH_HIDE) + strlen(game) + 1 > sizeof(pbuf)) {

Err, sizeof("foo") is 4, not 3.  Hence the space for final '\0' is already
accumulated with sizeof(_PATH_HIDE).

>  		(void)fprintf(stderr, "dm: %s/%s: %s\n", _PATH_HIDE, game,
>  			strerror(ENAMETOOLONG));
>  		exit(1);
>  	}
> -	(void)strcpy(pbuf, _PATH_HIDE);
> -	(void)strcpy(pbuf + sizeof(_PATH_HIDE) - 1, game);
> +	bzero((void *)&pbuf, MAXPATHLEN+1);
> +	strlcpy(pbuf, _PATH_HIDE, sizeof(pbuf));
> +	strlcat(pbuf+strlen(_PATH_HIDE), game, sizeof(pbuf)-strlen(_PATH_HIDE));

There was nothing wrong with this.

>  	if (priority > 0)	/* < 0 requires root */
>  		(void)setpriority(PRIO_PROCESS, 0, priority);
>  	execv(pbuf, args);
> @@ -135,30 +136,37 @@
>  read_config()
>  {
>  	FILE *cfp;
> -	char lbuf[BUFSIZ], f1[40], f2[40], f3[40], f4[40], f5[40];
> +	char lbuf[BUFSIZ+1], f1[40], f2[40], f3[40], f4[40], f5[40];
>  
>  	if (!(cfp = fopen(_PATH_CONFIG, "r")))
>  		return;
> -	while (fgets(lbuf, sizeof(lbuf), cfp))
> +	while (fgets(lbuf, sizeof(lbuf)-1, cfp)) {

The fgets() function reads at most one less than the number of characters
specified by size from the given stream and stores them in the string
str.

> +		bzero(&f1, sizeof(f1));
> +		bzero(&f2, sizeof(f2));
> +		bzero(&f3, sizeof(f3));
> +		bzero(&f4, sizeof(f4));
> +		bzero(&f5, sizeof(f5));

Umm, sscanf(3) places a trailing NUL character:

: s  Matches a sequence of non-white-space characters; the next pointer
:    must be a pointer to char, and the array must be large enough to
:    accept all the sequence and the terminating NUL character.  The
:    input string stops at white space or at the maximum field width,
:    whichever occurs first.

>  		switch(*lbuf) {
>  		case 'b':		/* badtty */
> -			if (sscanf(lbuf, "%s%s", f1, f2) != 2 ||
> +			if (sscanf(lbuf, "%39s%39s", f1, f2) != 2 ||

Use "%.s" and "sizeof(f1) - 1", don't hardcode.

>  			    strcasecmp(f1, "badtty"))
>  				break;
>  			c_tty(f2);
>  			break;
>  		case 'g':		/* game */
> -			if (sscanf(lbuf, "%s%s%s%s%s",
> +			if (sscanf(lbuf, "%39s%39s%39s%39s%39s",
>  			    f1, f2, f3, f4, f5) != 5 || strcasecmp(f1, "game"))
>  				break;
>  			c_game(f2, f3, f4, f5);
>  			break;
>  		case 't':		/* time */
> -			if (sscanf(lbuf, "%s%s%s%s", f1, f2, f3, f4) != 4 ||
> -			    strcasecmp(f1, "time"))
> +			if (sscanf(lbuf, "%39s%39s%39s%39s", 
> +			    f1, f2, f3, f4) != 4 || strcasecmp(f1, "time"))
>  				break;
>  			c_day(f2, f3, f4);
>  		}
> +		bzero(&lbuf, sizeof(lbuf));
> +	}
>  	(void)fclose(cfp);
>  }
>  


-- 
Ruslan Ermilov		Oracle Developer/DBA,
ru@sunbay.com		Sunbay Software AG,
ru@FreeBSD.org		FreeBSD committer,
+380.652.512.251	Simferopol, Ukraine

http://www.FreeBSD.org	The Power To Serve
http://www.oracle.com	Enabling The Information Age

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




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