#1152995 tiger: local root via mount point names in find_files

Package:
tiger
Source:
tiger
Description:
security auditing and intrusion detection tools for Linux
Submitter:
Andrei Trimbitas
Date:
2026-11-04 08:59:02 UTC
Severity:
normal
Tags:
#1152995#5
Date:
2026-11-04 08:55:56 UTC
From:
To:
scripts/find_files runs find on each mount point it scans through eval:

eval nice -5 $FIND "$mountpt" $findpruneopt $findopt -print 2>/dev/null

The double quotes go in the first expansion, so eval parses the mount
point's path as shell code. The mount points come from gen_mounts, which
keeps those whose type it counts as local, fuse.encfs and fuse.lxcfs among
them. fusermount3 is setuid root and lets any user mount a FUSE file system
on a directory they own, setting the reported type with -o subtype=, so any
local user can make a "local" mount point whose name holds a command
substitution. find_files runs that command as root the next time it runs:
with the package's cronrc, at 02:00 on the 1st of every month, from the
hourly tigercron job in /etc/cron.d/tiger. The precondition is fuse3 (or
fuse) being installed.

The line is the same in 1:3.2.4~rc1-3.2 (bookworm), -3.4 (trixie) and -3.5
(sid and forky), and in upstream TIGER 3.2.4.

Verified in a privileged debian:sid container with 1:3.2.4~rc1-3.5 and
Tiger_FSScan_WDIR=Y: with a tmpfs mounted on a directory whose name held a
command substitution, find_files ran the command as root. With the attached
patch it did not, and both that mount and one on a directory named with an
apostrophe, which the eval had silently skipped, were scanned. On Ubuntu
24.04 I confirmed in October that an unprivileged user can make such a
mount with fusermount3 -o subtype=encfs, and that mount prints its name
unchanged.

The patch (DEP-3, against 1:3.2.4~rc1-3.5; it applies unchanged to -3.2 and
-3.4) passes the mount points to find as positional parameters, so eval
sees only '$FIND "$mountpt"'. The find options, which come from tiger's own
configuration, still go through eval. It applies with or without the
reworked patch for #610785, in either order.

I reported this privately to team@security.debian.org on 11 October and
followed up on 22 October, saying I would file it here on 29 October unless
asked to wait; there was no reply. Tigris, the fork of TIGER I maintain,
fixed it in 3.9.0, and its advisory is public as GHSA-p8g6-qw5j-8cgc, in
the creativeheadz/tigris repository on GitHub. A CVE was requested through
GitHub for that advisory and has not been assigned yet.

The same report named two lower-impact problems, which need a non-default
setting or an administrator's mistake: with Tiger_Check_PATHALL=Y (the
default is N), check_path sources assignments it extracts from every user's
.profile and .cshrc as root, and config reads ./tigerrc, ./.tigerrc and
./site from the directory tiger is started in, checking only that they are
not group or world writable, not who owns them. I can file those separately.

Andrei Trimbitas