Sandbox Permissions🔗
One of Flatpak’s main goals is to increase the security of desktop systems by isolating applications from one another. This is achieved using sandboxing and means that, by default, applications that are run with Flatpak have extremely limited access to the host environment. This includes:
No access to any host files except the runtime, the app,
~/.var/app/$FLATPAK_ID
, and$XDG_RUNTIME_DIR/app/$FLATPAK_ID
. Only the latter two being writable.No access to the network.
No access to any device nodes (apart from
/dev/null
, etc).No access to processes outside the sandbox.
Limited syscalls. For instance, apps can’t use nonstandard network socket types or ptrace other processes.
Limited access to the session D-Bus instance - an app can only own its own name on the bus.
No access to host services like X11, system D-Bus, or PulseAudio.
Most applications will need access to some of these resources in order to
be useful. This is primarily done during the finishing build stage, which
can be configured through the finish-args
section of the manifest file
(see Manifests).
Portals🔗
Portals have already been mentioned in Grundlegende Konzepte. They are a framework for providing access to resources outside of the sandbox, including:
Opening files with a native file chooser dialog
Opening URIs
Printing
Showing notifications
Taking screenshots
Inhibiting the user session from ending, suspending, idling or getting switched away
Getting network status information
In many cases, portals use a system component to implicitly ask the user for permission before granting access to a particular resource. For example, in the case of opening a file, the user’s selection of a file using the file chooser dialog is interpreted as implicitly granting the application access to whatever file is chosen.
This approach enables applications to avoid having to configure blanket access to large amounts of data or services and gives users control over what their applications have access to.
Interface toolkits like GTK3 and Qt5 implement transparent support for portals, meaning that applications don’t need to do any additional work to use them (it is worth checking which portals each toolkit supports). Applications that aren’t using a toolkit with support for portals can refer to the xdg-desktop-portal API documentation for information on how to use them.
Permissions guidelines🔗
Bemerkung
Note, that these permissions are completely static and variable
expansion or substitution (for example in --filesystem
or --env
)
is not possible.
While application developers have control over the sandbox permissions they wish to configure, good practice is encouraged and can be enforced. For example, the Flathub hosting service places requirements on which permissions can be used, and software on the host may warn users if certain permissions are used.
The following guidelines describe which permissions can be freely used, which can be used on an as-needed basis, and which should be avoided.
Standard permissions🔗
The following permissions provide access to basic resources that applications commonly require, and can therefore be freely used.
--allow=bluetooth
- Allow access to Bluetooth (AF_BLUETOOTH
) sockets--device=dri
- OpenGL rendering--share=ipc
- Share IPC namespace with the host [1]--share=network
- Access the network [2]--socket=cups
- Talk to the CUPS printing system ($CUPS_SERVER
or server defined in CUPS’sclient.conf
. Falls back to/var/run/cups/cups.sock
)--socket=gpg-agent
- Talk to the GPG agent (The socket ingpgconf --list-dir agent-socket
)--socket=pcsc
- Smart card access$PCSCLITE_CSOCK_NAME
--socket=pulseaudio
- Access to PulseAudio, includes sound input (mic), sound output/playback, MIDI and ALSA sound devices in/dev/snd
--socket=ssh-auth
- Allow access to$SSH_AUTH_SOCK
Bemerkung
Applications that do not support native Wayland should use
only --socket=x11
and applications that do, should use
--socket=fallback-x11
and --socket=wayland
.
The two configurations here will make the application work on both
X11 and Wayland sessions of the desktop environment.
--socket=wayland
- Show windows with Wayland--socket=x11
- Show windows using X11--socket=fallback-x11
- Show windows using X11, if Wayland is not available, overridesx11
socket permission. Note that you must still use--socket=wayland
for wayland permission
D-Bus access🔗
DBus access is filtered by default. The default policy for the session bus
only allows the application to own its own namespace named by
$FLATPAK_ID
, subnames of it and org.mpris.MediaPlayer2.$FLATPAK_ID
for MPRIS.
Furthermore, it is only allowed to talk to names matching those patterns,
the bus itself org.freedesktop.DBus
and portal APIs of the form
org.freedesktop.portal.*
.
Access to the entire bus with --socket=system-bus
or
--socket=session-bus
stops the filtering and using them is a security
risk. So they must be avoided, unless the application is a development
tool.
flatpak run --log-session-bus $FLATPAK_ID
can be used to find the specific
D-Bus permissions needed. See Audit session or system bus traffic
for more information.
Ownership
Any ownership beyond what is granted by default ie. own namespace and
org.mpris.MediaPlayer2.$FLAPTAK_ID
is typically unnecessary
although there can be exceptions.
Talk
Talk permissions can be freely used, although it is recommended to use the minimum required.
Filesystem access🔗
As a general rule, static and permanent filesystem access should be limited as much as possible. This includes:
Using portals as an alternative to blanket filesystem access, wherever possible.
Using read-only access wherever possible, using the
:ro
option.Using XDG base directories to store application’s cache, config and state. Then no additional filesystem access would be required.
Avoiding full home access and instead using XDG directories such as
xdg-music
orxdg-download
etc.
The following permission options are available:
:ro
- read-only access:create
- read/write access, and create the directory if it doesn’t exist
Additionally the following permissions are available:
|
Access to |
Includes any subpaths |
|
Host’s |
Host’s |
|
Host’s |
Mounted at |
|
Access the home directory |
Except |
|
Access an arbitrary path except any reserved path |
Includes any subpaths |
|
Arbitrary path relative to the home directory |
Includes any subpaths |
|
Access the XDG desktop directory |
|
|
Access the XDG documents directory |
|
|
Access the XDG download directory |
|
|
Access the XDG music directory |
|
|
Access the XDG pictures directory |
|
|
Access the XDG public directory |
|
|
Access the XDG videos directory |
|
|
Access the XDG templates directory |
|
|
Access the XDG config directory [3] |
|
|
Access the XDG cache directory [3] |
|
|
Access the XDG data directory [3] |
|
|
Access subdirectories of the XDG runtime directory |
|
Except host, host-etc, host-os
paths can be added to all the above
filesystem options. For example, --filesystem=xdg-documents/path
.
Other filesystem access guidelines include:
The
--persist=DIR
option can be used to map directories from the user’s home directory into the sandbox filesystem. This only works if the application has nohome
or a broader permission likehost
that includeshome
.For example, if an application hardcodes the directory
~/.foo
, without anyhome
access and no--persist
the directory will be lost from the sandbox once exited due to the filesystem being set up as tmpfs by flatpak unless overriden. A--persist=.foo
bind mounts~/.foo
inside the sandbox to~/.var/app/$FLATPAK_ID/.foo
on host thus allowing an app to persistently store data in~/.var/app/$FLATPAK_ID/.foo
which would otherwise be lost.A
--persist=.
will persist all directories.This does not support
:create, :ro, :rw
suffixes or special values likexdg-documents
. However, the directory will be created by flatpak if it doesn’t already exist.This makes it possible to avoid configuring access to the entire home directory, and can be useful for applications that hardcode file paths in
~/
.If an application uses
$TMPDIR
to contain lock files you may want to add a wrapper script that sets it to$XDG_RUNTIME_DIR/app/$FLATPAK_ID
(tmpfs) or/var/tmp
(persistent on host).Retaining and sharing configuration with non-Flatpak installations is to be avoided.
Reserved Paths🔗
The following paths and subpaths of them are reserved and asking access
to them with --filesystem
will have no effect:
/app, /bin, /dev, /etc, /lib, /lib32, /lib64, /proc, /run/flatpak, /run/host, /sbin, /usr
The entire /run
is not allowed and all subpaths of /run
except
/run/flatpak, /run/host
is allowed to be exposed via
--filesystem
. Additionally, if /var/run
on host is a symlink to
../run
, exposing it or a subpath of it, is not allowed.
Additionally the following directories from host need to be explicitly
requested with --filesystem
and are not available with
home, host, host-os, host-etc
by default:
~/.var/app
- The app can access only its own directory in~/.var/app/$FLATPAK_ID
$XDG_DATA_HOME/flatpak
(~/.local/share/flatpak
)/boot
/efi
/root
/sys
/tmp
/var
- Note that by default/var/{cache, config, data, tmp}
inside the sandbox are the same as~/.var/app/$FLATPAK_ID/{cache, config, data, cache/tmp}
. However an explicit--filesystem=/var
will make only/var
from host available and those will no longer be available./var/lib/flatpak
-/var
does not give access to this.
Device access🔗
You can provide the following device permissions:
|
Direct Rendering Interface. Necessary for GL. |
|
Kernel based Virtual Machine |
|
Shared Memory in |
|
Input devices as exposed in |
|
Raw USB devices as exposed in |
|
All devices, including all of the above except |
Bemerkung
Using newer permissions like input
or usb
will have no effect
on older Flatpak versions and will fail when used through Flatpak
commandline.
While not ideal, --device=all
can be used to access devices like
webcams, CD/DVD drives etc.
USB portal🔗
Since 1.5.11.
Sandboxed access to individual USB devices can be controlled by portals. Flatpak allows specifying enumerable USB devices to allow access.
Like --device=usb
, this is just about accessing the raw USB
device, that needs libusb (or equivalent). By using the portal, you
can restrict which device can be requested (enumerable) and then
request an explicit permission to access. For example, if you run a
scanner driver, there is no reason for USB security devices to be
accessible.
A list of valid use cases includes scanners (handled, for example by SANE), photo cameras (handled by libgphoto2), flashing devices, etc.
While this is portal dependent and xdg-desktop-portal
is currently
the only portal implementation, the overall permission flow is as
follows:
The Flatpak package specifies the devices it wishes to enumerate through
finish-args
.The application requests the portal to enumerate the available USB devices based on that list. If the list is empty it will enumerate all USB devices.
When the application wants to access the device, it will make a request for the device it wants to access via the portal.
The portal then requests permission from the user if not already granted.
If the permission was granted, a file descriptor for the device is passed back to the application.
The application is then able to open the devices it is supposed to use while the others would be hidden.
Specifying the enumerable devices🔗
You can specify devices on the flatpak
command line, and by
extension in the finish arguments for Flatpak Builder. Enumerable
devices are specified with a query passed with --usb=
while hidden
devices are specified with a query passed with --nousb=
. The
hidden list takes precedence over the enumerable list, like an
exception list. The goal is to be able to specify a broad range and
then exclude the few devices that shall not be enumerated.
Queries are made out of rules. These rules are composable with +
.
The rule all
enumerates every USB device. There is no further rule
allowed in the query.
The vnd
and dev
rules specify a USB vendor and a USB device ID
respectively. A vendor can be specified alone, but a device rule
always comes with a vendor rule as a device ID is only unique within a
vendor. Vendor and device ID are specified with 4 digit hex
numbers. For more information about the USB IDs, you can refer to the
Linux USB ID repository
cls
specifies the device USB class and subclass. Both class and
subclass are two digit hex numbers separated by a colon :
. You
can use *
to specify any subclass within the class.
Some examples of the syntax:
vnd:1234
: Devices from vendor1234
vnd:1234+dev:3456
: Only device3456
from vendor1234
.vnd:1234+cls:06:*
: All the PTP devices from vendor1234
.cls:06:*
: All the PTP devices.
This permission only allows to enumerate devices. To open them, permission must be requested from the portal. It is not possible to open a device that is not enumerable.
Bemerkung
The --device=usb
permission is broader than what the USB portal
is supposed to provide and allows unfettered access to any USB
device on the bus.
In some situations you may need to specify a very long list of devices.
Device lists can be passed in one single argument, or through a file.
When using --usb-list
, the queries are separated by a semi-colon
;
, with queries for hidden devices (i.e. those that would be
passed with --nousb
) prefixed with !
.
When using --usb-list-file
, the filename of the file containing
USB queries is passed line by line. Like with --usb-list
queries
for hidden devices are prefixed with !
. Empty lines and lines
starting with a #
are ignored. When used with flatpak override
or flatpak build-finish
the file is no longer needed afterwards as
the list is persisted internally.
dconf access🔗
As of xdg-desktop-portal 1.1.0 and glib 2.60.5 (in the runtime) you do not need direct DConf access in most cases.
As of now this glib version is included in org.freedesktop.Platform//19.08
and org.gnome.Platform//3.34
and newer.
If an application existed prior to these runtimes you can tell Flatpak (>=
1.3.4) to migrate the DConf settings on the
host into the sandbox by adding
--metadata=X-DConf=migrate-path=/org/example/foo/
to finish-args
. The
path must be similar to your app-id or it will not be allowed (case is
ignored and _
and -
are treated equal).
If you are targeting older runtimes or require direct DConf access for other reasons you can use these permissions:
--filesystem=xdg-run/dconf
--filesystem=~/.config/dconf:ro
--talk-name=ca.desrt.dconf
--env=DCONF_USER_CONFIG_DIR=.config/dconf
With those permissions glib will continue using dconf directly.
If you use a newer runtime where dconf is no longer built and still need it
you will have to build the dconf GIO module
and set --env=GIO_EXTRA_MODULES=/app/lib/gio/modules/
.
gvfs access🔗
As of gvfs 1.48, the gvfs daemons and applications use an on-disk socket to communicate, rather than an abstract socket so that the gvfs infrastructure still works when network support is disabled in the application’s sandbox.
A number of different options need to be passed depending on the application’s use of gvfs.
--talk-name=org.gtk.vfs.*
is necessary to talk to the gvfs daemons over
D-Bus and list mounts using the GIO APIs.
--filesystem=xdg-run/gvfsd
is necessary to use the GIO APIs to list and access
non-native files using the GIO APIs, using URLs rather than FUSE paths.
--filesystem=xdg-run/gvfs
is necessary to give access to the FUSE mounts
non-GIO and legacy applications can use. This is what will make native files
appear under /run/user/`id -u`/gvfs/
.
Typical GNOME and GTK applications should use:
--talk-name=org.gtk.vfs.*
--filesystem=xdg-run/gvfsd
Typical non-GNOME and non-GTK applications should use:
--filesystem=xdg-run/gvfs
No application should be using --talk-name=org.gtk.vfs
in its manifest, as
there are no D-Bus services named org.gtk.vfs
.
External drive access🔗
External drives are mounted by the host system using systemd, udev, udisk fstab etc. and each of them can have different defaults. Flatpak has no control over how and where they get mounted. The following filesystem permissions should work in most cases:
--filesystem=/media
--filesystem=/run/media
--filesystem=/mnt
If --filesystem=host
is used /media, /run/media
is shared
automatically if they exist.
Note that these should not have subpaths in them unless the value of the subpath can be consistently pre-determined. Block device naming depends on the kernel/fstab configuration and cannot be pre-determined.
Footnotes