Date: Mon, 17 Jan 2000 13:03:25 +1100 From: Peter Jeremy <peter.jeremy@alcatel.com.au> To: Kris Kennaway <kris@hub.freebsd.org> Cc: audit@FreeBSD.ORG Subject: Re: awk tempfile handling Message-ID: <00Jan17.130325est.40324@border.alcanet.com.au> In-Reply-To: <Pine.BSF.4.21.0001161707440.18027-100000@hub.freebsd.org>; from kris@hub.freebsd.org on Mon, Jan 17, 2000 at 12:01:00PM %2B1100 References: <Pine.BSF.4.21.0001161707440.18027-100000@hub.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 2000-Jan-17 12:01:00 +1100, Kris Kennaway <kris@hub.freebsd.org> wrote:
>+ char *name = "/tmp/pipXXXXXXXXXX";
No good. mkstemp() updates the passed string in place (see the notes
in mktemp(3). The above defines a read-only string. This leads to
segmentation violations at runtime.
> static char cmdbuf[256];
Into which you're sprintf()ing an unbounded string. Not a good idea.
>- if ((name = tempnam(".", "pip")) == NULL)
>+ if ((current = mkstemp(name)) == INVALID_HANDLE)
> return NULL;
tempnam() returns a malloc'd buffer, mkstemp() reuses the passed name.
This will cause problems if `name' is later free()d.
> sprintf(cmdbuf, "%s > %s", cmd, name);
> system(cmdbuf);
system(3) is one of those system calls which is virtually impossible to
use safely. There's also a race condition here - there's nothing stopping
another process doing something nasty between the mkstemp() and the
I/O redirection done by the shell within system().
The following is an outline of what needs to be done:
{
static char name[] = "/tmp/pipXXXXXXXXXX";
int current; /* FD for stdout from command */
pid_t pid;
int status;
if ((current = mkstemps(name, 10)) == INVALID_HANDLE)
return NULL;
if ((pid = fork()) < 0)
return NULL;
else if (pid == 0) {
if (current != 1) {
if (dup2(current, 1) < 0)
_exit(1);
close(current);
}
/*XXX close other random FD's and/or set close-on-exec flags */
/*XXX If security is an issue, don't call sh at all */
execl("/bin/sh", "sh", "-c", cmd, NULL);
_exit(1);
} else {
while (waitpid(pid, &status, 0) < 0 && errno == EINTR)
;
}
pipes[current].name = strdup(name);
pipes[current].command = strdup(cmd);
rp->iop = iop_alloc(current, name, NULL);
...
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?00Jan17.130325est.40324>
