Date: Sun, 26 Jan 1997 22:17:20 +1100 (EST) From: Julian Assange <proff@iq.org> To: FreeBSD-gnats-submit@freebsd.org, dyson@freebsd.org Subject: bin/2593: <Synopsis of the problem (one line)> [small] security hole and nfs compatibility bug in rexecd.c Message-ID: <199701261117.WAA16474@profane.iq.org> Resent-Message-ID: <199701261120.DAA02330@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 2593
>Category: bin
>Synopsis: [small] security hole and nfs compatibility bug in rexecd.c
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sun Jan 26 03:20:01 PST 1997
>Last-Modified:
>Originator: Julian Assange
>Organization:
>Release: FreeBSD 3.0-CURRENT i386
>Environment:
>Description:
rexecd.c performs a chdir(home) as root rather than as
user, possibly allowing the rexecd.c client access to
directories they would have otherwise been barred from.
The condition also has the effect of breaking all nfs
mounted home directories where root is mapped to non-root,
and the home directory is o-x. Additionally the buffer
overflow in error() I reported earlier does not exist (I
somehow managed (ADD?;) to mixup the order of the arguments
in my head, swapping err<->buf).
>How-To-Repeat:
>Fix:
--- src/libexec/rexecd/rexecd.c~ Sun Jan 26 21:48:35 1997
+++ src/libexec/rexecd/rexecd.c Sun Jan 26 22:05:03 1997
@@ -66,9 +66,9 @@
/*VARARGS1*/
int error();
-char username[20] = "USER=";
-char homedir[64] = "HOME=";
-char shell[64] = "SHELL=";
+char username[MAXLOGNAME+5+1] = "USER=";
+char homedir[MAXPATHLEN+5+1] = "HOME=";
+char shell[MAXPATHLEN+6+1] = "SHELL=";
char path[sizeof(_PATH_DEFPATH) + sizeof("PATH=")] = "PATH=";
char *envinit[] =
{homedir, shell, path, username, 0};
@@ -213,10 +213,6 @@
syslog(LOG_INFO, "login from %s as %s", remote, user);
- if (chdir(pwd->pw_dir) < 0) {
- error("No remote directory.\n");
- exit(1);
- }
(void) write(2, "\0", 1);
if (port) {
(void) pipe(pv);
@@ -276,6 +272,10 @@
cp++;
else
cp = pwd->pw_shell;
+ if (chdir(pwd->pw_dir) < 0) {
+ perror("bad remote directory.\n");
+ exit(1);
+ }
execl(pwd->pw_shell, cp, "-c", cmdbuf, 0);
perror(pwd->pw_shell);
exit(1);
@@ -289,7 +289,7 @@
char buf[BUFSIZ];
buf[0] = 1;
- (void) sprintf(buf+1, fmt, a1, a2, a3);
+ (void) snprintf(buf+1, sizeof(buf)-1, fmt, a1, a2, a3);
(void) write(2, buf, strlen(buf));
}
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199701261117.WAA16474>
