Re: [PATCH v2 1/4] landlock: Fix layer composition of LANDLOCK_ACCESS_FS_REFER
From: Mickaël Salaün
Date: Thu Nov 12 2026 - 21:51:35 EST
Good. Please add erratum 5 in this patch with abi-4.h .
On Sun, Nov 08, 2026 at 09:23:48PM +0100, Günther Noack wrote:
> In landlock_get_fs_access_mask(), only add the
> LANDLOCK_ACCESS_FS_REFER right if any filesystem access rights are
> handled at all. This prevents us from accidentally treating
> non-filesystem layers as if they handled LANDLOCK_ACCESS_FS_REFER.
>
> landlock_get_fs_access_mask() is used when initializing the layer
> masks for doing access right checks, so this bug meant that we
> unintentionally denied "refer" (e.g., link, rename) operations in
> layered cases, where the same operation would have been accepted if
> only either one of the two layers had been enforced. If the rulesets
> individually allow an operation, the composition of these rulesets
> should also allow it.
>
> The bug only manifests as soon as one other layer handles filesystem
> access rights. Otherwise, Landlock filesystem path walk is guarded by
> an early exit for the case that no filesystem-enforcing layer exists.
>
> Reported-by: Dwi Siswanto <me@xxxxxx>
> Link: https://github.com/landlock-lsm/linux/issues/67
> Link: https://github.com/landlock-lsm/go-landlock/issues/66
> Fixes: fff69fb03dde ("landlock: Support network rules with TCP bind and connect")
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Günther Noack <gnoack3000@xxxxxxxxx>
> ---
> security/landlock/domain.h | 13 ++++++++++---
> 1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/security/landlock/domain.h b/security/landlock/domain.h
> index 935e18b12b3c..d9ebf4857fce 100644
> --- a/security/landlock/domain.h
> +++ b/security/landlock/domain.h
> @@ -262,9 +262,16 @@ static inline access_mask_t
> landlock_get_fs_access_mask(const struct landlock_domain *const domain,
> const u16 layer_level)
> {
> - /* Handles all initially denied by default access rights. */
> - return domain->layers[layer_level].handled.fs |
> - _LANDLOCK_ACCESS_FS_INITIALLY_DENIED;
> + access_mask_t handled = domain->layers[layer_level].handled.fs;
> +
> + /*
> + * Handles all initially denied by default access rights, but only for
> + * layers handling filesystem accesses.
> + */
> + if (handled)
> + handled |= _LANDLOCK_ACCESS_FS_INITIALLY_DENIED;
> +
> + return handled;
> }
>
> static inline access_mask_t
>
> --
> 2.56.0
>
>