aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorLines
2018-08-31Do not hardcode /etc/fuse.conf path.Nikolaus Rath-13/+33
2018-08-30Updated ChangeLog with recent changes.Nikolaus Rath-1/+8
2018-08-29return different non-zero error codes (#290)Oded Arbel-6/+15
Return different error codes from fuse_main()
2018-08-26Fix memory leak of FUSE modulesRostislav-3/+23
2018-08-26Fix invalid free of memory pointer in 'struct fuse_buf'Rostislav-1/+2
2018-08-25Make meson build scripts subprojects friendlyMartin Blanchard-12/+10
Multiple meson build scripts improvements including: * Bump meson requirement to 0.40.1 (0.40 already required) * Declare a dependency object for main library * Stop using add_global_arguments() * Various minor style fixes
2018-08-09Add bcachefs to mountpoint file system whitelistDaniel Fullmer-0/+1
2018-08-05Add FAT to mountpoint file system whitelistBenjamin Barenblat-0/+1
2018-08-05Realphabetize and re-document mountpoint file system whitelistBenjamin Barenblat-4/+6
2018-07-31Add autofs to mountpoint file system whitelistRobo Shimmer-0/+3
2018-07-25Remove unused member of 'struct fuse_dh'Rostislav Skudnov-1/+0
2018-07-24Released 3.2.5Nikolaus Rath-3/+12
2018-07-24Added ChangeLog entry for hardening patches.Nikolaus Rath-2/+6
2018-07-23test_write_cache: Use fuse_session_exit() to stop filesystem threadRostislav Skudnov-2/+3
Using fuse_session_exit() followed by fuse_session_unmount() ensures that a proper cleanup and shutdown is performed.
2018-07-23example/{hello,null}: Fix memory leaksRostislav Skudnov-1/+8
2018-07-23test_write_cache: Fix memory leaksRostislav Skudnov-0/+3
2018-07-23fusermount: Fix memory leaksRostislav Skudnov-0/+2
2018-07-21Fix readdir() bug when a non-zero offset is specified in filler (#269)Rostislav-11/+84
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.
2018-07-18fusermount: whitelist known-good filesystems for mountpointsJann Horn-1/+49
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-18fusermount: refuse unknown optionsJann Horn-1/+7
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-18fusermount: bail out on transient config read failureJann Horn-0/+9
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-18fusermount: don't feed "escaped commas" into mount optionsJann Horn-1/+4
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-18fusermount: prevent silent truncation of mount optionsJann Horn-3/+20
Currently, in the kernel, copy_mount_options() copies in one page of userspace memory (or less if some of that memory area is not mapped). do_mount() then writes a null byte to the last byte of the copied page. This means that mount option strings longer than PAGE_SIZE-1 bytes get truncated silently. Therefore, this can happen: user@d9-ut:~$ _FUSE_COMMFD=10000 fusermount -o "$(perl -e 'print ","x4000')" mount sending file descriptor: Bad file descriptor user@d9-ut:~$ grep /mount /proc/mounts /dev/fuse /home/user/mount fuse rw,nosuid,nodev,relatime,user_id=1000,group_id=1000 0 0 user@d9-ut:~$ fusermount -u mount user@d9-ut:~$ _FUSE_COMMFD=10000 fusermount -o "$(perl -e 'print ","x4050')" mount sending file descriptor: Bad file descriptor user@d9-ut:~$ grep /mount /proc/mounts /dev/fuse /home/user/mount fuse rw,nosuid,nodev,relatime,user_id=1000,group_id=100 0 0 user@d9-ut:~$ fusermount -u mount user@d9-ut:~$ _FUSE_COMMFD=10000 fusermount -o "$(perl -e 'print ","x4051')" mount sending file descriptor: Bad file descriptor user@d9-ut:~$ grep /mount /proc/mounts /dev/fuse /home/user/mount fuse rw,nosuid,nodev,relatime,user_id=1000,group_id=10 0 0 user@d9-ut:~$ fusermount -u mount user@d9-ut:~$ _FUSE_COMMFD=10000 fusermount -o "$(perl -e 'print ","x4052')" mount sending file descriptor: Bad file descriptor user@d9-ut:~$ grep /mount /proc/mounts /dev/fuse /home/user/mount fuse rw,nosuid,nodev,relatime,user_id=1000,group_id=1 0 0 user@d9-ut:~$ fusermount -u mount I'm not aware of any context in which this is actually exploitable - you'd still need the UIDs to fit, and you can't do it if the three GIDs of the process don't match (in the case of a typical setgid binary), but it does look like something that should be fixed. I also plan to try to get this fixed on the kernel side.
2018-07-11Released 3.2.4Nikolaus Rath-4/+8
2018-07-11Don't assume sub-second resolution for st_atime/st_mtime.Nikolaus Rath-2/+2
Fixes: #224
2018-07-04Use triple quotes for multiline string.Nikolaus Rath-2/+2
Single quotes will become an error in a future meson release.
2018-07-04Document that access() is also called on chdir().Nikolaus Rath-3/+3
Source: Miklos Szeredi on fuse-devel, Wednesday, 4 July 2018 15:29.
2018-07-04Source LSB init functionsLaszlo Boszormenyi (GCS)-0/+3
2018-07-04Fix manpage filename for mount.fuse3Laszlo Boszormenyi (GCS)-1/+1
2018-07-02fuse.h: fix typo (currenlty -> currently)William Woodruff-1/+1
2018-05-24fix documentation for opendir in fuse_operationsCarl Edquist-1/+1
the filehandle from opendir is passed to releasedir - there is no closedir function in fuse_operations
2018-05-18rename: perform user mode dir loop check when not done in kernelBill Zissimooulos-10/+12
Fix conditionals as per maintainer's request.
2018-05-18changelog: add info on rename deadlock fixBill Zissimopoulos-0/+5
2018-05-18rename: perform user mode dir loop check when not done in kernelBill Zissimooulos-3/+275
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-05-11Released 3.2.3Nikolaus Rath-1/+6
2018-05-11add_arg(): check for overflowNikolaus Rath-0/+5
Fixes: #222.
2018-05-08Fix compile-time warnings on IGNORE_MTABTomohiro Kusumi-1/+2
Silence below warnings which appear if IGNORE_MTAB is defined. [59/64] Compiling C object 'util/fusermount3@exe/fusermount.c.o'. ../util/fusermount.c:493:12: warning: function declaration isn't a prototype [-Wstrict-prototypes] static int count_fuse_fs() ^~~~~~~~~~~~~ ../util/fusermount.c: In function 'unmount_fuse': ../util/fusermount.c:508:46: warning: unused parameter 'quiet' [-Wunused-parameter] static int unmount_fuse(const char *mnt, int quiet, int lazy) ^~~~~
2018-04-13Fix path to pytest cache directory.Nikolaus Rath-1/+1
2018-04-13Invert calloc(3) argument order (`nmemb` comes first)Tomohiro Kusumi-1/+1
No functional difference expected, but should still follow the standard. http://pubs.opengroup.org/onlinepubs/009695399/functions/calloc.html
2018-04-13Drop unneeded void cast for actually used local variableTomohiro Kusumi-1/+0
`int sig` is acutually used, so `(void) sig;` is unneeded.
2018-04-13Drop redundant ; from FUSE_REGISTER_MODULE()Tomohiro Kusumi-1/+1
Callers do (and should) use ;.
2018-03-31Travis: remove root-owned cache files.Nikolaus Rath-0/+3
2018-03-31Fix Travis build environmentNikolaus Rath-3/+2
Newest Meson requires Python 3.5 which isn't available in Trusty. Pip version pin no longer necessary.
2018-03-31Fixed up duplicate ChangeLog entry.Nikolaus Rath-2/+0
2018-03-31Released 3.2.2Nikolaus Rath-0/+13
2018-03-28Add example configuration file (#216)admorgan-0/+20
Add a configuration file with all options disabled that includes all valid options and their description.
2018-03-28Fix build error on DragonFlyBSD (sync with other *BSD) (#240)Tomohiro Kusumi-6/+6
DragonFlyBSD has no "bsd" in uname, so add 'dragonfly' to conditionals. -- e.g. uname(1) in DragonFlyBSD [root@ ~]# uname DragonFly [root@ ~]# python -c "import sys; print(sys.platform)" dragonfly5
2018-02-09Fix uninitialised read in fuse_new_30() (#231) (#234)Ashley Pittman-0/+3
Ensure that conf is always zero before it's read from to prevent sporadic failure at startup if higher layers were build against version 3.0 Signed-off-by: Ashley Pittman <ashley.m.pittman@intel.com>
2018-01-15Fix typo in "passthrough" docstring (#229)Mateusz UrbaƄczyk-1/+1
2017-12-01Handle mount ... -o nofail (#221)Josh Soref-0/+3
Accept (and ignore) nofail mount option