12th Mar 2003 [SBWID-6056]
COMMAND
man arbitrary code execution
SYSTEMS AFFECTED
versions prior to 1.5l. 1.51 is immune.
PROBLEM
Jack Lloyd reported following bug on the *widely used* man page reader:
man.
man 1.5l was released today, fixing a bug which results in arbitrary
code execution upon reading a specially formatted man file. The basic
problem is, upon finding a string with a quoting problem, the function
my_xsprintf in util.c will return "unsafe" (rather than returning a
string which could be interpreted by the shell). This return value is
passed directly to system(3) - meaning if there is any program named
`unsafe`, it will execute with the privs of the user.
Example
=======
$ cat innocent.1
.so "".1
$ cat '"".1' # the outer '' quotes are for the shell the user will never see this
$ cat `which unsafe`
#!/bin/sh
echo "oops"
id -a
$ man ./innocent.1
oops
uid=528(lloyd) gid=100(users) groups=100(users)
$
The location of the man pages and the binary are basically irrelevent,
as long as:
1) man can find the man pages somewhere; both man pages have to be in
the
same subtree due to how man handles .so directives. /usr/share/man/man*
works fine, as does the local directory (./manpage.1) case
2) the shell can find `unsafe` somewhere in $PATH
The severity of this depends on lot on your systems, but is generally
not very high. People running systems with publicly writeable contrib
directories should probably do a quick `find . -name unsafe` just to be
sure. Average home users probably don't have much to worry about, nor
do most corporate environments.
SOLUTION
A simple workaround is to symlink /bin/unsafe to /bin/true. man 1.5l is
not vulnerable to this problem.
I would like to thank Andries Brouwer, the current `man` maintainer,
for his fast response. Sources for the new version can be found at
ftp://ftp.win.tue.nl/pub/linux-local/utils/man/