mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
landlock: Document Landlock's file truncation support
Use the LANDLOCK_ACCESS_FS_TRUNCATE flag in the tutorial. Adapt the backwards compatibility example and discussion to remove the truncation flag where needed. Point out potential surprising behaviour related to truncate. Signed-off-by: Günther Noack <gnoack3000@gmail.com> Link: https://lore.kernel.org/r/20221018182216.301684-12-gnoack3000@gmail.com Signed-off-by: Mickaël Salaün <mic@digikod.net>
This commit is contained in:
committed by
Mickaël Salaün
parent
faeb919766
commit
ede2a34363
@@ -8,7 +8,7 @@ Landlock: unprivileged access control
|
|||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
:Author: Mickaël Salaün
|
:Author: Mickaël Salaün
|
||||||
:Date: September 2022
|
:Date: October 2022
|
||||||
|
|
||||||
The goal of Landlock is to enable to restrict ambient rights (e.g. global
|
The goal of Landlock is to enable to restrict ambient rights (e.g. global
|
||||||
filesystem access) for a set of processes. Because Landlock is a stackable
|
filesystem access) for a set of processes. Because Landlock is a stackable
|
||||||
@@ -60,7 +60,8 @@ the need to be explicit about the denied-by-default access rights.
|
|||||||
LANDLOCK_ACCESS_FS_MAKE_FIFO |
|
LANDLOCK_ACCESS_FS_MAKE_FIFO |
|
||||||
LANDLOCK_ACCESS_FS_MAKE_BLOCK |
|
LANDLOCK_ACCESS_FS_MAKE_BLOCK |
|
||||||
LANDLOCK_ACCESS_FS_MAKE_SYM |
|
LANDLOCK_ACCESS_FS_MAKE_SYM |
|
||||||
LANDLOCK_ACCESS_FS_REFER,
|
LANDLOCK_ACCESS_FS_REFER |
|
||||||
|
LANDLOCK_ACCESS_FS_TRUNCATE,
|
||||||
};
|
};
|
||||||
|
|
||||||
Because we may not know on which kernel version an application will be
|
Because we may not know on which kernel version an application will be
|
||||||
@@ -69,16 +70,28 @@ should try to protect users as much as possible whatever the kernel they are
|
|||||||
using. To avoid binary enforcement (i.e. either all security features or
|
using. To avoid binary enforcement (i.e. either all security features or
|
||||||
none), we can leverage a dedicated Landlock command to get the current version
|
none), we can leverage a dedicated Landlock command to get the current version
|
||||||
of the Landlock ABI and adapt the handled accesses. Let's check if we should
|
of the Landlock ABI and adapt the handled accesses. Let's check if we should
|
||||||
remove the ``LANDLOCK_ACCESS_FS_REFER`` access right which is only supported
|
remove the ``LANDLOCK_ACCESS_FS_REFER`` or ``LANDLOCK_ACCESS_FS_TRUNCATE``
|
||||||
starting with the second version of the ABI.
|
access rights, which are only supported starting with the second and third
|
||||||
|
version of the ABI.
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
int abi;
|
int abi;
|
||||||
|
|
||||||
abi = landlock_create_ruleset(NULL, 0, LANDLOCK_CREATE_RULESET_VERSION);
|
abi = landlock_create_ruleset(NULL, 0, LANDLOCK_CREATE_RULESET_VERSION);
|
||||||
if (abi < 2) {
|
if (abi < 0) {
|
||||||
|
/* Degrades gracefully if Landlock is not handled. */
|
||||||
|
perror("The running kernel does not enable to use Landlock");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
switch (abi) {
|
||||||
|
case 1:
|
||||||
|
/* Removes LANDLOCK_ACCESS_FS_REFER for ABI < 2 */
|
||||||
ruleset_attr.handled_access_fs &= ~LANDLOCK_ACCESS_FS_REFER;
|
ruleset_attr.handled_access_fs &= ~LANDLOCK_ACCESS_FS_REFER;
|
||||||
|
__attribute__((fallthrough));
|
||||||
|
case 2:
|
||||||
|
/* Removes LANDLOCK_ACCESS_FS_TRUNCATE for ABI < 3 */
|
||||||
|
ruleset_attr.handled_access_fs &= ~LANDLOCK_ACCESS_FS_TRUNCATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
This enables to create an inclusive ruleset that will contain our rules.
|
This enables to create an inclusive ruleset that will contain our rules.
|
||||||
@@ -127,8 +140,8 @@ descriptor.
|
|||||||
|
|
||||||
It may also be required to create rules following the same logic as explained
|
It may also be required to create rules following the same logic as explained
|
||||||
for the ruleset creation, by filtering access rights according to the Landlock
|
for the ruleset creation, by filtering access rights according to the Landlock
|
||||||
ABI version. In this example, this is not required because
|
ABI version. In this example, this is not required because all of the requested
|
||||||
``LANDLOCK_ACCESS_FS_REFER`` is not allowed by any rule.
|
``allowed_access`` rights are already available in ABI 1.
|
||||||
|
|
||||||
We now have a ruleset with one rule allowing read access to ``/usr`` while
|
We now have a ruleset with one rule allowing read access to ``/usr`` while
|
||||||
denying all other handled accesses for the filesystem. The next step is to
|
denying all other handled accesses for the filesystem. The next step is to
|
||||||
@@ -252,6 +265,37 @@ To be allowed to use :manpage:`ptrace(2)` and related syscalls on a target
|
|||||||
process, a sandboxed process should have a subset of the target process rules,
|
process, a sandboxed process should have a subset of the target process rules,
|
||||||
which means the tracee must be in a sub-domain of the tracer.
|
which means the tracee must be in a sub-domain of the tracer.
|
||||||
|
|
||||||
|
Truncating files
|
||||||
|
----------------
|
||||||
|
|
||||||
|
The operations covered by ``LANDLOCK_ACCESS_FS_WRITE_FILE`` and
|
||||||
|
``LANDLOCK_ACCESS_FS_TRUNCATE`` both change the contents of a file and sometimes
|
||||||
|
overlap in non-intuitive ways. It is recommended to always specify both of
|
||||||
|
these together.
|
||||||
|
|
||||||
|
A particularly surprising example is :manpage:`creat(2)`. The name suggests
|
||||||
|
that this system call requires the rights to create and write files. However,
|
||||||
|
it also requires the truncate right if an existing file under the same name is
|
||||||
|
already present.
|
||||||
|
|
||||||
|
It should also be noted that truncating files does not require the
|
||||||
|
``LANDLOCK_ACCESS_FS_WRITE_FILE`` right. Apart from the :manpage:`truncate(2)`
|
||||||
|
system call, this can also be done through :manpage:`open(2)` with the flags
|
||||||
|
``O_RDONLY | O_TRUNC``.
|
||||||
|
|
||||||
|
When opening a file, the availability of the ``LANDLOCK_ACCESS_FS_TRUNCATE``
|
||||||
|
right is associated with the newly created file descriptor and will be used for
|
||||||
|
subsequent truncation attempts using :manpage:`ftruncate(2)`. The behavior is
|
||||||
|
similar to opening a file for reading or writing, where permissions are checked
|
||||||
|
during :manpage:`open(2)`, but not during the subsequent :manpage:`read(2)` and
|
||||||
|
:manpage:`write(2)` calls.
|
||||||
|
|
||||||
|
As a consequence, it is possible to have multiple open file descriptors for the
|
||||||
|
same file, where one grants the right to truncate the file and the other does
|
||||||
|
not. It is also possible to pass such file descriptors between processes,
|
||||||
|
keeping their Landlock properties, even when these processes do not have an
|
||||||
|
enforced Landlock ruleset.
|
||||||
|
|
||||||
Compatibility
|
Compatibility
|
||||||
=============
|
=============
|
||||||
|
|
||||||
@@ -398,6 +442,15 @@ Starting with the Landlock ABI version 2, it is now possible to securely
|
|||||||
control renaming and linking thanks to the new ``LANDLOCK_ACCESS_FS_REFER``
|
control renaming and linking thanks to the new ``LANDLOCK_ACCESS_FS_REFER``
|
||||||
access right.
|
access right.
|
||||||
|
|
||||||
|
File truncation (ABI < 3)
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
File truncation could not be denied before the third Landlock ABI, so it is
|
||||||
|
always allowed when using a kernel that only supports the first or second ABI.
|
||||||
|
|
||||||
|
Starting with the Landlock ABI version 3, it is now possible to securely control
|
||||||
|
truncation thanks to the new ``LANDLOCK_ACCESS_FS_TRUNCATE`` access right.
|
||||||
|
|
||||||
.. _kernel_support:
|
.. _kernel_support:
|
||||||
|
|
||||||
Kernel support
|
Kernel support
|
||||||
|
Reference in New Issue
Block a user