Control: reassign -1 man-db 2.8.0-1

On Sun, Jun 24, 2018 at 03:40:55AM +0200, Boris Jakubith wrote:
> I found out this problem after debugging 'dwww' which no longer created any
> output for manual pages. After near 3 hours of debugging i found that the
> command
> 
>     man  -EUTF-8 -P/bin/cat  -l "/usr/share/man/man1/7z.1.gz" | dwww-txt2html 
> --man --utf8
> 
> crashed with the following message:
> 
>     man: nroff: Bad system call
>     man: command exited with status 159: /usr/lib/man-db/zsoelim | 
> /usr/lib/man-db/manconv -f UTF-8:ISO-8859-1 -t UTF-8//IGNORE | preconv -e 
> UTF-8 | tbl | nroff -mandoc -Tutf8
> 
> The same command worked without problems in a shell (with the normal
> environment). Using 'env -i ... man ...' with all environment variables
> supplied and eliminating the environment variables one by one, the command
> crashed with the error message above after i eliminated 'SHELL=/bin/bash'.
> 
> This leads me to a work-around for 'dwww'. Insert in 'dwww-convert' near line
> 248 an environment setting for 'SHELL':
> 
>     $ENV{'SHELL'} = '/bin/sh';
> 
> This should solve the problems with 'dwww', but if some other programs use
> 'man' with a limited environment, this problem may occur, too.

The bug is in man-db, not in nroff.  It seems familiar, and I thought I
remembered debugging this before, but I can't find a record of it.

What's happening is quite complicated, and it's as follows:

 * since version 2.8.0, man-db has used a seccomp filter to try to
   reduce the user's exposure to security vulnerabilities caused by
   maliciously-crafted manual pages (currently theoretical, but groff is
   complex enough that there's no good reason to believe that it will
   always be theoretical);

 * if SHELL is unset when bash starts (I think this is specific to bash,
   so it will depend on what /bin/sh points to on your system), then it
   does some extra initialisation steps that involve a call to getpwuid;

 * in glibc, getpwuid tries to contact nscd via a Unix socket to see if
   it's running;

 * the resulting socket syscall is denied by man-db's seccomp filter, on
   the basis that at least in the abstract there's no good reason for a
   pure text filter to be talking to a socket.

I'm not yet sure what the best solution is.  Fiddling about with SHELL
is obviously brittle.  I could change man to call groff directly rather
than nroff, which would avoid the problem, but that's also brittle as it
depends on the implementation language.  I suspect that I'll just have
to allow sockets in the seccomp sandbox, and maybe rely on AppArmor to
limit the potential damage.

-- 
Colin Watson                                       [cjwat...@debian.org]

Reply via email to