Skip to content

Commit

Permalink
Merge pull request #4355 from ThomasWaldmann/fuse-default-options-1.0
Browse files Browse the repository at this point in the history
security fix: configure FUSE with "default_permissions", fixes #3903
  • Loading branch information
ThomasWaldmann authored Feb 11, 2019
2 parents 69320a8 + c8c504c commit cc29608
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
7 changes: 5 additions & 2 deletions borg/archiver.py
Original file line number Diff line number Diff line change
Expand Up @@ -1613,12 +1613,15 @@ def build_parser(self, args=None, prog=None):
memory usage can be up to ~8 MiB times this number. The default is the number
of CPU cores.
For mount options, see the fuse(8) manual page. Additional mount options
supported by borg:
For FUSE configuration and mount options, see the mount.fuse(8) manual page.
Additional mount options supported by borg:
- allow_damaged_files: by default damaged files (where missing chunks were
replaced with runs of zeros by borg check --repair) are not readable and
return EIO (I/O error). Set this option to read such files.
- ignore_permissions: for security reasons the "default_permissions" mount
option is internally enforced by borg. "ignore_permissions" can be given
to not enforce "default_permissions".
When the daemonized process receives a signal or crashes, it does not unmount.
Unmounting in these cases could cause an active rsync or similar process
Expand Down
17 changes: 16 additions & 1 deletion borg/fuse.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,29 @@ def __init__(self, key, repository, manifest, archive, cached_repo):

def mount(self, mountpoint, mount_options, foreground=False):
"""Mount filesystem on *mountpoint* with *mount_options*."""
options = ['fsname=borgfs', 'ro']
# default_permissions enables permission checking by the kernel. Without
# this, any umask (or uid/gid) would not have an effect and this could
# cause security issues if used with allow_other mount option.
# When not using allow_other or allow_root, access is limited to the
# mounting user anyway.
options = ['fsname=borgfs', 'ro', 'default_permissions']
if mount_options:
options.extend(mount_options.split(','))
try:
options.remove('allow_damaged_files')
self.allow_damaged_files = True
except ValueError:
pass
try:
options.remove('ignore_permissions')
# if above does not raise ValueError (meaning: ignore_permissions is present),
# we remove default_permissions again.
# in case users have a use-case that requires NOT giving "default_permissions",
# this is enabled by the custom "ignore_permissions" mount option which just
# removes "default_permissions" again:
options.remove('default_permissions')
except ValueError:
pass
llfuse.init(self, mountpoint, options)
if not foreground:
old_id, new_id = daemonize()
Expand Down

0 comments on commit cc29608

Please sign in to comment.