Commit Graph

1021 Commits

Author SHA1 Message Date
Sam James
5a43d0f724 util/ulockmgr_server.c: conditionally define closefrom (fix glibc-2.34+)
closefrom(3) has joined us in glibc-land from *BSD and Solaris. Since
it's available in glibc 2.34+, we want to detect it and only define our
fallback if the libc doesn't provide it.

Bug: https://bugs.gentoo.org/803923
Signed-off-by: Sam James <sam@gentoo.org>
2021-07-25 11:21:45 +01:00
Andrew Gaul
5d38afc8a5
Correct errno comparison (#571) 2020-12-14 10:16:05 +00:00
tenzap
6d55007027 Whitelist UFSD (backport to 2.9 branch) (#452) 2019-09-15 08:57:08 -07:00
Nikolaus Rath
d046879231 Released 2.9.9 2019-01-04 13:38:34 +00:00
Nikolaus Rath
41e3e7c00e Added OpenAFS to type whitelist
Fixes: #336.
2019-01-04 13:34:34 +00:00
Rostislav Skudnov
06fc40705f Fix readdir() bug when a non-zero offset is specified in filler
The bug occurs when a filesystem client reads a directory until the end,
seeks using seekdir() to some valid non-zero position and calls
readdir(). A valid 'struct dirent *' is expected, but NULL is returned
instead. Pseudocode demonstrating the bug:

DIR *dp = opendir("some_dir");
struct dirent *de = readdir(dp);

/* Get offset of the second entry */
long offset = telldir(dp);

/* Read directory until the end */
while (de)
	de = readdir(de);

seekdir(dp, offset);
de = readdir(dp);
/* de must contain the second entry, but NULL is returned instead */

The reason of the bug is that when the end of directory is reached, the
kernel calls FUSE_READDIR op with an offset at the end of directory, so
the filesystem's .readdir callback never calls the filler function, and
we end up with dh->filled set to 1. After seekdir(), FUSE_READDIR is
called again with a new offset, but this time the filesystem's .readdir
callback is never called, and an empty reply is returned.

Fix by setting dh->filled to 1 only when zero offsets are given to
filler function.

This commit is backported from the following commit in 'master' branch:

commit 5f125c5e6b
Author: Rostislav <rostislav@users.noreply.github.com>
Date:   Sat Jul 21 12:57:09 2018 +0300

    Fix readdir() bug when a non-zero offset is specified in filler (#269)
2018-07-25 12:28:59 +01:00
Nikolaus Rath
6172ece717 Released 2.9.8 2018-07-25 11:05:35 +01:00
Nikolaus Rath
3eb3c6995f Add changelog entry for commit b045e. 2018-07-21 12:20:49 +01:00
Nikolaus Rath
57ab9586b1 Added ChangeLog entry for hardening patches. 2018-07-21 12:19:30 +01:00
Jann Horn
b3abb45118 fusermount: whitelist known-good filesystems for mountpoints
Before:

$ _FUSE_COMMFD=1 priv_strace -s8000 -e trace=mount util/fusermount3 /proc/self/fd
mount("/dev/fuse", ".", "fuse", MS_NOSUID|MS_NODEV, "fd=3,rootmode=40000,user_id=379777,group_id=5001") = 0
sending file descriptor: Socket operation on non-socket
+++ exited with 1 +++

After:

$ _FUSE_COMMFD=1 priv_strace -s8000 -e trace=mount util/fusermount3 /proc/self/fd
util/fusermount3: mounting over filesystem type 0x009fa0 is forbidden
+++ exited with 1 +++

This patch could potentially have security
impact on some systems that are configured with allow_other;
see https://launchpad.net/bugs/1530566 for an example of how a similar
issue in the ecryptfs mount helper was exploitable. However, the FUSE
mount helper performs slightly different security checks, so that exact
attack doesn't work with fusermount; I don't know of any specific attack
you could perform using this, apart from faking the SELinux context of your
process when someone's looking at a process listing. Potential targets for
overwrite are (looking on a system with a 4.9 kernel):

writable only for the current process:
/proc/self/{fd,map_files}
(Yes, "ls -l" claims that you don't have write access, but that's not true;
"find -writable" will show you what access you really have.)

writable also for other owned processes:
/proc/$pid/{sched,autogroup,comm,mem,clear_refs,attr/*,oom_adj,
oom_score_adj,loginuid,coredump_filter,uid_map,gid_map,projid_map,
setgroups,timerslack_ns}
2018-07-21 12:17:49 +01:00
Jann Horn
d50017e850 fusermount: refuse unknown options
Blacklists are notoriously fragile; especially if the kernel wishes to add
some security-critical mount option at a later date, all existing systems
with older versions of fusermount installed will suddenly have a security
problem.
Additionally, if the kernel's option parsing became a tiny bit laxer, the
blacklist could probably be bypassed.

Whitelist known-harmless flags instead, even if it's slightly more
inconvenient.
2018-07-21 12:17:49 +01:00
Jann Horn
7c49d3cb74 fusermount: bail out on transient config read failure
If an attacker wishes to use the default configuration instead of the
system's actual configuration, they can attempt to trigger a failure in
read_conf(). This only permits increasing mount_max if it is lower than the
default, so it's not particularly interesting. Still, this should probably
be prevented robustly; bail out if funny stuff happens when we're trying to
read the config.

Note that the classic attack trick of opening so many files that the
system-wide limit is reached won't work here - because fusermount only
drops the fsuid, not the euid, the process is running with euid=0 and
CAP_SYS_ADMIN, so it bypasses the number-of-globally-open-files check in
get_empty_filp() (unless you're inside a user namespace).
2018-07-21 12:17:49 +01:00
Jann Horn
520f09be3c fusermount: don't feed "escaped commas" into mount options
The old code permits the following behavior:

$ _FUSE_COMMFD=10000 priv_strace -etrace=mount -s200 fusermount -o 'foobar=\,allow_other' mount
mount("/dev/fuse", ".", "fuse", MS_NOSUID|MS_NODEV, "foobar=\\,allow_other,fd=3,rootmode=40000,user_id=1000,group_id=1000") = -1 EINVAL (Invalid argument)

However, backslashes do not have any special meaning for the kernel here.

As it happens, you can't abuse this because there is no FUSE mount option
that takes a string value that can contain backslashes; but this is very
brittle. Don't interpret "escape characters" in places where they don't
work.
2018-07-21 12:17:49 +01:00
Alexander
b045ea4bb7 Fix SIGSEGV when fuse_interrupted() is called outside the eventloop 2018-07-09 16:50:42 +01:00
Bill Zissimopoulos
a0c14264e9 rename: perform user mode dir loop check when not done in kernel
Linux performs the dir loop check (rename(a, a/b/c)
    or rename(a/b/c, a), etc.) in kernel. Unfortunately
    other systems do not perform this check (e.g. FreeBSD).
    This results in a deadlock in get_path2, because libfuse
    did not expect to handle such cases.

    We add a check_dir_loop function that performs the dir
    loop check in user mode and enable it on systems that
    need it.
2018-06-07 10:17:12 +01:00
Carl Edquist
c17f2c6823 fix documentation for opendir in fuse_operations
the filehandle from opendir is passed to releasedir - there is no
closedir function in fuse_operations
2018-05-24 16:01:37 +01:00
Nikolaus Rath
c2d0e65057 Document that client pid/gid/uid may be zero.
Fixes #67.
2016-10-02 21:38:27 -07:00
Nikolaus Rath
df499bf1ce Released 2.9.7. 2016-06-20 12:55:12 -07:00
Hendrik Brueckner
6189312b0c libfuse/fuse_daemonize: wait until daemon child process is ready (#55)
Mounting a FUSE file system remotely using SSH in combination with
pseudo-terminal allocation (-t), results in "Transport endpoint is
not connected" errors when trying to access the file system contents.

For example:

  # ssh -t root@localhost  "cmsfs-fuse /dev/disk/by-path/ccw-0.0.0190 /CMSFS"
  Connection to localhost closed.
  # ls /CMSFS
  ls: cannot access '/CMSFS': Transport endpoint is not connected

The cmsfs-fuse main program (which can also be any other FUSE file
system) calls into the fuse_main() libfuse library function.
The fuse_main() function later calls fuse_daemonize() to fork the
daemon process to handle the FUSE file system I/O.

The fuse_daemonize() function calls fork() as usual.  The child
proceeds with setsid() and then redirecting its file descriptors
to /dev/null etc.  The parent process, simply exits.

The child's functions and the parent's exit creates a subtle race.
This is seen with an SSH connection.  The SSH command above calls
cmsfs-fuse on an allocated pseudo-terminal device (-t option).

If the parent exits, SSH receives the command completion and closes
the connection, that means, it closes the master side of the
pseudo-terminal.  This causes a HUP signal being sent to the process
group on the pseudo-terminal.  At this point in time, the child might
not have completed the setsid() call and, hence, becomes terminated.
Note that fuse daemon sets up its signal handlers after fuse_daemonize()
has completed.

Even if the child has the chance to disassociate from its parent process
group to become it's own process group with setsid(), the child still
has the pseudo-terminal opened as stdin, stdout, and stderr.  So the
pseudo-terminal still behave as controlling terminal and might cause a
SIGHUP at closing the the master side.

To solve the problem, the parent has to wait until the child (the fuse
daemon process) has completed its processing, that means, has become
its own process group with setsid() and closed any file descriptors
pointing to the pseudo-terminal.

Closes: #27

Reported-by: Ofer Baruch <oferba@il.ibm.com>
Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
2016-06-20 12:50:05 -07:00
Dalvik Khertel
9448849b56 libfuse: pass security context options to kernel
Mount can be used with an "-o context=" option in order to specify a
mountpoint-wide SELinux security context different from the default context
provided by the active SELinux policy.

This is useful in order to enable users to mount multiple sshfs targets under
distinct contexts, which is my main motivation for getting this patch mainlined.

Closes: #36
2016-06-20 12:49:36 -07:00
Nikolaus Rath
c47dde86c0 Fix ambigious condition
Fixes #42.
2016-06-05 15:45:49 -04:00
Nikolaus Rath
a82a069c97 Released 2.9.6 2016-04-23 09:48:15 -07:00
Nikolaus Rath
85f3ff439c Fix description of bug #15. 2016-02-02 08:58:27 -08:00
Nikolaus Rath
9775c70da5 Document bug #15. 2016-02-01 09:09:11 -08:00
Nikolaus Rath
6c60e26c60 Include documentation in tarball. 2016-01-28 18:00:24 -08:00
Nikolaus Rath
2b4e3144bb Remove "credits" section, we now have an AUTHORS file. 2016-01-28 16:40:17 -08:00
Nikolaus Rath
1ac9ca5636 Released 2.9.5 2016-01-14 11:20:22 -08:00
Nikolaus Rath
7a7f10cd3f Mention new maintainer in Changelog. 2016-01-14 11:18:33 -08:00
Nikolaus Rath
e786950b1d Changed Changelog format
Up to now, the Changelog has essentially been a (manually maintained)
copy of the git commit history. This doesn't seem to have any point
other than following the GNU coding standards. I believe it's much
better to use the Changelog to summarize the release-to-release
changes that are most important for users, so this is what we'll do
from now on.
2016-01-14 11:15:00 -08:00
Nikolaus Rath
0cc20e82dc Removed placeholder README file and switch automake to foreign flavor.
The GNU flavor merely requires to existence of some files (including
README, but we prefer README.md), so there seems to be little point
in using it.
2016-01-14 10:58:27 -08:00
Nikolaus Rath
7a93cf053b Removed hopelessly outdated files. 2016-01-14 10:39:08 -08:00
Nikolaus Rath
8818df921d Enable subdir-objects automake option
This is recommended for forward-compatibility.
2016-01-14 10:19:12 -08:00
Nikolaus Rath
f5e1f46793 Update makeconf.sh
Describe why manual copying of config.rpath is necessary, and fail
with a more helpful message if it can't be found.

Remove code for systems without autoreconf - it's apparently not used
by anyone since it has been broken for quite some time (there is no
`kernel` directory anymore).
2016-01-14 10:14:35 -08:00
Nikolaus Rath
89c75201e6 Update maintainer and contributor list 2016-01-14 09:55:47 -08:00
Nikolaus Rath
2ff84d34d6 Extend write_buf documentation 2016-01-14 09:23:18 -08:00
Nikolaus Rath
d09dbea729 Initialize padding to zero.
This should prevent some valgrind warnings.
2016-01-14 09:21:51 -08:00
Nikolaus Rath
547dc9e49f Migrated README to README.md for Markdown rendering on GitHub. 2015-12-20 13:52:30 -08:00
Miklos Szeredi
0285462226 libfuse: fix warning mount.c:receive_fd()
Reported by Albert Berger
2015-08-12 11:53:10 +02:00
Miklos Szeredi
1fbc6e5353 libfuse: fix possible memory leak
Reported by Jose R. Guzman
2015-06-29 18:08:07 +02:00
Miklos Szeredi
6adcb719a9 Released 2.9.4 2015-05-22 11:24:02 +02:00
Miklos Szeredi
0516ee45ec libfuse: fix exec environment for mount and umount
Found by Tavis Ormandy (CVE-2015-3202).
2015-05-22 11:01:12 +02:00
Miklos Szeredi
cd757d22b4 libfuse: fix fuse_remove_signal_handlers()
to properly restore the default signal handler.

Reported by: Chris Johnson <johnsocg@gmail.com>
2015-02-26 16:58:37 +01:00
Miklos Szeredi
4163109fd5 libfuse: document deadlock avoidance for fuse_notify_inval_entry()
and fuse_notify_delete()

Reported by Han-Wen Nienhuys
2014-07-22 06:36:01 +02:00
Miklos Szeredi
4e8f86d4d6 Initilaize stat buffer passed to ->getattr() and ->fgetattr()
to zero in all cases.

Reported by Daniel Iwan.
2014-07-22 06:31:23 +02:00
Fabrice Bauzac
c92fecbb51 Advertize the existence of some "configure" env vars.
Advertize the existence of env vars MOUNT_FUSE_PATH, UDEV_RULES_PATH
and INIT_D_PATH in the execution of ./configure.
2014-07-22 06:28:09 +02:00
Miklos Szeredi
d6c284cbda libfuse: highlevel API: fix directory file handle passed to ioctl() method
Reported by Eric Biggers
2014-07-21 18:59:23 +02:00
Miklos Szeredi
60ac20d25f fusermount, libfuse: send value as unsigned in "user_id=" and "group_id="
...options.  Uids/gids larger than 2147483647 would result in EINVAL when
mounting the filesystem.  This also needs a fix in the kernel.
2014-07-21 18:59:05 +02:00
Daniel Thau
78bc1108d5 Add missing includes
This allows compiling fuse with musl.
2013-08-26 12:01:17 +02:00
Miklos Szeredi
d44bf3a4ac Released 2.9.3 2013-07-01 10:48:51 +02:00
Miklos Szeredi
014d950de7 libfuse: don't close fd if it's -1
This prevents a valgrind warning.
2013-07-01 10:18:49 +02:00